from datetime import timezone as dt_timezone from django.utils import timezone from rest_framework import status from rest_framework.permissions import IsAuthenticated from rest_framework.request import Request from rest_framework.response import Response from labs.api.base import Endpoint from labs.api.serializers.live_demo_project import ( ProjectSQLActionCreateSerializer, get_statement_type, ) from labs.models import Project, ProjectAction def _format_api_datetime(value): if not value: return None return value.astimezone(dt_timezone.utc).isoformat().replace("+00:00", "Z") class ProjectByKeyEndpoint(Endpoint): permission_classes = (IsAuthenticated,) def get(self, request: Request, project_key: str, **kwargs) -> Response: try: project = Project.objects.get(project_key=project_key) except Project.DoesNotExist: return Response( { "error": "PROJECT_NOT_FOUND", "message": "Project not found.", }, status=status.HTTP_404_NOT_FOUND, ) return Response( { "id": project.id, "project_key": project.project_key, "project_name": project.project_name, "is_active": project.is_active, } ) class ProjectActionCreateEndpoint(Endpoint): permission_classes = (IsAuthenticated,) def post(self, request: Request, project_key: str, **kwargs) -> Response: serializer = ProjectSQLActionCreateSerializer(data=request.data) serializer.is_valid(raise_exception=True) project = Project.objects.filter(project_key=project_key).first() if not project: return Response( { "error": "PROJECT_NOT_FOUND", "message": "Project not found.", }, status=status.HTTP_404_NOT_FOUND, ) if not project.is_active: return Response( { "error": "PROJECT_INACTIVE", "message": "Project is inactive.", }, status=status.HTTP_409_CONFLICT, ) statement_type = get_statement_type(serializer.validated_data["sql_text"]) executed_at = serializer.validated_data.get("executed_at") or timezone.now() action = ProjectAction.objects.create( project=project, email=serializer.validated_data["email"], statement_type=statement_type, sql_text=serializer.validated_data["sql_text"], status=serializer.validated_data.get("status", "success"), duration_ms=serializer.validated_data.get("duration_ms"), error_code=serializer.validated_data.get("error_code"), executed_at=executed_at, ) return Response( { "id": action.id, "project_key": project_key, "email": serializer.validated_data["email"], "statement_type": statement_type, "executed_at": _format_api_datetime(executed_at), }, status=status.HTTP_201_CREATED, )