refactor(backend/api): extract DSR services (Step 4 — file 15 of 18)
compliance/api/dsr_routes.py (1176 LOC) -> 369 LOC thin routes +
469-line DsrService + 487-line DsrWorkflowService + 101-line schemas.
Two-service split for Data Subject Request (DSGVO Art. 15-22):
- dsr_service.py: CRUD, list, stats, export, audit log
- dsr_workflow_service.py: identity verification, processing,
portability, escalation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
101
backend-compliance/compliance/schemas/dsr.py
Normal file
101
backend-compliance/compliance/schemas/dsr.py
Normal file
@@ -0,0 +1,101 @@
|
||||
"""
|
||||
DSR (Data Subject Request) schemas — Betroffenenanfragen nach DSGVO Art. 15-21.
|
||||
|
||||
Phase 1 Step 4: extracted from ``compliance.api.dsr_routes``.
|
||||
"""
|
||||
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class DSRCreate(BaseModel):
|
||||
request_type: str = "access"
|
||||
requester_name: str
|
||||
requester_email: str
|
||||
requester_phone: Optional[str] = None
|
||||
requester_address: Optional[str] = None
|
||||
requester_customer_id: Optional[str] = None
|
||||
source: str = "email"
|
||||
source_details: Optional[str] = None
|
||||
request_text: Optional[str] = None
|
||||
priority: Optional[str] = "normal"
|
||||
notes: Optional[str] = None
|
||||
|
||||
|
||||
class DSRUpdate(BaseModel):
|
||||
priority: Optional[str] = None
|
||||
notes: Optional[str] = None
|
||||
internal_notes: Optional[str] = None
|
||||
assigned_to: Optional[str] = None
|
||||
request_text: Optional[str] = None
|
||||
affected_systems: Optional[List[str]] = None
|
||||
erasure_checklist: Optional[List[Dict[str, Any]]] = None
|
||||
rectification_details: Optional[Dict[str, Any]] = None
|
||||
objection_details: Optional[Dict[str, Any]] = None
|
||||
|
||||
|
||||
class StatusChange(BaseModel):
|
||||
status: str
|
||||
comment: Optional[str] = None
|
||||
|
||||
|
||||
class VerifyIdentity(BaseModel):
|
||||
method: str
|
||||
notes: Optional[str] = None
|
||||
document_ref: Optional[str] = None
|
||||
|
||||
|
||||
class AssignRequest(BaseModel):
|
||||
assignee_id: str
|
||||
|
||||
|
||||
class ExtendDeadline(BaseModel):
|
||||
reason: str
|
||||
days: Optional[int] = 60
|
||||
|
||||
|
||||
class CompleteDSR(BaseModel):
|
||||
summary: Optional[str] = None
|
||||
result_data: Optional[Dict[str, Any]] = None
|
||||
|
||||
|
||||
class RejectDSR(BaseModel):
|
||||
reason: str
|
||||
legal_basis: Optional[str] = None
|
||||
|
||||
|
||||
class SendCommunication(BaseModel):
|
||||
communication_type: str = "outgoing"
|
||||
channel: str = "email"
|
||||
subject: Optional[str] = None
|
||||
content: str
|
||||
template_used: Optional[str] = None
|
||||
|
||||
|
||||
class UpdateExceptionCheck(BaseModel):
|
||||
applies: bool
|
||||
notes: Optional[str] = None
|
||||
|
||||
|
||||
class CreateTemplateVersion(BaseModel):
|
||||
version: str = "1.0"
|
||||
language: Optional[str] = "de"
|
||||
subject: str
|
||||
body_html: str
|
||||
body_text: Optional[str] = None
|
||||
|
||||
|
||||
__all__ = [
|
||||
"DSRCreate",
|
||||
"DSRUpdate",
|
||||
"StatusChange",
|
||||
"VerifyIdentity",
|
||||
"AssignRequest",
|
||||
"ExtendDeadline",
|
||||
"CompleteDSR",
|
||||
"RejectDSR",
|
||||
"SendCommunication",
|
||||
"UpdateExceptionCheck",
|
||||
"CreateTemplateVersion",
|
||||
]
|
||||
Reference in New Issue
Block a user