from fastapi import Request, Depends from starlette.responses import JSONResponse from . import router from .. import JWTBearer from ..sql import SessionMaker, AlertEndpoints from pydantic import BaseModel, create_model, HttpUrl class SubscriptionData(BaseModel): endpoint: HttpUrl keys: create_model("keys", auth=(str, ...), p256dh=(str, ...)) @router.post("/alert/register", dependencies=[Depends(JWTBearer())]) async def register(request: Request, subscription: SubscriptionData): with SessionMaker() as session: check = session.query(AlertEndpoints).filter(AlertEndpoints.url == str(subscription.endpoint)) if check.first() is not None: return JSONResponse({ "success": True }) info = AlertEndpoints(username=request.state.jwt["account"], url=str(subscription.endpoint), auth=subscription.keys.auth, p256dh=subscription.keys.p256dh) session.merge(info) session.commit() return JSONResponse({ "success": True }) @router.post("/alert/unregister", dependencies=[Depends(JWTBearer())]) async def unregister(request: Request): with SessionMaker() as session: body = await request.json() session.query(AlertEndpoints).filter(AlertEndpoints.url == body.get("url", ""), AlertEndpoints.username == request.state.jwt["account"]).delete() session.commit() return JSONResponse({ "success": True }) @router.post("/alert/clear", dependencies=[Depends(JWTBearer())]) async def clear(request: Request): with SessionMaker() as session: session.query(AlertEndpoints).filter(AlertEndpoints.username == request.state.jwt["account"]).delete() session.commit() return JSONResponse({ "success": True })