This commit is contained in:
benarc
2021-11-12 04:14:55 +00:00
parent 860709f48c
commit 267dea4f75
61 changed files with 23219 additions and 13297 deletions
+3 -4
View File
@@ -5,13 +5,12 @@ from lnbits.helpers import template_renderer
db = Database("ext_streamalerts")
streamalerts_ext: APIRouter = APIRouter(
prefix="/streamalerts",
tags=["streamalerts"]
)
streamalerts_ext: APIRouter = APIRouter(prefix="/streamalerts", tags=["streamalerts"])
def streamalerts_renderer():
return template_renderer(["lnbits/extensions/streamalerts/templates"])
from .views import * # noqa
from .views_api import * # noqa
+3 -10
View File
@@ -25,9 +25,7 @@ async def get_charge_details(service_id):
These might be different depending for services implemented in the future.
"""
details = {
"time": 1440,
}
details = {"time": 1440}
service = await get_service(service_id)
wallet_id = service.wallet
wallet = await get_wallet(wallet_id)
@@ -111,9 +109,7 @@ async def post_donation(donation_id: str) -> tuple:
return response.json()
async def create_service(
data: CreateService
) -> Service:
async def create_service(data: CreateService) -> Service:
"""Create a new Service"""
returning = "" if db.type == SQLITE else "RETURNING ID"
@@ -215,10 +211,7 @@ async def service_add_token(service_id, token):
return False
await db.execute(
"UPDATE streamalerts.Services SET authenticated = 1, token = ? where id = ?",
(
token,
service_id,
),
(token, service_id),
)
return True
+2
View File
@@ -13,12 +13,14 @@ class CreateService(BaseModel):
servicename: str = Query(...)
onchain: str = Query(None)
class CreateDonation(BaseModel):
name: str = Query("Anonymous")
sats: int = Query(..., ge=1)
service: int = Query(...)
message: str = Query("")
class ValidateDonation(BaseModel):
id: str = Query(...)
+4 -6
View File
@@ -18,7 +18,9 @@ templates = Jinja2Templates(directory="templates")
@streamalerts_ext.get("/", response_class=HTMLResponse)
async def index(request: Request, user: User = Depends(check_user_exists)):
"""Return the extension's settings page"""
return streamalerts_renderer().TemplateResponse("streamalerts/index.html", {"request": request, "user": user.dict()})
return streamalerts_renderer().TemplateResponse(
"streamalerts/index.html", {"request": request, "user": user.dict()}
)
@streamalerts_ext.get("/{state}")
@@ -31,9 +33,5 @@ async def donation(state, request: Request):
)
return streamalerts_renderer().TemplateResponse(
"streamalerts/display.html",
{
"request": request,
"twitchuser": service.twitchuser,
"service":service.id
}
{"request": request, "twitchuser": service.twitchuser, "service": service.id},
)
+40 -46
View File
@@ -35,14 +35,14 @@ from .crud import (
@streamalerts_ext.post("/api/v1/services")
async def api_create_service(data : CreateService, wallet: WalletTypeInfo = Depends(get_key_type)):
async def api_create_service(
data: CreateService, wallet: WalletTypeInfo = Depends(get_key_type)
):
"""Create a service, which holds data about how/where to post donations"""
try:
service = await create_service(data=data)
except Exception as e:
raise HTTPException(
status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(e)
)
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(e))
return service.dict()
@@ -68,23 +68,24 @@ async def api_get_access(service_id, request: Request):
return RedirectResponse(redirect_url)
else:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST,
detail="Service does not exist!"
status_code=HTTPStatus.BAD_REQUEST, detail="Service does not exist!"
)
@streamalerts_ext.get("/api/v1/authenticate/{service_id}")
async def api_authenticate_service(service_id, request: Request, code: str = Query(...), state: str = Query(...)):
async def api_authenticate_service(
service_id, request: Request, code: str = Query(...), state: str = Query(...)
):
"""Endpoint visited via redirect during third party API authentication
If successful, an API access token will be added to the service, and
the user will be redirected to index.html.
"""
service = await get_service(service_id)
if service.state != state:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST,
detail="State doesn't match!"
status_code=HTTPStatus.BAD_REQUEST, detail="State doesn't match!"
)
redirect_uri = request.url.scheme + "://" + request.headers["Host"]
@@ -94,8 +95,7 @@ async def api_authenticate_service(service_id, request: Request, code: str = Que
return RedirectResponse(url)
else:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST,
detail="Service already authenticated!"
status_code=HTTPStatus.BAD_REQUEST, detail="Service already authenticated!"
)
@@ -114,7 +114,7 @@ async def api_create_donation(data: CreateDonation, request: Request):
service = await get_service(service_id)
charge_details = await get_charge_details(service.id)
name = data.name
description = f"{sats} sats donation from {name} to {service.twitchuser}"
charge = await create_charge(
amount=sats,
@@ -132,7 +132,7 @@ async def api_create_donation(data: CreateDonation, request: Request):
cur_code=cur_code,
sats=data.sats,
amount=amount,
service=data.service
service=data.service,
)
return {"redirect_url": f"/satspay/{charge.id}"}
@@ -141,15 +141,14 @@ async def api_create_donation(data: CreateDonation, request: Request):
async def api_post_donation(request: Request, data: ValidateDonation):
"""Post a paid donation to Stremalabs/StreamElements.
This endpoint acts as a webhook for the SatsPayServer extension."""
donation_id = data.id
charge = await get_charge(donation_id)
if charge and charge.paid:
return await post_donation(donation_id)
else:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST,
detail="Not a paid charge!"
status_code=HTTPStatus.BAD_REQUEST, detail="Not a paid charge!"
)
@@ -178,58 +177,55 @@ async def api_get_donations(g: WalletTypeInfo = Depends(get_key_type)):
@streamalerts_ext.put("/api/v1/donations/{donation_id}")
async def api_update_donation(data: CreateDonation, donation_id=None, g: WalletTypeInfo = Depends(get_key_type)):
async def api_update_donation(
data: CreateDonation, donation_id=None, g: WalletTypeInfo = Depends(get_key_type)
):
"""Update a donation with the data given in the request"""
if donation_id:
donation = await get_donation(donation_id)
if not donation:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND,
detail="Donation does not exist."
status_code=HTTPStatus.NOT_FOUND, detail="Donation does not exist."
)
if donation.wallet != g.wallet.id:
raise HTTPException(
status_code=HTTPStatus.FORBIDDEN,
detail="Not your donation."
status_code=HTTPStatus.FORBIDDEN, detail="Not your donation."
)
donation = await update_donation(donation_id, **data.dict())
else:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST,
detail="No donation ID specified"
)
status_code=HTTPStatus.BAD_REQUEST, detail="No donation ID specified"
)
return donation.dict()
@streamalerts_ext.put("/api/v1/services/{service_id}")
async def api_update_service(data: CreateService, service_id=None, g: WalletTypeInfo = Depends(get_key_type)):
async def api_update_service(
data: CreateService, service_id=None, g: WalletTypeInfo = Depends(get_key_type)
):
"""Update a service with the data given in the request"""
if service_id:
service = await get_service(service_id)
if not service:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND,
detail="Service does not exist."
status_code=HTTPStatus.NOT_FOUND, detail="Service does not exist."
)
if service.wallet != g.wallet.id:
raise HTTPException(
status_code=HTTPStatus.FORBIDDEN,
detail="Not your service."
status_code=HTTPStatus.FORBIDDEN, detail="Not your service."
)
service = await update_service(service_id, **data.dict())
else:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST,
detail="No service ID specified"
)
status_code=HTTPStatus.BAD_REQUEST, detail="No service ID specified"
)
return service.dict()
@@ -239,14 +235,13 @@ async def api_delete_donation(donation_id, g: WalletTypeInfo = Depends(get_key_t
donation = await get_donation(donation_id)
if not donation:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND,
detail="No donation with this ID!"
)
status_code=HTTPStatus.NOT_FOUND, detail="No donation with this ID!"
)
if donation.wallet != g.wallet.id:
raise HTTPException(
status_code=HTTPStatus.FORBIDDEN,
detail="Not authorized to delete this donation!"
)
status_code=HTTPStatus.FORBIDDEN,
detail="Not authorized to delete this donation!",
)
await delete_donation(donation_id)
raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
@@ -257,13 +252,12 @@ async def api_delete_service(service_id, g: WalletTypeInfo = Depends(get_key_typ
service = await get_service(service_id)
if not service:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND,
detail="No service with this ID!"
)
status_code=HTTPStatus.NOT_FOUND, detail="No service with this ID!"
)
if service.wallet != g.wallet.id:
raise HTTPException(
status_code=HTTPStatus.FORBIDDEN,
detail="Not authorized to delete this service!"
)
status_code=HTTPStatus.FORBIDDEN,
detail="Not authorized to delete this service!",
)
await delete_service(service_id)
raise HTTPException(status_code=HTTPStatus.NO_CONTENT)