diff --git a/app/main.py b/app/main.py index df6897e..cceec0d 100644 --- a/app/main.py +++ b/app/main.py @@ -142,6 +142,27 @@ async def api_set_balance(request: Request): return JSONResponse({"error": e.detail}, status_code=e.status_code) +@app.post("/api/set-credits") +async def api_set_credits(request: Request): + if not is_admin(request): + return JSONResponse({"error": "forbidden"}, status_code=403) + body = await request.json() + email = (body.get("email") or "").strip().lower() + if not email: + return JSONResponse({"error": "Missing email"}, status_code=400) + payload = {"email": email, "reason": body.get("reason") or "admin adjustment"} + if "add" in body: + payload["add"] = float(body["add"]) + elif "set" in body: + payload["set"] = float(body["set"]) + else: + return JSONResponse({"error": "Provide 'set' or 'add'"}, status_code=400) + try: + return await portal_post("/admin/set-credits", payload) + except HTTPException as e: + return JSONResponse({"error": e.detail}, status_code=e.status_code) + + # --------------------------------------------------------------------------- # OIDC routes — authorization-code flow against Cloudron's OIDC provider. # Active only when the `oidc` addon is configured (CLOUDRON_OIDC_* present). @@ -240,6 +261,8 @@ PAGE_HTML = """ .adjust input { width: 64px; padding: 4px 6px; border: 1px solid var(--border); border-radius: 6px; font-size: 12px; } .adjust button { cursor: pointer; border: none; border-radius: 6px; background: var(--green-deep); color: #fff; font-size: 12px; font-weight: 600; padding: 4px 10px; } .adjust button:hover { background: #4e7a4d; } + .adjust .credits-btn { background: var(--bronze, #a97a4a); } + .adjust .credits-btn:hover { background: #92693c; } .tabs { display: flex; gap: 8px; margin: 28px 0 12px; align-items: center; } .tabs h2 { font-size: 17px; font-weight: 700; margin-right: 8px; } .tab-btn { cursor: pointer; border: 1px solid var(--border); background: #fff; color: var(--muted); border-radius: 8px; font-size: 13px; font-weight: 600; padding: 6px 14px; } @@ -282,7 +305,8 @@ PAGE_HTML = """