feat: per-operator settings — house rules + card acceptance (multi-tenant)
Chatelet is multi-tenant: any LNbits user can host rooms. What an operator decides for all their rooms now lives in chatelet.operator_settings, keyed by user id and created lazily (m003, which also indexes bookings by guest): check-in/out times, cancellation policy, and accept_fiat. Guests see it: the public room view (both doors) gains house_rules and payment_methods, and the kind:30402 listing carries payment_methods, checkin_time and checkout_time tags so a generic Nostr client can render the right pay buttons and rules without our RPC. The check-in DM reads the room owner's rules instead of the instance row. Card is offered only when the operator opted in, the room is fiat-priced, and LNbits core has a fiat provider for that user — resolved through settings.get_fiat_providers_for_user(owner), the one seam lnbits#67's per-user Stripe credentials will plug into; chatelet never sees creds. Operator endpoints: GET/PUT /api/v1/operator (admin key → wallet user) and RPC twins chatelet_operator_get/update (AUTH_WALLET); saving re-publishes the owner's active listings. Admin UI moves the house-rule inputs into a per-operator card with the card toggle and a provider hint. The old house-rule columns on settings stay for old rows but are no longer read. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
feaaef93e3
commit
9ab52f2c69
17 changed files with 531 additions and 42 deletions
8
tasks.py
8
tasks.py
|
|
@ -12,7 +12,7 @@ from lnbits.core.models import Payment
|
|||
from lnbits.tasks import register_invoice_listener
|
||||
from loguru import logger
|
||||
|
||||
from . import crud
|
||||
from . import crud, services
|
||||
from .models import BookingStatus
|
||||
from .nostr import service as nostr
|
||||
|
||||
|
|
@ -47,9 +47,11 @@ async def on_invoice_paid(payment: Payment):
|
|||
# Best-effort: a publish failure must not undo a confirmed, paid booking.
|
||||
try:
|
||||
room = await crud.get_room(booking.room_id)
|
||||
settings = await crud.get_or_create_settings()
|
||||
if room:
|
||||
await nostr.send_checkin_dm(booking, room, settings)
|
||||
# House rules are the room owner's, not the instance's.
|
||||
owner = await services.room_owner_id(room)
|
||||
ops = await crud.get_or_create_operator_settings(owner)
|
||||
await nostr.send_checkin_dm(booking, room, ops)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
logger.warning(f"chatelet: check-in DM failed for {booking.id} (continuing): {exc}")
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue