Add drag-drop and keyboard link ordering
This commit is contained in:
@@ -198,6 +198,15 @@ class RestoreIn(BaseModel):
|
||||
confirm: bool = False
|
||||
|
||||
|
||||
class ReorderItem(BaseModel):
|
||||
id: int
|
||||
sort_order: int
|
||||
|
||||
|
||||
class ReorderIn(BaseModel):
|
||||
items: list[ReorderItem]
|
||||
|
||||
|
||||
def utc_now_iso() -> str:
|
||||
return datetime.utcnow().isoformat()
|
||||
|
||||
@@ -637,6 +646,32 @@ def update_link(
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@app.patch("/api/links/order")
|
||||
def reorder_links(request: Request, inp: ReorderIn):
|
||||
require_admin(request)
|
||||
require_csrf(request)
|
||||
if not inp.items:
|
||||
raise HTTPException(422, "items must not be empty")
|
||||
seen: set[int] = set()
|
||||
with db() as c:
|
||||
c.begin()
|
||||
try:
|
||||
with c.cursor() as cur:
|
||||
for item in inp.items:
|
||||
if item.id in seen:
|
||||
raise HTTPException(422, "duplicate link id in reorder payload")
|
||||
seen.add(item.id)
|
||||
cur.execute("update links set sort_order=%s,updated_at=%s where id=%s", (item.sort_order, utc_now_db(), item.id))
|
||||
if cur.rowcount == 0:
|
||||
raise HTTPException(404, f"link {item.id} not found")
|
||||
c.commit()
|
||||
except Exception:
|
||||
c.rollback()
|
||||
raise
|
||||
log_event(request, "links.reorder", count=len(inp.items))
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@app.get("/api/admin/backup")
|
||||
def backup(request: Request):
|
||||
require_admin(request)
|
||||
|
||||
Reference in New Issue
Block a user