from datetime import datetime from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from starlette.requests import Request from starlette.responses import Response from app.credit.models import ChargeRequestStatus, CreditChargeRequest, CreditTransaction, CreditTransactionType from app.database.session import AsyncSessionLocal from app.user.models import User from config import TIMEZONE async def get_dashboard_context() -> dict: async with AsyncSessionLocal() as session: today_start = datetime.now(TIMEZONE).replace(hour=0, minute=0, second=0, microsecond=0) pending_charge_requests_count = (await session.execute( select(func.count()).select_from(CreditChargeRequest) .where(CreditChargeRequest.status == ChargeRequestStatus.PENDING) )).scalar() today_charge = (await session.execute( select(func.count()).select_from(CreditTransaction) .where( CreditTransaction.type == CreditTransactionType.CHARGE, CreditTransaction.created_at >= today_start, ) )).scalar() today_consume = (await session.execute( select(func.count()).select_from(CreditTransaction) .where( CreditTransaction.type == CreditTransactionType.CONSUME, CreditTransaction.created_at >= today_start, ) )).scalar() month_start = datetime.now(TIMEZONE).replace(day=1, hour=0, minute=0, second=0, microsecond=0) month_consume = (await session.execute( select(func.coalesce(func.sum(func.abs(CreditTransaction.amount)), 0)) .select_from(CreditTransaction) .where( CreditTransaction.type == CreditTransactionType.CONSUME, CreditTransaction.created_at >= month_start, ) )).scalar() pending_requests = (await session.execute( select(CreditChargeRequest) .where(CreditChargeRequest.status == ChargeRequestStatus.PENDING) .order_by(CreditChargeRequest.created_at.desc()) .limit(10) )).scalars().all() recent_transactions = (await session.execute( select(CreditTransaction) .order_by(CreditTransaction.created_at.desc()) .limit(10) )).scalars().all() recent_users = (await session.execute( select(User) .where(User.is_deleted == False) .order_by(User.created_at.desc()) .limit(10) )).scalars().all() return { "stats": { "pending_charge_requests": pending_charge_requests_count, "today_charge": today_charge, "today_consume": today_consume, "month_consume": month_consume, }, "pending_requests": pending_requests, "recent_transactions": recent_transactions, "recent_users": recent_users, }