From f40b28ecdaf059250d689b4eff8f1f1c84c38c0d Mon Sep 17 00:00:00 2001 From: Christian Gesell Date: Sun, 26 Mar 2017 16:54:07 +0200 Subject: [PATCH 1/4] Specific windows for angular frontend dev --- tmux.sh | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) 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 From e7e157f3f1bd8bb6c5c438413e36f869e74c1720 Mon Sep 17 00:00:00 2001 From: Christian Gesell Date: Sun, 26 Mar 2017 21:38:22 +0200 Subject: [PATCH 2/4] splitting persistency functionality into interface and implementation --- frontend/lib/app_component.dart | 3 +- frontend/lib/services/firebase_service.dart | 3 +- .../lib/services/persistency_service.dart | 78 +++++++++++++++++++ frontend/lib/store/regatta_action.dart | 5 +- 4 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 frontend/lib/services/persistency_service.dart 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/services/firebase_service.dart b/frontend/lib/services/firebase_service.dart index 2c82295..9b47446 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; diff --git a/frontend/lib/services/persistency_service.dart b/frontend/lib/services/persistency_service.dart new file mode 100644 index 0000000..bce42a8 --- /dev/null +++ b/frontend/lib/services/persistency_service.dart @@ -0,0 +1,78 @@ +import 'dart:async'; + +import 'package:angular2/core.dart'; +import 'package:firebase/firebase.dart' as fb; +import 'package:frontend/models/event.dart'; +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; + +// TODO: Should we have a percistency Interface that is segregated from the authentication interface? +// OR: Does authentication mean for us: "authenticate to access percistency"? + + +// can't be Injectable because it is abstract ... @Injectable() +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..3586519 100644 --- a/frontend/lib/store/regatta_action.dart +++ b/frontend/lib/store/regatta_action.dart @@ -1,5 +1,6 @@ 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'; @@ -75,10 +76,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 _fbService; RequestCreateEventAction(String payload) - : _fbService = AppComponent.myinjector.get(FirebaseService), + : _fbService = AppComponent.myinjector.get(PersistencyService), super(payload); @override From d0159719c1b55defa7058ae5bcb43b6ed20e2e74 Mon Sep 17 00:00:00 2001 From: Christian Gesell Date: Sun, 26 Mar 2017 21:59:13 +0200 Subject: [PATCH 3/4] Cleanup and renaming - firebase dependency isolated --- .../lib/components/app_header/app_header.dart | 4 +- .../lib/services/persistency_service.dart | 1 - frontend/lib/store/regatta_action.dart | 55 +++++++++---------- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/frontend/lib/components/app_header/app_header.dart b/frontend/lib/components/app_header/app_header.dart index 3be214f..167e2a4 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/persistency_service.dart b/frontend/lib/services/persistency_service.dart index bce42a8..f3acee5 100644 --- a/frontend/lib/services/persistency_service.dart +++ b/frontend/lib/services/persistency_service.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:angular2/core.dart'; -import 'package:firebase/firebase.dart' as fb; import 'package:frontend/models/event.dart'; import 'package:frontend/models/sailing_club.dart'; import 'package:frontend/models/boat.dart'; diff --git a/frontend/lib/store/regatta_action.dart b/frontend/lib/store/regatta_action.dart index 3586519..1ba391f 100644 --- a/frontend/lib/store/regatta_action.dart +++ b/frontend/lib/store/regatta_action.dart @@ -6,7 +6,6 @@ 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); @@ -76,10 +75,10 @@ abstract class RegattaAction extends Action { /// Action to request the add of a new Event. class RequestCreateEventAction extends RegattaAction implements AsyncAction { - final PersistencyService _fbService; + final PersistencyService _persistencyService; RequestCreateEventAction(String payload) - : _fbService = AppComponent.myinjector.get(PersistencyService), + : _persistencyService = AppComponent.myinjector.get(PersistencyService), super(payload); @override @@ -87,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)); } } @@ -102,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 @@ -113,7 +112,7 @@ class RequestUpdateEventAction extends RegattaAction implements AsyncActi @override Future call(MiddlewareApi api) { - return _fbService.updateEvent(payload); + return _persistencyService.updateEvent(payload); } } @@ -127,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 @@ -138,7 +137,7 @@ class RequestDeleteEventAction extends RegattaAction implements AsyncActi @override Future call(MiddlewareApi api) { - return _fbService.deleteEvent(payload); + return _persistencyService.deleteEvent(payload); } } @@ -153,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 @@ -164,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)); } } @@ -179,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 @@ -190,7 +189,7 @@ class RequestUpdateSailingClubAction extends RegattaAction implemen @override Future call(MiddlewareApi api) { - return _fbService.updateSailingClub(payload); + return _persistencyService.updateSailingClub(payload); } } @@ -204,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 @@ -215,7 +214,7 @@ class RequestDeleteSailingClubAction extends RegattaAction implemen @override Future call(MiddlewareApi api) { - return _fbService.deleteSailingClub(payload); + return _persistencyService.deleteSailingClub(payload); } } @@ -230,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 @@ -241,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)); } } @@ -256,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 @@ -267,7 +266,7 @@ class RequestUpdateBoatAction extends RegattaAction implements AsyncAction @override Future call(MiddlewareApi api) { - return _fbService.updateBoat(payload); + return _persistencyService.updateBoat(payload); } } @@ -281,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 @@ -292,7 +291,7 @@ class RequestDeleteBoatAction extends RegattaAction implements AsyncAction @override Future call(MiddlewareApi api) { - return _fbService.deleteBoat(payload); + return _persistencyService.deleteBoat(payload); } } From 53862e623ebf0867503c822009bf16815ca510a3 Mon Sep 17 00:00:00 2001 From: Christian Gesell Date: Mon, 27 Mar 2017 22:38:55 +0200 Subject: [PATCH 4/4] Style stuff --- frontend/lib/components/app_header/app_header.dart | 2 +- frontend/lib/services/firebase_service.dart | 11 +++++++++++ frontend/lib/services/persistency_service.dart | 7 ------- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/frontend/lib/components/app_header/app_header.dart b/frontend/lib/components/app_header/app_header.dart index 167e2a4..87b577d 100644 --- a/frontend/lib/components/app_header/app_header.dart +++ b/frontend/lib/components/app_header/app_header.dart @@ -10,7 +10,7 @@ import 'package:frontend/services/persistency_service.dart'; directives: const [materialDirectives], providers: const [materialProviders]) class AppHeader { - final PersistencyService fbService; + final PersistencyService fbService; AppHeader(this.fbService); } diff --git a/frontend/lib/services/firebase_service.dart b/frontend/lib/services/firebase_service.dart index 9b47446..7ad8984 100644 --- a/frontend/lib/services/firebase_service.dart +++ b/frontend/lib/services/firebase_service.dart @@ -58,6 +58,7 @@ class FirebaseService implements PersistencyService { } } + @override Future signIn() async { try { await _fbAuth.signInWithPopup(_fbGoogleAuthProvider); @@ -66,6 +67,7 @@ class FirebaseService implements PersistencyService { } } + @override void signOut() { _fbAuth.signOut(); } @@ -76,6 +78,7 @@ class FirebaseService implements PersistencyService { _store.dispatch(actions.addEvent(ev)); } + @override Future addEvent(Event event) async { try { await _fbRefEvents.push(event.toMap()).future; @@ -89,6 +92,7 @@ class FirebaseService implements PersistencyService { _store.dispatch(actions.updateEvent(ev)); } + @override Future updateEvent(Event event) async { try { await _fbRefEvents.child(event.key).update(event.toMap()); @@ -102,6 +106,7 @@ class FirebaseService implements PersistencyService { _store.dispatch(actions.deleteEvent(ev)); } + @override Future deleteEvent(Event event) async { try { await _fbRefEvents.child(event.key).remove(); @@ -116,6 +121,7 @@ class FirebaseService implements PersistencyService { _store.dispatch(actions.addSailingClub(sc)); } + @override Future addSailingClub(SailingClub sailingClub) async { try { await _fbRefSailingClubs.push(sailingClub.toMap()).future; @@ -129,6 +135,7 @@ class FirebaseService implements PersistencyService { _store.dispatch(actions.updateSailingClub(sc)); } + @override Future updateSailingClub(SailingClub sailingClub) async { try { await _fbRefSailingClubs.child(sailingClub.key).update(sailingClub.toMap()); @@ -142,6 +149,7 @@ class FirebaseService implements PersistencyService { _store.dispatch(actions.deleteSailingClub(sc)); } + @override Future deleteSailingClub(SailingClub sailingClub) async { try { await _fbRefSailingClubs.child(sailingClub.key).remove(); @@ -156,6 +164,7 @@ class FirebaseService implements PersistencyService { _store.dispatch(actions.addBoat(sc)); } + @override Future addBoat(Boat sailingClub) async { try { await _fbRefBoats.push(sailingClub.toMap()).future; @@ -169,6 +178,7 @@ class FirebaseService implements PersistencyService { _store.dispatch(actions.updateBoat(sc)); } + @override Future updateBoat(Boat sailingClub) async { try { await _fbRefBoats.child(sailingClub.key).update(sailingClub.toMap()); @@ -182,6 +192,7 @@ class FirebaseService implements PersistencyService { _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 index f3acee5..3bd8d65 100644 --- a/frontend/lib/services/persistency_service.dart +++ b/frontend/lib/services/persistency_service.dart @@ -1,19 +1,12 @@ import 'dart:async'; -import 'package:angular2/core.dart'; import 'package:frontend/models/event.dart'; 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; // TODO: Should we have a percistency Interface that is segregated from the authentication interface? -// OR: Does authentication mean for us: "authenticate to access percistency"? - -// can't be Injectable because it is abstract ... @Injectable() abstract class PersistencyService { - // final RegattaStore _store; // PersistencyService(this._store);