From 8be7a97c79d04ca4d3a3676345432f582f6a5124 Mon Sep 17 00:00:00 2001
From: Pierre Chanial <pierre.chanial@ego-gw.it>
Date: Thu, 22 Jul 2021 23:49:03 +0200
Subject: [PATCH] Refactoring: split db directory into dbadmin and dbprojects.

---
 app/apis/v0/projects.py                     |  2 +-
 app/apis/v0/users.py                        |  2 +-
 app/db/__init__.py                          | 10 ++++------
 app/db/dbadmin/__init__.py                  | 10 ++++++++++
 app/db/{ => dbadmin}/models.py              |  0
 app/db/dbadmin/sessions.py                  | 13 +++++++++++++
 app/db/dbprojects/__init__.py               |  1 +
 app/db/{access.py => dbprojects/engines.py} | 14 ++------------
 migrations/env.py                           |  2 +-
 scripts/initialize_dbadmin.py               |  3 ++-
 scripts/wait_for_initialized_dbadmin.py     |  3 ++-
 tests/conftest.py                           |  2 +-
 12 files changed, 38 insertions(+), 24 deletions(-)
 create mode 100644 app/db/dbadmin/__init__.py
 rename app/db/{ => dbadmin}/models.py (100%)
 create mode 100644 app/db/dbadmin/sessions.py
 create mode 100644 app/db/dbprojects/__init__.py
 rename app/db/{access.py => dbprojects/engines.py} (76%)

diff --git a/app/apis/v0/projects.py b/app/apis/v0/projects.py
index 0f9c06f..18c7e40 100644
--- a/app/apis/v0/projects.py
+++ b/app/apis/v0/projects.py
@@ -8,7 +8,7 @@ from sqlalchemy.exc import DBAPIError
 from sqlalchemy.future import select
 from sqlalchemy.orm import Session
 
-from ...db import DBProject, DBProjectServer
+from ...db.dbadmin import DBProject, DBProjectServer
 from ...helpers import fix_sqlalchemy2_stubs_non_nullable_column
 from ...schemas import Project
 from ..depends import get_session, get_session_as_you_go
diff --git a/app/apis/v0/users.py b/app/apis/v0/users.py
index 699e5d6..47565fc 100644
--- a/app/apis/v0/users.py
+++ b/app/apis/v0/users.py
@@ -4,7 +4,7 @@ import logging
 from fastapi import APIRouter, Depends
 from sqlalchemy.orm import Session
 
-from ...db import DBUser
+from ...db.dbadmin import DBUser
 from ...schemas import User
 from ..depends import get_session
 
diff --git a/app/db/__init__.py b/app/db/__init__.py
index ea5ed65..7a905a0 100644
--- a/app/db/__init__.py
+++ b/app/db/__init__.py
@@ -1,11 +1,9 @@
-"""The ESAP-DB module handling the admin database."""
-from .access import AdminSession, project_engines
-from .models import DBProject, DBProjectServer, DBUser
+"""Accessors to the admin or project databases."""
+
+from .dbadmin import AdminSession
+from .dbprojects.engines import project_engines
 
 __all__ = (
     'AdminSession',
-    'DBProject',
-    'DBProjectServer',
-    'DBUser',
     'project_engines',
 )
