diff --git a/frontend/lib/app_component.dart b/frontend/lib/app_component.dart index 49fcdb6..d3ad7be 100644 --- a/frontend/lib/app_component.dart +++ b/frontend/lib/app_component.dart @@ -11,6 +11,7 @@ import 'package:frontend/components/sailing_club_detail_component/sailing_club_d import 'package:frontend/components/boat_list_component/boat_list_component.dart'; import 'package:frontend/components/boat_detail_component/boat_detail_component.dart'; import 'package:frontend/store/regatta_store.dart'; +import 'package:frontend/services/persistency_service.dart'; import 'package:frontend/services/firebase_service.dart'; @Component(selector: 'my-app', templateUrl: 'app_component.html', styleUrls: const [ @@ -25,7 +26,7 @@ import 'package:frontend/services/firebase_service.dart'; ROUTER_PROVIDERS, const Provider(LocationStrategy, useClass: HashLocationStrategy), RegattaStore, - FirebaseService, + const Provider(PersistencyService, useClass: FirebaseService) ]) @RouteConfig(const [ const Route(path: '/events', name: 'Events', component: EventListComponent, useAsDefault: true), diff --git a/frontend/lib/components/app_header/app_header.dart b/frontend/lib/components/app_header/app_header.dart index 3be214f..87b577d 100644 --- a/frontend/lib/components/app_header/app_header.dart +++ b/frontend/lib/components/app_header/app_header.dart @@ -1,7 +1,7 @@ import 'package:angular2/angular2.dart'; import 'package:angular2_components/angular2_components.dart'; -import 'package:frontend/services/firebase_service.dart'; +import 'package:frontend/services/persistency_service.dart'; @Component( selector: 'app-header', @@ -10,7 +10,7 @@ import 'package:frontend/services/firebase_service.dart'; directives: const [materialDirectives], providers: const [materialProviders]) class AppHeader { - final FirebaseService fbService; + final PersistencyService fbService; AppHeader(this.fbService); } diff --git a/frontend/lib/services/firebase_service.dart b/frontend/lib/services/firebase_service.dart index 2c82295..7ad8984 100644 --- a/frontend/lib/services/firebase_service.dart +++ b/frontend/lib/services/firebase_service.dart @@ -7,9 +7,10 @@ import 'package:frontend/models/sailing_club.dart'; import 'package:frontend/models/boat.dart'; import 'package:frontend/store/regatta_store.dart'; import 'package:frontend/store/regatta_action.dart' as actions; +import 'package:frontend/services/persistency_service.dart'; @Injectable() -class FirebaseService { +class FirebaseService implements PersistencyService { fb.Auth _fbAuth; fb.GoogleAuthProvider _fbGoogleAuthProvider; fb.Database _fbDatabase; @@ -57,6 +58,7 @@ class FirebaseService { } } + @override Future signIn() async { try { await _fbAuth.signInWithPopup(_fbGoogleAuthProvider); @@ -65,6 +67,7 @@ class FirebaseService { } } + @override void signOut() { _fbAuth.signOut(); } @@ -75,6 +78,7 @@ class FirebaseService { _store.dispatch(actions.addEvent(ev)); } + @override Future addEvent(Event event) async { try { await _fbRefEvents.push(event.toMap()).future; @@ -88,6 +92,7 @@ class FirebaseService { _store.dispatch(actions.updateEvent(ev)); } + @override Future updateEvent(Event event) async { try { await _fbRefEvents.child(event.key).update(event.toMap()); @@ -101,6 +106,7 @@ class FirebaseService { _store.dispatch(actions.deleteEvent(ev)); } + @override Future deleteEvent(Event event) async { try { await _fbRefEvents.child(event.key).remove(); @@ -115,6 +121,7 @@ class FirebaseService { _store.dispatch(actions.addSailingClub(sc)); } + @override Future addSailingClub(SailingClub sailingClub) async { try { await _fbRefSailingClubs.push(sailingClub.toMap()).future; @@ -128,6 +135,7 @@ class FirebaseService { _store.dispatch(actions.updateSailingClub(sc)); } + @override Future updateSailingClub(SailingClub sailingClub) async { try { await _fbRefSailingClubs.child(sailingClub.key).update(sailingClub.toMap()); @@ -141,6 +149,7 @@ class FirebaseService { _store.dispatch(actions.deleteSailingClub(sc)); } + @override Future deleteSailingClub(SailingClub sailingClub) async { try { await _fbRefSailingClubs.child(sailingClub.key).remove(); @@ -155,6 +164,7 @@ class FirebaseService { _store.dispatch(actions.addBoat(sc)); } + @override Future addBoat(Boat sailingClub) async { try { await _fbRefBoats.push(sailingClub.toMap()).future; @@ -168,6 +178,7 @@ class FirebaseService { _store.dispatch(actions.updateBoat(sc)); } + @override Future updateBoat(Boat sailingClub) async { try { await _fbRefBoats.child(sailingClub.key).update(sailingClub.toMap()); @@ -181,6 +192,7 @@ class FirebaseService { _store.dispatch(actions.deleteBoat(sc)); } + @override Future deleteBoat(Boat sailingClub) async { try { await _fbRefBoats.child(sailingClub.key).remove(); diff --git a/frontend/lib/services/persistency_service.dart b/frontend/lib/services/persistency_service.dart new file mode 100644 index 0000000..3bd8d65 --- /dev/null +++ b/frontend/lib/services/persistency_service.dart @@ -0,0 +1,70 @@ +import 'dart:async'; + +import 'package:frontend/models/event.dart'; +import 'package:frontend/models/sailing_club.dart'; +import 'package:frontend/models/boat.dart'; + +// TODO: Should we have a percistency Interface that is segregated from the authentication interface? + +abstract class PersistencyService { +// final RegattaStore _store; + +// PersistencyService(this._store); + + Future signIn(); + void signOut(); + + // These private methods are called by implementing classes + // to propagate changes in the DB to the frontend. +/* + void newEvent(Event newEvent) { + _store.dispatch(actions.addEvent(newEvent)); + } + + void _changedEvent(Event changedEvent) { + _store.dispatch(actions.updateEvent(changedEvent)); + } + + void _removedEvent(Event removedEvent) { + _store.dispatch(actions.deleteEvent(removedEvent)); + } + + void _newSailingClub(SailingClub sc) { + _store.dispatch(actions.addSailingClub(sc)); + } + + void _changedSailingClub(SailingClub sc) { + _store.dispatch(actions.updateSailingClub(sc)); + } + + void _removedSailingClub(SailingClub sc) { + _store.dispatch(actions.deleteSailingClub(sc)); + } + + void _newBoat(Boat boat) { + _store.dispatch(actions.addBoat(boat)); + } + + void _changedBoat(Boat boat) { + _store.dispatch(actions.updateBoat(boat)); + } + + void _removedBoat(Boat boat) { + _store.dispatch(actions.deleteBoat(boat)); + } +*/ + // The following methods are called by the frontend + // to write to the DB. + + Future addEvent(Event event); + Future updateEvent(Event event); + Future deleteEvent(Event event); + + Future addSailingClub(SailingClub sailingClub); + Future updateSailingClub(SailingClub sailingClub); + Future deleteSailingClub(SailingClub sailingClub); + + Future addBoat(Boat boat); + Future updateBoat(Boat boat); + Future deleteBoat(Boat boat); +} diff --git a/frontend/lib/store/regatta_action.dart b/frontend/lib/store/regatta_action.dart index cc927b6..1ba391f 100644 --- a/frontend/lib/store/regatta_action.dart +++ b/frontend/lib/store/regatta_action.dart @@ -1,11 +1,11 @@ import 'dart:async'; import 'action_type.dart'; +import 'package:frontend/services/persistency_service.dart'; import 'package:greencat/greencat.dart'; import 'package:frontend/app_component.dart'; import 'package:frontend/models/event.dart'; import 'package:frontend/models/sailing_club.dart'; import 'package:frontend/models/boat.dart'; -import 'package:frontend/services/firebase_service.dart'; /// Utility function to trigger the addEvent action. RegattaAction requestCreateEvent(String name) => new RequestCreateEventAction(name); @@ -75,10 +75,10 @@ abstract class RegattaAction extends Action { /// Action to request the add of a new Event. class RequestCreateEventAction extends RegattaAction implements AsyncAction { - final FirebaseService _fbService; + final PersistencyService _persistencyService; RequestCreateEventAction(String payload) - : _fbService = AppComponent.myinjector.get(FirebaseService), + : _persistencyService = AppComponent.myinjector.get(PersistencyService), super(payload); @override @@ -86,7 +86,7 @@ class RequestCreateEventAction extends RegattaAction implements AsyncAct @override Future call(MiddlewareApi api) { - return _fbService.addEvent(new Event(null, payload)); + return _persistencyService.addEvent(new Event(null, payload)); } } @@ -101,10 +101,10 @@ class AddEventAction extends RegattaAction { /// Action to add an Event. class RequestUpdateEventAction extends RegattaAction implements AsyncAction { - final FirebaseService _fbService; + final PersistencyService _persistencyService; RequestUpdateEventAction(Event payload) - : _fbService = AppComponent.myinjector.get(FirebaseService), + : _persistencyService = AppComponent.myinjector.get(PersistencyService), super(payload); @override @@ -112,7 +112,7 @@ class RequestUpdateEventAction extends RegattaAction implements AsyncActi @override Future call(MiddlewareApi api) { - return _fbService.updateEvent(payload); + return _persistencyService.updateEvent(payload); } } @@ -126,10 +126,10 @@ class UpdateEventAction extends RegattaAction { /// Action to delete an Event. class RequestDeleteEventAction extends RegattaAction implements AsyncAction { - final FirebaseService _fbService; + final PersistencyService _persistencyService; RequestDeleteEventAction(Event payload) - : _fbService = AppComponent.myinjector.get(FirebaseService), + : _persistencyService = AppComponent.myinjector.get(PersistencyService), super(payload); @override @@ -137,7 +137,7 @@ class RequestDeleteEventAction extends RegattaAction implements AsyncActi @override Future call(MiddlewareApi api) { - return _fbService.deleteEvent(payload); + return _persistencyService.deleteEvent(payload); } } @@ -152,10 +152,10 @@ class DeleteEventAction extends RegattaAction { /// Action to request the add of a new SailingClub. class RequestCreateSailingClubAction extends RegattaAction implements AsyncAction { - final FirebaseService _fbService; + final PersistencyService _persistencyService; RequestCreateSailingClubAction(String payload) - : _fbService = AppComponent.myinjector.get(FirebaseService), + : _persistencyService = AppComponent.myinjector.get(PersistencyService), super(payload); @override @@ -163,7 +163,7 @@ class RequestCreateSailingClubAction extends RegattaAction implements As @override Future call(MiddlewareApi api) { - return _fbService.addSailingClub(new SailingClub(null, payload)); + return _persistencyService.addSailingClub(new SailingClub(null, payload)); } } @@ -178,10 +178,10 @@ class AddSailingClubAction extends RegattaAction { /// Action to add a SailingClub. class RequestUpdateSailingClubAction extends RegattaAction implements AsyncAction { - final FirebaseService _fbService; + final PersistencyService _persistencyService; RequestUpdateSailingClubAction(SailingClub payload) - : _fbService = AppComponent.myinjector.get(FirebaseService), + : _persistencyService = AppComponent.myinjector.get(PersistencyService), super(payload); @override @@ -189,7 +189,7 @@ class RequestUpdateSailingClubAction extends RegattaAction implemen @override Future call(MiddlewareApi api) { - return _fbService.updateSailingClub(payload); + return _persistencyService.updateSailingClub(payload); } } @@ -203,10 +203,10 @@ class UpdateSailingClubAction extends RegattaAction { /// Action to delete a SailingClub. class RequestDeleteSailingClubAction extends RegattaAction implements AsyncAction { - final FirebaseService _fbService; + final PersistencyService _persistencyService; RequestDeleteSailingClubAction(SailingClub payload) - : _fbService = AppComponent.myinjector.get(FirebaseService), + : _persistencyService = AppComponent.myinjector.get(PersistencyService), super(payload); @override @@ -214,7 +214,7 @@ class RequestDeleteSailingClubAction extends RegattaAction implemen @override Future call(MiddlewareApi api) { - return _fbService.deleteSailingClub(payload); + return _persistencyService.deleteSailingClub(payload); } } @@ -229,10 +229,10 @@ class DeleteSailingClubAction extends RegattaAction { /// Action to request the add of a new Boat. class RequestCreateBoatAction extends RegattaAction implements AsyncAction { - final FirebaseService _fbService; + final PersistencyService _persistencyService; RequestCreateBoatAction(String payload) - : _fbService = AppComponent.myinjector.get(FirebaseService), + : _persistencyService = AppComponent.myinjector.get(PersistencyService), super(payload); @override @@ -240,7 +240,7 @@ class RequestCreateBoatAction extends RegattaAction implements AsyncActi @override Future call(MiddlewareApi api) { - return _fbService.addBoat(new Boat(null, payload)); + return _persistencyService.addBoat(new Boat(null, payload)); } } @@ -255,10 +255,10 @@ class AddBoatAction extends RegattaAction { /// Action to add a Boat. class RequestUpdateBoatAction extends RegattaAction implements AsyncAction { - final FirebaseService _fbService; + final PersistencyService _persistencyService; RequestUpdateBoatAction(Boat payload) - : _fbService = AppComponent.myinjector.get(FirebaseService), + : _persistencyService = AppComponent.myinjector.get(PersistencyService), super(payload); @override @@ -266,7 +266,7 @@ class RequestUpdateBoatAction extends RegattaAction implements AsyncAction @override Future call(MiddlewareApi api) { - return _fbService.updateBoat(payload); + return _persistencyService.updateBoat(payload); } } @@ -280,10 +280,10 @@ class UpdateBoatAction extends RegattaAction { /// Action to delete a Boat. class RequestDeleteBoatAction extends RegattaAction implements AsyncAction { - final FirebaseService _fbService; + final PersistencyService _persistencyService; RequestDeleteBoatAction(Boat payload) - : _fbService = AppComponent.myinjector.get(FirebaseService), + : _persistencyService = AppComponent.myinjector.get(PersistencyService), super(payload); @override @@ -291,7 +291,7 @@ class RequestDeleteBoatAction extends RegattaAction implements AsyncAction @override Future call(MiddlewareApi api) { - return _fbService.deleteBoat(payload); + return _persistencyService.deleteBoat(payload); } } diff --git a/tmux.sh b/tmux.sh index 254875e..1bacce5 100755 --- a/tmux.sh +++ b/tmux.sh @@ -3,15 +3,19 @@ SESSION=$USER tmux -2 new-session -d -s $SESSION -tmux new-window -t $SESSION:2 -n 'Django-Backend' -tmux new-window -t $SESSION:3 -n 'Angular2-Frontend' -tmux new-window -t $SESSION:4 -n 'Selenium-TestServer' -tmux new-window -t $SESSION:5 -n 'Protractor-End2EndTest' +tmux new-window -t $SESSION:1 -n 'Frontend-Angular2-Server' +tmux new-window -t $SESSION:2 -n 'Frontend-Static-Tests' +tmux new-window -t $SESSION:3 -n 'Frontend-Unit-Tests' +tmux new-window -t $SESSION:4 -n 'Frontend-Browser-Tests' +#tmux new-window -t $SESSION:5 -n 'Protractor-Webdriver' +#tmux new-window -t $SESSION:6 -n 'Protractor-End2EndTest' -tmux send-keys -t $SESSION:2 'cd backend' ENTER 'make' ENTER -tmux send-keys -t $SESSION:3 'cd frontend' ENTER 'make' ENTER -tmux send-keys -t $SESSION:4 'cd e2e_tests' ENTER 'make' ENTER +tmux send-keys -t $SESSION:1 'cd frontend' ENTER 'make' ENTER +tmux send-keys -t $SESSION:2 'cd frontend' ENTER 'make lint && make style' ENTER +tmux send-keys -t $SESSION:3 'cd frontend' ENTER 'make test' ENTER +tmux send-keys -t $SESSION:4 'cd frontend' ENTER 'make dtests' +#tmux send-keys -t $SESSION:5 'cd e2e_tests' ENTER 'make' ENTER -tmux send-keys -t $SESSION:5 'cd e2e_tests' ENTER 'make tests' +#tmux send-keys -t $SESSION:6 'cd e2e_tests' ENTER 'make tests' tmux attach