feat: toggle relays on and off

This commit is contained in:
Vlad Stan 2023-02-06 16:33:08 +02:00
parent a849dea99f
commit bc60551313
5 changed files with 95 additions and 37 deletions

13
crud.py
View file

@ -20,6 +20,17 @@ async def create_relay(user_id: str, r: NostrRelay) -> NostrRelay:
assert relay, "Created relay cannot be retrieved" assert relay, "Created relay cannot be retrieved"
return relay 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]: 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,)) 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 return NostrRelay.from_row(row) if row else None
async def get_relays(user_id: str) -> List[NostrRelay]: 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] return [NostrRelay.from_row(row) for row in rows]

View file

@ -14,6 +14,7 @@ class NostrRelay(BaseModel):
description: Optional[str] description: Optional[str]
pubkey: Optional[str] pubkey: Optional[str]
contact: Optional[str] = "https://t.me/lnbits" contact: Optional[str] = "https://t.me/lnbits"
active: bool = False
supported_nips: List[str] = ["NIP01", "NIP09", "NIP11", "NIP15", "NIP20"] supported_nips: List[str] = ["NIP01", "NIP09", "NIP11", "NIP15", "NIP20"]
software: Optional[str] = "LNbist" software: Optional[str] = "LNbist"
version: Optional[str] version: Optional[str]

View file

@ -12,32 +12,29 @@ const relays = async () => {
relayLinks: [], relayLinks: [],
formDialogRelay: { formDialogRelay: {
show: false, show: false,
showAdvanced: false,
data: { data: {
id: '',
name: '', name: '',
description: '', description: '',
pubkey: '', pubkey: '',
contact: '', contact: ''
contact: '',
wallet: ''
} }
}, },
relaysTable: { relaysTable: {
columns: [ columns: [
{
name: 'id',
align: 'left',
label: 'ID',
field: 'id'
},
{ {
name: '', name: '',
align: 'left', align: 'left',
label: '', label: '',
field: '' field: ''
}, },
{
name: 'id',
align: 'left',
label: 'ID',
field: 'id'
},
{ {
name: 'name', name: 'name',
align: 'left', align: 'left',
@ -106,7 +103,6 @@ const relays = async () => {
createRelay: async function (data) { createRelay: async function (data) {
try { try {
console.log('### createRelay', data)
const resp = await LNbits.api.request( const resp = await LNbits.api.request(
'POST', 'POST',
'/nostrrelay/api/v1/relay', '/nostrrelay/api/v1/relay',
@ -120,10 +116,41 @@ const relays = async () => {
LNbits.utils.notifyApiError(error) 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) { deleteRelay: function (relayId) {
LNbits.utils 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 () => { .onOk(async () => {
try { try {
const response = await LNbits.api.request( const response = await LNbits.api.request(

View file

@ -68,23 +68,29 @@
/> />
</q-td> </q-td>
<q-td auto-width> {{props.row.name}} </q-td>
<q-td key="id" :props="props"> {{props.row.id}} </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"> <q-td key="description" :props="props">
{{props.row.description}} {{props.row.description}}
</q-td> </q-td>
<q-td key="contact" :props="props">
<div>{{props.row.contact}}</div>
</q-td>
<q-td key="pubkey" :props="props"> <q-td key="pubkey" :props="props">
<div>{{props.row.pubkey}}</div> <div>{{props.row.pubkey}}</div>
</q-td> </q-td>
<q-td key="contact" :props="props">
<div>{{props.row.contact}}</div>
</q-td>
</q-tr> </q-tr>
<q-tr v-if="props.row.expanded" :props="props"> <q-tr v-if="props.row.expanded" :props="props">
<q-td colspan="100%"> <q-td colspan="100%">
<div class="row items-center q-mt-md q-mb-lg"> <div class="row items-center q-mt-md q-mb-lg">
<div class="col-2 q-pr-lg">ID:</div> <div class="col-6 q-pr-lg">
<div class="col-4 q-pr-lg">{{props.row.id}}</div> <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"> <div class="col-6 q-pr-lg">
<q-btn <q-btn
unelevated unelevated
@ -172,21 +178,6 @@
label="Contact" label="Contact"
></q-input> ></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"> <div class="row q-mt-lg">
<q-btn <q-btn
unelevated unelevated

View file

@ -16,7 +16,7 @@ from lnbits.helpers import urlsafe_short_hash
from . import nostrrelay_ext from . import nostrrelay_ext
from .client_manager import NostrClientConnection, NostrClientManager 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 from .models import NostrRelay
client_manager = NostrClientManager() client_manager = NostrClientManager()
@ -46,7 +46,7 @@ async def api_nostrrelay_info():
@nostrrelay_ext.post("/api/v1/relay") @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: try:
relay = await create_relay(wallet.wallet.user, data) 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", 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") @nostrrelay_ext.get("/api/v1/relay")
async def api_get_relays(wallet: WalletTypeInfo = Depends(require_invoice_key)) -> List[NostrRelay]: async def api_get_relays(wallet: WalletTypeInfo = Depends(require_invoice_key)) -> List[NostrRelay]: