opus-submitter/polylan_submitter/noita/api.py

75 lines
2.1 KiB
Python

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)}"}