Commit graph

56 commits

Author SHA1 Message Date
b938183770 chore: bump to v1.3.0-aio.4
Some checks failed
lint.yml / chore: bump to v1.3.0-aio.4 (push) Failing after 0s
v1.3.0-aio.4
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 12:23:23 +02:00
48f3c11f88 fix: gate event edits through the approval workflow
The PUT /events/{id} endpoint blindly copied every field from the
request body onto the existing event, including `status`. A non-admin
owner with auto_approve=false could PUT {"status": "approved", ...}
and self-approve, bypassing review entirely.

Replace the blanket setattr loop with an explicit field list (status
omitted) and derive the new status from the same admin / auto_approve
gate that api_event_create uses. Reconcile Nostr against the status
transition:
  approved → approved : re-publish the replaceable NIP-52 event
  proposed → approved : fresh publish
  approved → proposed : NIP-09 delete so the public feed drops it
                        until the edit is re-approved
  proposed → proposed : no-op

Also apply the same end/closing-date defaulting as create_event so an
edit that omits those fields doesn't wipe them.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 12:23:10 +02:00
d7a25e9bb3 chore: bump to v1.3.0-aio.3
Some checks failed
lint.yml / chore: bump to v1.3.0-aio.3 (push) Failing after 0s
v1.3.0-aio.3
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 01:22:50 +02:00
4aa90d80ad feat: support optional start/end time on events
event_start_date / event_end_date now accept either YYYY-MM-DD (date-only)
or YYYY-MM-DDTHH:MM (ISO datetime). The NIP-52 publisher switches kind
on the "T" delimiter: kind 31922 (date-based, YYYY-MM-DD start/end) when
absent, kind 31923 (time-based, unix-timestamp start/end + day-granularity
D tags) when present. Delete events match the original publish kind.

Closing-date parsing accepts both formats. The LNbits admin form gains
optional HH:MM inputs alongside each date picker; they fold into the
wire-format string on submit and split back on edit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 01:22:38 +02:00
80a934be06 chore: bump to v1.3.0-aio.2
Some checks failed
lint.yml / chore: bump to v1.3.0-aio.2 (push) Failing after 0s
v1.3.0-aio.2
Picks up the upstream-lint pass (mypy/pyright/black/prettier).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 20:14:33 +02:00
b428b0dca8 chore: satisfy upstream lint (black, mypy, prettier, ruff)
Some checks failed
lint.yml / chore: satisfy upstream lint (black, mypy, prettier, ruff) (push) Failing after 0s
- black/prettier reformatting across new aio code
- type annotations on db.fetchone/fetchall callsites in crud.py
- explicit dict[str, list[str]] for tag_lists in nostr_sync.py
- type:ignore[attr-defined] on Account.prvkey access — the field is
  added by the aio-fork lnbits.core.models.Account; upstream lnbits
  does not yet have it, so consumers without the fork must add a
  prvkey column to accounts before the Nostr publisher can sign.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 20:04:15 +02:00
42a373bff1 feat: add NIP-52 Nostr publish + sync of calendar events
Some checks failed
lint.yml / feat: add NIP-52 Nostr publish + sync of calendar events (push) Failing after 0s
v1.3.0-aio.1
Approved events are mirrored to Nostr as NIP-52 calendar events (kind
31922) signed by the wallet owner's pubkey, and incoming kind 31922/31923
events from subscribed relays are synced into the local DB so events
created on other LNbits instances or Nostr clients show up locally.

- m009 stores nostr_event_id + nostr_event_created_at on each event
  (used for replaceable updates and NIP-09 deletes); m011 adds location
  + JSON-encoded categories list (NIP-52 location/`t` tags).
- models: Event/PublicEvent/CreateEvent gain location, categories,
  nostr_event_id, nostr_event_created_at; parse_categories validator
  decodes the JSON column on read.
- nostr/{event,nostr_client}.py: Schnorr signing, websocket relay client,
  and a NostrEvent model (publish-only and subscribe variants).
