CRUD finished

This commit is contained in:
Eden Kirin
2023-09-14 19:57:47 +02:00
parent 4875837d4e
commit e59b00e078
4 changed files with 58 additions and 35 deletions

View File

@ -1,18 +1,12 @@
from typing import TYPE_CHECKING, Optional from typing import TYPE_CHECKING, Optional
from uuid import UUID from uuid import UUID
from litestar import Controller, get from litestar import Controller, get, post, put
from litestar.contrib.repository.filters import LimitOffset, SearchFilter from litestar.contrib.repository.filters import LimitOffset, SearchFilter
from litestar.di import Provide from litestar.di import Provide
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from app.domain.city import ( from app.domain.city import City, CityReadDTO, CityWriteDTO, Repository, Service
City,
CityReadDTO,
CityWriteDTO,
Repository,
Service,
)
from app.lib.responses import ObjectListResponse, ObjectResponse from app.lib.responses import ObjectListResponse, ObjectResponse
if TYPE_CHECKING: if TYPE_CHECKING:
@ -55,9 +49,24 @@ class CityController(Controller):
content = await service.list(*filters) content = await service.list(*filters)
return ObjectListResponse(content=content) return ObjectListResponse(content=content)
@get(DETAIL_ROUTE) @post()
async def get_city( async def create_city(
self, service: Service, city_id: UUID self,
data: City,
service: Service,
) -> ObjectResponse[City]: ) -> ObjectResponse[City]:
content = await service.create(data)
return ObjectResponse(content=content)
@get(DETAIL_ROUTE)
async def get_city(self, service: Service, city_id: UUID) -> ObjectResponse[City]:
content = await service.get(city_id) content = await service.get(city_id)
return ObjectResponse(content=content) return ObjectResponse(content=content)
@put(DETAIL_ROUTE)
async def update_city(
self, data: City, service: Service, city_id: UUID
) -> ObjectResponse[City]:
data.id = city_id
content = await service.update(city_id, data)
return ObjectResponse(content=content)

View File

@ -1,18 +1,12 @@
from typing import TYPE_CHECKING, Optional from typing import TYPE_CHECKING, Optional
from uuid import UUID from uuid import UUID
from litestar import Controller, get from litestar import Controller, get, post, put
from litestar.contrib.repository.filters import LimitOffset, SearchFilter from litestar.contrib.repository.filters import LimitOffset, SearchFilter
from litestar.di import Provide from litestar.di import Provide
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from app.domain.user import ( from app.domain.user import Repository, Service, User, UserReadDTO, UserWriteDTO
User,
UserReadDTO,
UserWriteDTO,
Repository,
Service,
)
from app.lib.responses import ObjectListResponse, ObjectResponse from app.lib.responses import ObjectListResponse, ObjectResponse
if TYPE_CHECKING: if TYPE_CHECKING:
@ -55,9 +49,26 @@ class UserController(Controller):
content = await service.list(*filters) content = await service.list(*filters)
return ObjectListResponse(content=content) return ObjectListResponse(content=content)
@get(DETAIL_ROUTE) @post()
async def get_user( async def create_user(
self, service: Service, user_id: UUID self,
data: User,
service: Service,
) -> ObjectResponse[User]: ) -> ObjectResponse[User]:
print(data)
content = await service.create(data)
return ObjectResponse(content=content)
@get(DETAIL_ROUTE)
async def get_user(self, service: Service, user_id: UUID) -> ObjectResponse[User]:
content = await service.get(user_id) content = await service.get(user_id)
return ObjectResponse(content=content) return ObjectResponse(content=content)
@put(DETAIL_ROUTE)
async def update_user(
self, data: User, service: Service, user_id: UUID
) -> ObjectResponse[User]:
data.id = user_id
content = await service.update(user_id, data)
return ObjectResponse(content=content)

View File

@ -1,7 +1,7 @@
from datetime import datetime from datetime import datetime
from typing import Annotated from typing import Annotated
from litestar.contrib.sqlalchemy.base import UUIDBase from litestar.contrib.sqlalchemy.base import UUIDAuditBase
from litestar.contrib.sqlalchemy.dto import SQLAlchemyDTO from litestar.contrib.sqlalchemy.dto import SQLAlchemyDTO
from litestar.dto import DTOConfig from litestar.dto import DTOConfig
from sqlalchemy.orm import Mapped from sqlalchemy.orm import Mapped
@ -10,13 +10,13 @@ from app.lib import service
from app.lib.filter_repository import FilterRepository from app.lib.filter_repository import FilterRepository
class City(UUIDBase): class City(UUIDAuditBase):
__tablename__ = "cities" # type: ignore[assignment] __tablename__ = "cities" # type: ignore[assignment]
name: Mapped[str] name: Mapped[str]
postal_code: Mapped[str] postal_code: Mapped[str]
created_at: Mapped[datetime] created_at: Mapped[datetime]
modified_at: Mapped[datetime] updated_at: Mapped[datetime]
class Repository(FilterRepository[City]): class Repository(FilterRepository[City]):
@ -27,6 +27,6 @@ class Service(service.Service[City]):
repository_type = Repository repository_type = Repository
write_config = DTOConfig(exclude={"id"}) write_config = DTOConfig(exclude={"id", "created_at", "updated_at"})
CityWriteDTO = SQLAlchemyDTO[Annotated[City, write_config]] CityWriteDTO = SQLAlchemyDTO[Annotated[City, write_config]]
CityReadDTO = SQLAlchemyDTO[City] CityReadDTO = SQLAlchemyDTO[City]

View File

@ -1,22 +1,24 @@
from datetime import datetime
from typing import Annotated from typing import Annotated
from uuid import UUID
from litestar.contrib.sqlalchemy.base import UUIDBase from litestar.contrib.sqlalchemy.base import UUIDAuditBase
from litestar.contrib.sqlalchemy.dto import SQLAlchemyDTO from litestar.contrib.sqlalchemy.dto import SQLAlchemyDTO
from litestar.dto import DTOConfig from litestar.dto import DTOConfig, Mark, dto_field
from sqlalchemy.orm import Mapped from sqlalchemy import ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.domain.city import City
from app.lib import service from app.lib import service
from app.lib.filter_repository import FilterRepository from app.lib.filter_repository import FilterRepository
class User(UUIDBase): class User(UUIDAuditBase):
__tablename__ = "users" # type: ignore[assignment] __tablename__ = "users" # type: ignore[assignment]
first_name: Mapped[str] first_name: Mapped[str]
last_name: Mapped[str] last_name: Mapped[str]
created_at: Mapped[datetime] city_id: Mapped[UUID] = mapped_column(ForeignKey("cities.id"))
modified_at: Mapped[datetime] city: Mapped[City] = relationship(lazy="joined", info=dto_field(Mark.READ_ONLY))
class Repository(FilterRepository[User]): class Repository(FilterRepository[User]):
@ -27,6 +29,7 @@ class Service(service.Service[User]):
repository_type = Repository repository_type = Repository
write_config = DTOConfig(exclude={"id"}) write_config = DTOConfig(exclude={"id", "created_at", "updated_at"})
read_config = DTOConfig(exclude={"city"})
UserWriteDTO = SQLAlchemyDTO[Annotated[User, write_config]] UserWriteDTO = SQLAlchemyDTO[Annotated[User, write_config]]
UserReadDTO = SQLAlchemyDTO[User] UserReadDTO = SQLAlchemyDTO[Annotated[User, read_config]]