From 16157ce86ad5faa34fae72985336f294b62252b8 Mon Sep 17 00:00:00 2001
From: David Trattnig <david.trattnig@o94.at>
Date: Thu, 25 Jun 2020 17:47:37 +0200
Subject: [PATCH] Improved SQLAlchemy initialization.

---
 Dockerfile                                |  2 +-
 run.sh                                    |  6 +++---
 setup.py                                  |  2 +-
 src/{server.py => app.py}                 | 20 ++++++++++----------
 src/models.py                             | 11 ++++-------
 src/rest/controllers/public_controller.py |  4 ++--
 src/service.py                            |  2 +-
 7 files changed, 22 insertions(+), 25 deletions(-)
 rename src/{server.py => app.py} (86%)

diff --git a/Dockerfile b/Dockerfile
index a04a188..d4cfd45 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -19,5 +19,5 @@ COPY config/sample/gunicorn/sample-docker.gunicorn.conf.py config/docker/gunicor
 
 EXPOSE 8008
 ENTRYPOINT ["gunicorn"]
-CMD ["-c", "/srv/config/docker/gunicorn.conf.py", "src.server:app"]
+CMD ["-c", "/srv/config/docker/gunicorn.conf.py", "src.app:app"]
 
diff --git a/run.sh b/run.sh
index ceb50bf..27e20bc 100755
--- a/run.sh
+++ b/run.sh
@@ -44,7 +44,7 @@ if [[ $docker == "false" ]]; then
 		# echo "Building Web Applications"
 		# sh ./script/build-web.sh
 		echo "Starting API Server"
-		/usr/bin/env python3.7 src/server.py
+		/usr/bin/env python3.7 src/app.py
 	fi
 
 	### Runs the API Server using Gunicorn without a system daemon (Production) ###
@@ -53,7 +53,7 @@ if [[ $docker == "false" ]]; then
 		echo "Activating Python Environment"
 		source ../python-env/bin/activate
 		echo "Starting API Server"
-		gunicorn -c config/gunicorn.conf.py src.server:app
+		gunicorn -c config/gunicorn.conf.py src.app:app
 	fi
 
 	if [[ $mode == "test" ]]; then
@@ -64,7 +64,7 @@ if [[ $docker == "false" ]]; then
 	### CAUTION: This deletes everything in your database ###
 
 	if [[ $mode == "recreate-database" ]]; then
-		/usr/bin/env python3.7 src/server.py --recreate-database
+		/usr/bin/env python3.7 src/app.py --recreate-database
 	fi
 
 fi
diff --git a/setup.py b/setup.py
index 2435033..f9c96b8 100644
--- a/setup.py
+++ b/setup.py
@@ -45,7 +45,7 @@ setup(
     package_data={'': ['src/rest/swagger/swagger.yaml']},
     include_package_data=True,
     entry_points={
-        'console_scripts': ['src.server=src.server.__main__:main']
+        'console_scripts': ['src.app=src.app.__main__:main']
     },
     long_description="""\
     This is the AURA Engine API. Read more at https://gitlab.servus.at/aura/engine.
diff --git a/src/server.py b/src/app.py
similarity index 86%
rename from src/server.py
rename to src/app.py
index 51d8d3b..ca700fc 100644
--- a/src/server.py
+++ b/src/app.py
@@ -23,36 +23,35 @@ import os
 sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
 
 import connexion
-from flask_sqlalchemy import SQLAlchemy
-from flask_marshmallow import Marshmallow
 
 from base.config import AuraConfig
 from base.logger import AuraLogger
 from rest import encoder
 from service import ApiService
 
+from models import db, ma
+
 
 # App Initialization
+
 config = AuraConfig()
 logger = AuraLogger(config, "engine-api").logger
 
-def configure_flask(app):
-    api.app.json_encoder = encoder.JSONEncoder
+def build_app(app):
+    app.json_encoder = encoder.JSONEncoder
     app.config["SQLALCHEMY_DATABASE_URI"] = config.get_database_uri()
     app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
     app.config['ENV'] = "development"
     app.config['FLASK_ENV'] = "development"
     if config.get("debug_flask") == "true":
         app.config['DEBUG'] = True
+    db.init_app(app)
+    ma.init_app(app)
     return app
 
-
 api = connexion.App(__name__, specification_dir='rest/swagger')
 api.add_api('swagger.yaml', arguments={'title': 'AURA Engine API'}, pythonic_params=True)
-app = configure_flask(api.app)
-db = SQLAlchemy(app)
-db.init_app(app)
-ma = Marshmallow(app)
+app = build_app(api.app)
 
 
 def startup():
@@ -67,8 +66,9 @@ with app.app_context():
     """
     Initialize Server.
     """
+    db.create_all()
     service = ApiService(config, logger)
-    logger.info("API Service initialized.")
+    logger.info("API server initialized.")
 
 
 if __name__ == '__main__':
diff --git a/src/models.py b/src/models.py
index 6bb9588..1cf739f 100644
--- a/src/models.py
+++ b/src/models.py
@@ -21,10 +21,11 @@
 import datetime
 
 from sqlalchemy import create_engine, Column, DateTime, String, Integer, Boolean
+from flask_sqlalchemy import SQLAlchemy
+from flask_marshmallow import Marshmallow
 
-from src.server import db, ma
-
-
+db = SQLAlchemy()
+ma = Marshmallow()
 
 
 class PlayLog(db.Model):
@@ -144,7 +145,3 @@ class TrackServiceSchema(ma.SQLAlchemySchema):
             "track_title"
             )
 
-
-
-# Create Tables
-db.create_all()
diff --git a/src/rest/controllers/public_controller.py b/src/rest/controllers/public_controller.py
index b04c95e..104ba1e 100644
--- a/src/rest/controllers/public_controller.py
+++ b/src/rest/controllers/public_controller.py
@@ -15,7 +15,7 @@ def current_track():  # noqa: E501
 
     :rtype: PlayLogEntry
     """
-    from src.server import service
+    from src.app import service
     return service.current_track()
 
 
@@ -31,5 +31,5 @@ def list_tracks(offset=None, limit=None):  # noqa: E501
 
     :rtype: List[PlayLogEntry]
     """
-    from src.server import service
+    from src.app import service
     return service.list_tracks(offset, limit)
\ No newline at end of file
diff --git a/src/service.py b/src/service.py
index bd4b96a..712db26 100644
--- a/src/service.py
+++ b/src/service.py
@@ -19,6 +19,7 @@
 
 import datetime
 
+from models import PlayLog, TrackServiceSchema
 
 
 class ApiService():
@@ -42,7 +43,6 @@ class ApiService():
         Returns:
             (PlayLogEntry)
         """
-        from models import PlayLog, TrackServiceSchema
         track = PlayLog.select_current()
         track_schema = TrackServiceSchema()
         return track_schema.dump(track)
-- 
GitLab