From 41298ae65597b0957b02943985b08d36a863eed5 Mon Sep 17 00:00:00 2001 From: AYM1607 Date: Mon, 1 Apr 2019 00:34:36 -0600 Subject: [PATCH] modified usermodel to have an events array --- lib/src/blocs/home_bloc.dart | 6 ++-- lib/src/models/user_model.dart | 6 ++++ lib/src/resources/authService.dart | 1 + lib/src/resources/firestore_provider.dart | 31 ++++++++++++++++++- .../resources/firestore_provider_test.dart | 3 +- 5 files changed, 42 insertions(+), 5 deletions(-) diff --git a/lib/src/blocs/home_bloc.dart b/lib/src/blocs/home_bloc.dart index 14f91e5..8d0e922 100644 --- a/lib/src/blocs/home_bloc.dart +++ b/lib/src/blocs/home_bloc.dart @@ -10,7 +10,7 @@ export '../resources/authService.dart' show FirebaseUser; class HomeBloc { final AuthService _auth = authService; - final FirestoreProvider _firestore = firestoreProvider; + final FirestoreProvider _repository = firestoreProvider; final _tasks = BehaviorSubject>(); // Stream getters. @@ -30,7 +30,7 @@ class HomeBloc { Future fetchTasks() async { final user = await _auth.currentUser; - _firestore.getUserTasks(user.email).pipe(_tasks); + _repository.getUserTasks(user.email).pipe(_tasks); } Future getUserAvatarUrl() async { @@ -44,7 +44,7 @@ class HomeBloc { } void markTaskAsDone(TaskModel task) async { - _firestore.updateTask( + _repository.updateTask( task.id, done: true, ); diff --git a/lib/src/models/user_model.dart b/lib/src/models/user_model.dart index 55ad02a..cc29a95 100644 --- a/lib/src/models/user_model.dart +++ b/lib/src/models/user_model.dart @@ -14,6 +14,9 @@ class UserModel { /// An array of task ids. final List tasks; + /// An array of event names. + final List events; + /// Added and finished tasks for the current week. final SummaryModel summary; @@ -34,6 +37,7 @@ class UserModel { @required this.pendingHigh, @required this.pendingMedium, @required this.pendingLow, + @required this.events, }); ///Returns a [UserModel] from a map. @@ -41,6 +45,7 @@ class UserModel { : id = id, username = firestoreMap["username"], tasks = firestoreMap["tasks"].cast(), + events = firestoreMap["events"].cast(), summary = SummaryModel.fromMap(firestoreMap["summary"].cast()), pendingHigh = firestoreMap["pendingHigh"], @@ -51,6 +56,7 @@ class UserModel { return { "username": username, "tasks": tasks, + "events": events, "summary": summary.toMap(), "pendingHigh": pendingHigh, "pendingMedium": pendingMedium, diff --git a/lib/src/resources/authService.dart b/lib/src/resources/authService.dart index ed9dc55..047449c 100644 --- a/lib/src/resources/authService.dart +++ b/lib/src/resources/authService.dart @@ -33,6 +33,7 @@ class AuthService { final newUserModel = UserModel( username: user.email, tasks: [], + events: [], summary: SummaryModel(), pendingHigh: 0, pendingMedium: 0, diff --git a/lib/src/resources/firestore_provider.dart b/lib/src/resources/firestore_provider.dart index 9926a60..a9bfaed 100644 --- a/lib/src/resources/firestore_provider.dart +++ b/lib/src/resources/firestore_provider.dart @@ -21,7 +21,7 @@ class FirestoreProvider { //-----------------------User related operations------------------------------ /// Returns a stream of [UserModel]. - Observable getUser(String username) { + Observable getUserObservable(String username) { final mappedStream = _firestore .collection('users') .where('username', isEqualTo: username) @@ -42,6 +42,28 @@ class FirestoreProvider { return Observable(mappedStream); } + //TODO: add tests for this method. + + /// Returns a [UserModel]. + /// Only one out of id or username can be provided, if both are provided id + /// will have higher priority. + Future getUser({String id, String username}) async { + DocumentSnapshot documentSnapshot; + if (id != null) { + documentSnapshot = await _firestore.document('users/$id').get(); + } else { + final querySnapshot = await _firestore + .collection('users') + .where('username', isEqualTo: username) + .getDocuments(); + documentSnapshot = querySnapshot.documents.first; + } + return UserModel.fromFirestore( + documentSnapshot.data, + id: documentSnapshot.documentID, + ); + } + /// Creates a new instance of a user in Firestore. Future createUser(UserModel user, String uid) async { try { @@ -68,6 +90,7 @@ class FirestoreProvider { Future updateUser( String id, { List tasks, + List events, SummaryModel summary, int pendingHigh, int pendingMedium, @@ -75,6 +98,7 @@ class FirestoreProvider { }) async { final newData = { 'tasks': tasks, + 'events': events, 'summary': summary, 'pendingHigh': pendingHigh, 'pendingMedium': pendingMedium, @@ -200,6 +224,11 @@ class FirestoreProvider { try { final dataMap = event.toFirestoreMap(); await _firestore.collection('users/$userId/Events').add(dataMap); + // After the event was added successfully we have to update the events a + // user has. + final user = await getUser(id: userId); + final newEventsArray = user.events..add(event.name); + await updateUser(userId, events: newEventsArray); } catch (e) { print('Error adding Event to firestore: $e'); } diff --git a/test/src/resources/firestore_provider_test.dart b/test/src/resources/firestore_provider_test.dart index 1ffc823..70d31b4 100644 --- a/test/src/resources/firestore_provider_test.dart +++ b/test/src/resources/firestore_provider_test.dart @@ -29,6 +29,7 @@ main() { final user = UserModel( id: '123', tasks: [], + events: [], pendingHigh: 0, pendingMedium: 0, pendingLow: 0, @@ -81,7 +82,7 @@ main() { when(querySnapshot.documents).thenReturn([snapshot]); when(snapshot.documentID).thenReturn(user.id); - expect(provider.getUser(user.username), emits(user)); + expect(provider.getUserObservable(user.username), emits(user)); }); test('should create task', () {