"""Application. The API application is a `flask` application. It provides simple features such as registering a url for a specific handlers. """ from flask import Flask from flask_caching import Cache from flask_sqlalchemy import SQLAlchemy from owslogger import flask_logger from owsrequest import flask_request from owsresponse import response from owsresponse.adaptors.flask import flaskify from werkzeug.exceptions import HTTPException from product_review import config def http_error_handler(error): """Handle errors.""" return flaskify( response.create_error_response( message=error.description, status=error.code, code="error" ) ) app = Flask(config.SERVICE_NAME, static_folder=None) app.config["CACHE_TYPE"] = "SimpleCache" cache = Cache(app) app.config.update(**config.DB_CONFIG) if config.ENVIRONMENT == config.TEST_ENVIRONMENT: app.register_error_handler(HTTPException, http_error_handler) db = SQLAlchemy(app, session_options={"autocommit": False, "autoflush": False}) flask_logger.setup( app, config.ENVIRONMENT, config.LOGGER_NAME, config.LOGGER_LEVEL, config.SERVICE_NAME, config.SERVICE_VERSION, exclude_paths=[config.HEALTH_CHECK], ) try: import uwsgi # noqa uwsgiRunning = True except ImportError: uwsgiRunning = False flask_request.set_rules_validator(app, "product_review/access_rules.yml") flask_request.setup( app, config.ENVIRONMENT, add_request_context=True, label_profile=True, verify_access=False, rules_file=None, access_log_only=config.ONLY_LOG_ACCESS_ERRORS, exclude_paths=[config.HEALTH_CHECK], uwsgi_cache_enabled=uwsgiRunning ) if config.ENVIRONMENT in [config.QA_ENVIRONMENT, config.PROD_ENVIRONMENT]: if not config.SENTRY: raise Exception(f"Sentry is not configured in {config.ENVIRONMENT}")