Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
78347140ae | |||
e8cdb715f2 | |||
774168e93a | |||
58d0657657 |
@ -7,92 +7,117 @@ hide circle
|
|||||||
skinparam linetype ortho
|
skinparam linetype ortho
|
||||||
|
|
||||||
entity "user" as user {
|
entity "user" as user {
|
||||||
*user_id : number <<generated>>
|
*id : number <<generated>>
|
||||||
--
|
--
|
||||||
*nickname : text
|
*nickname : text(25)
|
||||||
*pronouns : text
|
pronouns : text(25)
|
||||||
*address_1_name: text
|
fullname: text(100)
|
||||||
*address_2_additional: text
|
volunteerwork: text(4000)
|
||||||
*address_4_street: text
|
freetext: text(4000)
|
||||||
*adress_house_number: text
|
*created: datetime
|
||||||
*adress_city_code: text
|
*updated: datetime
|
||||||
*adress_country: text
|
|
||||||
*Ehrenaemter: text
|
|
||||||
*gravatar_email : text
|
|
||||||
*Freitext: text
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entity user_address {
|
||||||
|
*id : number <<generated>>
|
||||||
|
*userid
|
||||||
|
--
|
||||||
|
street: text(25)
|
||||||
|
house_number: text(10)
|
||||||
|
additional: text(25)
|
||||||
|
postcode: text(10)
|
||||||
|
city: text(25)
|
||||||
|
country: text(25)
|
||||||
|
}
|
||||||
|
user ||-o{ user_address : user_has_address
|
||||||
|
|
||||||
entity user_skill {
|
entity user_skill {
|
||||||
user_id: id
|
*user_id: id
|
||||||
skill_id: id
|
*skill_id: id
|
||||||
--
|
--
|
||||||
level: number
|
level: number
|
||||||
}
|
}
|
||||||
|
|
||||||
entity user_language {
|
entity user_language {
|
||||||
user_id: id
|
*user_id: id
|
||||||
language_id: id
|
*language_id: id
|
||||||
--
|
--
|
||||||
level: number
|
level: number
|
||||||
}
|
}
|
||||||
|
|
||||||
entity skill {
|
entity skill {
|
||||||
skill_id
|
*id : number <<generated>>
|
||||||
--
|
--
|
||||||
*name: text
|
*name: text(25)
|
||||||
}
|
}
|
||||||
|
|
||||||
entity user_experience {
|
entity user_experience {
|
||||||
user_id
|
*id : number <<generated>>
|
||||||
|
*user_id
|
||||||
--
|
--
|
||||||
description
|
description
|
||||||
start: date
|
start: date
|
||||||
end: date
|
end: date
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entity user_experience_experience {
|
||||||
|
*user_experience_id
|
||||||
|
*experience_id
|
||||||
|
}
|
||||||
|
|
||||||
|
user ||--o{ user_experience : user_has_experience
|
||||||
|
user_experience ||--o{ user_experience_experience : user_experience_is_tagged_with
|
||||||
|
|
||||||
|
entity experience {
|
||||||
|
*id : number <<generated>>
|
||||||
|
--
|
||||||
|
*name: text(25)
|
||||||
|
}
|
||||||
|
user_experience_experience }o--|| experience
|
||||||
|
|
||||||
|
|
||||||
entity user_search_topic {
|
entity user_search_topic {
|
||||||
user_id
|
*user_id
|
||||||
topic_id
|
*topic_id
|
||||||
|
--
|
||||||
}
|
}
|
||||||
|
|
||||||
entity user_contact {
|
entity user_contact {
|
||||||
user_id
|
*id : number <<generated>>
|
||||||
contact_type_id
|
*user_id
|
||||||
|
*contact_type_id
|
||||||
--
|
--
|
||||||
content_: text
|
*content: text(200)
|
||||||
}
|
}
|
||||||
|
|
||||||
entity topic {
|
entity topic {
|
||||||
topic_id
|
*id : number <<generated>>
|
||||||
--
|
--
|
||||||
*name: text
|
*name: text
|
||||||
}
|
}
|
||||||
|
|
||||||
entity language {
|
entity language {
|
||||||
id
|
*id : number <<generated>>
|
||||||
--
|
--
|
||||||
name: text
|
*name: text(25)
|
||||||
}
|
}
|
||||||
|
|
||||||
entity experience {
|
entity contact_type {
|
||||||
id
|
*id : number <<generated>>
|
||||||
--
|
--
|
||||||
name: text
|
*name: text(25)
|
||||||
}
|
|
||||||
|
|
||||||
entity contact_types {
|
|
||||||
id
|
|
||||||
--
|
|
||||||
name
|
|
||||||
}
|
}
|
||||||
|
|
||||||
user ||--o{ user_skill : user_has_skills
|
user ||--o{ user_skill : user_has_skills
|
||||||
user_skill ||-o{ skill
|
user_skill ||--o{ skill
|
||||||
user ||--o{ user_experience : user_has_experience
|
|
||||||
user_experience ||-o{ experience : user_experience_is_tagged_with
|
user ||--o{ user_language : user_speaks_language
|
||||||
user ||-o{ user_language : user_speaks_language
|
user_language||--{ language
|
||||||
user_language||-{ language
|
|
||||||
user ||-o{ user_search_topic
|
user ||--o{ user_search_topic
|
||||||
user_search_topic ||-o{ topic
|
user_search_topic ||--o{ topic
|
||||||
|
|
||||||
|
user ||-o{ user_contact
|
||||||
|
user_contact ||-o{ contact_type
|
||||||
|
|
||||||
@enduml
|
@enduml
|
||||||
|
@ -34,6 +34,9 @@ Technisch
|
|||||||
Systemkontext
|
Systemkontext
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
Systemkontext Backend
|
||||||
|
*********************
|
||||||
|
|
||||||
.. uml:: systemcontext.plantuml.txt
|
.. uml:: systemcontext.plantuml.txt
|
||||||
|
|
||||||
Use cases
|
Use cases
|
||||||
@ -50,3 +53,193 @@ Datenmodell
|
|||||||
|
|
||||||
.. uml:: erdmodel.plantuml.txt
|
.. 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).
|
||||||
|
@ -19,10 +19,10 @@
|
|||||||
|
|
||||||
project = 'kompetenzinventar'
|
project = 'kompetenzinventar'
|
||||||
copyright = '2021, diverse'
|
copyright = '2021, diverse'
|
||||||
author = 'diverse'
|
author = 'Gulliver <gulliver@wtf-eg.de>, Scammo, Weeman'
|
||||||
|
|
||||||
# The full version, including alpha/beta/rc tags
|
# The full version, including alpha/beta/rc tags
|
||||||
release = '0.1'
|
release = '0.0.2'
|
||||||
|
|
||||||
|
|
||||||
# -- General configuration ---------------------------------------------------
|
# -- General configuration ---------------------------------------------------
|
||||||
@ -42,7 +42,7 @@ templates_path = ['_templates']
|
|||||||
#
|
#
|
||||||
# This is also used if you do content translation via gettext catalogs.
|
# This is also used if you do content translation via gettext catalogs.
|
||||||
# Usually you set "language" from the command line for these cases.
|
# Usually you set "language" from the command line for these cases.
|
||||||
language = 'de en'
|
language = 'de'
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and
|
# List of patterns, relative to source directory, that match files and
|
||||||
# directories to ignore when looking for source files.
|
# directories to ignore when looking for source files.
|
||||||
|
Reference in New Issue
Block a user