feat: add per-user trial control in admin panel (backend + UI)

This commit is contained in:
2026-09-24 12:12:37 +05:30
parent 85665a5eab
commit a6db3e7c17
2 changed files with 71 additions and 3 deletions

View File

@@ -1470,6 +1470,7 @@ class AdminUserPatch(BaseModel):
school: Optional[str] = None
city: Optional[str] = None
state: Optional[str] = None
trial_days: Optional[int] = None # number of trial days to grant from now (0 = remove trial)
@app.get("/api/admin/students", tags=["Admin"])
def list_all_students(session: Session = Depends(get_session), current_user: models.User = Depends(get_current_user)):
@@ -1608,7 +1609,7 @@ def get_student_detail(user_id: UUID, session: Session = Depends(get_session), c
@app.patch("/api/admin/students/{user_id}", tags=["Admin"])
def patch_student(user_id: UUID, payload: AdminUserPatch, session: Session = Depends(get_session), current_user: models.User = Depends(get_current_user)):
"""Admin update: tier, name, streak, exam, location."""
"""Admin update: tier, name, streak, exam, location, trial."""
user = session.get(models.User, user_id)
if not user:
raise HTTPException(status_code=404, detail="Student not found")
@@ -1619,10 +1620,15 @@ def patch_student(user_id: UUID, payload: AdminUserPatch, session: Session = Dep
if payload.school is not None: user.school = payload.school
if payload.city is not None: user.city = payload.city
if payload.state is not None: user.state = payload.state
if payload.trial_days is not None:
if payload.trial_days <= 0:
user.trial_end = None # remove trial
else:
user.trial_end = datetime.utcnow() + timedelta(days=payload.trial_days)
session.add(user)
session.commit()
session.refresh(user)
return {"status": "ok", "user_id": str(user.id), "tier": user.tier.value}
return {"status": "ok", "user_id": str(user.id), "tier": user.tier.value, "trial_end": user.trial_end.isoformat() if user.trial_end else None}
# --- BILLING & PAYMENTS ---