Freelancer Pool Modul
Zweck
Das Freelancer Pool Modul bietet einen öffentlichen Freelancer-Pool für Sicherheitsfirmen. Es ermöglicht Schichten öffentlich auszuschreiben, Freelancer-Bewerbungen zu verwalten, Verifizierungsprozess, Profil-Ansicht und Matching-System für passende Freelancer.
Verantwortlichkeiten
Was gehört zum Modul
- Öffentlicher Pool: Öffentliche Schichten ausschreiben
- Freelancer-Bewerbungen: Bewerbungen verwalten
- Verifizierungsprozess: Verifizierung von Freelancern
- Profil-Ansicht: Freelancer-Profile anzeigen
- Matching-System: Matching für passende Freelancer
Was gehört nicht zum Modul
- Schicht-Verwaltung: Siehe shift-pool Modul
- Freelancer-Verwaltung: Siehe support Modul
Implementierung
Backend- und Frontend-API sind modular aufgebaut; Details siehe interne Entwickler-Dokumentation.
Konfiguration
Entitlement
Das Modul ist ein Core-Modul und erfordert kein spezielles Entitlement. Es ist immer aktiv.
Entitlement-Key: Keiner (Core-Modul)
Environment Variables
Keine modulspezifischen ENV-Variablen erforderlich.
Defaults
- Öffentlicher Zugriff: Öffentliche Schichten sind ohne Auth sichtbar
Abhängigkeiten
Optionale Abhängigkeiten
Keine.
Core-Abhängigkeiten
- shift-pool: Für Schicht-Daten
API-Endpoints
Authentifizierung
Öffentliche Endpoints erfordern keine Authentifizierung. Admin-Endpoints erfordern Auth.
Header: Authorization: Bearer <token> (nur für Admin-Endpoints)
Sicherheit öffentlicher Endpoints
Alle öffentlichen Endpoints (Pool-Liste, Apply, Register) unterliegen verbindlichen Schutzmaßnahmen:
- Rate Limiting / Throttling auf allen öffentlichen Endpoints
- Anti-Abuse (Bot-Protection / CAPTCHA oder vergleichbar) speziell für Register und Apply
- Keine User-Enumeration: generische Fehlermeldungen (z. B. bei DUPLICATE)
- Secret-Hygiene: Passwörter und Tokens werden niemals geloggt; Token-/Passwort-Redaction
- Least Privilege: Hochprivilegierte Endpoints (z. B. SuperAdmin) werden nicht öffentlich dokumentiert
Öffentliche Pool-Liste
GET /api/freelancer/pool/public
Öffentliche Pool-Liste (alle Schichten mit isPublicPool: true). Kein Auth erforderlich.
Query-Parameter:
- from (optional): Start-Datum
- to (optional): End-Datum
- location (optional): Standort-Filter
- q (optional): Suchbegriff
Response:
{
"shifts": [
{
"id": "shift123",
"title": "Schicht-Titel",
"startsAt": "2024-01-15T08:00:00Z",
"endsAt": "2024-01-15T17:00:00Z",
"location": "Standort A",
"isPublicPool": true
}
],
"count": 1
}
Auf öffentliche Schicht bewerben
POST /api/freelancer/pool/public/:shiftId/apply
Bewirbt sich auf eine öffentliche Schicht. Öffentliche Bewerbung ist möglich; der Zugriff wird serverseitig validiert (u. a. Berechtigung, Anti-Abuse, Throttling). Kein Auth erforderlich für den Einstieg in den Freelancer-Flow.
Request Body:
Response:
{
"application": {
"id": "app123",
"shiftId": "shift456",
"status": "PENDING",
"appliedAt": "2024-01-15T10:00:00Z"
},
"message": "Application submitted successfully"
}
Fehler:
- 404 NOT_FOUND: Schicht nicht gefunden oder nicht verfügbar
- 422 VALIDATION_ERROR: Bewerbungsfrist abgelaufen oder bereits beworben
- 403 FORBIDDEN: Zugriff nur für berechtigte Freelancer
Freelancer-Registrierung
Freelancer registrieren
POST /api/freelancer/register
Registriert einen neuen Freelancer. Öffentlich zugänglich (kein Auth erforderlich).
Sicherheit: Passwort wird ausschließlich über TLS übertragen und serverseitig gehasht gespeichert; wird niemals geloggt. Es gelten Rate Limiting, Anti-Abuse (z. B. CAPTCHA), Passwort-Policy, Brute-Force-Schutz und keine User-Enumeration (generische Fehlermeldungen).
Request Body:
{
"email": "freelancer@example.com",
"password": "[password]",
"firstName": "Max",
"lastName": "Mustermann",
"phone": "+49 123 456789",
"companyName": "Optional: Firmenname",
"address": {
"street": "Musterstraße 1",
"zip": "12345",
"city": "Berlin",
"country": "Deutschland"
}
}
Response:
{
"freelancer": {
"uid": "user123",
"email": "freelancer@example.com",
"firstName": "Max",
"lastName": "Mustermann",
"status": "pending_verification"
},
"message": "Freelancer registered successfully"
}
Fehler:
- 422 VALIDATION_ERROR: Ungültige Eingabedaten (z.B. E-Mail-Format, Passwort-Anforderungen)
- 409 DUPLICATE: Konto existiert bereits (generische Meldung aus Sicherheitsgründen)
Registrierung abschließen
POST /api/freelancer/complete-registration
Schließt die Freelancer-Registrierung nach E-Mail-Verifizierung ab (Auth erforderlich).
Response:
{
"freelancer": {
"uid": "user123",
"email": "freelancer@example.com",
"status": "active"
},
"message": "Freelancer registration completed successfully"
}
Fehler:
- 400 EMAIL_NOT_VERIFIED: E-Mail ist noch nicht verifiziert
- 404 NO_PENDING_REGISTRATION: Keine ausstehende Registrierung gefunden
Freelancer-Profil
Eigenes Profil abrufen
GET /api/freelancer/me
Lädt das eigene Freelancer-Profil.
Response:
{
"freelancer": {
"uid": "user123",
"email": "freelancer@example.com",
"firstName": "Max",
"lastName": "Mustermann",
"displayName": "Max Mustermann",
"phone": "+49 123 456789",
"companyName": "Firmenname",
"status": "active",
"verificationStatus": "pending"
}
}
Fehler:
- 403 Forbidden: Nur Freelancer können auf diesen Endpunkt zugreifen
Profil aktualisieren
PATCH /api/freelancer/me
Aktualisiert das eigene Freelancer-Profil.
Request Body:
{
"displayName": "Max Mustermann",
"firstName": "Max",
"lastName": "Mustermann",
"email": "newemail@example.com",
"phone": "+49 123 456789",
"address": {
"street": "Neue Straße 2",
"zip": "12345",
"city": "Berlin"
},
"companyName": "Neuer Firmenname"
}
Response:
{
"freelancer": {
"uid": "user123",
"displayName": "Max Mustermann",
"firstName": "Max",
"lastName": "Mustermann"
},
"message": "Profile updated successfully"
}
Fehler:
- 422 VALIDATION_ERROR: Ungültige Eingabedaten (z.B. E-Mail-Format)
- 404 NOT_FOUND: Freelancer-Profil nicht gefunden
- 403 Forbidden: Nur Freelancer können ihr Profil aktualisieren
Konto-Löschung beantragen
DELETE /api/freelancer/me
Erstellt einen Löschauftrag für das eigene Freelancer-Konto (DSGVO-konform). Das Konto wird nicht sofort gelöscht, sondern ein Antrag wird an das Support-Team gesendet.
Request Body:
Response:
{
"message": "Deletion request submitted successfully. Your account will be reviewed by our support team. Data will be retained for 30 days after approval before permanent deletion.",
"requestId": "user123",
"status": "pending"
}
Fehler:
- 422 CONFIRMATION_REQUIRED: Bestätigung erforderlich (confirmation muss "DELETE_MY_ACCOUNT" sein)
- 404 NOT_FOUND: Freelancer-Profil nicht gefunden
- 409 DUPLICATE_REQUEST: Löschungsanfrage existiert bereits
- 403 Forbidden: Nur Freelancer können eine Löschungsanfrage stellen
Freelancer-Entitlements
Entitlements abrufen
GET /api/freelancer/entitlements
Lädt alle Entitlements für den eingeloggten Freelancer.
Response:
Fehler:
- 403 Forbidden: Nur Freelancer können auf diesen Endpunkt zugreifen
Verifizierung
Verifizierungsdokument hochladen
POST /api/freelancer/verification/upload
Lädt einen Gewerbeschein oder Ausweis hoch.
Request: Multipart Form-Data
- file (required): Die Datei (max. 10MB)
Response:
{
"documentPath": "[storage-path]/[filename]",
"message": "Verification document uploaded successfully"
}
Fehler:
- 400 MISSING_FILE: Keine Datei hochgeladen
- 404 NOT_FOUND: Freelancer nicht gefunden
- 422 VALIDATION_ERROR: Ungültiger Dateityp oder Dateigröße überschreitet 10MB
- 403 Forbidden: Nur Freelancer können Verifizierungsdokumente hochladen
Verifizierungsstatus abrufen
GET /api/freelancer/verification/status
Lädt den Verifizierungsstatus.
Response:
{
"verificationStatus": "pending",
"verificationSubmittedAt": "2024-01-15T10:00:00Z",
"verificationReviewedAt": null,
"verificationRejectionReason": null
}
Fehler:
- 403 Forbidden: Nur Freelancer können auf diesen Endpunkt zugreifen
- 404 NOT_FOUND: Freelancer-Profil nicht gefunden
Verifizierungsdokument abrufen
GET /api/freelancer/verification/document
Lädt die Download-URL für das Verifizierungsdokument. Sicherheit: Kurzlebige signierte URL, kurze TTL, one-time/rotating; URL und Dokumente werden nicht geloggt; Content-Disposition und no-store wo anwendbar.
Response:
Fehler:
- 404 NOT_FOUND: Freelancer oder Verifizierungsdokument nicht gefunden
- 403 Forbidden: Nur Freelancer können Verifizierungsdokumente abrufen
Firestore Collections
Das Freelancer Pool Modul verwendet keine eigenen Collections. Es nutzt Daten aus dem shift-pool Modul.
Wird dokumentiert: Detaillierte Datenbank-Struktur folgt.
Fehlerfälle
HTTP-Status-Codes
- 200 OK: Erfolgreich
- 201 Created: Ressource erstellt
- 400 Bad Request: Validierungsfehler
- 401 Unauthorized: Nicht authentifiziert (nur für Admin-Endpoints)
- 403 Forbidden: Keine Berechtigung
- 404 Not Found: Ressource nicht gefunden
- 500 Internal Server Error: Server-Fehler
Fehlercodes
Die folgenden Fehlercodes werden von den API-Endpunkten zurückgegeben:
NOT_FOUND: Ressource nicht gefundenVALIDATION_ERROR: Validierungsfehler bei EingabedatenDUPLICATE: Konto existiert bereitsEMAIL_NOT_VERIFIED: E-Mail ist noch nicht verifiziertNO_PENDING_REGISTRATION: Keine ausstehende Registrierung gefundenCONFIRMATION_REQUIRED: Bestätigung erforderlich (für Konto-Löschung)DUPLICATE_REQUEST: Löschungsanfrage existiert bereitsMISSING_FILE: Keine Datei hochgeladenFORBIDDEN: Keine Berechtigung (z.B. nur Freelancer können auf Endpunkt zugreifen)
FAQ / Troubleshooting
Wird dokumentiert: Häufige Fragen und Lösungen folgen.