109 lines
3.2 KiB
Python
109 lines
3.2 KiB
Python
import logging
|
|
import uuid
|
|
|
|
from aiohttp import web
|
|
from aiohttp.web import Request, Response
|
|
|
|
from app.library.encoder import Encoder
|
|
from app.library.Events import EventBus, Events
|
|
from app.library.Notifications import Notification, NotificationEvents
|
|
from app.library.router import route
|
|
from app.library.Utils import validate_uuid
|
|
|
|
LOG: logging.Logger = logging.getLogger(__name__)
|
|
|
|
|
|
@route("GET", "api/notifications/", "notifications_list")
|
|
async def notifications_list(encoder: Encoder) -> Response:
|
|
"""
|
|
Get the notification targets.
|
|
|
|
Args:
|
|
encoder (Encoder): The encoder instance.
|
|
|
|
Returns:
|
|
Response: The response object.
|
|
|
|
"""
|
|
return web.json_response(
|
|
data={
|
|
"notifications": Notification.get_instance().get_targets(),
|
|
"allowedTypes": list(NotificationEvents.get_events().values()),
|
|
},
|
|
status=web.HTTPOk.status_code,
|
|
dumps=encoder.encode,
|
|
)
|
|
|
|
|
|
@route("PUT", "api/notifications/", "notification_add")
|
|
async def notification_add(request: Request, encoder: Encoder) -> Response:
|
|
"""
|
|
Add notification targets.
|
|
|
|
Args:
|
|
request (Request): The request object.
|
|
encoder (Encoder): The encoder instance.
|
|
notify (EventBus): The event bus instance.
|
|
|
|
Returns:
|
|
Response: The response object.
|
|
|
|
"""
|
|
post = await request.json()
|
|
if not isinstance(post, list):
|
|
return web.json_response(
|
|
{"error": "Invalid request body expecting list with dicts."},
|
|
status=web.HTTPBadRequest.status_code,
|
|
)
|
|
|
|
targets: list = []
|
|
|
|
ins: Notification = Notification.get_instance()
|
|
for item in post:
|
|
if not isinstance(item, dict):
|
|
return web.json_response(
|
|
{"error": "Invalid request body expecting list with dicts."},
|
|
status=web.HTTPBadRequest.status_code,
|
|
)
|
|
|
|
if not item.get("id", None) or validate_uuid(item.get("id"), version=4):
|
|
item["id"] = str(uuid.uuid4())
|
|
|
|
try:
|
|
Notification.validate(item)
|
|
except ValueError as e:
|
|
return web.json_response(
|
|
{"error": f"Invalid notification target settings. {e!s}", "data": item},
|
|
status=web.HTTPBadRequest.status_code,
|
|
)
|
|
|
|
targets.append(ins.make_target(item))
|
|
|
|
try:
|
|
ins.save(targets=targets)
|
|
ins.load()
|
|
except Exception as e:
|
|
LOG.exception(e)
|
|
return web.json_response({"error": "Failed to save tasks."}, status=web.HTTPInternalServerError.status_code)
|
|
|
|
data = {"notifications": targets, "allowedTypes": list(NotificationEvents.get_events().values())}
|
|
|
|
return web.json_response(data=data, status=web.HTTPOk.status_code, dumps=encoder.encode)
|
|
|
|
|
|
@route("POST", "api/notifications/test/", "notification_test")
|
|
async def notification_test(encoder: Encoder, notify: EventBus) -> Response:
|
|
"""
|
|
Test the notification.
|
|
|
|
Args:
|
|
encoder (Encoder): The encoder instance.
|
|
notify (EventBus): The event bus instance.
|
|
|
|
Returns:
|
|
Response: The response object.
|
|
|
|
"""
|
|
await notify.emit(Events.TEST, title="Test Notification", message="This is a test notification.")
|
|
|
|
return web.json_response(data={}, status=web.HTTPOk.status_code, dumps=encoder.encode)
|