feat: toggle relays on and off
This commit is contained in:
parent
a849dea99f
commit
bc60551313
5 changed files with 95 additions and 37 deletions
13
crud.py
13
crud.py
|
|
@ -20,6 +20,17 @@ async def create_relay(user_id: str, r: NostrRelay) -> NostrRelay:
|
|||
assert relay, "Created relay cannot be retrieved"
|
||||
return relay
|
||||
|
||||
async def update_relay(user_id: str, r: NostrRelay) -> NostrRelay:
|
||||
await db.execute(
|
||||
"""
|
||||
UPDATE nostrrelay.relays
|
||||
SET (name, description, pubkey, contact, active) = (?, ?, ?, ?, ?)
|
||||
WHERE user_id = ? AND id = ?
|
||||
""",
|
||||
(r.name, r.description, r.pubkey, r.contact, r.active, user_id, r.id),
|
||||
)
|
||||
|
||||
return r
|
||||
|
||||
async def get_relay(user_id: str, relay_id: str) -> Optional[NostrRelay]:
|
||||
row = await db.fetchone("""SELECT * FROM nostrrelay.relays WHERE user_id = ? AND id = ?""", (user_id, relay_id,))
|
||||
|
|
@ -27,7 +38,7 @@ async def get_relay(user_id: str, relay_id: str) -> Optional[NostrRelay]:
|
|||
return NostrRelay.from_row(row) if row else None
|
||||
|
||||
async def get_relays(user_id: str) -> List[NostrRelay]:
|
||||
rows = await db.fetchall("""SELECT * FROM nostrrelay.relays WHERE user_id = ?""", (user_id,))
|
||||
rows = await db.fetchall("""SELECT * FROM nostrrelay.relays WHERE user_id = ? ORDER BY id ASC""", (user_id,))
|
||||
|
||||
return [NostrRelay.from_row(row) for row in rows]
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ class NostrRelay(BaseModel):
|
|||
description: Optional[str]
|
||||
pubkey: Optional[str]
|
||||
contact: Optional[str] = "https://t.me/lnbits"
|
||||
active: bool = False
|
||||
supported_nips: List[str] = ["NIP01", "NIP09", "NIP11", "NIP15", "NIP20"]
|
||||
software: Optional[str] = "LNbist"
|
||||
version: Optional[str]
|
||||
|
|
|
|||
|
|
@ -12,32 +12,29 @@ const relays = async () => {
|
|||
relayLinks: [],
|
||||
formDialogRelay: {
|
||||
show: false,
|
||||
showAdvanced: false,
|
||||
data: {
|
||||
id: '',
|
||||
name: '',
|
||||
description: '',
|
||||
pubkey: '',
|
||||
contact: '',
|
||||
contact: '',
|
||||
wallet: ''
|
||||
contact: ''
|
||||
}
|
||||
},
|
||||
|
||||
relaysTable: {
|
||||
columns: [
|
||||
{
|
||||
name: 'id',
|
||||
align: 'left',
|
||||
label: 'ID',
|
||||
field: 'id'
|
||||
},
|
||||
{
|
||||
name: '',
|
||||
align: 'left',
|
||||
label: '',
|
||||
field: ''
|
||||
},
|
||||
|
||||
{
|
||||
name: 'id',
|
||||
align: 'left',
|
||||
label: 'ID',
|
||||
field: 'id'
|
||||
},
|
||||
{
|
||||
name: 'name',
|
||||
align: 'left',
|
||||
|
|
@ -106,7 +103,6 @@ const relays = async () => {
|
|||
|
||||
createRelay: async function (data) {
|
||||
try {
|
||||
console.log('### createRelay', data)
|
||||
const resp = await LNbits.api.request(
|
||||
'POST',
|
||||
'/nostrrelay/api/v1/relay',
|
||||
|
|
@ -120,10 +116,41 @@ const relays = async () => {
|
|||
LNbits.utils.notifyApiError(error)
|
||||
}
|
||||
},
|
||||
showToggleRelayDialog: function (relay) {
|
||||
console.log('### showToggleRelayDialog', relay)
|
||||
if (relay.active) {
|
||||
this.toggleRelay(relay)
|
||||
return
|
||||
}
|
||||
LNbits.utils
|
||||
.confirmDialog('Are you sure you want to deactivate this relay?')
|
||||
.onOk(async () => {
|
||||
this.toggleRelay(relay)
|
||||
})
|
||||
.onCancel(async () => {
|
||||
console.log('#### onCancel')
|
||||
relay.active = !relay.active
|
||||
})
|
||||
},
|
||||
toggleRelay: async function (relay) {
|
||||
console.log('### toggleRelay', relay)
|
||||
try {
|
||||
const response = await LNbits.api.request(
|
||||
'PUT',
|
||||
'/nostrrelay/api/v1/relay/' + relay.id,
|
||||
this.g.user.wallets[0].adminkey,
|
||||
relay
|
||||
)
|
||||
} catch (error) {
|
||||
LNbits.utils.notifyApiError(error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteRelay: function (relayId) {
|
||||
LNbits.utils
|
||||
.confirmDialog('Are you sure you want to delete this survet?')
|
||||
.confirmDialog(
|
||||
'All data will be lost! Are you sure you want to delete this relay?'
|
||||
)
|
||||
.onOk(async () => {
|
||||
try {
|
||||
const response = await LNbits.api.request(
|
||||
|
|
|
|||
|
|
@ -68,23 +68,29 @@
|
|||
/>
|
||||
</q-td>
|
||||
|
||||
<q-td auto-width> {{props.row.name}} </q-td>
|
||||
<q-td key="id" :props="props"> {{props.row.id}} </q-td>
|
||||
<q-td auto-width> {{props.row.name}} </q-td>
|
||||
<q-td key="description" :props="props">
|
||||
{{props.row.description}}
|
||||
</q-td>
|
||||
<q-td key="contact" :props="props">
|
||||
<div>{{props.row.contact}}</div>
|
||||
</q-td>
|
||||
<q-td key="pubkey" :props="props">
|
||||
<div>{{props.row.pubkey}}</div>
|
||||
</q-td>
|
||||
<q-td key="contact" :props="props">
|
||||
<div>{{props.row.contact}}</div>
|
||||
</q-td>
|
||||
</q-tr>
|
||||
<q-tr v-if="props.row.expanded" :props="props">
|
||||
<q-td colspan="100%">
|
||||
<div class="row items-center q-mt-md q-mb-lg">
|
||||
<div class="col-2 q-pr-lg">ID:</div>
|
||||
<div class="col-4 q-pr-lg">{{props.row.id}}</div>
|
||||
<div class="col-6 q-pr-lg">
|
||||
<q-toggle
|
||||
:label="props.row.active ? 'Activated': 'Deactivated' "
|
||||
color="secodary"
|
||||
v-model="props.row.active"
|
||||
@input="showToggleRelayDialog(props.row)"
|
||||
></q-toggle>
|
||||
</div>
|
||||
<div class="col-6 q-pr-lg">
|
||||
<q-btn
|
||||
unelevated
|
||||
|
|
@ -172,21 +178,6 @@
|
|||
label="Contact"
|
||||
></q-input>
|
||||
|
||||
<q-toggle
|
||||
v-model="formDialogRelay.showAdvanced"
|
||||
label="Show advanced options"
|
||||
></q-toggle>
|
||||
<div v-if="formDialogRelay.showAdvanced">
|
||||
<q-select
|
||||
filled
|
||||
dense
|
||||
emit-value
|
||||
v-model="formDialogRelay.data.wallet"
|
||||
:options="g.user.walletOptions"
|
||||
label="Wallet *"
|
||||
>
|
||||
</q-select>
|
||||
</div>
|
||||
<div class="row q-mt-lg">
|
||||
<q-btn
|
||||
unelevated
|
||||
|
|
|
|||
32
views_api.py
32
views_api.py
|
|
@ -16,7 +16,7 @@ from lnbits.helpers import urlsafe_short_hash
|
|||
|
||||
from . import nostrrelay_ext
|
||||
from .client_manager import NostrClientConnection, NostrClientManager
|
||||
from .crud import create_relay, delete_relay, get_relay, get_relays
|
||||
from .crud import create_relay, delete_relay, get_relay, get_relays, update_relay
|
||||
from .models import NostrRelay
|
||||
|
||||
client_manager = NostrClientManager()
|
||||
|
|
@ -46,7 +46,7 @@ async def api_nostrrelay_info():
|
|||
|
||||
|
||||
@nostrrelay_ext.post("/api/v1/relay")
|
||||
async def api_create_survey(data: NostrRelay, wallet: WalletTypeInfo = Depends(require_admin_key)) -> NostrRelay:
|
||||
async def api_create_relay(data: NostrRelay, wallet: WalletTypeInfo = Depends(require_admin_key)) -> NostrRelay:
|
||||
|
||||
try:
|
||||
relay = await create_relay(wallet.wallet.user, data)
|
||||
|
|
@ -59,6 +59,34 @@ async def api_create_survey(data: NostrRelay, wallet: WalletTypeInfo = Depends(r
|
|||
detail="Cannot create relay",
|
||||
)
|
||||
|
||||
@nostrrelay_ext.put("/api/v1/relay/{relay_id}")
|
||||
async def api_update_relay(relay_id: str, data: NostrRelay, wallet: WalletTypeInfo = Depends(require_admin_key)) -> NostrRelay:
|
||||
if relay_id != data.id:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.BAD_REQUEST,
|
||||
detail="Cannot change the relay id",
|
||||
)
|
||||
|
||||
try:
|
||||
relay = await get_relay(wallet.wallet.user, data.id)
|
||||
if not relay:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.NOT_FOUND,
|
||||
detail="Relay not found",
|
||||
)
|
||||
updated_relay = NostrRelay.parse_obj({**dict(relay), **dict(data)})
|
||||
updated_relay = await update_relay(wallet.wallet.user, updated_relay)
|
||||
return updated_relay
|
||||
|
||||
except HTTPException as ex:
|
||||
raise ex
|
||||
except Exception as ex:
|
||||
logger.warning(ex)
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
|
||||
detail="Cannot update relay",
|
||||
)
|
||||
|
||||
|
||||
@nostrrelay_ext.get("/api/v1/relay")
|
||||
async def api_get_relays(wallet: WalletTypeInfo = Depends(require_invoice_key)) -> List[NostrRelay]:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue