2016-02-17 17:04:50 +00:00
|
|
|
from flask import (
|
|
|
|
|
jsonify,
|
|
|
|
|
current_app
|
|
|
|
|
)
|
2016-02-19 11:37:35 +00:00
|
|
|
from sqlalchemy.exc import SQLAlchemyError, DataError
|
|
|
|
|
from sqlalchemy.orm.exc import NoResultFound
|
2016-06-14 15:07:23 +01:00
|
|
|
from marshmallow import ValidationError
|
2016-06-29 17:37:20 +01:00
|
|
|
from app.authentication.auth import AuthError
|
2015-12-11 16:57:00 +00:00
|
|
|
|
|
|
|
|
|
2016-06-14 15:07:23 +01:00
|
|
|
class InvalidRequest(Exception):
|
2016-06-13 11:48:20 +01:00
|
|
|
|
|
|
|
|
def __init__(self, message, status_code):
|
|
|
|
|
super().__init__()
|
|
|
|
|
self.message = message
|
|
|
|
|
self.status_code = status_code
|
|
|
|
|
|
|
|
|
|
def to_dict(self):
|
|
|
|
|
return {'result': 'error', 'message': self.message}
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return str(self.to_dict())
|
|
|
|
|
|
|
|
|
|
|
2016-02-17 17:04:50 +00:00
|
|
|
def register_errors(blueprint):
|
2015-12-11 16:57:00 +00:00
|
|
|
|
2016-06-29 17:37:20 +01:00
|
|
|
@blueprint.app_errorhandler(AuthError)
|
|
|
|
|
def authentication_error(error):
|
|
|
|
|
return jsonify(result='error', message=error.message), error.code
|
|
|
|
|
|
2016-06-14 15:07:23 +01:00
|
|
|
@blueprint.app_errorhandler(ValidationError)
|
|
|
|
|
def validation_error(error):
|
|
|
|
|
current_app.logger.error(error)
|
|
|
|
|
return jsonify(result='error', message=error.messages), 400
|
|
|
|
|
|
|
|
|
|
@blueprint.app_errorhandler(InvalidRequest)
|
2016-06-13 11:48:20 +01:00
|
|
|
def invalid_data(error):
|
|
|
|
|
response = jsonify(error.to_dict())
|
|
|
|
|
response.status_code = error.status_code
|
|
|
|
|
current_app.logger.error(error)
|
|
|
|
|
return response
|
|
|
|
|
|
2016-02-17 17:04:50 +00:00
|
|
|
@blueprint.app_errorhandler(400)
|
|
|
|
|
def bad_request(e):
|
2016-10-17 17:41:39 +01:00
|
|
|
msg = e.description or "Invalid request parameters"
|
2016-06-13 11:48:20 +01:00
|
|
|
current_app.logger.exception(msg)
|
2016-02-26 12:00:16 +00:00
|
|
|
return jsonify(result='error', message=str(msg)), 400
|
2015-12-11 16:57:00 +00:00
|
|
|
|
2016-02-17 17:04:50 +00:00
|
|
|
@blueprint.app_errorhandler(401)
|
|
|
|
|
def unauthorized(e):
|
|
|
|
|
error_message = "Unauthorized, authentication token must be provided"
|
2016-02-25 12:11:51 +00:00
|
|
|
return jsonify(result='error', message=error_message), 401, [('WWW-Authenticate', 'Bearer')]
|
2015-12-11 16:57:00 +00:00
|
|
|
|
2016-02-17 17:04:50 +00:00
|
|
|
@blueprint.app_errorhandler(403)
|
|
|
|
|
def forbidden(e):
|
|
|
|
|
error_message = "Forbidden, invalid authentication token provided"
|
2016-02-25 12:11:51 +00:00
|
|
|
return jsonify(result='error', message=error_message), 403
|
2015-12-11 16:57:00 +00:00
|
|
|
|
2016-02-17 17:04:50 +00:00
|
|
|
@blueprint.app_errorhandler(404)
|
|
|
|
|
def page_not_found(e):
|
2016-10-17 17:41:39 +01:00
|
|
|
msg = e.description or "Not found"
|
2016-06-13 11:48:20 +01:00
|
|
|
current_app.logger.exception(msg)
|
2016-02-26 12:00:16 +00:00
|
|
|
return jsonify(result='error', message=msg), 404
|
2015-12-11 16:57:00 +00:00
|
|
|
|
2016-02-17 17:04:50 +00:00
|
|
|
@blueprint.app_errorhandler(429)
|
|
|
|
|
def limit_exceeded(e):
|
2016-06-13 11:48:20 +01:00
|
|
|
current_app.logger.exception(e)
|
2016-02-25 12:11:51 +00:00
|
|
|
return jsonify(result='error', message=str(e.description)), 429
|
2015-12-11 16:57:00 +00:00
|
|
|
|
2016-02-19 11:37:35 +00:00
|
|
|
@blueprint.app_errorhandler(NoResultFound)
|
|
|
|
|
@blueprint.app_errorhandler(DataError)
|
2016-10-17 17:41:39 +01:00
|
|
|
def no_result_found(e):
|
2016-03-11 15:52:28 +00:00
|
|
|
current_app.logger.exception(e)
|
2016-02-25 12:11:51 +00:00
|
|
|
return jsonify(result='error', message="No result found"), 404
|
2016-02-19 11:37:35 +00:00
|
|
|
|
|
|
|
|
@blueprint.app_errorhandler(SQLAlchemyError)
|
|
|
|
|
def db_error(e):
|
2016-03-11 15:52:28 +00:00
|
|
|
current_app.logger.exception(e)
|
2016-04-25 10:38:37 +01:00
|
|
|
if e.orig.pgerror and \
|
|
|
|
|
('duplicate key value violates unique constraint "services_name_key"' in e.orig.pgerror or
|
|
|
|
|
'duplicate key value violates unique constraint "services_email_from_key"' in e.orig.pgerror):
|
|
|
|
|
return jsonify(
|
|
|
|
|
result='error',
|
2016-04-26 09:32:27 +01:00
|
|
|
message={'name': ["Duplicate service name '{}'".format(
|
|
|
|
|
e.params.get('name', e.params.get('email_from', ''))
|
|
|
|
|
)]}
|
2016-04-25 10:38:37 +01:00
|
|
|
), 400
|
|
|
|
|
return jsonify(result='error', message="Internal server error"), 500
|
2016-10-17 17:41:39 +01:00
|
|
|
|
|
|
|
|
# this must be defined after all other error handlers since it catches the generic Exception object
|
|
|
|
|
@blueprint.app_errorhandler(500)
|
|
|
|
|
@blueprint.app_errorhandler(Exception)
|
|
|
|
|
def internal_server_error(e):
|
|
|
|
|
current_app.logger.exception(e)
|
|
|
|
|
return jsonify(result='error', message="Internal server error"), 500
|