feat(showcase): add public showcase page with per-profile/per-postcard visibility controls
This commit is contained in:
@@ -456,26 +456,80 @@ async def upload_image(
|
||||
return _redirect(f"/postcards/{postcard_id}")
|
||||
|
||||
|
||||
# ---------- API Keys ----------
|
||||
# ---------- Showcase ----------
|
||||
|
||||
@router.get("/api-keys", response_class=HTMLResponse)
|
||||
def api_keys_page(request: Request, user: User = Depends(get_current_user_web), db: Session = Depends(get_db)):
|
||||
keys = db.query(ApiKey).filter(ApiKey.user_id == user.id).all()
|
||||
return templates.TemplateResponse("api_keys.html", {"request": request, "user": user, "keys": keys})
|
||||
@router.get("/showcase/manage", response_class=HTMLResponse)
|
||||
def showcase_manage(request: Request, user: User = Depends(get_current_user_web), db: Session = Depends(get_db)):
|
||||
profiles = db.query(Profile).filter(Profile.user_id == user.id).all()
|
||||
profile_cards = {}
|
||||
for p in profiles:
|
||||
cards = db.query(Postcard).filter(Postcard.profile_id == p.id).all()
|
||||
profile_cards[p.id] = cards
|
||||
return templates.TemplateResponse("showcase_manage.html", {
|
||||
"request": request, "user": user, "profiles": profiles, "profile_cards": profile_cards,
|
||||
})
|
||||
|
||||
|
||||
@router.post("/api-keys")
|
||||
def api_key_create(user: User = Depends(get_current_user_web), db: Session = Depends(get_db)):
|
||||
ak = ApiKey(user_id=user.id, key=ApiKey.generate_key())
|
||||
db.add(ak)
|
||||
db.commit()
|
||||
return _redirect("/api-keys")
|
||||
|
||||
|
||||
@router.post("/api-keys/{key_id}/delete")
|
||||
def api_key_delete(key_id: int, user: User = Depends(get_current_user_web), db: Session = Depends(get_db)):
|
||||
ak = db.query(ApiKey).filter(ApiKey.id == key_id, ApiKey.user_id == user.id).first()
|
||||
if ak:
|
||||
db.delete(ak)
|
||||
@router.post("/showcase/manage")
|
||||
def showcase_manage_save(request: Request, showcase_mode: str = Form("profile"), user: User = Depends(get_current_user_web), db: Session = Depends(get_db)):
|
||||
if showcase_mode in ("profile", "flat"):
|
||||
user.showcase_mode = showcase_mode
|
||||
db.commit()
|
||||
return _redirect("/api-keys")
|
||||
return _redirect("/showcase/manage")
|
||||
|
||||
|
||||
@router.post("/profiles/{profile_id}/showcase")
|
||||
def profile_showcase_save(
|
||||
profile_id: int,
|
||||
showcase_enabled: str = Form(""),
|
||||
showcase_visible: str = Form("both"),
|
||||
user: User = Depends(get_current_user_web),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
p = db.query(Profile).filter(Profile.id == profile_id, Profile.user_id == user.id).first()
|
||||
if p:
|
||||
p.showcase_enabled = showcase_enabled == "1"
|
||||
if showcase_visible in ("sent", "received", "both"):
|
||||
p.showcase_visible = showcase_visible
|
||||
db.commit()
|
||||
return _redirect("/showcase/manage")
|
||||
|
||||
|
||||
@router.post("/postcards/{postcard_id}/showcase-toggle")
|
||||
def postcard_showcase_toggle(postcard_id: int, showcase_hidden: str = Form(""), user: User = Depends(get_current_user_web), db: Session = Depends(get_db)):
|
||||
pc = db.query(Postcard).filter(Postcard.id == postcard_id).first()
|
||||
if pc:
|
||||
profile = db.query(Profile).filter(Profile.id == pc.profile_id, Profile.user_id == user.id).first()
|
||||
if profile and profile.showcase_enabled:
|
||||
pc.showcase_hidden = showcase_hidden == "1"
|
||||
db.commit()
|
||||
return _redirect("/showcase/manage")
|
||||
|
||||
|
||||
@router.get("/u/{username}", response_class=HTMLResponse)
|
||||
def public_showcase(request: Request, username: str, db: Session = Depends(get_db)):
|
||||
user = db.query(User).filter(User.username == username).first()
|
||||
if not user:
|
||||
return HTMLResponse("用户不存在", status_code=404)
|
||||
profiles = db.query(Profile).filter(Profile.user_id == user.id, Profile.showcase_enabled == True).all()
|
||||
sent_all, received_all, profile_groups = [], [], []
|
||||
for p in profiles:
|
||||
cards = db.query(Postcard).filter(Postcard.profile_id == p.id, Postcard.showcase_hidden == False).all()
|
||||
if p.showcase_visible in ("sent", "both"):
|
||||
sent_all.extend([c for c in cards if c.status in ("sent", "delivered")])
|
||||
if p.showcase_visible in ("received", "both"):
|
||||
received_all.extend([c for c in cards if c.status == "received"])
|
||||
if p.showcase_visible in ("sent", "both"):
|
||||
p_sent = [c for c in cards if c.status in ("sent", "delivered")]
|
||||
else:
|
||||
p_sent = []
|
||||
if p.showcase_visible in ("received", "both"):
|
||||
p_received = [c for c in cards if c.status == "received"]
|
||||
else:
|
||||
p_received = []
|
||||
if p_sent or p_received:
|
||||
profile_groups.append({"profile": p, "sent": p_sent, "received": p_received})
|
||||
return templates.TemplateResponse("showcase.html", {
|
||||
"request": request, "profile_user": user, "mode": user.showcase_mode,
|
||||
"profile_groups": profile_groups, "sent_all": sent_all, "received_all": received_all,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user