2019-02-22 00:13:06 -06:00
|
|
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
|
|
|
|
import 'package:rxdart/rxdart.dart';
|
|
|
|
|
|
|
|
|
|
import '../models/event_model.dart';
|
|
|
|
|
import '../models/user_model.dart';
|
|
|
|
|
import '../models/task_model.dart';
|
|
|
|
|
|
|
|
|
|
/// A connection to the Cloud Firestore database
|
2019-02-23 15:04:40 -06:00
|
|
|
///
|
|
|
|
|
/// Implempents CRUD operations for users, tasks and events.
|
2019-02-22 00:13:06 -06:00
|
|
|
class FirestoreProvider {
|
|
|
|
|
final Firestore firestore = Firestore.instance;
|
|
|
|
|
|
|
|
|
|
FirestoreProvider() {
|
|
|
|
|
firestore.settings(timestampsInSnapshotsEnabled: true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns a stream of [UserModel].
|
|
|
|
|
Observable<UserModel> getUser(String username) {
|
|
|
|
|
final mappedStream = firestore
|
|
|
|
|
.collection('users')
|
|
|
|
|
.where('username', isEqualTo: username)
|
|
|
|
|
.snapshots()
|
|
|
|
|
.map(
|
|
|
|
|
(QuerySnapshot snapshot) {
|
|
|
|
|
if (snapshot.documents.isEmpty) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
final userSnapshot = snapshot.documents.first;
|
|
|
|
|
return UserModel.fromFirestore(
|
2019-02-23 15:04:40 -06:00
|
|
|
userSnapshot.data,
|
|
|
|
|
id: userSnapshot.documentID,
|
|
|
|
|
);
|
2019-02-22 00:13:06 -06:00
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
return Observable(mappedStream);
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-23 15:04:40 -06:00
|
|
|
//-------------------------Task related operations----------------------------
|
|
|
|
|
|
2019-02-23 15:22:24 -06:00
|
|
|
/// Adds a task to the tasks collection in firestore.
|
|
|
|
|
Future<void> addTask(TaskModel task) async {
|
|
|
|
|
final dataMap = task.toFirestoreMap();
|
|
|
|
|
await firestore.collection('tasks').add(dataMap);
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-22 00:13:06 -06:00
|
|
|
/// Returns a stream of [List<Task>]
|
|
|
|
|
///
|
2019-02-23 15:22:24 -06:00
|
|
|
/// The [event] parameter is used to query tasks that are part of a certain
|
|
|
|
|
/// event.
|
2019-02-22 00:13:06 -06:00
|
|
|
Observable<List<TaskModel>> getUserTasks(String username, {String event}) {
|
|
|
|
|
Query query = firestore
|
|
|
|
|
.collection('tasks')
|
|
|
|
|
.where('ownerUsername', isEqualTo: username)
|
|
|
|
|
.where('done', isEqualTo: false);
|
|
|
|
|
|
|
|
|
|
if (event != null) {
|
|
|
|
|
query = query.where('event', isEqualTo: event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final mappedStream = query.snapshots().map(
|
|
|
|
|
(QuerySnapshot snapshot) {
|
|
|
|
|
return snapshot.documents.map(
|
|
|
|
|
(DocumentSnapshot document) {
|
2019-02-23 15:04:40 -06:00
|
|
|
return TaskModel.fromFirestore(
|
|
|
|
|
document.data,
|
|
|
|
|
id: document.documentID,
|
|
|
|
|
);
|
2019-02-22 00:13:06 -06:00
|
|
|
},
|
|
|
|
|
).toList();
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return Observable(mappedStream);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Observable<TaskModel> getTask(String id) {
|
|
|
|
|
final mappedStream =
|
|
|
|
|
firestore.collection('tasks').document(id).snapshots().map(
|
|
|
|
|
(DocumentSnapshot snapshot) {
|
2019-02-23 15:04:40 -06:00
|
|
|
return TaskModel.fromFirestore(
|
|
|
|
|
snapshot.data,
|
|
|
|
|
id: snapshot.documentID,
|
|
|
|
|
);
|
2019-02-22 00:13:06 -06:00
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return Observable(mappedStream);
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-23 15:04:40 -06:00
|
|
|
//-----------------------Event related operations-----------------------------
|
|
|
|
|
|
2019-02-22 00:13:06 -06:00
|
|
|
// TODO: Change the Events collction name to 'events'
|
|
|
|
|
Observable<List<EventModel>> getUserEvents(String userDocumentId) {
|
|
|
|
|
final mappedStream = firestore
|
|
|
|
|
.collection('users')
|
|
|
|
|
.document(userDocumentId)
|
|
|
|
|
.collection('Events')
|
|
|
|
|
.snapshots()
|
|
|
|
|
.map(
|
|
|
|
|
(QuerySnapshot snapshot) {
|
|
|
|
|
return snapshot.documents.map((DocumentSnapshot documentSnapshot) {
|
|
|
|
|
return EventModel.fromFirestore(
|
2019-02-23 15:04:40 -06:00
|
|
|
documentSnapshot.data,
|
|
|
|
|
id: documentSnapshot.documentID,
|
|
|
|
|
);
|
2019-02-22 00:13:06 -06:00
|
|
|
}).toList();
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return Observable(mappedStream);
|
|
|
|
|
}
|
|
|
|
|
}
|