from django.http import HttpRequest from django.core.files.base import ContentFile from ninja import Router, File from ninja.files import UploadedFile from .models import LogfileSubmission from .schemas import NoitaSubmissionOut router = Router() @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)}"}