Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[API Client] API Client Code aus den Komponenten herausziehen #259

Open
vlow opened this issue Apr 27, 2020 · 4 comments
Open

[API Client] API Client Code aus den Komponenten herausziehen #259

vlow opened this issue Apr 27, 2020 · 4 comments
Assignees
Labels
change Ein aktuelles Verhalten oder eine Eigenschaft ist nicht falsch, soll sich aber trotzdem ändern. epic > 2 Tage. Ein Change, der schwer zu fassen ist und mehr als zwei Tage braucht. frontend

Comments

@vlow
Copy link
Collaborator

vlow commented Apr 27, 2020

Wir entwerfen einen Blueprint für die Behandlung von Service Calls im Frontend und ziehen den API Client Code aus allen UI Komponenten entsprechend um.

Dieses Ticket gilt als Epic für alle damit verbundenen Tätigkeiten. Diese sind in einzelnen Tickets und in dem verknüpften Projekt zu bearbeiten. Der Übersicht halber erhalten alle Tickets, die Teil dieses Epics sind, das Prefix [API Client].

@vlow vlow added frontend epic > 2 Tage. Ein Change, der schwer zu fassen ist und mehr als zwei Tage braucht. change Ein aktuelles Verhalten oder eine Eigenschaft ist nicht falsch, soll sich aber trotzdem ändern. labels Apr 27, 2020
@vlow vlow added this to the v1.3 | to-be-named milestone Apr 27, 2020
@vlow vlow changed the title API Client Code aus den Komponenten herausziehen [API Client] API Client Code aus den Komponenten herausziehen Apr 27, 2020
defaude added a commit that referenced this issue Apr 27, 2020
Also migrated the "ImageService" to utilize it as "ShopImageService"

Relates to #260 and to #259
defaude added a commit that referenced this issue Apr 27, 2020
defaude added a commit that referenced this issue Apr 27, 2020
defaude added a commit that referenced this issue Apr 27, 2020
defaude added a commit that referenced this issue Apr 27, 2020
The changes relating to this client are most likely on an unmerged branch yet

Relates to #260 and to #259
defaude added a commit that referenced this issue Apr 27, 2020
defaude added a commit that referenced this issue Apr 27, 2020
defaude added a commit that referenced this issue Apr 27, 2020
defaude added a commit that referenced this issue Apr 27, 2020
Reasoning: The HttpClient will always return an Observable<Object>, anyway.
Since we're relying on the backend actually providing stuff that matches our
expectations "by convention", we can simply ignore the Observable type inside
the promisify method. This allows us to remove pesky "as Observable<any>"
annotations in Client implementations.

Relates to #259
defaude added a commit that referenced this issue Apr 27, 2020
… to use it

Also move AdminService into "service" directory
@defaude
Copy link
Collaborator

defaude commented Apr 27, 2020

Habe schon einmal einen größeren Teil der Backend Controller im Frontend als Clients gespiegelt. Ein paar fehlen allerdings noch, das sollte jedoch im Prinzip nur Fleißarbeit sein.

Nächster Schritt: Einziehen einer Service-Schicht zwischen den Clients und den UI Komponenten (ein Bisschen Inspiration gibt's ja schon z.B. mit dem AdminService).

In der ersten Welle würde der Auslöser, ob ein Request raus gehen soll oder nicht, immer noch von der jeweiligen UI Komponente ausgehen - aber der Service hat die Möglichkeit, zu entscheiden, ob er mit dem Request wirklich bis zum Client durchgeht oder ob vllt. von einem vorherigen Request (z.B. Postleitzahl-Suche) eine response (Promise) herumliegt

@defaude
Copy link
Collaborator

defaude commented Apr 27, 2020

Ein nächster Schritt wäre dann, die Services (wo sinnvoll) so umzubauen, dass sie eine "resolve" Funktion für die relevanten Routen haben, wo die benötigten Daten geladen werden und die Navigation im Routing festgehalten wird, bis die Daten da sind.

Beispiel: User navigiert zu /shops/foo123

  1. Router ruft die entsprechende "resolve" Methode auf dem ShopService auf
  2. Dieser weiß jetzt, dass die Details für den Laden geholt werden müssen (trigger)
  3. Der Service schaut erst mal, ob er ggf. die Daten schon hat (etwa von einem vorherigen Besuch der gleichen Shop-Seite)
  4. Nur wenn nein, werden die Daten per Client vom Backend geladen
  5. "resolve" ist fertig
  6. Router macht mit seiner Arbeit weiter
  7. ShopDetailsPage wird vom Router auf die Bühne gestellt und holt sich beim ShopService die Daten (immer noch eine Promise, weil diese Daten per Definition nur Asynchron vorhanden sind
  8. Da diese Promise aber sofort resolved (oder rejected im Fehlerfall), kann die UI instant was anzeigen

@defaude
Copy link
Collaborator

defaude commented Apr 27, 2020

Im Fehlerfall ist es auch denkbar, die "resolve" Funktion rejecten zu lassen - aber da muss ich erst noch mal nachlesen, wie der Router sich da verhält (und wir müssen uns überlegen, wie wir diesen Fehlerzustand darstellen wollen, da bisher das Handling dieses Fehlers erst auf der jeweiligen Seite passiert ist)

@veronika-schwarz veronika-schwarz self-assigned this Oct 12, 2020
@veronika-schwarz
Copy link
Collaborator

Ich mach das mal noch fertig

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
change Ein aktuelles Verhalten oder eine Eigenschaft ist nicht falsch, soll sich aber trotzdem ändern. epic > 2 Tage. Ein Change, der schwer zu fassen ist und mehr als zwei Tage braucht. frontend
Projects
None yet
Development

No branches or pull requests

3 participants