84 lines
2.9 KiB
Dart
84 lines
2.9 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
|
|
|
/// Service untuk data monitoring hidroponik (pH, nutrisi, suhu, dll)
|
|
class HidroponikDataService {
|
|
static const String collectionName = 'hidroponik_data';
|
|
|
|
CollectionReference<Map<String, dynamic>> get _collection =>
|
|
FirebaseFirestore.instance.collection(collectionName);
|
|
|
|
/// Stream data terbaru untuk kartu monitoring
|
|
Stream<Map<String, dynamic>?> latestDataStream({String? userId}) {
|
|
return _collection.snapshots().map((snapshot) {
|
|
if (snapshot.docs.isEmpty) return null;
|
|
|
|
final allDocs = snapshot.docs
|
|
.map((doc) => {...doc.data(), 'doc_id': doc.id})
|
|
.toList();
|
|
|
|
// Cari dokumen yang memiliki user_id cocok
|
|
final userDocs = (userId != null && userId.isNotEmpty)
|
|
? allDocs.where((d) => d['user_id'] == userId).toList()
|
|
: <Map<String, dynamic>>[];
|
|
|
|
// Jika ada dokumen sesuai user_id pakai userDocs, jika belum ada pakai allDocs (fallback)
|
|
final targetDocs = userDocs.isNotEmpty ? userDocs : allDocs;
|
|
|
|
targetDocs.sort((a, b) {
|
|
final aTime = a['timestamp'];
|
|
final bTime = b['timestamp'];
|
|
if (aTime is Timestamp && bTime is Timestamp) {
|
|
return bTime.compareTo(aTime);
|
|
} else if (aTime is DateTime && bTime is DateTime) {
|
|
return bTime.compareTo(aTime);
|
|
}
|
|
return 0;
|
|
});
|
|
|
|
return targetDocs.first;
|
|
}).handleError((error) {
|
|
debugPrint('[HidroponikDataService] latestDataStream error: $error');
|
|
return null;
|
|
});
|
|
}
|
|
|
|
/// Stream histori data untuk grafik
|
|
Stream<List<Map<String, dynamic>>> historyStream({
|
|
int limit = 7,
|
|
String? userId,
|
|
}) {
|
|
return _collection.snapshots().map((snapshot) {
|
|
if (snapshot.docs.isEmpty) return <Map<String, dynamic>>[];
|
|
|
|
final allDocs = snapshot.docs
|
|
.map((doc) => {...doc.data(), 'doc_id': doc.id})
|
|
.toList();
|
|
|
|
// Cari dokumen yang memiliki user_id cocok
|
|
final userDocs = (userId != null && userId.isNotEmpty)
|
|
? allDocs.where((d) => d['user_id'] == userId).toList()
|
|
: <Map<String, dynamic>>[];
|
|
|
|
// Jika ada dokumen sesuai user_id pakai userDocs, jika belum ada pakai allDocs (fallback)
|
|
final targetDocs = userDocs.isNotEmpty ? userDocs : allDocs;
|
|
|
|
targetDocs.sort((a, b) {
|
|
final aTime = a['timestamp'];
|
|
final bTime = b['timestamp'];
|
|
if (aTime is Timestamp && bTime is Timestamp) {
|
|
return bTime.compareTo(aTime);
|
|
} else if (aTime is DateTime && bTime is DateTime) {
|
|
return bTime.compareTo(aTime);
|
|
}
|
|
return 0;
|
|
});
|
|
|
|
return targetDocs.take(limit <= 0 ? 1 : limit).toList();
|
|
}).handleError((error) {
|
|
debugPrint('[HidroponikDataService] historyStream error: $error');
|
|
return <Map<String, dynamic>>[];
|
|
});
|
|
}
|
|
}
|