53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
from typing import Annotated
|
|
|
|
from fastapi import APIRouter, Depends
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.api.deps import get_current_active_user
|
|
from app.core.admin_database import get_admin_db
|
|
from app.core.config import settings
|
|
from app.models.account import Account
|
|
from app.models.user import User
|
|
from app.schemas.billing import (
|
|
BillingStateResponse,
|
|
CheckoutSessionCreate,
|
|
CheckoutSessionResponse,
|
|
)
|
|
from app.services.billing import BillingService
|
|
|
|
router = APIRouter(prefix="/billing", tags=["billing"])
|
|
|
|
|
|
@router.post("/checkout-session", response_model=CheckoutSessionResponse)
|
|
async def create_checkout_session(
|
|
payload: CheckoutSessionCreate,
|
|
current_user: Annotated[User, Depends(get_current_active_user)],
|
|
db: Annotated[AsyncSession, Depends(get_admin_db)],
|
|
) -> CheckoutSessionResponse:
|
|
account = (await db.execute(
|
|
select(Account).where(Account.id == current_user.account_id)
|
|
)).scalar_one()
|
|
url = await BillingService.create_checkout_session(
|
|
db=db,
|
|
account=account,
|
|
plan=payload.plan,
|
|
seats=payload.seats,
|
|
billing_interval=payload.billing_interval,
|
|
success_url=f"{settings.FRONTEND_URL}/account/billing?success=1",
|
|
cancel_url=f"{settings.FRONTEND_URL}/account/billing/select-plan",
|
|
)
|
|
return CheckoutSessionResponse(url=url)
|
|
|
|
|
|
@router.get("/state", response_model=BillingStateResponse)
|
|
async def get_billing_state(
|
|
current_user: Annotated[User, Depends(get_current_active_user)],
|
|
db: Annotated[AsyncSession, Depends(get_admin_db)],
|
|
) -> BillingStateResponse:
|
|
account = (await db.execute(
|
|
select(Account).where(Account.id == current_user.account_id)
|
|
)).scalar_one()
|
|
state = await BillingService.get_billing_state(db, account)
|
|
return BillingStateResponse(**state)
|