diff --git a/app/db/dbadmin/__init__.py b/app/db/dbadmin/__init__.py
new file mode 100644
index 0000000..03790d3
--- /dev/null
+++ b/app/db/dbadmin/__init__.py
@@ -0,0 +1,10 @@
+"""The ESAP-DB module handling the admin database."""
+from .models import DBProject, DBProjectServer, DBUser
+from .sessions import AdminSession
+
+__all__ = (
+    'AdminSession',
+    'DBProject',
+    'DBProjectServer',
+    'DBUser',
+)
diff --git a/app/db/models.py b/app/db/dbadmin/models.py
similarity index 100%
rename from app/db/models.py
rename to app/db/dbadmin/models.py
diff --git a/app/db/dbadmin/sessions.py b/app/db/dbadmin/sessions.py
new file mode 100644
index 0000000..539239d
--- /dev/null
+++ b/app/db/dbadmin/sessions.py
@@ -0,0 +1,13 @@
+"""This module provides factories to access the admin and project databases.
+
+An instance of this class can be used to connect the admin or a project database.
+"""
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+
+from ...config import settings
+
+assert settings.SQLALCHEMY_DBADMIN_URI is not None
+
+engine = create_engine(settings.SQLALCHEMY_DBADMIN_URI, pool_pre_ping=True, future=True)
+AdminSession = sessionmaker(autocommit=False, autoflush=False, bind=engine, future=True)
diff --git a/app/db/dbprojects/__init__.py b/app/db/dbprojects/__init__.py
new file mode 100644
index 0000000..9f54156
--- /dev/null
+++ b/app/db/dbprojects/__init__.py
@@ -0,0 +1 @@
+"""The ESAP-DB module handling the project databases."""
diff --git a/app/db/access.py b/app/db/dbprojects/engines.py
similarity index 76%
rename from app/db/access.py
rename to app/db/dbprojects/engines.py
index a0a6365..ab12e2a 100644
--- a/app/db/access.py
+++ b/app/db/dbprojects/engines.py
@@ -1,7 +1,4 @@
-"""This module provides factories to access the admin and project databases.
-
-An instance of this class can be used to connect the admin or a project database.
-"""
+"""Factory for the SQLAlchemy engines of the projects, with a caching mechanism."""
 import collections
 from typing import Iterator
 
@@ -9,15 +6,8 @@ from fastapi import HTTPException, status
 from sqlalchemy import create_engine
 from sqlalchemy.engine import Engine
 from sqlalchemy.future import select
-from sqlalchemy.orm import sessionmaker
-
-from ..config import settings
-from .models import DBProject
-
-assert settings.SQLALCHEMY_DBADMIN_URI is not None
 
-engine = create_engine(settings.SQLALCHEMY_DBADMIN_URI, pool_pre_ping=True, future=True)
-AdminSession = sessionmaker(autocommit=False, autoflush=False, bind=engine, future=True)
+from ..dbadmin import AdminSession, DBProject
 
 
 class ProjectEngines(collections.abc.Mapping):
diff --git a/migrations/env.py b/migrations/env.py
index 4f00b45..416072a 100644
--- a/migrations/env.py
+++ b/migrations/env.py
@@ -13,7 +13,7 @@ from sqlalchemy import engine_from_config, pool
 # from myapp import mymodel
 # target_metadata = mymodel.Base.metadata
 from app.config import settings
-from app.db import models
+from app.db.dbadmin import models
 
 BASE_DIR = Path(__file__).parents[1].absolute()
 load_dotenv(BASE_DIR / '.env')
diff --git a/scripts/initialize_dbadmin.py b/scripts/initialize_dbadmin.py
index ff3b72b..e9272b4 100644
--- a/scripts/initialize_dbadmin.py
+++ b/scripts/initialize_dbadmin.py
@@ -4,7 +4,8 @@ import logging
 from sqlalchemy.exc import IntegrityError
 
 from app.config import settings
-from app.db import AdminSession, DBProjectServer
+from app.db import AdminSession
+from app.db.dbadmin import DBProjectServer
 
 logging.basicConfig(level=logging.INFO)
 logger = logging.getLogger(__name__)
diff --git a/scripts/wait_for_initialized_dbadmin.py b/scripts/wait_for_initialized_dbadmin.py
index 74171ca..9d0a948 100644
--- a/scripts/wait_for_initialized_dbadmin.py
+++ b/scripts/wait_for_initialized_dbadmin.py
@@ -4,7 +4,8 @@ import logging
 from sqlalchemy import select
 from tenacity import after_log, before_log, retry, stop_after_attempt, wait_fixed
 
-from app.db import AdminSession, DBProjectServer
+from app.db import AdminSession
+from app.db.dbadmin import DBProjectServer
 
 logging.basicConfig(level=logging.INFO)
 logger = logging.getLogger(__name__)
diff --git a/tests/conftest.py b/tests/conftest.py
index 543d4f8..3ff499e 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -3,7 +3,7 @@ from typing import Generator
 import pytest
 from sqlalchemy.orm import Session
 
-from app.db.access import AdminSession
+from app.db import AdminSession
 
 
 @pytest.fixture(scope='session')
-- 
GitLab