- nostr_publisher.py: build/sign NIP-52 kind 31922 events and NIP-09
  delete events; publish via the relay client.
- nostr_sync.py: subscribe to kinds 31922/31923, dedupe by nostr_event_id
  / d-tag, upsert Events; auto-approves discovered Nostr events since
  they're already public.
- nostr_hooks.py: thin bridge that views_api handlers call to publish
  or delete a NIP-52 event for a given local event. Lives in its own
  module to keep `from . import nostr_client` out of the view layer
  and avoid the views_api -> publisher import cycle.
- views_api: hooks publish_or_delete_nostr_event into create-on-approved,
  update-when-already-published, cancel (delete), delete (delete), and
  approve (publish).
- __init__.py: 3-task lifespan — wait_for_paid_invoices (upstream),
  NostrClient bootstrap, and the NIP-52 sync loop. Module-level
  nostr_client global is set by the bootstrap and read dynamically by
  publish_or_delete_nostr_event so the import order works regardless of
  whether nostrclient is up at startup.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 19:31:06 +02:00
4c8e06a6a9 feat: add event approval workflow with admin UI
Non-admin event submissions now land in a "proposed" queue that LNbits
admins review before the event becomes ticketable and publicly listed.

- m008 adds events.events.status (proposed/approved/rejected); m010 seeds
  an events.settings singleton row with the auto_approve toggle.
- Models: Event/CreateEvent.status, EventsSettings, optional date fields
  with sensible defaults (closing_date defaults to event_end_date which
  defaults to event_start_date), PublicEvent.status surfaces the workflow
  state on the public endpoint.
- crud: get_all/public/pending_events for the admin views; get/update_settings
  for the auto_approve toggle; create_event auto-fills missing date defaults.
- views_api:
  * POST /api/v1/events accepts wallet invoice keys so anyone can submit;
    handler stamps status="proposed" for non-admins when auto_approve is off
  * /public, /all, /pending, /settings (GET+PUT), /{id}/{approve,reject},
    /{id}/tickets endpoints; literal-prefix routes declared before /{event_id}
    so FastAPI matches them correctly
  * Public GET /{event_id} bypasses sold-out / closing-window gates for
    proposed/rejected events and returns the trimmed PublicEvent so the SFC
    can render a "pending approval" banner
  * POST /tickets/{event_id} rejects when event.status != "approved"
- Frontend: index.vue gains an admin Settings card, Pending Approvals list,
  status badge column and approve/reject row actions, plus an All Users'
  Events admin table; index.js gains the data + methods + an isAdmin probe
  via GET /events/all; display.vue shows pending/rejected banners and
  hides the Buy Ticket form unless status === "approved".

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 19:31:06 +02:00
11043ec8a7 feat: support optional user_id ticket identifier
Add an alternative ticket identifier scheme: instead of (name, email),
external integrations can issue tickets bound to an LNbits user_id.

- m007 adds the user_id column on events.ticket
- CreateTicket validator enforces exactly one identifier scheme per ticket
- Ticket / PublicTicket: name, email, user_id all Optional
- _parse_ticket_row reverses the empty-string sentinel used to keep the
  NOT NULL name/email columns satisfied when user_id is the identifier
- POST /tickets/{event_id} dispatches to _create_user_id_ticket vs
  _create_named_ticket based on the supplied identifier
