Skip to content

Backend design

Een RESTful API gebouwd met AWS Chalice en AWS Cognito voor gebruikersauthenticatie en autorisatie.


De VEMAP Backend biedt een complete applicatie met ondersteuning voor:

  • Gebruikerslogin met AWS Cognito
  • Challenge-gebaseerde authenticatie (bijv. wachtwoordwijzigingen)
  • Token vernieuwingsfunctionaliteit
  • Rol-gebaseerde toegangscontrole
  • Tenant en gebruikersbeheer
  • Project en afsluiting beheer
  • Bestandsbeheer en uploads
  • Email notificaties via AWS SES
  • Gestructureerde logging voor monitoring en auditing

  • Directorybackend/
    • app.py # Hoofdapplicatie entry point
    • Directorychalicelib/ # Applicatiebibliotheek
      • Directoryaws/ # AWS service integraties (S3, SES, SQS)
      • Directoryconfig/ # Configuratiebeheer
      • Directorycontrollers/ # HTTP request handlers
      • Directoryfactory/ # Dependency injection
      • Directorymiddleware/ # Request/response middleware
      • Directorymodels/ # Pydantic request/response models
      • Directoryqueries/ # SQL query definities
      • Directoryrepositories/ # Database toegang laag
      • Directoryservices/ # Business logic
      • Directoryutils/ # Utility functies
  • Directorytests/ # Test suite
  • requirements.txt # Productie dependencies
  • requirements-dev.txt # Development dependencies (tests)
  1. Gebruiker dient credentials in via POST /v1/authentication/login
  2. API valideert met AWS Cognito
  3. Bij succes: Retourneert tokens + gebruikersomgevingen
  4. Bij challenge vereist: Retourneert challenge data (302 status)
  1. Gebruiker ontvangt challenge response van login
  2. Gebruiker dient challenge response in via POST /v1/authentication/challenge
  3. API voltooit challenge met AWS Cognito
  4. Retourneert tokens + gebruikersomgevingen (zelfde als succesvolle login)
  1. Gebruiker dient refresh token in via POST /v1/authentication/refresh
  2. API vernieuwt tokens met AWS Cognito
  3. Retourneert nieuwe access, refresh en ID tokens
  • Python 3.8+
  • AWS CLI geconfigureerd
  • AWS Cognito User Pool en App Client
Terminal window
# Clone de repository
git clone <repository-url>
cd vemap-backend/backend
# Installeer dependencies
pip install -r requirements.txt
# Voor development: installeer ook test dependencies
pip install -r requirements-dev.txt
# Start lokaal
chalice local
Terminal window
CLIENT_ID=your-cognito-app-client-id
POOL_ID=your-cognito-user-pool-id

Naar authenticatie endpointdocumentatie

MethodeEndpointBeschrijvingToegang
GET/healthHealth checkPubliek
POST/v1/authentication/loginGebruikersloginPubliek
POST/v1/authentication/challengeVoltooi authenticatie challengePubliek
POST/v1/authentication/refreshVernieuw access tokensPubliek
POST/v1/authentication/logoutGebruikerslogoutPubliek
POST/v1/authentication/forgot-passwordInitieer wachtwoord resetPubliek
POST/v1/authentication/reset-passwordReset wachtwoord met codePubliek

Naar gebruiker endpointdocumentatie

MethodeEndpointBeschrijvingToegang
GET/v1/{tenant_id}/usersHaal gebruikers opAdmin, Organisatie, Manager
POST/v1/{tenant_id}/usersMaak nieuwe gebruikerAdmin, Organisatie, Manager
PATCH/v1/{tenant_id}/users/{user_id}Update gebruikerAdmin, Organisatie, Manager
DELETE/v1/{tenant_id}/users/{user_id}Verwijder gebruikerAdmin, Organisatie, Manager
MethodeEndpointBeschrijvingToegang
GET/v1/{tenant_id}/tenantsHaal tenants opAdmin
POST/v1/{tenant_id}/tenantsMaak nieuwe tenantAdmin
DELETE/v1/{tenant_id}/tenants/{target_tenant_id}Verwijder tenantAdmin
MethodeEndpointBeschrijvingToegang
GET/v1/{tenant_id}/projectsHaal projecten opOrganisatie, Manager
POST/v1/{tenant_id}/projectsMaak nieuw projectOrganisatie, Manager
PATCH/v1/{tenant_id}/projects/{project_id}Update projectOrganisatie, Manager
GET/v1/{tenant_id}/projects/{project_id}/closure-referencesHaal closure referenties opManager
GET/v1/{tenant_id}/projects/{project_id}/closuresHaal closures van project opManager, Stakeholder
GET/v1/{tenant_id}/projects/{project_id}/recipientsHaal project ontvangers opOrganisatie, Manager
POST/v1/{tenant_id}/projects/{project_id}/recipientsVoeg ontvangers toe aan projectOrganisatie, Manager
DELETE/v1/{tenant_id}/projects/{project_id}/recipients/{recipient_id}Verwijder ontvanger van projectManager
MethodeEndpointBeschrijvingToegang
GET/v1/{tenant_id}/projects/{project_id}/closuresHaal closures van project opManager, Stakeholder
GET/v1/{tenant_id}/closures/{closure_id}Haal specifieke closure opManager, Stakeholder
POST/v1/{tenant_id}/closuresMaak nieuwe closureManager
GET/v1/{tenant_id}/closures/{closure_id}/filesHaal bestanden van closure opManager, Stakeholder
POST/v1/{tenant_id}/closures/{closure_id}/stakeholdersVoeg stakeholders toe aan closureManager
DELETE/v1/{tenant_id}/closures/{closure_id}/stakeholders/{stakeholder_id}Verwijder stakeholder van closureManager
GET/v1/{tenant_id}/closures/{closure_id}/commentsHaal comments van closure opManager, Stakeholder
POST/v1/{tenant_id}/closures/{closure_id}/commentsMaak nieuwe commentStakeholder
GET/v1/{tenant_id}/closures/{closure_id}/eventsHaal events van closure opManager, Stakeholder
MethodeEndpointBeschrijvingToegang
GET/v1/{tenant_id}/files/{file_id}Haal specifiek bestand opManager, Stakeholder
POST/v1/{tenant_id}/filesUpload bestand metadataManager
PATCH/v1/{tenant_id}/files/{file_id}Update bestand metadataAdmin, Organisatie, Manager
DELETE/v1/{tenant_id}/files/{file_id}Verwijder bestandAdmin, Organisatie, Manager
MethodeEndpointBeschrijvingToegang
GET/v1/{tenant_id}/stakeholders/{user_id}/closuresHaal closures van stakeholder opStakeholder
MethodeEndpointBeschrijvingToegang
GET/v1/{tenant_id}/metricsHaal metrics opAdmin, Organisatie, Manager, Stakeholder
MethodeEndpointBeschrijvingToegang
POST/v1/{tenant_id}/mail/{closure_id}Verstuur mail voor closureAdmin, Organisatie, Manager
POST/v1/{tenant_id}/mail/recipients/{project_id}Maak ontvangers voor project/closureAdmin, Organisatie, Manager
DELETE/v1/{tenant_id}/mail/recipients/{project_id}/{closure_id}/{recipient_id}Verwijder ontvangerAdmin, Organisatie, Manager
GET/v1/{tenant_id}/mail/templatesHaal email templates opAdmin, Organisatie, Manager
POST/v1/{tenant_id}/mail/templatesMaak nieuwe email templateAdmin, Organisatie, Manager
  • MVC Pattern: Controllers handelen HTTP requests af, Services bevatten business logic
  • Repository Pattern: Database toegang geabstraheerd via repositories
  • Factory Pattern: Dependency injection voor service creatie
  • Middleware Pattern: Request/response verwerking en authenticatie
  • Controllers: HTTP request handling en response formatting
  • Services: Business logic en externe service integratie
  • Repositories: Database toegang en data persistentie
  • Queries: SQL query definities en database operaties
  • Middleware: Authenticatie, error handling en request verwerking
  • Models: Pydantic models voor request/response validatie
  • Utils: Utility functies voor logging, authenticatie, error handling
  • AWS Cognito integratie voor veilige authenticatie
  • JWT token-gebaseerde autorisatie
  • Rol-gebaseerde toegangscontrole (RBAC)
  • Gestructureerde logging voor audit trails en monitoring
  • CORS configuratie voor frontend integratie
  • Input validatie via Pydantic models
  • Gecentraliseerde error handling

De VEMAP Backend gebruikt een gestructureerd logging systeem voor monitoring en audit trails. Alle logs worden als JSON uitgevoerd voor eenvoudige integratie met CloudWatch Logs.

Het logging systeem gebruikt vier gestandaardiseerde event types:

  • SUCCESS - Voor succesvolle business operaties
  • FAILED - Voor gefaalde operaties (niet-kritieke fouten)
  • ERROR - Voor kritieke errors
  • WARNING - Voor waarschuwingen

Business events worden gelogd met een vereenvoudigde structuur waarbij de event_type alleen de status bevat en alle contextuele informatie in event_data staat:

self.logger.log_business_event(
"SUCCESS",
{
"action": "create_project",
"tenant_id": tenant_id,
"user_id": user_id,
"project_id": project_id
}
)

Belangrijke velden:

  • event_type: Status woord (SUCCESS, FAILED, ERROR, WARNING)
  • event_data.action: Beschrijvende actie naam (bijv. “create_project”, “login”)
  • event_data: Alle relevante contextuele informatie
  • request_id: Automatisch toegevoegd voor request tracking

Loggen:

  • CREATE/DELETE operaties voor belangrijke entiteiten
  • Authentication events (login, logout, password reset)
  • File uploads (initiatie)
  • Email operations (batch level)
  • Errors (gecentraliseerd door middleware)

NIET loggen:

  • Routine GET requests
  • Routine updates van niet-kritieke data
  • Middleware info logs
  • Debug logs in productie

Error logging is gecentraliseerd: services gooien exceptions zonder te loggen, middleware en error handlers loggen alle errors met "ERROR" als message en een action field voor context.

Terminal window
# Zorg dat development dependencies geïnstalleerd zijn
pip install -r requirements-dev.txt
# Voer tests uit
python -m pytest tests/

Het project volgt PEP 8 richtlijnen en gebruikt:

  • Type hints voor betere code documentatie
  • Uitgebreide logging voor debugging
  • Error handling met juiste HTTP status codes
  • Geen comments, wel docstrings
Terminal window
# Deploy naar AWS
# Deploy naar development omgeving
chalice deploy --stage dev
# Deploy naar production omgeving
chalice deploy --stage prod