hesabixArc/hesabixAPI/build/lib/adapters/api/v1/currencies.py

92 lines
2.6 KiB
Python
Raw Normal View History

2025-10-02 03:21:43 +03:30
from fastapi import APIRouter, Depends, Request
2025-10-04 17:17:53 +03:30
from sqlalchemy.orm import Session, joinedload
2025-10-02 03:21:43 +03:30
from adapters.db.session import get_db
from adapters.db.models.currency import Currency
from app.core.responses import success_response
2025-10-04 17:17:53 +03:30
from app.core.responses import ApiError
from app.core.auth_dependency import get_current_user, AuthContext
from app.core.permissions import require_business_access
from adapters.db.models.business import Business
2025-10-02 03:21:43 +03:30
router = APIRouter(prefix="/currencies", tags=["currencies"])
@router.get(
"",
summary="فهرست ارزها",
description="دریافت فهرست ارزهای قابل استفاده",
)
def list_currencies(request: Request, db: Session = Depends(get_db)) -> dict:
items = [
{
"id": c.id,
"name": c.name,
"title": c.title,
"symbol": c.symbol,
"code": c.code,
}
for c in db.query(Currency).order_by(Currency.title.asc()).all()
]
return success_response(items, request)
2025-10-04 17:17:53 +03:30
@router.get(
"/business/{business_id}",
summary="فهرست ارزهای کسب‌وکار",
description="دریافت ارز پیش‌فرض کسب‌وکار به‌علاوه ارزهای فعال آن کسب‌وکار (بدون تکرار)",
)
@require_business_access()
def list_business_currencies(
request: Request,
business_id: int,
ctx: AuthContext = Depends(get_current_user),
db: Session = Depends(get_db),
) -> dict:
business = (
db.query(Business)
.options(
joinedload(Business.default_currency),
joinedload(Business.currencies),
)
.filter(Business.id == business_id)
.first()
)
if not business:
raise ApiError("NOT_FOUND", "کسب‌وکار یافت نشد", http_status=404)
seen_ids = set()
result = []
# Add default currency first if exists
if business.default_currency:
c = business.default_currency
result.append({
"id": c.id,
"name": c.name,
"title": c.title,
"symbol": c.symbol,
"code": c.code,
"is_default": True,
})
seen_ids.add(c.id)
# Add active business currencies (excluding duplicates)
for c in business.currencies or []:
if c.id in seen_ids:
continue
result.append({
"id": c.id,
"name": c.name,
"title": c.title,
"symbol": c.symbol,
"code": c.code,
"is_default": False,
})
seen_ids.add(c.id)
# If nothing found, return empty list
return success_response(result, request)