diff --git a/lnbits/core/__init__.py b/lnbits/core/__init__.py index 467ca67d..b1b802e9 100644 --- a/lnbits/core/__init__.py +++ b/lnbits/core/__init__.py @@ -8,6 +8,7 @@ from .views.api import api_router 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 # backwards compatibility for extensions core_app = APIRouter(tags=["Core"]) @@ -22,3 +23,4 @@ def init_core_routers(app): app.include_router(super_node_router) app.include_router(public_node_router) app.include_router(admin_router) + app.include_router(tinyurl_router) diff --git a/lnbits/core/views/api.py b/lnbits/core/views/api.py index 6699392f..688f3b4c 100644 --- a/lnbits/core/views/api.py +++ b/lnbits/core/views/api.py @@ -23,7 +23,7 @@ from fastapi.exceptions import HTTPException from fastapi.responses import JSONResponse from loguru import logger from sse_starlette.sse import EventSourceResponse -from starlette.responses import RedirectResponse, StreamingResponse +from starlette.responses import StreamingResponse from lnbits import bolt11, lnurl from lnbits.core.db import core_app_extra, db @@ -77,12 +77,10 @@ from ..crud import ( DateTrunc, add_installed_extension, create_account, - create_tinyurl, create_wallet, create_webpush_subscription, delete_dbversion, delete_installed_extension, - delete_tinyurl, delete_wallet, delete_webpush_subscription, drop_extension_db, @@ -91,8 +89,6 @@ from ..crud import ( get_payments_history, get_payments_paginated, get_standalone_payment, - get_tinyurl, - get_tinyurl_by_url, get_wallet_for_key, get_webpush_subscription, save_balance_check, @@ -952,88 +948,6 @@ async def delete_extension_db(ext_id: str): ) -@api_router.post( - "/api/v1/tinyurl", - name="Tinyurl", - description="creates a tinyurl", -) -async def api_create_tinyurl( - url: str, endless: bool = False, wallet: WalletTypeInfo = Depends(get_key_type) -): - tinyurls = await get_tinyurl_by_url(url) - try: - for tinyurl in tinyurls: - if tinyurl: - if tinyurl.wallet == wallet.wallet.inkey: - return tinyurl - return await create_tinyurl(url, endless, wallet.wallet.inkey) - except Exception: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, detail="Unable to create tinyurl" - ) - - -@api_router.get( - "/api/v1/tinyurl/{tinyurl_id}", - name="Tinyurl", - description="get a tinyurl by id", -) -async def api_get_tinyurl( - tinyurl_id: str, wallet: WalletTypeInfo = Depends(get_key_type) -): - try: - tinyurl = await get_tinyurl(tinyurl_id) - if tinyurl: - if tinyurl.wallet == wallet.wallet.inkey: - return tinyurl - raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, detail="Wrong key provided." - ) - except Exception: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Unable to fetch tinyurl" - ) - - -@api_router.delete( - "/api/v1/tinyurl/{tinyurl_id}", - name="Tinyurl", - description="delete a tinyurl by id", -) -async def api_delete_tinyurl( - tinyurl_id: str, wallet: WalletTypeInfo = Depends(get_key_type) -): - try: - tinyurl = await get_tinyurl(tinyurl_id) - if tinyurl: - if tinyurl.wallet == wallet.wallet.inkey: - await delete_tinyurl(tinyurl_id) - return {"deleted": True} - raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, detail="Wrong key provided." - ) - except Exception: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, detail="Unable to delete" - ) - - -@api_router.get( - "/t/{tinyurl_id}", - name="Tinyurl", - description="redirects a tinyurl by id", -) -async def api_tinyurl(tinyurl_id: str): - tinyurl = await get_tinyurl(tinyurl_id) - if tinyurl: - response = RedirectResponse(url=tinyurl.url) - return response - else: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="unable to find tinyurl" - ) - - @api_router.post("/api/v1/webpush", status_code=HTTPStatus.CREATED) async def api_create_webpush_subscription( request: Request, diff --git a/lnbits/core/views/tinyurl_api.py b/lnbits/core/views/tinyurl_api.py new file mode 100644 index 00000000..c26c8d22 --- /dev/null +++ b/lnbits/core/views/tinyurl_api.py @@ -0,0 +1,104 @@ +from http import HTTPStatus + +from fastapi import ( + APIRouter, + Depends, + HTTPException, +) +from starlette.responses import RedirectResponse + +from lnbits.decorators import ( + WalletTypeInfo, + get_key_type, +) + +from ..crud import ( + create_tinyurl, + delete_tinyurl, + get_tinyurl, + get_tinyurl_by_url, +) + +tinyurl_router = APIRouter() + + +@tinyurl_router.post( + "/api/v1/tinyurl", + name="Tinyurl", + description="creates a tinyurl", +) +async def api_create_tinyurl( + url: str, endless: bool = False, wallet: WalletTypeInfo = Depends(get_key_type) +): + tinyurls = await get_tinyurl_by_url(url) + try: + for tinyurl in tinyurls: + if tinyurl: + if tinyurl.wallet == wallet.wallet.inkey: + return tinyurl + return await create_tinyurl(url, endless, wallet.wallet.inkey) + except Exception: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, detail="Unable to create tinyurl" + ) + + +@tinyurl_router.get( + "/api/v1/tinyurl/{tinyurl_id}", + name="Tinyurl", + description="get a tinyurl by id", +) +async def api_get_tinyurl( + tinyurl_id: str, wallet: WalletTypeInfo = Depends(get_key_type) +): + try: + tinyurl = await get_tinyurl(tinyurl_id) + if tinyurl: + if tinyurl.wallet == wallet.wallet.inkey: + return tinyurl + raise HTTPException( + status_code=HTTPStatus.FORBIDDEN, detail="Wrong key provided." + ) + except Exception: + raise HTTPException( + status_code=HTTPStatus.NOT_FOUND, detail="Unable to fetch tinyurl" + ) + + +@tinyurl_router.delete( + "/api/v1/tinyurl/{tinyurl_id}", + name="Tinyurl", + description="delete a tinyurl by id", +) +async def api_delete_tinyurl( + tinyurl_id: str, wallet: WalletTypeInfo = Depends(get_key_type) +): + try: + tinyurl = await get_tinyurl(tinyurl_id) + if tinyurl: + if tinyurl.wallet == wallet.wallet.inkey: + await delete_tinyurl(tinyurl_id) + return {"deleted": True} + raise HTTPException( + status_code=HTTPStatus.FORBIDDEN, detail="Wrong key provided." + ) + except Exception: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, detail="Unable to delete" + ) + + +@tinyurl_router.get( + "/t/{tinyurl_id}", + name="Tinyurl", + description="redirects a tinyurl by id", +) +async def api_tinyurl(tinyurl_id: str): + tinyurl = await get_tinyurl(tinyurl_id) + if tinyurl: + response = RedirectResponse(url=tinyurl.url) + return response + else: + raise HTTPException( + status_code=HTTPStatus.NOT_FOUND, detail="unable to find tinyurl" + )