From 683cd9a5450ff3e910a3b54ba6132d06aa12b23b Mon Sep 17 00:00:00 2001 From: ahtlon Date: Wed, 29 Jul 2026 01:24:22 +0200 Subject: [PATCH] [main.py] move settings stuff into its own import also correct imports to use app namespace --- app/.env.example | 4 +++- app/controllers/aaManager.py | 6 +++--- app/main.py | 33 ++++++++++++++------------------- app/services/auth.py | 7 ++----- app/services/database.py | 22 +++++++++++++++------- app/services/settings.py | 26 ++++++++++++++++++++++++++ 6 files changed, 63 insertions(+), 35 deletions(-) create mode 100644 app/services/settings.py diff --git a/app/.env.example b/app/.env.example index aa53ed9..30afee3 100644 --- a/app/.env.example +++ b/app/.env.example @@ -6,4 +6,6 @@ MIFARE_ACL_WRITE_BASE_KEY="f1aa99f81cca268de98d422ee0ccb65c" # 16 bytes AES key SECRET_KEY="8b14d0b447bff7efa24d5019cc59a999786e31f6f865173bbd642bf18de5ad85" #Key for oauth -#THESE ARE TESTING KEYS - DO NOT USE IN PROD \ No newline at end of file +#THESE ARE TESTING KEYS - DO NOT USE IN PROD + +SQLALCHEMY_DATABASE_URL="sqlite:///./gatekeeper.db" diff --git a/app/controllers/aaManager.py b/app/controllers/aaManager.py index e256051..2fa2e8c 100644 --- a/app/controllers/aaManager.py +++ b/app/controllers/aaManager.py @@ -5,9 +5,9 @@ from sqlmodel import Session, select from sqlalchemy.orm import selectinload from typing import List -from ..model.models import * -from ..services.database import engine, get_session, add_and_refresh -from ..services.auth import auth_is_admin +from app.model.models import * +from app.services.database import engine, get_session, add_and_refresh +from app.services.auth import auth_is_admin import uuid as gen_uuid aa_router = APIRouter(prefix="/api/v1/aa", tags=["AccessAuth"]) diff --git a/app/main.py b/app/main.py index 0453899..691e532 100644 --- a/app/main.py +++ b/app/main.py @@ -5,37 +5,32 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.security import OAuth2PasswordBearer from contextlib import asynccontextmanager -from dotenv import load_dotenv -from .controllers import userManager, cardManager, groupManager, aaManager, doorManager, debugManager -from .services.database import create_db_and_tables, get_db_session -from .services.auth import token_router, create_first_user +from dotenv import load_dotenv +load_dotenv() + +from app.controllers import userManager, cardManager, groupManager, aaManager, doorManager, debugManager +from app.services.database import create_db_and_tables, get_db_session +from app.services.auth import token_router, create_first_user +from app.services.settings import verify_settings from app.services.scanner import BackgroundScanner oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") scanner = BackgroundScanner(db=get_db_session()) logging.basicConfig(level=logging.INFO) -def checkDeps(): - load_dotenv() - MIFARE_APP_MASTER_KEY = os.getenv('MIFARE_APP_MASTER_KEY') - if not MIFARE_APP_MASTER_KEY: - logger.critical(f"MIFARE APP MASTER KEY not found!") - logger.critical("Writing and reading cards is disabled!") - - @asynccontextmanager async def lifespan(app: FastAPI): - logger.critical("-"*63) - logger.critical("---- Documentation is at http://127.0.0.1:8000/api/v1/docs ----") - logger.critical("-"*63) - checkDeps() + verify_settings() create_db_and_tables() create_first_user(db=get_db_session()) - logger.info("Database created and tables initialized.") - disableCards = os.getenv("DISABLE_CARDS") - if not disableCards: + + if not os.getenv("DISABLE_CARDS"): scanner.start() + + logger.info("-"*63) + logger.info("---- Documentation is at http://127.0.0.1:8000/api/v1/docs ----") + logger.info("-"*63) yield #scanner.stop() diff --git a/app/services/auth.py b/app/services/auth.py index 84e2924..55e9590 100644 --- a/app/services/auth.py +++ b/app/services/auth.py @@ -8,13 +8,10 @@ from sqlmodel import Session, select from pwdlib import PasswordHash import jwt from jwt.exceptions import InvalidTokenError -from ..model.models import UserDB, Token, TokenData, UserCreate -from ..services.database import * +from app.model.models import UserDB, Token, TokenData, UserCreate +from app.services.database import * import secrets, string, os -from dotenv import load_dotenv - -load_dotenv() SECRET_KEY = os.getenv("SECRET_KEY", default="ff"*16) ALGORITHM = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES = 120 diff --git a/app/services/database.py b/app/services/database.py index 513a55c..1f065cd 100644 --- a/app/services/database.py +++ b/app/services/database.py @@ -1,17 +1,25 @@ +import logging +logger = logging.getLogger(__name__) +from os import getenv, path from sqlmodel import create_engine, SQLModel, Session -from ..model.models import Base +from app.model.models import Base -SQLALCHEMY_DATABASE_URL = "sqlite:///./gatekeeper.db" +SQLALCHEMY_DATABASE_URL = getenv("SQLALCHEMY_DATABASE_URL", "sqlite:///./gatekeeper.db") engine = create_engine(SQLALCHEMY_DATABASE_URL) def create_db_and_tables(): - SQLModel.metadata.create_all(engine) - from alembic.config import Config - from alembic import command - alembic_cfg = Config("./alembic.ini") - command.stamp(alembic_cfg, "head") + if not path.exists(SQLALCHEMY_DATABASE_URL): + SQLModel.metadata.create_all(engine) + from alembic.config import Config + from alembic import command + alembic_cfg = Config("./alembic.ini") + command.stamp(alembic_cfg, "head") + logger.info("Database created and tables initialized.") + else: + logger.info("Database already exists") + def get_session(): with Session(engine) as db: diff --git a/app/services/settings.py b/app/services/settings.py new file mode 100644 index 0000000..a60d589 --- /dev/null +++ b/app/services/settings.py @@ -0,0 +1,26 @@ +import os +import logging +logger = logging.getLogger(__name__) + +def verify_settings(): + card_envs = [ + "MIFARE_APP_MASTER_KEY", + "MIFARE_ACL_READ_BASE_KEY", + "MIFARE_ACL_WRITE_BASE_KEY", + ] + important_envs = [ + "SECRET_KEY" + ] + other_envs = [ + "SQLALCHEMY_DATABASE_URL" + ] + for setting in card_envs: + if (setting not in os.environ or setting == "") and not os.getenv("DISABLE_CARDS"): + raise ValueError(f"Missing environment variable for scanner start: {setting} \n Run with DISABLE_CARDS env var to disable cards") + for setting in important_envs: + if setting not in os.environ or setting == "": + raise ValueError(f'Missing critical environment variable {setting}. Stopping...') + for setting in other_envs: + if setting not in os.environ: + logger.critical(f'Env var {setting} not set. Continuing with defaults.') +