| 
 | 1 | +import uuid  | 
 | 2 | +from typing import Any  | 
 | 3 | + | 
 | 4 | +from sqlalchemy import func  | 
 | 5 | +from sqlmodel import Session, select  | 
 | 6 | + | 
 | 7 | +from app.core.security import get_password_hash  | 
 | 8 | +from app.models import Item, ItemCreate, ItemUpdate  | 
 | 9 | + | 
 | 10 | + | 
 | 11 | +class ItemModel:  | 
 | 12 | +    def __init__(self, session: Session):  | 
 | 13 | +        self.session = session  | 
 | 14 | + | 
 | 15 | +    def create(self, item_create: ItemCreate, owner_id: uuid.UUID) -> Item:  | 
 | 16 | +        db_obj = Item.model_validate(  | 
 | 17 | +            item_create,  | 
 | 18 | +            update={"owner_id": owner_id},  | 
 | 19 | +        )  | 
 | 20 | +        self.session.add(db_obj)  | 
 | 21 | +        self.session.commit()  | 
 | 22 | +        self.session.refresh(db_obj)  | 
 | 23 | +        return db_obj  | 
 | 24 | + | 
 | 25 | +    def update(self, db_item: Item, item_in: ItemUpdate) -> Item:  | 
 | 26 | +        item_data = item_in.model_dump(exclude_unset=True)  | 
 | 27 | +        db_item.sqlmodel_update(item_data)  | 
 | 28 | +        self.session.add(db_item)  | 
 | 29 | +        self.session.commit()  | 
 | 30 | +        self.session.refresh(db_item)  | 
 | 31 | +        return db_item  | 
 | 32 | + | 
 | 33 | +    def get_by_id(self, item_id: str) -> "Item | None":  | 
 | 34 | +        statement = select(Item).where(Item.id == uuid.UUID(item_id))  | 
 | 35 | +        return self.session.exec(statement).first()  | 
 | 36 | + | 
 | 37 | +    def get_items(self, skip: int = 0, limit: int = 100, owner_id: uuid.UUID | None = None) -> dict:  | 
 | 38 | +        query = select(Item)  | 
 | 39 | +        if owner_id:  | 
 | 40 | +            query = query.where(Item.owner_id == owner_id)  | 
 | 41 | +              | 
 | 42 | +        count_statement = select(func.count()).select_from(query.subquery())  | 
 | 43 | +        count = self.session.exec(count_statement).one()  | 
 | 44 | +          | 
 | 45 | +        query = query.offset(skip).limit(limit)  | 
 | 46 | +        items = self.session.exec(query).all()  | 
 | 47 | +        return {"data": items, "count": count}  | 
 | 48 | + | 
 | 49 | +    def delete_item(self, item_id: str) -> None:  | 
 | 50 | +        item = self.get_by_id(item_id)  | 
 | 51 | +        if item:  | 
 | 52 | +            self.session.delete(item)  | 
 | 53 | +            self.session.commit()  | 
0 commit comments