from django.http import HttpRequest from django.core.files.base import ContentFile from ninja import Router, File from ninja.files import UploadedFile from noita.schemas import ObjectivOut from .models import LogfileSubmission, Objectiv from .schemas import NoitaSubmissionOut router = Router() @router.get("objectives", response=list[ObjectivOut]) def get_my_objectives(request: HttpRequest): return Objectiv.objects.order_by("-count").filter(user=request.user) @router.post("submit", response=NoitaSubmissionOut) def submit_log_file(request: HttpRequest, file: UploadedFile = File(...)): """ Submit a Noita run file (log file, screenshot, or video). Accepts: - Text files (.txt) for polylan_mod_log.txt - Images (.png, .jpg, .gif) - Videos (.mp4, .webm) Max file size: 256 MB """ # Validate file type allowed_types = [ "text/plain", "image/jpeg", "image/jpg", "image/png", "image/gif", "video/mp4", "video/webm", ] if file.content_type not in allowed_types: return 400, { "detail": f"Invalid file type: {file.content_type}. Allowed types: {', '.join(allowed_types)}" } # Validate file size (256MB limit) if file.size > 256 * 1024 * 1024: return 400, {"detail": "File too large (max 256MB)"} try: # Create submission submission = LogfileSubmission.objects.create( user=request.user if request.user.is_authenticated else None, content_type=file.content_type, file_size=file.size, ) # Save the file submission.file.save(file.name, ContentFile(file.read()), save=True) return { "id": str(submission.id), "user_id": submission.user_id, "username": submission.user.username if submission.user else None, "file_size": submission.file_size, "content_type": submission.content_type, "created_at": submission.created_at, "processed": submission.processed, } except Exception as e: return 500, {"detail": f"Error creating submission: {str(e)}"}