feat: finish forecast rendering and account-authenticated API explorer

This commit is contained in:
Pigway
2026-10-02 09:27:44 +08:00
parent e67b4ceb6e
commit d10b07c464
8 changed files with 83 additions and 10 deletions
+21 -4
View File
@@ -7,13 +7,15 @@ import secrets
import time
from pathlib import Path
from fastapi import Request, Response
from fastapi import Request, Response, Security
from fastapi.security import APIKeyCookie
from pydantic import BaseModel, Field
from pigway_frame_flow.errors import ErrorCode as E
from pigway_frame_flow.errors import FlowError
COOKIE = "frameflow_session"
cookie = APIKeyCookie(name=COOKIE, auto_error=False, scheme_name="AccountSession")
def password_hash(password: str) -> str:
@@ -153,18 +155,33 @@ def install_accounts(app, db):
raise FlowError(E.UNAUTHORIZED, "Account login required", 401)
return row
@app.get("/api/v1/auth/me", response_model=AccountView, tags=["Accounts"])
@app.get(
"/api/v1/auth/me",
response_model=AccountView,
tags=["Accounts"],
dependencies=[Security(cookie)],
)
def me(request: Request):
row = current(request)
return AccountView(username=row["username"], csrf_token=row["csrf"])
@app.post("/api/v1/auth/logout", status_code=204, tags=["Accounts"])
@app.post(
"/api/v1/auth/logout",
status_code=204,
tags=["Accounts"],
dependencies=[Security(cookie)],
)
def logout(request: Request, response: Response):
row = current(request)
db.execute("DELETE FROM sessions WHERE token_hash=?", (row["token_hash"],))
response.delete_cookie(COOKIE, path="/")
@app.put("/api/v1/auth/password", status_code=204, tags=["Accounts"])
@app.put(
"/api/v1/auth/password",
status_code=204,
tags=["Accounts"],
dependencies=[Security(cookie)],
)
def change_password(payload: PasswordChange, request: Request, response: Response):
session = current(request)
user = db.one("SELECT * FROM users WHERE username=?", (session["username"],))
+4 -2
View File
@@ -5,7 +5,7 @@ import json
from fastapi import Request, Security
from fastapi.security import HTTPBearer
from pigway_frame_flow.core.accounts import session_user
from pigway_frame_flow.core.accounts import cookie, session_user
from pigway_frame_flow.errors import ErrorCode as E
from pigway_frame_flow.errors import FlowError
from pigway_frame_flow.storage.database import encode, now_iso
@@ -38,7 +38,9 @@ def seed_client(db, token):
def require(scope):
def authorize(request: Request, credentials=Security(bearer)):
def authorize(
request: Request, credentials=Security(bearer), session_cookie=Security(cookie)
):
db = request.app.state.service.db
if not credentials:
account = session_user(request)