]> git.ipfire.org Git - pbs.git/commitdiff
API: Implement creating a new upload
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 17 Jun 2025 13:23:57 +0000 (13:23 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 17 Jun 2025 13:23:57 +0000 (13:23 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/api/uploads.py

index 329010e2040d4767cb39758553a903a5d42db2ed..e501c58df38f1e46e8cff07de768852975f9c37e 100644 (file)
@@ -19,6 +19,7 @@
 ###############################################################################
 
 import fastapi
+import pydantic
 import uuid
 
 from . import app
@@ -26,6 +27,7 @@ from . import auth
 from . import backend
 
 from .. import uploads
+from .. import users
 
 # Create a new router for all upload endpoints
 router = fastapi.APIRouter(
@@ -55,6 +57,47 @@ async def get_upload(id: uuid.UUID,
 
        return upload
 
+class UploadRequest(pydantic.BaseModel):
+       # Filename
+       filename: str
+
+       # Filesize
+       size: int
+
+       # Hexdigest (BLAKE2B512)
+       hexdigest_blake2b512: str
+
+       # Digest (BLAKE2B512)
+       @property
+       def digest_blake2b512(self):
+               return bytes.fromhex(self.hexdigest_blake2b512)
+
+
+@router.post("")
+async def create(request: UploadRequest,
+               current_principal = fastapi.Depends(auth.get_current_principal)) -> uploads.Upload:
+       # Create a new upload
+       try:
+               upload = await backend.uploads.create(
+                       filename          = request.filename,
+                       size              = request.size,
+                       owner             = current_principal,
+                       digest_blake2b512 = request.digest_blake2b512,
+               )
+
+       # Send 422 Unprocessable Entity if quota has been exceeded
+       except users.QuotaExceededError as e:
+               raise fastapi.HTTPException(422, "Quota exceeded")
+
+       # Send 400 Bad Request if any of the data could not be parsed
+       except ValueError as e:
+               raise fastapi.HTTPException(400)
+
+       # XXX This needs to go and we need to create a proper database session
+       await backend.db.commit()
+
+       return upload
+
 @router.get("/{id}")
 async def get(upload: uploads.Upload = fastapi.Depends(get_upload)) -> uploads.Upload:
        return upload