from __future__ import annotations from sqlalchemy.orm import Session from packages.adapters.sqlalchemy_impl.models import WorkspaceModel from packages.domain.entities import Workspace from packages.ports.workspace_repository import WorkspaceRepository class SQLAlchemyWorkspaceRepository(WorkspaceRepository): def __init__(self, session: Session): self.session = session def save(self, workspace: Workspace) -> None: model = self.session.get(WorkspaceModel, workspace.id) if model is None: model = WorkspaceModel(id=workspace.id) self.session.add(model) model.name = workspace.name model.owner_user_id = workspace.owner_user_id model.subscription_plan = workspace.subscription_plan model.subscription_status = workspace.subscription_status model.subscription_expires_at = workspace.subscription_expires_at model.max_projects = workspace.max_projects model.max_storage_gb = workspace.max_storage_gb model.used_storage_gb = workspace.used_storage_gb model.created_at = workspace.created_at self.session.commit() self.session.refresh(model) def find_by_id(self, workspace_id: str) -> Workspace | None: return self._to_entity(self.session.get(WorkspaceModel, workspace_id)) def delete(self, workspace_id: str) -> bool: model = self.session.get(WorkspaceModel, workspace_id) if model is None: return False self.session.delete(model) self.session.commit() return True @staticmethod def _to_entity(model: WorkspaceModel | None) -> Workspace | None: if model is None: return None return Workspace( id=model.id, name=model.name, owner_user_id=model.owner_user_id, subscription_plan=model.subscription_plan, subscription_status=model.subscription_status, subscription_expires_at=model.subscription_expires_at, max_projects=int(model.max_projects), max_storage_gb=int(model.max_storage_gb), used_storage_gb=float(model.used_storage_gb), created_at=model.created_at, )