diff --git a/lnbits/core/__init__.py b/lnbits/core/__init__.py index b1b802e9d..7724a97d8 100644 --- a/lnbits/core/__init__.py +++ b/lnbits/core/__init__.py @@ -9,6 +9,7 @@ from .views.generic import generic_router, update_user_extension from .views.node_api import node_router, public_node_router, super_node_router from .views.public_api import public_router from .views.tinyurl_api import tinyurl_router +from .views.webpush_api import webpush_router # backwards compatibility for extensions core_app = APIRouter(tags=["Core"]) @@ -24,3 +25,4 @@ def init_core_routers(app): app.include_router(public_node_router) app.include_router(admin_router) app.include_router(tinyurl_router) + app.include_router(webpush_router) diff --git a/lnbits/core/views/api.py b/lnbits/core/views/api.py index 688f3b4c9..4d13f5d09 100644 --- a/lnbits/core/views/api.py +++ b/lnbits/core/views/api.py @@ -1,12 +1,11 @@ import asyncio -import base64 import hashlib import json import uuid from http import HTTPStatus from io import BytesIO from typing import Dict, List, Optional, Union -from urllib.parse import ParseResult, parse_qs, unquote, urlencode, urlparse, urlunparse +from urllib.parse import ParseResult, parse_qs, urlencode, urlparse, urlunparse import httpx import pyqrcode @@ -37,7 +36,6 @@ from lnbits.core.models import ( CreateLnurl, CreateLnurlAuth, CreateWallet, - CreateWebPushSubscription, DecodePayment, Payment, PaymentFilters, @@ -46,7 +44,6 @@ from lnbits.core.models import ( User, Wallet, WalletType, - WebPushSubscription, ) from lnbits.db import Filters, Page from lnbits.decorators import ( @@ -78,11 +75,9 @@ from ..crud import ( add_installed_extension, create_account, create_wallet, - create_webpush_subscription, delete_dbversion, delete_installed_extension, delete_wallet, - delete_webpush_subscription, drop_extension_db, get_dbversions, get_payments, @@ -90,7 +85,6 @@ from ..crud import ( get_payments_paginated, get_standalone_payment, get_wallet_for_key, - get_webpush_subscription, save_balance_check, update_pending_payments, update_wallet, @@ -946,36 +940,3 @@ async def delete_extension_db(ext_id: str): status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=f"Cannot delete data for extension '{ext_id}'", ) - - -@api_router.post("/api/v1/webpush", status_code=HTTPStatus.CREATED) -async def api_create_webpush_subscription( - request: Request, - data: CreateWebPushSubscription, - wallet: WalletTypeInfo = Depends(require_admin_key), -) -> WebPushSubscription: - subscription = json.loads(data.subscription) - endpoint = subscription["endpoint"] - host = urlparse(str(request.url)).netloc - - subscription = await get_webpush_subscription(endpoint, wallet.wallet.user) - if subscription: - return subscription - else: - return await create_webpush_subscription( - endpoint, - wallet.wallet.user, - data.subscription, - host, - ) - - -@api_router.delete("/api/v1/webpush", status_code=HTTPStatus.OK) -async def api_delete_webpush_subscription( - request: Request, - wallet: WalletTypeInfo = Depends(require_admin_key), -): - endpoint = unquote( - base64.b64decode(str(request.query_params.get("endpoint"))).decode("utf-8") - ) - await delete_webpush_subscription(endpoint, wallet.wallet.user) diff --git a/lnbits/core/views/webpush_api.py b/lnbits/core/views/webpush_api.py new file mode 100644 index 000000000..ce23f116c --- /dev/null +++ b/lnbits/core/views/webpush_api.py @@ -0,0 +1,60 @@ +import base64 +import json +from http import HTTPStatus +from urllib.parse import unquote, urlparse + +from fastapi import ( + APIRouter, + Depends, + Request, +) + +from lnbits.core.models import ( + CreateWebPushSubscription, + WebPushSubscription, +) +from lnbits.decorators import ( + WalletTypeInfo, + require_admin_key, +) + +from ..crud import ( + create_webpush_subscription, + delete_webpush_subscription, + get_webpush_subscription, +) + +webpush_router = APIRouter(prefix="/api/v1/webpush", tags=["webpush"]) + + +@webpush_router.post("/", status_code=HTTPStatus.CREATED) +async def api_create_webpush_subscription( + request: Request, + data: CreateWebPushSubscription, + wallet: WalletTypeInfo = Depends(require_admin_key), +) -> WebPushSubscription: + subscription = json.loads(data.subscription) + endpoint = subscription["endpoint"] + host = urlparse(str(request.url)).netloc + + subscription = await get_webpush_subscription(endpoint, wallet.wallet.user) + if subscription: + return subscription + else: + return await create_webpush_subscription( + endpoint, + wallet.wallet.user, + data.subscription, + host, + ) + + +@webpush_router.delete("/", status_code=HTTPStatus.OK) +async def api_delete_webpush_subscription( + request: Request, + wallet: WalletTypeInfo = Depends(require_admin_key), +): + endpoint = unquote( + base64.b64decode(str(request.query_params.get("endpoint"))).decode("utf-8") + ) + await delete_webpush_subscription(endpoint, wallet.wallet.user)