From c95939f5df64cf21bb12cd8f38ed3db0504ae99b Mon Sep 17 00:00:00 2001 From: AYM1607 Date: Sat, 23 Feb 2019 16:51:27 -0600 Subject: [PATCH] Implemented the rest of CRUD operations for the task model --- lib/src/App.dart | 23 +++++-- lib/src/resources/firestore_provider.dart | 84 ++++++++++++++++++----- 2 files changed, 83 insertions(+), 24 deletions(-) diff --git a/lib/src/App.dart b/lib/src/App.dart index abe1283..6e40880 100644 --- a/lib/src/App.dart +++ b/lib/src/App.dart @@ -5,7 +5,7 @@ import './models/task_model.dart'; import './models/user_model.dart'; import './resources/firestore_provider.dart'; -class App extends StatelessWidget { +/* class App extends StatelessWidget { Widget build(BuildContext context) { final fire = FirestoreProvider(); return MaterialApp( @@ -19,9 +19,8 @@ class App extends StatelessWidget { ), ); } -} +} */ -/* class App extends StatelessWidget { Widget build(BuildContext context) { final fire = FirestoreProvider(); @@ -43,7 +42,22 @@ class App extends StatelessWidget { } final children = [ MaterialButton( - onPressed: () {}, + onPressed: () { + final task = TaskModel( + ownerUsername: 'mariano159357', + text: 'I dont know what to put', + priority: 2, + done: false, + event: 'Math', + ); + + fire.updateTask( + '-LZRNhS9mX-SO0XgfQIM', + done: true, + text: 'Hellloooooo', + priority: 1, + ); + }, child: Text('Add task'), ), ]; @@ -62,4 +76,3 @@ class App extends StatelessWidget { ); } } - */ diff --git a/lib/src/resources/firestore_provider.dart b/lib/src/resources/firestore_provider.dart index b2d1a1d..814d1df 100644 --- a/lib/src/resources/firestore_provider.dart +++ b/lib/src/resources/firestore_provider.dart @@ -5,6 +5,12 @@ import '../models/event_model.dart'; import '../models/user_model.dart'; import '../models/task_model.dart'; +/** +* TODO: the cloud firestore plugin currently throws an error when calling +* methods that modify documents. Wait for a fix. +* https://github.com/flutter/flutter/issues/28103 +*/ + /// A connection to the Cloud Firestore database /// /// Implempents CRUD operations for users, tasks and events. @@ -14,6 +20,7 @@ class FirestoreProvider { FirestoreProvider() { firestore.settings(timestampsInSnapshotsEnabled: true); } + //-----------------------User related operations------------------------------ /// Returns a stream of [UserModel]. Observable getUser(String username) { @@ -38,13 +45,66 @@ class FirestoreProvider { //-------------------------Task related operations---------------------------- - /// Adds a task to the tasks collection in firestore. + /// Adds a task to firestore. Future addTask(TaskModel task) async { - final dataMap = task.toFirestoreMap(); - await firestore.collection('tasks').add(dataMap); + try { + final dataMap = task.toFirestoreMap(); + await firestore.collection('tasks').add(dataMap); + } catch (e) { + print('Error adding task to firestore: $e'); + } } - /// Returns a stream of [List] + /// Returns a Stream of a single task from an id. + Observable getTask(String id) { + final mappedStream = + firestore.collection('tasks').document(id).snapshots().map( + (DocumentSnapshot snapshot) { + return TaskModel.fromFirestore( + snapshot.data, + id: snapshot.documentID, + ); + }, + ); + + return Observable(mappedStream); + } + + /// Deletes a task from firestore. + Future deleteTask(String id) async { + try { + final documentReference = firestore.collection('tasks').document(id); + await documentReference.delete(); + } catch (e) { + print('Error deleting task from firestore: $e'); + } + } + + /// Updates a task in firestore. + /// + /// Only the [text], [priority] and [done] attributes can be update. + /// Provide at least one of these values. + Future updateTask( + String id, { + String text, + int priority, + bool done, + }) async { + final newData = { + 'text': text, + 'priority': priority, + 'done': done, + }; + newData.removeWhere((key, value) => value == null); + try { + final documentReference = firestore.collection('tasks').document(id); + await documentReference.setData(newData, merge: true); + } catch (e) { + print('Error updating task in firestore: $e'); + } + } + + /// Returns a stream of [List] that correspond to a particular user. /// /// The [event] parameter is used to query tasks that are part of a certain /// event. @@ -74,23 +134,9 @@ class FirestoreProvider { return Observable(mappedStream); } - Observable getTask(String id) { - final mappedStream = - firestore.collection('tasks').document(id).snapshots().map( - (DocumentSnapshot snapshot) { - return TaskModel.fromFirestore( - snapshot.data, - id: snapshot.documentID, - ); - }, - ); - - return Observable(mappedStream); - } - //-----------------------Event related operations----------------------------- - // TODO: Change the Events collction name to 'events' + // TODO: Change the Events collction name to 'events' in forestore. Observable> getUserEvents(String userDocumentId) { final mappedStream = firestore .collection('users')