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"
|
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]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
32
views_api.py
32
views_api.py
|
|
@ -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]:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue