RFC|Feature // Web-API // Ein Modul muss mehrerer Web-APIs ansprechen können
Im Ticket #463(RFC|Feature // Login|Authentifizierung) wird das Login-Verfahren für die App beschrieben und implementiert. Dabei wird die Anforderung gestellt, dass die App ihre Daten direkt von den Servicen abholt. Dafür muss die App die verschiedenen APIs der Service verstehen und ansprechen können. Zusätzlich muss es möglich sein den Access-Token oder den ID-Token zu übermitteln.
Konzept
Damit die App selbständig unterschiedliche Server/Service ansprechen kann, sollte für jeden Service ein Provider in der App hinterlegt werden. Ein Provider ist eine Bibliothek, welche weiß wie man mit dem einzelnen Service Kommuniziert und die Daten des Service in ein einheitliches App-Format übersetzt. Die Module können auf den Provider zugreifen, um benötigte Daten zu erhalten.
In diesem Beispiel ist im Noten-Modul konfiguriert, dass die Noten-Daten über einen Moodle-Server abgeholt werden sollen. Somit wird der Moodle-Provider aktiviert und dieser für die Kommunikation mit dem Moodle-Server verwendet. Dabei stellen alle Provider die selbe Schnittelle für das Noten-Modul bereit.
Implementieren mit React-Kontexte
Auswirkungen
Somit wir der ASiST-Server nicht mehr benötigt, wodurch eine zu wartende Komponente im Server- bzw Kommunikationsdesign entfällt. Es werden alle Entwicklungen am ASiST-Sever eingestellt, um dieses Konzept stetig umzusetzen.
ALT
Mit dem Login muss die App ihre Daten direkt vom Service abholen, dazu muss ein Modul mehrerer Service(Web-APIs) unterstützen. Z.B.: Muss die App die Notendaten direkt vom HIS abholen können, da der Nutzer dort eingeloggt ist. Über den Kollektor werden die Daten nur im Notfall geleitet.
Wie kann man das Aufbauen?
Ein kleiner Prototyp ist im Event-Modul zu finden.
classDiagram
Client <|-- RestClient
Client <|-- GraphQLClient
APIContext o-- Client: Erzeugt und enthält
NewsContextProvider ..> View: Ummantelt
NewsContextProvider ..|> APIContext: erzeugt
class NewsView {
}
class NewsContext {
client: Client
}
class NewsContextProvider {
}
class Client {
+getNews()
}
class RestClient {
+getNews()
}
class GraphQLClient {
+getNews()
}