from uuid import UUID from typing import Type from sqlalchemy.orm import Session from app.domain.models.base import BaseModel from sqlalchemy import and_ from typing import Generic, TypeVar, Type, List, Optional ModelType = TypeVar("ModelType", bound=BaseModel) class BaseRepository(Generic[ModelType]): '''기본 레포지토리 클래스''' def __init__(self, model: Type[BaseModel], db: Session): self.model = model self.db = db def create(self, object: dict | BaseModel) -> ModelType: '''객체 생성 (dict 또는 모델 인스턴스 허용)''' if isinstance(object, dict): db_object = self.model(**object) else: db_object = object self.db.add(db_object) self.db.flush() # ID 확보용 self.db.refresh(db_object) return db_object def get_by_id(self, id: UUID) -> Optional[ModelType]: '''ID로 객체 조회''' return self.db.query(self.model).filter( and_(self.model.id == id, self.model.deleted == False) ).first() def get_all(self, skip: int = 0, limit: int = 100) -> List[ModelType]: """모든 객체 조회 (소프트 삭제된 것 제외)""" return self.db.query(self.model).filter( self.model.deleted == False ).offset(skip).limit(limit).all() def update(self, id: UUID, object: dict) -> Optional[ModelType]: '''ID로 객체 업데이트''' db_object = self.get_by_id(id) if db_object: for field, value in object.items(): setattr(db_object, field, value) self.db.commit() self.db.refresh(db_object) return db_object def soft_delete(self, id: UUID) -> bool: '''ID로 객체 소프트 삭제''' db_object = self.get_by_id(id) if db_object: db_object.soft_delete() self.db.commit() return True return False def delete(self, id: UUID) -> bool: '''ID로 객체 삭제''' db_object = self.get_by_id(id) if db_object: self.db.delete(db_object) self.db.commit() return True return False