from typing import Annotated from uuid import UUID from litestar.contrib.sqlalchemy.base import UUIDAuditBase from litestar.contrib.sqlalchemy.dto import SQLAlchemyDTO from litestar.dto import DTOConfig, Mark, dto_field 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.filter_repository import FilterRepository class User(UUIDAuditBase): __tablename__ = "users" # type: ignore[assignment] first_name: Mapped[str] last_name: Mapped[str] city_id: Mapped[UUID] = mapped_column(ForeignKey("cities.id")) city: Mapped[City] = relationship(lazy="joined", info=dto_field(Mark.READ_ONLY)) class Repository(FilterRepository[User]): model_type = User class Service(service.Service[User]): repository_type = Repository write_config = DTOConfig(exclude={"id", "created_at", "updated_at"}) read_config = DTOConfig(exclude={"city"}) UserWriteDTO = SQLAlchemyDTO[Annotated[User, write_config]] UserReadDTO = SQLAlchemyDTO[Annotated[User, read_config]]