import uuid from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.orm import Session from app.models.database import get_db, Tenant from app.dependencies.admin_auth import require_admin_jwt from app.schemas.admin_settings import GoLiveRequest, TenantSettingsUpdate, TenantResponse router = APIRouter(prefix="/admin", tags=["admin"]) @router.patch("/go-live", response_model=TenantResponse) def patch_admin_go_live( request: GoLiveRequest, tenant_id: uuid.UUID = Depends(require_admin_jwt), db: Session = Depends(get_db) ): tenant = db.scalar(select(Tenant).where(Tenant.id == tenant_id)) if not tenant: raise HTTPException(status_code=404, detail="Tenant not found") tenant.is_active = request.is_active db.commit() db.refresh(tenant) return tenant @router.put("/settings", response_model=TenantResponse) def put_admin_settings( request: TenantSettingsUpdate, tenant_id: uuid.UUID = Depends(require_admin_jwt), db: Session = Depends(get_db) ): tenant = db.scalar(select(Tenant).where(Tenant.id == tenant_id)) if not tenant: raise HTTPException(status_code=404, detail="Tenant not found") if request.name is not None: tenant.name = request.name if request.website_url is not None: tenant.website_url = str(request.website_url) if tenant.customization is None: tenant.customization = {} customization_update = {} if request.industry is not None: customization_update["industry"] = request.industry if request.timezone is not None: customization_update["timezone"] = request.timezone if request.chatbot_name is not None: customization_update["chatbot_name"] = request.chatbot_name if request.chatbot_greeting is not None: customization_update["chatbot_greeting"] = request.chatbot_greeting if customization_update: # SQLAlchemy requires a new dict object for JSON column mutation tracking new_customization = dict(tenant.customization) new_customization.update(customization_update) tenant.customization = new_customization if "backup_email" in request.model_fields_set: tenant.backup_email = str(request.backup_email) if request.backup_email else None db.commit() db.refresh(tenant) return tenant