- New GET /tickets/user/{user_id} returns tickets for a given user

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 19:31:06 +02:00
708d15629c chore: bump to v1.3.0-aio.1 and make m006 idempotent
Sets the rebase foundation: version metadata, point repo at the aio fork,
and a duplicate-column-tolerant m006 so AIO installs that already ran our
pre-rebase m007_add_extra_fields don't fail when LNbits replays upstream's
m006 under its new name.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 19:31:06 +02:00
dni ⚡
4afc78d44d
feat: register public page saves to localstorage (#48)
* feat: register public page saves to localstorage

previsously it fetched all tickets without much information. now it
saves the full scanned ticket after it was scanned, so it can be checked
by some1 without a login

* add last scan

* short id

* prettier
2026-05-05 10:45:14 +02:00
Tiago Vasconcelos
9e477ac959
feat: make events dynamic (#43)
---------

Co-authored-by: dni <office@dnilabs.com>
2026-05-04 17:01:53 +02:00
dni ⚡
f06bd9a668
chore: prepare release, fix lint and uv warnings (#44)
Some checks failed
/ release (push) Has been cancelled
/ pullrequest (push) Has been cancelled
v1.2.1
2026-04-15 17:37:34 +02:00
PatMulligan
78433a7d85
Fix: SQLite migration syntax error in m006 (#41)
Ran into this issue on my lnbits 1.4 on NixOS using the flake

- Fix m006_add_extra_fields migration that fails on SQLite with syntax error
- Split multi-column ALTER TABLE into separate statements (SQLite doesn't support adding multiple columns in one statement)
2026-04-15 17:30:34 +02:00
DoktorShift
1dd6f8b67e
docs: changes to more pages (#42)
* Changes to more pages
* Update description.md

---------

Co-authored-by: dni  <office@dnilabs.com>
2026-01-28 17:22:09 +01:00
Tiago Vasconcelos
42de6d4791
feat: add promo codes and conditional events (#40)
Some checks failed
/ release (push) Has been cancelled
/ pullrequest (push) Has been cancelled
v1.2.0
* add extra column
* add conditional events
* refunds
* conditional events working
* adding promo codes
* promo codes logic

---------

Co-authored-by: dni  <office@dnilabs.com>
2025-12-09 10:48:00 +00:00
arbadacarba
ee70c300f6
Fix typos (#39) 2025-12-09 10:28:48 +01:00
Tiago Vasconcelos
ae827a6545
fix: QR copy button (#38)
Some checks failed
/ release (push) Has been cancelled
/ pullrequest (push) Has been cancelled
v1.1.0
* fix QR copy button
* fixup poetry
* rc6 and chore update

---------

Co-authored-by: dni  <office@dnilabs.com>
2025-09-04 07:10:49 +02:00
Tiago Vasconcelos
7aeba1eeb4
Update to use uv (#37)
---------

Co-authored-by: dni  <office@dnilabs.com>
2025-08-22 16:54:51 +02:00
dni ⚡
c729ef17a6
fix: 1.0.0-rc5
Some checks failed
/ release (push) Has been cancelled
/ pullrequest (push) Has been cancelled
v1.0.0
2024-10-22 10:49:52 +02:00
dni ⚡
6714dcddc7
feat: update to lnbits 1.0.0 (#36) 2024-10-11 13:52:39 +02:00
dni ⚡
9ca714d878
fix: fetch incoming payment (#35)
did not work for internal payment
2024-09-03 16:35:42 +02:00
dni ⚡
400b39211d
feat: code quality (#34)
* feat: code quality
2024-08-29 12:18:49 +02:00
Arc
3df2a56ca2
Merge pull request #30 from lnbits/advanceddescription
added video
2024-05-17 17:39:51 +01:00
benarc
ea3a60ecd4 Added video 2024-05-17 17:39:11 +01:00
benarc
57f40b9790 Merge remote-tracking branch 'origin/main' into advanceddescription 2024-05-17 17:38:28 +01:00
Vlad Stan
9c82d9e2df chore: bump min_lnbits_version
Some checks failed
/ release (push) Has been cancelled
/ pullrequest (push) Has been cancelled
v0.2.0
2024-05-14 11:37:27 +03:00
Arc
c24f5ddb84
Merge pull request #29 from lnbits/advanceddescription
Added extended description
2024-05-06 12:42:45 +01:00
Tiago Vasconcelos
082f5e7488
Check payment (#28)
Hotfix the check payment when using fiat tickets
2024-05-06 12:41:35 +01:00
benarc
1b1cf72e17 Added extended description 2024-04-30 15:36:05 +01:00
dni ⚡
b985304384
fix: properly start/stop tasks (#27)
https://github.com/lnbits/lnbits/issues/2411
2024-04-15 12:53:16 +02:00
Tiago Vasconcelos
662587dbf2
fix timestamp on postgres (#26)
Some checks failed
/ release (push) Has been cancelled
/ pullrequest (push) Has been cancelled
v0.1.6
2024-03-07 12:06:59 +02:00
Arc
4f5fe8035d
Merge pull request #25 from lnbits/add_image_banner
Some checks failed
/ release (push) Has been cancelled
/ pullrequest (push) Has been cancelled
v0.1.5
allow for an image banner
2024-02-17 14:05:58 +00:00
benarc
38951a7ebe Merge branch 'main' into add_image_banner 2024-02-17 14:04:42 +00:00
Tiago Vasconcelos
07d2f59bc3
Refactor events extensions (#21)
Some checks failed
/ release (push) Has been cancelled
/ pullrequest (push) Has been cancelled
v0.1.4
* require admin key
* remove log
* only show paid tickets
* purge tickets
2024-02-05 08:50:39 +01:00
Tiago Vasconcelos
ae8930f884 allow for an image banner 2024-01-31 13:15:52 +00:00
Tiago Vasconcelos
f468183631
Sanitize/Validate name field (#20)
* escape name
* add email pydantic validation (API)
* format prettier
* don't allow slash on email also
* make regex const
* use string literals
* make get ticket a POST
* email regex


Co-authored-by: Vlad Stan <stan.v.vlad@gmail.com>
2024-01-26 14:30:14 +00:00
Tiago Vasconcelos
5e391a04bc
[FEAT] Fiat event tickets (#10) 2023-12-12 11:42:50 +01:00
Pavol Rusnak
ff73bc749b
fix typos (#19) 2023-12-11 12:13:12 +01:00
Tiago Vasconcelos
0c371e81df
allow custom path (#17)
Some checks failed
/ release (push) Has been cancelled
/ pullrequest (push) Has been cancelled
v0.1.3
* allow custom path

* update to minversion 0.11.0

---------

Co-authored-by: dni  <office@dnilabs.com>
2023-09-25 15:26:13 +01:00
dni ⚡
a0037f685a
[FEAT] add better release workflow (#18) 2023-09-23 22:36:08 +02:00
Tiago Vasconcelos
00f552c751
Fix ticket create (#13)
* don't set ticket as paid on create
* use crud fn in tasks.py
* create ticket is unpaid by default
2023-08-18 08:18:44 +02:00
Tiago Vasconcelos
c8b31d8e3f
[FEAT] add timestamp on register (#15)
* add timestamp on register
2023-08-18 08:17:29 +02:00
Tiago Vasconcelos
4586164016
Fix updating event (#9)
Some checks failed
release github version / build (push) Has been cancelled
0.1.2
* passing a copy of original data to dialog data
2023-07-04 09:17:31 +02:00
Tiago Vasconcelos
1d57e1ae1a
Fix create ticket endpoint (#7)
Some checks failed
release github version / build (push) Has been cancelled
0.1.1
* create ticket when creating invoice not on check payment
---------

Co-authored-by: dni  <office@dnilabs.com>
2023-06-28 14:25:28 +02:00
dni ⚡
13658ceda9
Merge pull request #3 from lnbits/fix_responsive_QR
make QR responsive on ticket page
2023-06-28 10:39:15 +02:00
dni ⚡
fb428cce40
Merge pull request #6 from lnbits/refactor-singular
refactor into singular
2023-06-27 12:06:16 +02:00
dni ⚡
1032bd9d7e
refactor into singular
models should always by singular
2023-06-27 11:57:16 +02:00
dni ⚡
cdcba0073a
add github release workflow 2023-06-27 11:47:55 +02:00
dni ⚡
a4a96824c9
add gitignore 2023-06-27 11:47:19 +02:00