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
|
|
@ -29,6 +29,9 @@ window.app = Vue.createApp({
|
|||
settings: {},
|
||||
settingsLoading: false,
|
||||
|
||||
operator: {},
|
||||
operatorLoading: false,
|
||||
|
||||
roomsColumns: [
|
||||
{name: 'title', label: 'Room', field: 'title', align: 'left'},
|
||||
{
|
||||
|
|
@ -237,11 +240,41 @@ window.app = Vue.createApp({
|
|||
} catch (err) {
|
||||
this._err(err, 'Could not save settings')
|
||||
}
|
||||
},
|
||||
|
||||
// --- per-operator settings (house rules, card acceptance) ---
|
||||
async getOperator() {
|
||||
this.operatorLoading = true
|
||||
try {
|
||||
const {data} = await LNbits.api.request('GET', `${API}/operator`, this.adminkey)
|
||||
this.operator = data
|
||||
} catch (err) {
|
||||
this._err(err, 'Could not load your settings')
|
||||
} finally {
|
||||
this.operatorLoading = false
|
||||
}
|
||||
},
|
||||
async saveOperator() {
|
||||
this.operatorLoading = true
|
||||
try {
|
||||
const {accept_fiat, checkin_time, checkout_time, cancellation_policy} = this.operator
|
||||
const {data} = await LNbits.api.request(
|
||||
'PUT', `${API}/operator`, this.adminkey,
|
||||
{accept_fiat, checkin_time, checkout_time, cancellation_policy}
|
||||
)
|
||||
this.operator = data
|
||||
Quasar.Notify.create({type: 'positive', message: 'Your settings saved'})
|
||||
} catch (err) {
|
||||
this._err(err, 'Could not save your settings')
|
||||
} finally {
|
||||
this.operatorLoading = false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
created() {
|
||||
this.getRooms()
|
||||
this.getSettings()
|
||||
this.getOperator()
|
||||
}
|
||||
})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue