fix: wallets
This commit is contained in:
@@ -2,8 +2,6 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
from .api import ExtensionAPI
|
from .api import ExtensionAPI
|
||||||
from .models import (
|
from .models import (
|
||||||
CreateInvoiceRequest,
|
CreateInvoiceRequest,
|
||||||
@@ -26,6 +24,9 @@ from .models import (
|
|||||||
class InMemoryExtensionState:
|
class InMemoryExtensionState:
|
||||||
storage: dict[str, dict[str, str]] = field(default_factory=dict)
|
storage: dict[str, dict[str, str]] = field(default_factory=dict)
|
||||||
payment_watchers: dict[str, dict[str, str]] = field(default_factory=dict)
|
payment_watchers: dict[str, dict[str, str]] = field(default_factory=dict)
|
||||||
|
user_wallets: dict[str, list[UserWalletSummary] | None] = field(
|
||||||
|
default_factory=dict
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class InMemoryExtensionAPI(ExtensionAPI):
|
class InMemoryExtensionAPI(ExtensionAPI):
|
||||||
@@ -36,17 +37,9 @@ class InMemoryExtensionAPI(ExtensionAPI):
|
|||||||
*,
|
*,
|
||||||
state: InMemoryExtensionState | None = None,
|
state: InMemoryExtensionState | None = None,
|
||||||
user_id: str | None = None,
|
user_id: str | None = None,
|
||||||
wallet_id: str | None = None,
|
|
||||||
user_wallets: list[UserWalletSummary] | None = None,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
super().__init__(
|
super().__init__(extension_id, permissions, user_id=user_id)
|
||||||
extension_id,
|
|
||||||
permissions,
|
|
||||||
user_id=user_id,
|
|
||||||
wallet_id=wallet_id,
|
|
||||||
)
|
|
||||||
self.state = state or InMemoryExtensionState()
|
self.state = state or InMemoryExtensionState()
|
||||||
self.user_wallets = list(user_wallets) if user_wallets is not None else None
|
|
||||||
|
|
||||||
async def storage_get(self, request: KvGetRequest) -> KvGetResponse:
|
async def storage_get(self, request: KvGetRequest) -> KvGetResponse:
|
||||||
self.require_permission("ext.storage.read_write")
|
self.require_permission("ext.storage.read_write")
|
||||||
@@ -66,12 +59,21 @@ class InMemoryExtensionAPI(ExtensionAPI):
|
|||||||
self, request: CreateInvoiceRequest
|
self, request: CreateInvoiceRequest
|
||||||
) -> CreateInvoiceResponse:
|
) -> CreateInvoiceResponse:
|
||||||
self.require_permission("wallet.create_invoice")
|
self.require_permission("wallet.create_invoice")
|
||||||
if self.wallet_id and request.wallet_id != self.wallet_id:
|
|
||||||
raise PermissionError("Extension cannot create invoices for this wallet.")
|
|
||||||
|
|
||||||
|
from lnbits.core.crud.wallets import get_wallet
|
||||||
from lnbits.core.models.payments import CreateInvoice
|
from lnbits.core.models.payments import CreateInvoice
|
||||||
from lnbits.core.services.payments import create_payment_request
|
from lnbits.core.services.payments import create_payment_request
|
||||||
# todo: security stuff here
|
|
||||||
|
if self.user_id:
|
||||||
|
wallet = await get_wallet(request.wallet_id)
|
||||||
|
if wallet is None or wallet.user != self.user_id:
|
||||||
|
raise PermissionError(
|
||||||
|
"Creating an invoice for this wallet requires an authenticated user context."
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
# todo: security stuff here
|
||||||
|
|
||||||
payment = await create_payment_request(
|
payment = await create_payment_request(
|
||||||
request.wallet_id,
|
request.wallet_id,
|
||||||
CreateInvoice(
|
CreateInvoice(
|
||||||
@@ -91,11 +93,24 @@ class InMemoryExtensionAPI(ExtensionAPI):
|
|||||||
self, _request: EmptyRequest
|
self, _request: EmptyRequest
|
||||||
) -> ListUserWalletsResponse:
|
) -> ListUserWalletsResponse:
|
||||||
self.require_permission("wallet.list")
|
self.require_permission("wallet.list")
|
||||||
if self.user_wallets is None:
|
if not self.user_id:
|
||||||
raise PermissionError(
|
raise PermissionError(
|
||||||
"Listing user wallets requires an authenticated user context."
|
"Listing user wallets requires an authenticated user context."
|
||||||
)
|
)
|
||||||
return ListUserWalletsResponse(wallets=self.user_wallets)
|
|
||||||
|
from lnbits.core.crud.wallets import get_wallets
|
||||||
|
|
||||||
|
user_wallets = await get_wallets(self.user_id)
|
||||||
|
if user_wallets is None:
|
||||||
|
raise PermissionError(
|
||||||
|
"Listing user wallets requires an authenticated user context."
|
||||||
|
)
|
||||||
|
return ListUserWalletsResponse(
|
||||||
|
wallets=[
|
||||||
|
UserWalletSummary(id=w.id, name=w.name, currency=w.currency)
|
||||||
|
for w in user_wallets
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
async def payments_watch(
|
async def payments_watch(
|
||||||
self, request: WatchPaymentRequest
|
self, request: WatchPaymentRequest
|
||||||
|
|||||||
@@ -26,13 +26,13 @@ async def invoke_wasm_extension_export(
|
|||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
extension = _get_registered_extension(app, ext_id)
|
extension = _get_registered_extension(app, ext_id)
|
||||||
state = _get_extension_state(app)
|
state = _get_extension_state(app)
|
||||||
|
state.user_wallets[extension.id] = _user_wallet_summaries(user)
|
||||||
permissions = _extension_permissions(extension)
|
permissions = _extension_permissions(extension)
|
||||||
api = InMemoryExtensionAPI(
|
api = InMemoryExtensionAPI(
|
||||||
extension.id,
|
extension.id,
|
||||||
permissions,
|
permissions,
|
||||||
state=state,
|
state=state,
|
||||||
user_id=_user_id(user),
|
user_id=_user_id(user),
|
||||||
user_wallets=_user_wallet_summaries(user),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return await asyncio.to_thread(
|
return await asyncio.to_thread(
|
||||||
|
|||||||
Reference in New Issue
Block a user