"""API voor het plugin-framework: modules opvragen en aan/uit zetten.""" from rest_framework import status from rest_framework.decorators import api_view, permission_classes from rest_framework.response import Response from core.audit import audit_log from core.permissions import AdminRolePermission from .models import AuditEvent from . import services @api_view(["GET"]) def module_list(request): """Alle modules met metadata en actuele aan/uit-status.""" services.sync_states() return Response(services.describe_all()) @api_view(["POST"]) @permission_classes([AdminRolePermission]) def module_set_state(request, key: str): """Zet één module aan of uit (alleen beheerders). Body: {"enabled": true|false}.""" enabled = request.data.get("enabled") # Expliciet een echte boolean eisen: bool("false") zou True zijn. if not isinstance(enabled, bool): return Response( {"detail": "Veld 'enabled' moet true of false zijn."}, status=status.HTTP_400_BAD_REQUEST, ) try: services.set_enabled(key, enabled) except services.ModuleError as exc: return Response({"detail": str(exc)}, status=status.HTTP_400_BAD_REQUEST) audit_log(request, "module_set_state", f"Module:{key}", {"enabled": enabled}) return Response(services.describe_all()) @api_view(["GET"]) @permission_classes([AdminRolePermission]) def audit_log_list(request): qs = AuditEvent.objects.all() action = request.query_params.get("action") actor = request.query_params.get("actor") if action: qs = qs.filter(action__icontains=action) if actor: qs = qs.filter(actor__icontains=actor) try: limit = min(max(int(request.query_params.get("limit", 100)), 1), 500) except ValueError: limit = 100 return Response([ { "id": event.id, "created_at": event.created_at, "actor": event.actor, "action": event.action, "target": event.target, "ip_address": event.ip_address, "extra": event.extra, } for event in qs[:limit] ])