from __future__ import annotations from datetime import datetime from typing import Annotated, Optional import sqlalchemy from litestar.contrib.sqlalchemy.base import BigIntBase from litestar.contrib.sqlalchemy.dto import SQLAlchemyDTO from litestar.dto import DTOConfig, MsgspecDTO from msgspec import Struct, Meta from sqlalchemy.orm import Mapped, mapped_column from app.domain.enums import AssetItemProductLineEnum, AssetItemStatusEnum from app.lib import service from app.lib.company_owned_repository import CompanyOwnedRepository class AssetItem(BigIntBase): __tablename__ = "asset_items" # type: ignore[assignment] company_id: Mapped[int] product_line: Mapped[AssetItemProductLineEnum] = mapped_column( sqlalchemy.Enum(AssetItemProductLineEnum, name="asset_product_line_enum") ) brand_id: Mapped[int] model_id: Mapped[int] serial_number: Mapped[str] external_id: Mapped[Optional[str]] alive: Mapped[bool] status: Mapped[AssetItemStatusEnum] = mapped_column( sqlalchemy.Enum(AssetItemStatusEnum, name="asset_status_enum") ) created_by_id: Mapped[Optional[int]] created_at: Mapped[datetime] last_modified_by_id: Mapped[Optional[int]] last_modified_at: Mapped[datetime] is_fiscal_device: Mapped[bool] warehouse_id: Mapped[Optional[int]] PositiveInt = Annotated[int, Meta(gt=0)] class AssetItemWriteStruct(Struct): company_id: PositiveInt product_line: AssetItemProductLineEnum brand_id: PositiveInt model_id: PositiveInt serial_number: Annotated[str, Meta(max_length=10)] external_id: Annotated[str, Meta(max_length=10)] | None alive: bool status: AssetItemStatusEnum created_by_id: PositiveInt | None created_at: datetime last_modified_by_id: PositiveInt | None last_modified_at: datetime | None is_fiscal_device: bool warehouse_id: PositiveInt | None class XXAssetItemWriteDTO(MsgspecDTO[AssetItemWriteStruct]): ... class Repository(CompanyOwnedRepository[AssetItem]): model_type = AssetItem alive_flag = "alive" company_id_field = "company_id" class Service(service.Service[AssetItem]): repository_type = Repository write_config = DTOConfig(exclude={"id"}) AssetItemWriteDTO = SQLAlchemyDTO[Annotated[AssetItem, write_config]] # AssetItemWriteDTO = MsgspecDTO[AssetItemWriteStruct] AssetItemReadDTO = SQLAlchemyDTO[AssetItem]