Coverage for src/couchers/servicers/media.py: 96%
24 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-12-30 22:00 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-12-30 22:00 +0000
1import logging
3import grpc
4from google.protobuf import empty_pb2
5from sqlalchemy import select
6from sqlalchemy.orm import Session
8from couchers.context import CouchersContext
9from couchers.crypto import secure_compare
10from couchers.interceptors import MediaInterceptor
11from couchers.models import InitiatedUpload, Upload
12from couchers.proto import media_pb2, media_pb2_grpc
14logger = logging.getLogger(__name__)
17def get_media_auth_interceptor(secret_token: str) -> MediaInterceptor:
18 def is_authorized(token: str) -> bool:
19 return secure_compare(token.encode("ascii"), secret_token.encode("ascii"))
21 return MediaInterceptor(is_authorized)
24class Media(media_pb2_grpc.MediaServicer):
25 def UploadConfirmation(
26 self, request: media_pb2.UploadConfirmationReq, context: CouchersContext, session: Session
27 ) -> empty_pb2.Empty:
28 initiated_upload = session.execute(
29 select(InitiatedUpload).where(InitiatedUpload.key == request.key).where(InitiatedUpload.is_valid)
30 ).scalar_one_or_none()
32 if not initiated_upload:
33 context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "upload_not_found")
35 # move it to a completed upload
36 upload = Upload(
37 key=request.key,
38 filename=request.filename,
39 creator_user_id=initiated_upload.initiator_user_id,
40 )
41 session.add(upload)
43 # delete the old upload
44 session.delete(initiated_upload)
46 return empty_pb2.Empty()