refactor: move webpush to it own router

refactor to make `views/api.py` cleaner
This commit is contained in:
dni ⚡
2023-12-05 15:56:45 +01:00
committed by Pavol Rusnak
parent fa49133bd7
commit 5fc472a8d9
3 changed files with 63 additions and 40 deletions

View File

@@ -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.node_api import node_router, public_node_router, super_node_router
from .views.public_api import public_router from .views.public_api import public_router
from .views.tinyurl_api import tinyurl_router from .views.tinyurl_api import tinyurl_router
from .views.webpush_api import webpush_router
# backwards compatibility for extensions # backwards compatibility for extensions
core_app = APIRouter(tags=["Core"]) core_app = APIRouter(tags=["Core"])
@@ -24,3 +25,4 @@ def init_core_routers(app):
app.include_router(public_node_router) app.include_router(public_node_router)
app.include_router(admin_router) app.include_router(admin_router)
app.include_router(tinyurl_router) app.include_router(tinyurl_router)
app.include_router(webpush_router)

View File

@@ -1,12 +1,11 @@
import asyncio import asyncio
import base64
import hashlib import hashlib
import json import json
import uuid import uuid
from http import HTTPStatus from http import HTTPStatus
from io import BytesIO from io import BytesIO
from typing import Dict, List, Optional, Union 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 httpx
import pyqrcode import pyqrcode
@@ -37,7 +36,6 @@ from lnbits.core.models import (
CreateLnurl, CreateLnurl,
CreateLnurlAuth, CreateLnurlAuth,
CreateWallet, CreateWallet,
CreateWebPushSubscription,
DecodePayment, DecodePayment,
Payment, Payment,
PaymentFilters, PaymentFilters,
@@ -46,7 +44,6 @@ from lnbits.core.models import (
User, User,
Wallet, Wallet,
WalletType, WalletType,
WebPushSubscription,
) )
from lnbits.db import Filters, Page from lnbits.db import Filters, Page
from lnbits.decorators import ( from lnbits.decorators import (
@@ -78,11 +75,9 @@ from ..crud import (
add_installed_extension, add_installed_extension,
create_account, create_account,
create_wallet, create_wallet,
create_webpush_subscription,
delete_dbversion, delete_dbversion,
delete_installed_extension, delete_installed_extension,
delete_wallet, delete_wallet,
delete_webpush_subscription,
drop_extension_db, drop_extension_db,
get_dbversions, get_dbversions,
get_payments, get_payments,
@@ -90,7 +85,6 @@ from ..crud import (
get_payments_paginated, get_payments_paginated,
get_standalone_payment, get_standalone_payment,
get_wallet_for_key, get_wallet_for_key,
get_webpush_subscription,
save_balance_check, save_balance_check,
update_pending_payments, update_pending_payments,
update_wallet, update_wallet,
@@ -946,36 +940,3 @@ async def delete_extension_db(ext_id: str):
status_code=HTTPStatus.INTERNAL_SERVER_ERROR, status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
detail=f"Cannot delete data for extension '{ext_id}'", 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)

View File

@@ -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)