diff --git a/backend/app/services/tenant_service.py b/backend/app/services/tenant_service.py new file mode 100644 index 0000000..f5eab09 --- /dev/null +++ b/backend/app/services/tenant_service.py @@ -0,0 +1,51 @@ +"""Tenant service: CRUD operations for tenants.""" +from sqlalchemy.orm import Session +from typing import List, Optional +from app.models.tenant import Tenant +from app.schemas.tenant import TenantCreate, TenantUpdate, TenantResponse + + +class TenantService: + @staticmethod + def list_tenants(db: Session, skip: int = 0, limit: int = 100) -> List[Tenant]: + return db.query(Tenant).offset(skip).limit(limit).all() + + @staticmethod + def get_tenant(db: Session, tenant_id: int) -> Optional[Tenant]: + return db.query(Tenant).filter(Tenant.id == tenant_id).first() + + @staticmethod + def create_tenant(db: Session, req: TenantCreate) -> Tenant: + # Check slug uniqueness + existing = db.query(Tenant).filter(Tenant.slug == req.slug).first() + if existing: + raise ValueError(f"Tenant slug '{req.slug}' already exists") + tenant = Tenant( + name=req.name, + slug=req.slug, + description=req.description, + ) + db.add(tenant) + db.commit() + db.refresh(tenant) + return tenant + + @staticmethod + def update_tenant(db: Session, tenant_id: int, req: TenantUpdate) -> Tenant: + tenant = db.query(Tenant).filter(Tenant.id == tenant_id).first() + if not tenant: + raise ValueError(f"Tenant #{tenant_id} not found") + for field, value in req.model_dump(exclude_unset=True).items(): + setattr(tenant, field, value) + db.commit() + db.refresh(tenant) + return tenant + + @staticmethod + def delete_tenant(db: Session, tenant_id: int) -> bool: + tenant = db.query(Tenant).filter(Tenant.id == tenant_id).first() + if not tenant: + return False + db.delete(tenant) + db.commit() + return True