@@ -834,7 +834,8 @@ Advanced Alchemy provides built-in support for file storage with various backend
834
834
835
835
from litestar import Controller, Litestar, delete, get, patch, post
836
836
from litestar.datastructures import UploadFile
837
- from litestar.params import Dependency
837
+ from litestar.enums import RequestEncodingType
838
+ from litestar.params import Body, Dependency
838
839
from pydantic import BaseModel, Field, computed_field
839
840
from sqlalchemy.orm import Mapped, mapped_column
840
841
@@ -881,6 +882,19 @@ Advanced Alchemy provides built-in support for file storage with various backend
881
882
return None
882
883
return self .file.sign()
883
884
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
+
884
898
# Service
885
899
class DocumentService (service .SQLAlchemyAsyncRepositoryService[DocumentModel]):
886
900
""" Document repository."""
@@ -918,20 +932,19 @@ Advanced Alchemy provides built-in support for file storage with various backend
918
932
@post (path = " /" )
919
933
async def create_document (
920
934
self ,
935
+ data : Annotated[CreateDocument, Body(media_type = RequestEncodingType.MULTI_PART )],
921
936
documents_service : DocumentService,
922
- name : str ,
923
- file : Annotated[Optional[UploadFile], None ] = None ,
924
937
) -> Document:
925
938
obj = await documents_service.create(
926
939
DocumentModel(
927
- name = name,
940
+ name = data. name,
928
941
file = FileObject(
929
942
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(),
933
946
)
934
- if file
947
+ if data. file
935
948
else None ,
936
949
)
937
950
)
@@ -949,20 +962,19 @@ Advanced Alchemy provides built-in support for file storage with various backend
949
962
@patch (path = " /{document_id: uuid} " )
950
963
async def update_document (
951
964
self ,
952
- documents_service : DocumentService,
953
965
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 ,
956
968
) -> Document:
957
969
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:
961
973
update_data[" file" ] = FileObject(
962
974
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(),
966
978
)
967
979
968
980
obj = await documents_service.update(update_data, item_id = document_id)
0 commit comments