from flask import jsonify from flask_apispec import doc, marshal_with from flask_atlas_auth import claims_required from webargs.flaskparser import use_args from werkzeug.exceptions import NotFound from core_notifications.auth.claims import Audience from core_notifications import services from . import api from .schemas import ( EmailSendRequestBodyItemSchema, EmailSendResponse, StatusResponse, ) @api.route("/email/send", methods=["POST"]) @claims_required( [ Audience(Audience.Values.core_notifications), Audience(Audience.Values.api), ], login_redirect=False, ) @use_args(EmailSendRequestBodyItemSchema(many=True), location="json") @marshal_with(EmailSendResponse(many=True)) @doc( requestBody={ "content": { "application/json": { "schema": EmailSendRequestBodyItemSchema(many=True), }, }, }, tags=["email"], ) def email_send(data): return jsonify(services.schedule_emails_batch(data)) @api.route("/status/", methods=["GET"]) @claims_required( [ Audience(Audience.Values.core_notifications), Audience(Audience.Values.api), ], login_redirect=False, ) @marshal_with(StatusResponse) @doc( params={ "task_id": { "name": "task_id", "in": "path", "required": True, "schema": { "type": "string", }, }, }, tags=["generic"], ) def get_status(task_id): status = services.get_sending_status(task_id) if not status: raise NotFound("The task is not found.") return jsonify({"status": status.value})