add push notification support
This commit is contained in:
parent
6a69c5a34d
commit
1b1dcc3755
12 changed files with 175 additions and 10 deletions
4
cef_3M/endpoints/account.py
Normal file
4
cef_3M/endpoints/account.py
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
from . import router
|
||||
from fastapi import UploadFile, Request, Depends
|
||||
|
||||
from ..auth import JWTBearer
|
||||
51
cef_3M/endpoints/alerts.py
Normal file
51
cef_3M/endpoints/alerts.py
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
from fastapi import Request, Depends
|
||||
from starlette.responses import JSONResponse
|
||||
from . import router
|
||||
from .. import JWTBearer
|
||||
from ..sql import SessionMaker, AlertEndpoints
|
||||
from ..util import redis
|
||||
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):
|
||||
session = SessionMaker()
|
||||
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):
|
||||
session = SessionMaker()
|
||||
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):
|
||||
session = SessionMaker()
|
||||
session.query(AlertEndpoints).filter(AlertEndpoints.username == request.state.jwt["account"]).delete()
|
||||
session.commit()
|
||||
|
||||
return JSONResponse({
|
||||
"success": True
|
||||
})
|
||||
|
|
@ -23,7 +23,7 @@ def pathParts(path):
|
|||
async def mediamtxChannelStreams(request: Request, channel: str):
|
||||
inChannel = request.state.jwt.get("channel", "").lower() == "#" + channel.lower()
|
||||
results = []
|
||||
for result in redis.scan_iter(f"stream #{channel} *"):
|
||||
async for result in redis.scan_iter(f"stream #{channel} *"):
|
||||
_, channel, user, token = result.decode("utf8").split()
|
||||
if inChannel or token == "public":
|
||||
results.append({
|
||||
|
|
@ -74,7 +74,7 @@ async def mediamtxAdd(request: Request):
|
|||
body = await request.json()
|
||||
path = body["env"]["MTX_PATH"].split("/")
|
||||
parts = [x for x in pathParts(path) if x]
|
||||
redis.set("stream " + " ".join(parts), parts[2])
|
||||
await redis.set("stream " + " ".join(parts), parts[2])
|
||||
if len(parts) == 3:
|
||||
await ergo.broadcastTo(parts[0], "STREAMSTART", parts[0], parts[1], parts[2])
|
||||
|
||||
|
|
@ -87,7 +87,7 @@ async def mediamtxDelete(request: Request):
|
|||
body = await request.json()
|
||||
path = body["env"]["MTX_PATH"].split("/")
|
||||
parts = [x for x in pathParts(path) if x]
|
||||
redis.delete("stream " + " ".join(parts))
|
||||
await redis.delete("stream " + " ".join(parts))
|
||||
if len(parts) == 3:
|
||||
await ergo.broadcastTo(parts[0], "STREAMEND", parts[0], parts[1], parts[2])
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue