Added wallet authentication to creat, get and delete tinyurls

This commit is contained in:
ben
2023-01-24 21:26:18 +00:00
parent 7322d27aa3
commit c0c4c86808
4 changed files with 76 additions and 25 deletions

View File

@@ -628,34 +628,38 @@ async def create_admin_settings(super_user: str, new_settings: dict):
# ------- # -------
async def create_tinyurl(domain: str, endless: bool, conn: Optional[Connection] = None): async def create_tinyurl(domain: str, endless: bool, wallet: str):
tinyurl_id = shortuuid.uuid()[:8] tinyurl_id = shortuuid.uuid()[:8]
await (conn or db).execute( await db.execute(
f"INSERT INTO tiny_url (id, url, endless) VALUES (?, ?, ?)", f"INSERT INTO tiny_url (id, url, endless, wallet) VALUES (?, ?, ?, ?)",
( (
tinyurl_id, tinyurl_id,
domain, domain,
endless, endless,
wallet,
), ),
) )
return await get_tinyurl(tinyurl_id) return await get_tinyurl(tinyurl_id)
async def get_tinyurl( async def get_tinyurl(tinyurl_id: str) -> Optional[TinyURL]:
tinyurl_id: str, conn: Optional[Connection] = None row = await db.fetchone(
) -> Optional[TinyURL]:
row = await (conn or db).fetchone(
f"SELECT * FROM tiny_url WHERE id = ?", f"SELECT * FROM tiny_url WHERE id = ?",
(tinyurl_id,), (tinyurl_id,),
) )
return TinyURL.from_row(row) if row else None return TinyURL.from_row(row) if row else None
async def get_tinyurl_by_url( async def get_tinyurl_by_url(url: str) -> List[TinyURL]:
url: str, conn: Optional[Connection] = None rows = await db.fetchall(
) -> Optional[TinyURL]:
row = await (conn or db).fetchone(
f"SELECT * FROM tiny_url WHERE url = ?", f"SELECT * FROM tiny_url WHERE url = ?",
(url,), (url,),
) )
return TinyURL.from_row(row) if row else None return [TinyURL.from_row(row) for row in rows]
async def delete_tinyurl(tinyurl_id: str):
row = await db.execute(
f"DELETE FROM tiny_url WHERE id = ?",
(tinyurl_id,),
)

View File

@@ -278,6 +278,7 @@ async def m009_create_tinyurl_table(db):
id TEXT PRIMARY KEY, id TEXT PRIMARY KEY,
url TEXT, url TEXT,
endless BOOL NOT NULL DEFAULT false, endless BOOL NOT NULL DEFAULT false,
wallet TEXT,
time TIMESTAMP NOT NULL DEFAULT {db.timestamp_now} time TIMESTAMP NOT NULL DEFAULT {db.timestamp_now}
); );
""" """

View File

@@ -219,6 +219,7 @@ class TinyURL(BaseModel):
id: str id: str
url: str url: str
endless: bool endless: bool
wallet: str
time: float time: float
@classmethod @classmethod

View File

@@ -48,6 +48,7 @@ from lnbits.utils.exchange_rates import (
from .. import core_app, db from .. import core_app, db
from ..crud import ( from ..crud import (
create_tinyurl, create_tinyurl,
delete_tinyurl,
get_payments, get_payments,
get_standalone_payment, get_standalone_payment,
get_tinyurl, get_tinyurl,
@@ -715,23 +716,67 @@ async def websocket_update_get(item_id: str, data: str):
@core_app.post("/api/v1/tinyurl") @core_app.post("/api/v1/tinyurl")
async def api_create_tinyurl(url: str, endless: bool = False): async def api_create_tinyurl(
tinyurl = await get_tinyurl_by_url(url) 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:
if tinyurl.wallet == wallet.wallet.inkey:
return tinyurl return tinyurl
return await create_tinyurl(url, endless) return await create_tinyurl(url, endless, wallet.wallet.inkey)
except:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST, detail="Unable to create tinyurl"
)
@core_app.get("/api/v1/tinyurl/{tinyurl_id}") @core_app.get("/api/v1/tinyurl/{tinyurl_id}")
async def api_get_tinyurl(tinyurl_id: str): async def api_get_tinyurl(
return await get_tinyurl(tinyurl_id) tinyurl_id: str, wallet: WalletTypeInfo = Depends(get_key_type)
):
try:
tinyurl = await get_tinyurl(tinyurl_id)
if tinyurl.wallet == wallet.wallet.inkey:
return tinyurl
raise HTTPException(
status_code=HTTPStatus.FORBIDDEN, detail="Wrong key provided."
)
except:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="Unable to fetch tinyurl"
)
@core_app.delete("/api/v1/tinyurl/{tinyurl_id}")
async def api_delete_tinyurl(
tinyurl_id: str, wallet: WalletTypeInfo = Depends(get_key_type)
):
try:
tinyurl = await get_tinyurl(tinyurl_id)
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:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST, detail="Unable to delete"
)
@core_app.get("/t/{tinyurl_id}") @core_app.get("/t/{tinyurl_id}")
async def api_tinyurl(tinyurl_id: str): async def api_tinyurl(tinyurl_id: str):
try:
tinyurl = await get_tinyurl(tinyurl_id) tinyurl = await get_tinyurl(tinyurl_id)
if tinyurl: if tinyurl:
response = RedirectResponse(url=tinyurl.url) response = RedirectResponse(url=tinyurl.url)
return response return response
else: else:
return return
except:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="unable to find tinyurl"
)