Files
notifications-api/app/service/callback_rest.py

177 lines
5.5 KiB
Python
Raw Normal View History

2021-03-10 13:55:06 +00:00
from flask import Blueprint, jsonify, request
from sqlalchemy.exc import SQLAlchemyError
2021-03-10 13:55:06 +00:00
from app.dao.service_callback_api_dao import (
delete_service_callback_api,
get_service_callback_api,
reset_service_callback_api,
save_service_callback_api,
)
from app.dao.service_inbound_api_dao import (
delete_service_inbound_api,
get_service_inbound_api,
reset_service_inbound_api,
save_service_inbound_api,
)
from app.enums import CallbackType
2021-03-10 13:55:06 +00:00
from app.errors import InvalidRequest, register_errors
from app.models import ServiceCallbackApi, ServiceInboundApi
from app.schema_validation import validate
from app.service.service_callback_api_schema import (
create_service_callback_api_schema,
2021-03-10 13:55:06 +00:00
update_service_callback_api_schema,
2017-11-29 16:51:39 +00:00
)
2023-08-29 14:54:30 -07:00
service_callback_blueprint = Blueprint(
"service_callback", __name__, url_prefix="/service/<uuid:service_id>"
)
register_errors(service_callback_blueprint)
2023-08-29 14:54:30 -07:00
@service_callback_blueprint.route("/inbound-api", methods=["POST"])
def create_service_inbound_api(service_id):
data = request.get_json()
validate(data, create_service_callback_api_schema)
data["service_id"] = service_id
inbound_api = ServiceInboundApi(**data)
try:
save_service_inbound_api(inbound_api)
except SQLAlchemyError as e:
2023-08-29 14:54:30 -07:00
return handle_sql_error(e, "service_inbound_api")
return jsonify(data=inbound_api.serialize()), 201
2023-08-29 14:54:30 -07:00
@service_callback_blueprint.route(
"/inbound-api/<uuid:inbound_api_id>", methods=["POST"]
)
def update_service_inbound_api(service_id, inbound_api_id):
data = request.get_json()
validate(data, update_service_callback_api_schema)
to_update = get_service_inbound_api(inbound_api_id, service_id)
2023-08-29 14:54:30 -07:00
reset_service_inbound_api(
service_inbound_api=to_update,
updated_by_id=data["updated_by_id"],
url=data.get("url", None),
bearer_token=data.get("bearer_token", None),
)
return jsonify(data=to_update.serialize()), 200
2023-08-29 14:54:30 -07:00
@service_callback_blueprint.route("/inbound-api/<uuid:inbound_api_id>", methods=["GET"])
def fetch_service_inbound_api(service_id, inbound_api_id):
inbound_api = get_service_inbound_api(inbound_api_id, service_id)
return jsonify(data=inbound_api.serialize()), 200
2023-08-29 14:54:30 -07:00
@service_callback_blueprint.route(
"/inbound-api/<uuid:inbound_api_id>", methods=["DELETE"]
)
def remove_service_inbound_api(service_id, inbound_api_id):
inbound_api = get_service_inbound_api(inbound_api_id, service_id)
if not inbound_api:
2023-08-29 14:54:30 -07:00
error = "Service inbound API not found"
raise InvalidRequest(error, status_code=404)
delete_service_inbound_api(inbound_api)
2023-08-29 14:54:30 -07:00
return "", 204
2023-08-29 14:54:30 -07:00
@service_callback_blueprint.route("/delivery-receipt-api", methods=["POST"])
2017-11-29 16:51:39 +00:00
def create_service_callback_api(service_id):
data = request.get_json()
validate(data, create_service_callback_api_schema)
data["service_id"] = service_id
data["callback_type"] = CallbackType.DELIVERY_STATUS
2017-11-29 16:51:39 +00:00
callback_api = ServiceCallbackApi(**data)
try:
save_service_callback_api(callback_api)
except SQLAlchemyError as e:
2023-08-29 14:54:30 -07:00
return handle_sql_error(e, "service_callback_api")
2017-11-29 16:51:39 +00:00
return jsonify(data=callback_api.serialize()), 201
2023-08-29 14:54:30 -07:00
@service_callback_blueprint.route(
"/delivery-receipt-api/<uuid:callback_api_id>", methods=["POST"]
)
2017-11-29 16:51:39 +00:00
def update_service_callback_api(service_id, callback_api_id):
data = request.get_json()
validate(data, update_service_callback_api_schema)
to_update = get_service_callback_api(callback_api_id, service_id)
2023-08-29 14:54:30 -07:00
reset_service_callback_api(
service_callback_api=to_update,
updated_by_id=data["updated_by_id"],
url=data.get("url", None),
bearer_token=data.get("bearer_token", None),
)
2017-11-29 16:51:39 +00:00
return jsonify(data=to_update.serialize()), 200
2023-08-29 14:54:30 -07:00
@service_callback_blueprint.route(
"/delivery-receipt-api/<uuid:callback_api_id>", methods=["GET"]
)
2017-11-29 16:51:39 +00:00
def fetch_service_callback_api(service_id, callback_api_id):
callback_api = get_service_callback_api(callback_api_id, service_id)
return jsonify(data=callback_api.serialize()), 200
2023-08-29 14:54:30 -07:00
@service_callback_blueprint.route(
"/delivery-receipt-api/<uuid:callback_api_id>", methods=["DELETE"]
)
def remove_service_callback_api(service_id, callback_api_id):
callback_api = get_service_callback_api(callback_api_id, service_id)
if not callback_api:
2023-08-29 14:54:30 -07:00
error = "Service delivery receipt callback API not found"
raise InvalidRequest(error, status_code=404)
delete_service_callback_api(callback_api)
2023-08-29 14:54:30 -07:00
return "", 204
def handle_sql_error(e, table_name):
2023-08-29 14:54:30 -07:00
if (
hasattr(e, "orig")
and hasattr(e.orig, "pgerror")
and e.orig.pgerror
and (
'duplicate key value violates unique constraint "ix_{}_service_id"'.format(
table_name
)
in e.orig.pgerror
)
):
return (
jsonify(
result="error",
message={
"name": [
"You can only have one URL and bearer token for your service."
]
},
),
400,
)
elif (
hasattr(e, "orig")
and hasattr(e.orig, "pgerror")
and e.orig.pgerror
and (
'insert or update on table "{0}" violates '
'foreign key constraint "{0}_service_id_fkey"'.format(table_name)
in e.orig.pgerror
)
):
return jsonify(result="error", message="No result found"), 404
else:
raise e