@@ -834,7 +834,8 @@ Advanced Alchemy provides built-in support for file storage with various backend
834834
835835 from litestar import Controller, Litestar, delete, get, patch, post
836836 from litestar.datastructures import UploadFile
837- from litestar.params import Dependency
837+ from litestar.enums import RequestEncodingType
838+ from litestar.params import Body, Dependency
838839 from pydantic import BaseModel, Field, computed_field
839840 from sqlalchemy.orm import Mapped, mapped_column
840841
@@ -881,6 +882,19 @@ Advanced Alchemy provides built-in support for file storage with various backend
881882 return None
882883 return self .file.sign()
883884
885+ # Schema for creating and updating documents
886+ class CreateDocument (BaseModel ):
887+ model_config = {" arbitrary_types_allowed" : True }
888+
889+ name: str
890+ file : Optional[UploadFile] = None
891+
892+ class PatchDocument (BaseModel ):
893+ model_config = {" arbitrary_types_allowed" : True }
894+
895+ name: Optional[str ] = None
896+ file : Optional[UploadFile] = None
897+
884898 # Service
885899 class DocumentService (service .SQLAlchemyAsyncRepositoryService[DocumentModel]):
886900 """ Document repository."""
@@ -918,20 +932,19 @@ Advanced Alchemy provides built-in support for file storage with various backend
918932 @post (path = " /" )
919933 async def create_document (
920934 self ,
935+ data : Annotated[CreateDocument, Body(media_type = RequestEncodingType.MULTI_PART )],
921936 documents_service : DocumentService,
922- name : str ,
923- file : Annotated[Optional[UploadFile], None ] = None ,
924937 ) -> Document:
925938 obj = await documents_service.create(
926939 DocumentModel(
927- name = name,
940+ name = data. name,
928941 file = FileObject(
929942 backend = " local" ,
930- filename = file .filename or " uploaded_file" ,
931- content_type = file .content_type,
932- content = await file .read(),
943+ filename = data. file.filename or " uploaded_file" ,
944+ content_type = data. file.content_type,
945+ content = await data. file.read(),
933946 )
934- if file
947+ if data. file
935948 else None ,
936949 )
937950 )
@@ -949,20 +962,19 @@ Advanced Alchemy provides built-in support for file storage with various backend
949962 @patch (path = " /{document_id: uuid} " )
950963 async def update_document (
951964 self ,
952- documents_service : DocumentService,
953965 document_id : UUID ,
954- name : Optional[ str ] = None ,
955- file : Annotated[Optional[UploadFile], None ] = None ,
966+ data : Annotated[PatchDocument, Body( media_type = RequestEncodingType. MULTI_PART )] ,
967+ documents_service : DocumentService ,
956968 ) -> Document:
957969 update_data: dict[str , Any] = {}
958- if name is not None :
959- update_data[" name" ] = name
960- if file is not None :
970+ if data. name:
971+ update_data[" name" ] = data. name
972+ if data. file:
961973 update_data[" file" ] = FileObject(
962974 backend = " local" ,
963- filename = file .filename or " uploaded_file" ,
964- content_type = file .content_type,
965- content = await file .read(),
975+ filename = data. file.filename or " uploaded_file" ,
976+ content_type = data. file.content_type,
977+ content = await data. file.read(),
966978 )
967979
968980 obj = await documents_service.update(update_data, item_id = document_id)
0 commit comments