/symfony-api-test

Simple Symfony Api Test

Primary LanguagePHP

Test Symfony Backend

verfügbare Zeit: 2 - 3 h

Voraussetzungen

Für Windows 10 Nutzer

  • Bitte WSL2 installieren
  • Debian aus dem MS-Store laden und installieren
  • mit PS (Powershell) oder WinT (Windows Terminal) ins Debian-Image wechseln (einfach 'Debian' eingeben)
  • Den Code im WSL-Image von Debian clonen

Wenn das erfolgt ist, gelten die folgenden Schritte auch für Windows im WSL-Kontext

Vorbereitung

  • dieses Repo forken
  • geforktes Repo auschecken
  • in das Repo wechseln
  • folgendes ausführen
docker compose up --build

## Dependencies im Container installieren
docker compose exec php composer install
docker compose exec php bin/console assets:install --relative

Alternativ können die Shortcuts via Makefile genutzt werden: make init etc.

Troubleshooting:

Dependencies lokal installieren (erfordert Composer + PHP 8.2):

composer install --ignore-platform-reqs --no-scripts
## assets via copy installieren
bin/console assets:install

PGAdmin

Bei PGAdmin muss das Verzeichnis wie folgt geändert werden:

sudo chown -R 5050:5050 .pgadmin

PGAdmin ist via docker unter http://localhost:5050/ erreichbar.

User: user@domain.com
PW: SuperSecret

Datenbank

Die Datenbank wird mit docker-compose automatisch erstellt und mit Testdaten befüllt. Diese Struktur kann und soll nicht angepasst werden. Es handelt sich hierbei um die einzige "legacy" Stelle des Backends.

Symfony sollte nun via http://localhost:8080 und Api Platform unter http://localhost:8080/api erreichbar sein.

Commits

Bitte mache in regelmäßigen Abständen Commits deiner Arbeit, damit wir den Fortschritt nach verfolgen können, wenn du den PR aufmachst.

Aufgabenstellung

Es soll eine Backend-Api erstellt werden, mit der die Kundendaten eines Fondsvermittlers ausgelesen, aktualisiert sowie neu erstellt und gelöscht werden können. Die Ausgabe soll im JSON(+ld) Format erfolgen.

Die API soll vorrangig mit Hilfe von API-Platform erstellt und mit OpenApi dokumentiert werden.

Alle Bundles müssen selbst konfiguriert und eingestellt werden. Bsp. services.yaml, security.yaml, lexik_jwt_authentication.yaml

Jeder Vermittler aus der Tabelle std.vermittler darf n Kunden haben. Ausgegeben werden sollen nur Kunden, die dem Vermittler anhand der ID zugeordnet und nicht gelöscht sind. Die Vermittlerdaten selbst sollen nicht mit ausgegeben werden.
Jeder Kunde kann n Adressen haben, die wiederum eine 1:1 Beziehung zu std.kunde_adresse haben, wo festgelegt wird, ob die Adresse geschäftlich genutzt wird und als Rechnungsadresse genutzt werden darf. Zusätzlich besitzt jeder Kunde einen Onlinezugang der in sec.users steht.

Hilfreiche Links

Zusatzaufgabe

Zur Sicherheit soll die API mit einem JWT abgesichert werden. Dafür soll ein JWT nach einem Login via POST erzeugt werden. Nur Vermittler mit einem aktiven Zugang (sec.vermittler_user) dürfen sich einloggen und einen JWT erhalten.
Für den JWT kommt das Bundle lexik/jwt-authentication zur Anwendung.

Daten-Anforderungen

  • Folgende Felder sind erforderlich:
    • Kunde: vorname, nachname, geburtsdatum
    • Adresse: strasse, plz, ort, bundesland
    • User: username (email), password
  • Das Passwort eines Kunden darf nicht mit ausgegeben werden
  • Das Passwort darf beim Erstellen eines Users nicht leer sein
  • Das Passwort eines Kunden soll 8 Zeichen lang sein und Groß/Kleinbuchstaben sowie mind. eine Zahl und ein Sonderzeichen enthalten
  • Die E-Mail-Adresse des Kunden muss valide sein
  • Wird ein Datensatz aus einer Tabelle auf "gelöscht" gesetzt, darf dieser bei einer Abfrage nicht erscheinen

Folgende Ressourcen werden erwartet

  • foo/kunden
    • GET Collection (alle Kunden des eingeloggten Vermittlers), POST neuer Kunde für den VP
  • foo/kunden/{id}
    • GET/PUT/DELETE
  • foo/adressen
    • GET Collection (alle Adressen aller Kunden für den eingeloggten VP), POST neue Adresse für einen Kunden
  • foo/adressen/{id}
    • GET/PUT/DELETE
  • foo/user
    • GET Collection, POST neuer User für einen Kunden
  • foo/user/{id}
    • GET/PUT/DELETE

Sub-Ressourcen

  • foo/kunden/{id}/adressen
    • GET Collection Adressen eines Kunden
  • foo/kunden/{id}/user
    • GET Collection user eines Kunden
  • foo/kunden/{id}/adressen/{id}/details
    • GET Collection Details zu einer Adresse eines Kunden

Bestehende Vermittler (inaktive und aktive)

Erwartetes JSON Format

{
    "id": "CF451PQ9",
    "name": "Mustermann",
    "vorname": "Max",
    "geburtsdatum": "1970-01-01",
    "geschlecht": "divers",
    "email": "max.mustermann@example.org",
    "vermittlerId": 1000,
    "adressen": [
        {
            "adresseId": 1,
            "strasse": "Musterstrasse 12",
            "plz": "01234",
            "ort": "Musterort",
            "bundesland": "BE",
            "details": {
                "geschaeftlich": false,
                "rechnungsadresse": true
            }
        }
    ],
    "user": {
        "username": "max.mustermann@example.org",
        "aktiv": 1,
        "lastLogin": "2020-05-01T20:20:20+02:00"
    }
}