from typing import Any from fastapi import APIRouter, Depends, HTTPException, Query from fastapi.responses import JSONResponse from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession from db_setup import get_session from org_settings.views import OrgSetting from users.permissions import PermissionTag, require_permission router = APIRouter() class OrgSettingItem(BaseModel): key: str value: Any = None category: str class OrgSettingsUpdate(BaseModel): settings: list[OrgSettingItem] @router.get("/org-settings/fetch") async def fetch_org_settings( current_user: dict = Depends(require_permission(PermissionTag.SETTINGS_VIEW)), category: str | None = Query(None), session: AsyncSession = Depends(get_session), ): try: service = OrgSetting(session=session) data, total = await service.get_settings(category) return JSONResponse(content={"data": data, "total": total, "status_code": 200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.put("/org-settings/update") async def update_org_settings( payload: OrgSettingsUpdate, current_user: dict = Depends(require_permission(PermissionTag.SETTINGS_CONFIGURE)), session: AsyncSession = Depends(get_session), ): try: service = OrgSetting(session=session) data = await service.update_settings(payload.model_dump(exclude_unset=True), current_user) return JSONResponse(content={"data": data, "total": len(data), "status_code": 200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e))