HydroNutrify_Ari_e41221567/lib/data/services/hidroponik_data_service.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>>[];
});
}
}