Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/hesabixAPI/adapters/api/v1/ai/business_provider.py

99 lines
3.4 KiB
Python

from __future__ import annotations
from typing import Any, Dict, Optional
from fastapi import APIRouter, Body, Depends, Path, Request
from sqlalchemy.orm import Session
from adapters.db.session import get_db
from app.core.auth_dependency import AuthContext, get_current_user
from app.core.permissions import require_business_permission_dep
from app.core.responses import ApiError, success_response
from app.services.ai.business_ai_provider_service import (
business_has_active_byok_subscription,
delete_config,
get_config,
serialize_config,
test_connection,
upsert_config,
)
router = APIRouter(
prefix="/businesses/{business_id}/ai-provider",
tags=["ارائه‌دهنده AI اختصاصی"],
dependencies=[Depends(require_business_permission_dep("settings", "manage_ai_provider"))],
)
@router.get("", summary="دریافت تنظیمات ارائه‌دهنده اختصاصی")
async def get_business_ai_provider(
request: Request,
business_id: int = Path(...),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
) -> Dict[str, Any]:
has_byok, plan = business_has_active_byok_subscription(
db,
user_id=ctx.get_user_id(),
business_id=business_id,
)
cfg = get_config(db, business_id)
data = serialize_config(cfg, plan=plan if has_byok else None)
data["has_byok_subscription"] = has_byok
data["plan_code"] = plan.code if plan and has_byok else None
data["plan_name"] = plan.name if plan and has_byok else None
return success_response(data, request)
@router.put("", summary="ذخیره تنظیمات ارائه‌دهنده اختصاصی")
async def put_business_ai_provider(
request: Request,
business_id: int = Path(...),
payload: Dict[str, Any] = Body(...),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
) -> Dict[str, Any]:
cfg = upsert_config(
db,
business_id=business_id,
user_id=ctx.get_user_id(),
payload=payload or {},
)
_, plan = business_has_active_byok_subscription(
db,
user_id=ctx.get_user_id(),
business_id=business_id,
)
data = serialize_config(cfg, plan=plan)
data["has_byok_subscription"] = True
return success_response(data, request, "تنظیمات ارائه‌دهنده ذخیره شد")
@router.post("/test", summary="تست اتصال ارائه‌دهنده اختصاصی")
async def test_business_ai_provider(
request: Request,
business_id: int = Path(...),
model: Optional[str] = Body(None, embed=True),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
) -> Dict[str, Any]:
result = test_connection(
db,
business_id=business_id,
user_id=ctx.get_user_id(),
model=model,
)
return success_response(result, request, "اتصال برقرار شد")
@router.delete("", summary="حذف تنظیمات ارائه‌دهنده اختصاصی")
async def delete_business_ai_provider(
request: Request,
business_id: int = Path(...),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
) -> Dict[str, Any]:
if not ctx.can_access_business(business_id):
raise ApiError("FORBIDDEN", "دسترسی به این کسب‌وکار مجاز نیست", http_status=403)
delete_config(db, business_id)
return success_response({"deleted": True}, request, "تنظیمات حذف شد")