80 lines
2.9 KiB
Python
80 lines
2.9 KiB
Python
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,
|
|
}
|