2021-05-28 22:20:20 +02:00
|
|
|
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
|
|
|
|
=============
|
|
|
|
|
2021-05-31 21:56:02 +02:00
|
|
|
Systemkontext Backend
|
|
|
|
*********************
|
|
|
|
|
2021-05-28 22:20:20 +02:00
|
|
|
.. uml:: systemcontext.plantuml.txt
|
|
|
|
|
|
|
|
Use cases
|
|
|
|
=========
|
|
|
|
|
|
|
|
Nutzerprofilverwaltung
|
|
|
|
**********************
|
|
|
|
|
|
|
|
Suche nach Mitgliedern
|
|
|
|
**********************
|
|
|
|
|
|
|
|
Datenmodell
|
|
|
|
===========
|
|
|
|
|
|
|
|
.. uml:: erdmodel.plantuml.txt
|
|
|
|
|
2021-05-31 21:56:02 +02:00
|
|
|
Ü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).
|