Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Catch all exceptions in wallet API #220

Merged
merged 4 commits into from
May 22, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 14 additions & 1 deletion cashu/wallet/api/app.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from fastapi import FastAPI
from fastapi import FastAPI, Request, status
from fastapi.responses import JSONResponse

from ...core.settings import settings
from .router import router
Expand All @@ -19,4 +20,16 @@ def create_app() -> FastAPI:

app = create_app()


@app.middleware("http")
async def catch_exceptions(request: Request, call_next):
try:
response = await call_next(request)
return response
except Exception as e:
return JSONResponse(
status_code=status.HTTP_400_BAD_REQUEST, content={"detail": str(e)}
)


app.include_router(router=router)
80 changes: 19 additions & 61 deletions cashu/wallet/api/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from os.path import isdir, join
from typing import Optional

from fastapi import APIRouter, HTTPException, Query, status
from fastapi import APIRouter, Query

from ...core.base import TokenV3
from ...core.helpers import sum_proofs
Expand All @@ -32,7 +32,7 @@ async def load_mint(wallet: Wallet, mint: Optional[str] = None):
try:
await wallet.load_mint()
except Exception as e:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
raise Exception(str(e))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Jokingly suggest using a custom Exception class Cachuww 🤧

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cash'uwu

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This block can be replaced by simply wallet.load_mint() without try: ... except: ... – achieves the same thing.

return wallet


Expand All @@ -42,9 +42,7 @@ async def load_mint(wallet: Wallet, mint: Optional[str] = None):
@router.on_event("startup")
async def start_wallet():
if settings.tor and not TorProxy().check_platform():
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail="tor not working"
)
raise Exception("tor not working.")
await init_wallet(wallet)


Expand All @@ -57,23 +55,16 @@ async def pay(
),
):
if not settings.lightning:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail="lightning not enabled."
)
raise Exception("lightning not enabled.")

global wallet
wallet = await load_mint(wallet, mint)

await wallet.load_proofs()
initial_balance = wallet.available_balance
total_amount, fee_reserve_sat = await wallet.get_pay_amount_with_fees(invoice)
assert total_amount > 0, HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="amount has to be larger than zero.",
)
if wallet.available_balance < total_amount:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail="balance is too low."
)
assert total_amount > 0, "amount has to be larger than zero."
assert wallet.available_balance >= total_amount, "balance is too low."
_, send_proofs = await wallet.split_to_send(wallet.proofs, total_amount)
await wallet.pay_lightning(send_proofs, invoice)
await wallet.load_proofs()
Expand Down Expand Up @@ -152,16 +143,10 @@ async def send_command(

await wallet.load_proofs()
if not nostr:
try:
balance, token = await send(wallet, amount, lock, legacy=False)
except Exception as e:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
balance, token = await send(wallet, amount, lock, legacy=False)
return {"balance": balance, "token": token}
else:
try:
token, pubkey = await send_nostr(wallet, amount, nostr)
except Exception as e:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
token, pubkey = await send_nostr(wallet, amount, nostr)
return {
"balance": wallet.available_balance,
"token": token,
Expand All @@ -178,25 +163,12 @@ async def receive_command(
):
result = {"initial_balance": wallet.available_balance}
if token:
try:
tokenObj: TokenV3 = await deserialize_token_from_string(token)

try:
await verify_mints(wallet, tokenObj)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)
)

balance = await receive(wallet, tokenObj, lock)
except Exception as e:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
tokenObj: TokenV3 = await deserialize_token_from_string(token)
await verify_mints(wallet, tokenObj)
balance = await receive(wallet, tokenObj, lock)
elif nostr:
try:
await receive_nostr(wallet)
balance = wallet.available_balance
except Exception as e:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
await receive_nostr(wallet)
balance = wallet.available_balance
elif all:
reserved_proofs = await get_reserved_proofs(wallet.db)
balance = None
Expand All @@ -205,23 +177,10 @@ async def receive_command(
proofs = list(value)
token = await wallet.serialize_proofs(proofs)
tokenObj = await deserialize_token_from_string(token)
try:
await verify_mints(wallet, tokenObj)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)
)
try:
balance = await receive(wallet, tokenObj, lock)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)
)
await verify_mints(wallet, tokenObj)
balance = await receive(wallet, tokenObj, lock)
else:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="enter token or use either flag --nostr or --all.",
)
raise Exception("enter token or use either flag --nostr or --all.")
assert balance
result.update({"balance": balance})
return result
Expand All @@ -245,9 +204,8 @@ async def burn(
if not delete:
wallet = await load_mint(wallet, mint)
if not (all or token or force or delete) or (token and all):
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="enter a token or use --all to burn all pending tokens, --force to check all tokens"
raise Exception(
"enter a token or use --all to burn all pending tokens, --force to check all tokens"
"or --delete with send ID to force-delete pending token from list if mint is unavailable.",
)
if all:
Expand Down