major api refactoring
							parent
							
								
									f0cdf02479
								
							
						
					
					
						commit
						80cc6e4430
					
				@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from flask import Flask
 | 
				
			||||||
 | 
					from flask_cors import CORS
 | 
				
			||||||
 | 
					from flask_sqlalchemy import SQLAlchemy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from api.settings import app_settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# instantiate the extensions
 | 
				
			||||||
 | 
					db = SQLAlchemy()
 | 
				
			||||||
 | 
					cors = CORS()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def create_app(script_info=None):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    app = Flask(__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # set config
 | 
				
			||||||
 | 
					    config_engine = app_settings[os.getenv("APP_SETTINGS", "dev")]()
 | 
				
			||||||
 | 
					    app.config.from_object(config_engine)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # set up extensions
 | 
				
			||||||
 | 
					    db.init_app(app)
 | 
				
			||||||
 | 
					    cors.init_app(app)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #     migrate.init_app(app, db)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # register blueprints
 | 
				
			||||||
 | 
					    from .app import main_blueprint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    app.register_blueprint(main_blueprint)
 | 
				
			||||||
 | 
					    #     from project.api.users import users_blueprint
 | 
				
			||||||
 | 
					    #     app.register_blueprint(users_blueprint)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # shell context for flask cli
 | 
				
			||||||
 | 
					    app.shell_context_processor({"app": app, "db": db})
 | 
				
			||||||
 | 
					    return app
 | 
				
			||||||
@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					import os
 | 
				
			||||||
 | 
					from flask import Blueprint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main_blueprint = Blueprint("main", __name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__version__ = "1.2.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@main_blueprint.route("/ping")
 | 
				
			||||||
 | 
					@main_blueprint.route("/")
 | 
				
			||||||
 | 
					def pong():
 | 
				
			||||||
 | 
					    """A simple ping route."""
 | 
				
			||||||
 | 
					    return {"message": "pong"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@main_blueprint.route("/env")
 | 
				
			||||||
 | 
					def env():
 | 
				
			||||||
 | 
					    """Exposes the environment variables."""
 | 
				
			||||||
 | 
					    return dict(os.environ)
 | 
				
			||||||
@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# TODO Add  postgres params option
 | 
				
			||||||
 | 
					def build_postgres_uri(host, user, dbname, passwd=None, port="5432", sslmode=None):
 | 
				
			||||||
 | 
					    """Builds a PostgreSQL uri.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    See https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING for additional details.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if passwd:
 | 
				
			||||||
 | 
					        uri = f"postgresql://{user}:{passwd}@{host}:{port}/{dbname}"
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        uri = f"postgresql://{user}@{host}:{port}/{dbname}"
 | 
				
			||||||
 | 
					    if sslmode:
 | 
				
			||||||
 | 
					        uri = f"{uri}?sslmode={sslmode}"
 | 
				
			||||||
 | 
					    return uri
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BaseConfigEngine:
 | 
				
			||||||
 | 
					    """Base configuration engine"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    POSTGRES_HOST = os.getenv("POSTGRES_HOST", default="localhost")
 | 
				
			||||||
 | 
					    POSTGRES_USER = os.getenv("POSTGRES_USER", default="postgres")
 | 
				
			||||||
 | 
					    POSTGRES_APP_DATABASE = os.getenv("POSTGRES_APP_DATABASE", default="postgres")
 | 
				
			||||||
 | 
					    POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD")
 | 
				
			||||||
 | 
					    POSTGRES_PORT = os.getenv("POSTGRES_PORT", default="5432")
 | 
				
			||||||
 | 
					    POSTGRES_SSL_MODE = os.getenv("POSTGRES_SSL_MODE", default="prefer")
 | 
				
			||||||
 | 
					    POSTGRES_PARAMS = os.getenv("POSTGRES_PARAMS")
 | 
				
			||||||
 | 
					    SECRET_KEY = os.getenv("SECRET_KEY", "defaultsecretkey")
 | 
				
			||||||
 | 
					    SQLALCHEMY_TRACK_MODIFICATIONS = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def SQLALCHEMY_DATABASE_URI(self):  # Note: all caps
 | 
				
			||||||
 | 
					        return build_postgres_uri(
 | 
				
			||||||
 | 
					            self.POSTGRES_HOST,
 | 
				
			||||||
 | 
					            self.POSTGRES_USER,
 | 
				
			||||||
 | 
					            self.POSTGRES_APP_DATABASE,
 | 
				
			||||||
 | 
					            self.POSTGRES_PASSWORD,
 | 
				
			||||||
 | 
					            self.POSTGRES_PORT,
 | 
				
			||||||
 | 
					            self.POSTGRES_SSL_MODE,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DevConfigEngine(BaseConfigEngine):
 | 
				
			||||||
 | 
					    DEBUG = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestingConfigEngine(BaseConfigEngine):
 | 
				
			||||||
 | 
					    TESTING = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ProductionConfigEngine(BaseConfigEngine):
 | 
				
			||||||
 | 
					    DEBUG = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app_settings = {
 | 
				
			||||||
 | 
					    "dev": DevConfigEngine,
 | 
				
			||||||
 | 
					    "development": DevConfigEngine,
 | 
				
			||||||
 | 
					    "test": TestingConfigEngine,
 | 
				
			||||||
 | 
					    "testing": TestingConfigEngine,
 | 
				
			||||||
 | 
					    "prod": ProductionConfigEngine,
 | 
				
			||||||
 | 
					    "production": ProductionConfigEngine,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import pytest
 | 
					import pytest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from backend.settings import build_postgres_uri
 | 
					from api.settings import build_postgres_uri
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@pytest.mark.parametrize(
 | 
					@pytest.mark.parametrize(
 | 
				
			||||||
@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					from api import create_app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app = create_app()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    app.run()
 | 
				
			||||||
@ -1,21 +0,0 @@
 | 
				
			|||||||
import os
 | 
					 | 
				
			||||||
from flask import Flask
 | 
					 | 
				
			||||||
from flask_cors import CORS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
app = Flask(__name__)
 | 
					 | 
				
			||||||
cors = CORS(app)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
__version__ = "1.0.0"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@app.route("/ping")
 | 
					 | 
				
			||||||
@app.route("/")
 | 
					 | 
				
			||||||
def pong():
 | 
					 | 
				
			||||||
    """A simple ping route."""
 | 
					 | 
				
			||||||
    return {"message": "pong"}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@app.route("/env")
 | 
					 | 
				
			||||||
def env():
 | 
					 | 
				
			||||||
    """Exposes the environment variables."""
 | 
					 | 
				
			||||||
    return dict(os.environ)
 | 
					 | 
				
			||||||
@ -1,27 +0,0 @@
 | 
				
			|||||||
import os
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def build_postgres_uri(
 | 
					 | 
				
			||||||
    host, user, dbname, port, sslmode=None, passwd=None, params=None
 | 
					 | 
				
			||||||
):
 | 
					 | 
				
			||||||
    """Builds a PostgreSQL uri.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    See https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING for additional details.
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if passwd:
 | 
					 | 
				
			||||||
        uri = f"postgresql://{user}:{passwd}@{host}:{port}/{dbname}"
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        uri = f"postgresql://{user}@{host}:{port}/{dbname}"
 | 
					 | 
				
			||||||
    if sslmode:
 | 
					 | 
				
			||||||
        uri = f"{uri}?sslmode={sslmode}"
 | 
					 | 
				
			||||||
    return uri
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
POSTGRES_HOST = os.getenv("POSTGRES_HOST")
 | 
					 | 
				
			||||||
POSTGRES_USER = os.getenv("POSTGRES_USER")
 | 
					 | 
				
			||||||
POSTGRES_APP_DATABASE = os.getenv("POSTGRES_APP_DATABASE")
 | 
					 | 
				
			||||||
POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD")
 | 
					 | 
				
			||||||
POSTGRES_PORT = os.getenv("POSTGRES_PORT", default="5432")
 | 
					 | 
				
			||||||
POSTGRES_SSL_MODE = os.getenv("POSTGRES_SSL_MODE", default="prefer")
 | 
					 | 
				
			||||||
POSTGRES_PARAMS = os.getenv("POSTGRES_PARAMS")
 | 
					 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue