Skip to content

Commit 726bdab

Browse files
authored
fix: litestar fileobject example (#531)
Updated Litestar FileObject example
1 parent e94a52a commit 726bdab

File tree

2 files changed

+59
-34
lines changed

2 files changed

+59
-34
lines changed

docs/usage/frameworks/litestar.rst

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

examples/litestar/litestar_fileobject.py

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
import uvicorn
55
from litestar import Controller, Litestar, delete, get, patch, post
66
from litestar.datastructures import UploadFile
7-
from litestar.params import Dependency
7+
from litestar.enums import RequestEncodingType
8+
from litestar.params import Body, Dependency
89
from pydantic import BaseModel, Field, computed_field
910
from sqlalchemy.orm import Mapped, mapped_column
1011

@@ -54,6 +55,20 @@ def file_url(self) -> Optional[Union[str, list[str]]]:
5455
return self.file.sign()
5556

5657

58+
class CreateDocument(BaseModel):
59+
model_config = {"arbitrary_types_allowed": True}
60+
61+
name: str
62+
file: Optional[UploadFile] = None
63+
64+
65+
class PatchDocument(BaseModel):
66+
model_config = {"arbitrary_types_allowed": True}
67+
68+
name: Optional[str] = None
69+
file: Optional[UploadFile] = None
70+
71+
5772
# Advanced Alchemy Service
5873
class DocumentService(service.SQLAlchemyAsyncRepositoryService[DocumentModel]):
5974
"""Document repository."""
@@ -88,20 +103,19 @@ async def list_documents(
88103
@post(path="/")
89104
async def create_document(
90105
self,
106+
data: Annotated[CreateDocument, Body(media_type=RequestEncodingType.MULTI_PART)],
91107
documents_service: DocumentService,
92-
name: str,
93-
file: Annotated[Optional[UploadFile], None] = None,
94108
) -> Document:
95109
obj = await documents_service.create(
96110
DocumentModel(
97-
name=name,
111+
name=data.name,
98112
file=FileObject(
99113
backend="local",
100-
filename=file.filename or "uploaded_file",
101-
content_type=file.content_type,
102-
content=await file.read(),
114+
filename=data.file.filename or "uploaded_file",
115+
content_type=data.file.content_type,
116+
content=await data.file.read(),
103117
)
104-
if file
118+
if data.file
105119
else None,
106120
)
107121
)
@@ -119,20 +133,19 @@ async def get_document(
119133
@patch(path="/{document_id:uuid}")
120134
async def update_document(
121135
self,
122-
documents_service: DocumentService,
123136
document_id: UUID,
124-
name: Optional[str] = None,
125-
file: Annotated[Optional[UploadFile], None] = None,
137+
data: Annotated[PatchDocument, Body(media_type=RequestEncodingType.MULTI_PART)],
138+
documents_service: DocumentService,
126139
) -> Document:
127140
update_data: dict[str, Any] = {}
128-
if name is not None:
129-
update_data["name"] = name
130-
if file is not None:
141+
if data.name:
142+
update_data["name"] = data.name
143+
if data.file:
131144
update_data["file"] = FileObject(
132145
backend="local",
133-
filename=file.filename or "uploaded_file",
134-
content_type=file.content_type,
135-
content=await file.read(),
146+
filename=data.file.filename or "uploaded_file",
147+
content_type=data.file.content_type,
148+
content=await data.file.read(),
136149
)
137150

138151
obj = await documents_service.update(update_data, item_id=document_id)

0 commit comments

Comments
 (0)