@@ -409,6 +364,51 @@
+
+
+
+
+
+
+ All Users' Events
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/transport_rpcs.py b/transport_rpcs.py
index 16060d6..e278f91 100644
--- a/transport_rpcs.py
+++ b/transport_rpcs.py
@@ -20,7 +20,7 @@ from lnbits.core.crud import get_user
from lnbits.core.models import WalletTypeInfo
from lnbits.core.services.nostr_transport.models import NostrRpcRequest
-from .crud import get_event, get_ticket, update_ticket
+from .crud import get_event, get_ticket, get_tickets_by_event, update_ticket
async def handle_events_ticket_register(
@@ -66,3 +66,55 @@ async def handle_events_ticket_register(
ticket.reg_timestamp = datetime.now(timezone.utc)
await update_ticket(ticket)
return ticket.dict()
+
+
+async def handle_events_list_event_tickets(
+ auth: WalletTypeInfo,
+ request: NostrRpcRequest,
+) -> dict:
+ """Return paid + registered counts plus the per-ticket roster for
+ one calendar event, organizer-only.
+
+ Backs the door scanner's counts strip and "All scanned" tab so the
+ UI reads authoritative state from the backend instead of relying
+ on per-device localStorage (which diverges the moment a second
+ organizer scans, or the operator switches devices).
+
+ The roster only includes paid tickets — proposed/unpaid rows are
+ irrelevant at the door.
+ """
+ body = request.body or {}
+ event_id = body.get("event_id")
+ if not event_id:
+ raise ValueError("event_id is required")
+
+ event = await get_event(event_id)
+ if not event:
+ raise ValueError("Event does not exist")
+
+ user = await get_user(auth.wallet.user)
+ owned_wallet_ids = user.wallet_ids if user else [auth.wallet.id]
+ if event.wallet not in owned_wallet_ids:
+ raise PermissionError("You do not own this event")
+
+ tickets = await get_tickets_by_event(event_id)
+ paid_tickets = [t for t in tickets if t.paid]
+ registered_count = sum(1 for t in paid_tickets if t.registered)
+
+ return {
+ "event_id": event_id,
+ "sold": len(paid_tickets),
+ "registered": registered_count,
+ "remaining": len(paid_tickets) - registered_count,
+ "tickets": [
+ {
+ "id": t.id,
+ "name": t.name,
+ "registered": t.registered,
+ "registered_at": (
+ t.reg_timestamp.isoformat() if t.reg_timestamp else None
+ ),
+ }
+ for t in paid_tickets
+ ],
+ }