Architecture ############ Systembeschreibung ================== Die Kompentenzinventar-Software dient zur: - Eintragung und Speicherung von Nutzerprofilen - Suche nach Nutzerprofilen mit geeigneten Erfahrungen Kompetenzinventar - Anforderungen ********************************* - Kompetenz Verwaltung aller WTF Member (aktuell ca. 150) Tendenz stark wachsen - Einfache Verwaltung eigener Kompetenzen, Business Wünsche - Einfache Suche von Fähigkeiten - Netzwerk - Nur für Interne Verwendung - xing aber intern - Auf der Seite müssen SKills, Erfahrungen und Projektwünsche skizziert werden können - Z.b. Scammo, Flensburg, Kann: Javascript, Vue, Projekte, PHP, Events Sucht: Projekte als Freelancer 8-40H; Spricht Deutsch und English; - Muss einfach für die Member erreichbar sein; Primär die Pflege der Daten - Sollte auch Member abholen, die nicht so viel Zeit bei der WTF verbringen Technisch --------- - Muss WTF gehostet sein - Bus Faktor aka Es darf nicht alles von einen Menschen abhängig machen - Möglichst Resourcen Schonend in Entwicklung und Betrieb Systemkontext ============= Systemkontext Backend ********************* .. uml:: systemcontext.plantuml.txt Use cases ========= Nutzerprofilverwaltung ********************** Suche nach Mitgliedern ********************** Datenmodell =========== .. uml:: erdmodel.plantuml.txt Überblick Rest API ================== Authentifizierung ***************** HTTP Bearer Token. Wird vom Backend verwaltet. Es gibt eine konfigurierbare, maximale Gültigkeit für einen Token. Allgemeine Antworten: * 401: Anfrage ohne Token * 403: Token abgelaufen oder ungültig Authorisierung ************** * Zugriff nur mit Login * Jeder eingloggte Benutzer darf alles sehen * Ein Benutzer darf nur sein eigenes Profil bearbeiten Endpunkte ***************** POST `/users/login` ------------------- Hiermit kann sich ein Benutzer anmelden. Der Endpunkt authentifiziert gegen LDAP. Anfrage: .. code-block:: text :linenos: { "username": "peter", "password": "asdasd" } Antwort: **Status 200** Login hat geklappt .. code-block:: json { "token": "aSDASDADASDASD" } **Status 403** Login hat nicht geklappt. Grund ist Benutzer existiert nicht oder Passwort war falsch. Kein weiterer Text über die API wegen Sicherheit. DELETE `/users/login` --------------------- Markiert den zur Request Authentifizierung verwendeten Token als nicht mehr gültig. POST `/users/profile` --------------------- Speichert ein Profil ab. Übertragene Daten entsprechen #3 im JSON Format. Anfrage: .. code-block:: json { "profile": {} } Antwort: **Status 200** Gespeichert, ok **Status 400** Validierung fehlgeschlagen .. code-block:: json { "messages": { "nickname": "Bitte ausfüllen" } } GET `/users/{id}/profile` ------------------------- Endpunkt um ein Profil gezielt nach ID abzurufen. Antwort: **Status 200** Profil gefunden .. code-block:: json { "profile": {} } GET `/users/profiles` ------------------------- Suche nach Profilen mit Query-Parametern: * `skill[]=PHP` * `page=1` für die Paginierung * `page_size=20` Einträge pro Seite (Liste wird erweitert). Antwort: .. code-block:: json { "total": 23, "profiles": [] } * `total` Gesamtanzahl der passenden Profile * `profils` Liste mit Profilen GET `/skills` ------------------------- Hier können die auswählbaren Fähigkeiten inkl. Autovervollständigung abgerufen werden sowie "Ich Suche". * `search=an` * Es werden 10 Einträge zurückgegeben Antwort: .. code-block:: json { "skills": [ { "id": 23, "name": "Angular" }, { "id": 42, "name": "Anforderungs-Management" } ] } GET `/skills/{id}/icon` ----------------------- Icon einer Fähigkeit (weils gut ausschaut). GET `/languages` ---------------- Abruf der Sprachen. * `search=fra` * Es werden 10 Einträge zurückgegeben Antwort: .. code-block:: json { "languages": [ { "id": 23, "name": "Französisch" } ] } GET `/languages/{id}/icon` -------------------------- Icon einer Sprache (weils gut ausschaut).