|
from fastapi import APIRouter, HTTPException, status, Depends |
|
from typing import List |
|
from .Model import Plan |
|
from .Schema import ( |
|
CreatePlanRequest, |
|
UpdatePlanRequest, |
|
PlanResponse, |
|
PlanListResponse, |
|
BaseResponse, |
|
) |
|
|
|
plan_router = APIRouter(tags=["Plans"]) |
|
|
|
|
|
@plan_router.post("/plan/create", response_model=BaseResponse) |
|
async def create_plan(request: CreatePlanRequest): |
|
|
|
existing_plan = await Plan.get_or_none(name=request.name) |
|
if existing_plan: |
|
raise HTTPException( |
|
status_code=status.HTTP_400_BAD_REQUEST, |
|
detail="A plan with this name already exists", |
|
) |
|
|
|
if request.is_promo: |
|
plan = await Plan.create( |
|
name=request.name, |
|
amount=request.amount, |
|
duration=request.duration, |
|
download_speed=request.download_speed, |
|
upload_speed=request.upload_speed, |
|
is_promo=request.is_promo, |
|
) |
|
await plan.set_expiration() |
|
await plan.save() |
|
|
|
return BaseResponse( |
|
code=200, |
|
message="Plan created successfully", |
|
payload={"plan_id": str(plan.id)}, |
|
) |
|
|
|
|
|
plan = await Plan.create( |
|
name=request.name, |
|
amount=request.amount, |
|
duration=request.duration, |
|
download_speed=request.download_speed, |
|
upload_speed=request.upload_speed, |
|
) |
|
await plan.save() |
|
|
|
return BaseResponse( |
|
code=200, message="Plan created successfully", payload={"plan_id": str(plan.id)} |
|
) |
|
|
|
|
|
@plan_router.put("/plan/{plan_id}/update", response_model=BaseResponse) |
|
async def update_plan(plan_id: str, request: UpdatePlanRequest): |
|
|
|
plan = await Plan.get_or_none(id=plan_id) |
|
if not plan: |
|
raise HTTPException( |
|
status_code=status.HTTP_404_NOT_FOUND, detail="Plan not found" |
|
) |
|
|
|
|
|
if request.name is not None: |
|
plan.name = request.name |
|
if request.amount is not None: |
|
plan.amount = request.amount |
|
if request.duration is not None: |
|
plan.duration = request.duration |
|
if request.download_speed is not None: |
|
plan.download_speed = request.download_speed |
|
if request.upload_speed is not None: |
|
plan.upload_speed = request.upload_speed |
|
|
|
await plan.save() |
|
|
|
return BaseResponse( |
|
code=200, message="Plan updated successfully", payload={"plan_id": str(plan.id)} |
|
) |
|
|
|
|
|
@plan_router.delete("/plan/{plan_id}/delete", response_model=BaseResponse) |
|
async def delete_plan(plan_id: str): |
|
|
|
plan = await Plan.get_or_none(id=plan_id) |
|
if not plan: |
|
raise HTTPException( |
|
status_code=status.HTTP_404_NOT_FOUND, detail="Plan not found" |
|
) |
|
|
|
await plan.delete() |
|
|
|
return BaseResponse(code=200, message="Plan deleted successfully") |
|
|
|
|
|
@plan_router.get("/plans", response_model=PlanListResponse) |
|
async def list_plans(): |
|
plans = await Plan.all() |
|
total_count = await Plan.all().count() |
|
|
|
result = [ |
|
PlanResponse( |
|
id=str(plan.id), |
|
name=plan.name, |
|
amount=plan.amount, |
|
duration=plan.duration, |
|
download_speed=plan.download_speed, |
|
upload_speed=plan.upload_speed, |
|
) |
|
for plan in plans |
|
] |
|
|
|
return PlanListResponse(plans=result, total_count=total_count) |
|
|