add API routes, admin UI, and SPA bootstrap

views_api wires the full task lifecycle: create / update / delete /
list (per-wallet, public, admin-all) and the completion flow (claim /
start / complete via POST, unclaim via DELETE, plus a "mine" lookup
for the current user's claim on a task or specific occurrence).

Auth model: tasks are owned by an LNbits wallet but signed with the
wallet owner's account.pubkey — _wallet_pubkey resolves that pubkey at
create time and refuses to create tasks for accounts that haven't
generated a keypair yet, so we never publish a task we can't sign.

Completions optimistically insert with a local hash, publish to Nostr,
then re-insert under the actual event id so a later delete can find it.

Static SPA: Quasar-UMD index.vue / index.js mirroring the events
extension layout — wallet picker, task table, create/edit dialog with
optional daily/weekly recurrence, plus an admin-only public_listing
toggle. /tasks/:id and display.vue intentionally left out until the
public task page lands.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-05-13 11:43:59 +02:00
commit 48a63c0338
5 changed files with 631 additions and 12 deletions

View file

@ -1,5 +1,5 @@
from fastapi import APIRouter, Depends
from lnbits.core.views.generic import index, index_public
from lnbits.core.views.generic import index
from lnbits.decorators import check_account_id_exists
tasks_generic_router = APIRouter()
@ -11,6 +11,3 @@ tasks_generic_router.add_api_route(
dependencies=[Depends(check_account_id_exists)],
)
tasks_generic_router.add_api_route(
"/{task_id}", methods=["GET"], endpoint=index_public
)