diff --git a/configs/test_settings.toml b/configs/test_settings.toml index c907a0c2..ce2365c7 100644 --- a/configs/test_settings.toml +++ b/configs/test_settings.toml @@ -6,3 +6,4 @@ dynaconf_merge = true echo = true url = "postgresql+asyncpg://test:test@localhost:5465/test" max_connection_count = 10 +database_url = "postgresql+asyncpg://test:test@localhost:5465/test" diff --git a/src/business_logic/services/jwt_token.py b/src/business_logic/services/jwt_token.py index 3b3049ea..e335b6fa 100644 --- a/src/business_logic/services/jwt_token.py +++ b/src/business_logic/services/jwt_token.py @@ -2,14 +2,16 @@ import jwt from typing import Any, no_type_check, Optional -from src.config.rsa_keys import RSAKeypair +from src.scripts.rsa_keys.dto import RSAKeypair +from src.dyna_config import settings from src.di import Container logger = logging.getLogger(__name__) - class JWTService: - def __init__(self, keys: RSAKeypair = Container().config().keys) -> None: + # def __init__(self, keys: RSAKeypair = settings.KEYS) -> None: + def __init__(self, keys: RSAKeypair = Container().config().KEYS) -> None: + ##### def __init__(self, keys: RSAKeypair = Container().config().keys) -> None: self.algorithm = "RS256" self.algorithms = ["RS256"] self.keys = keys diff --git a/src/config/__init__.py b/src/config/__init__.py deleted file mode 100644 index 487bba90..00000000 --- a/src/config/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .logging import LogConfig -from .setup import get_app_settings diff --git a/src/config/events.py b/src/config/events.py deleted file mode 100644 index 810d8143..00000000 --- a/src/config/events.py +++ /dev/null @@ -1,23 +0,0 @@ -from typing import Callable - -from fastapi import FastAPI - -from src.config.settings.app import AppSettings -from src.data_access.postgresql.events import connect_to_db, close_db_connection - - -def create_start_app_handler( - app: FastAPI, - settings: AppSettings, -) -> Callable: - async def start_app() -> None: - await connect_to_db(app, settings) - - return start_app - - -def create_stop_app_handler(app: FastAPI) -> Callable: - async def stop_app() -> None: - await close_db_connection(app) - - return stop_app diff --git a/src/config/logging.py b/src/config/logging.py deleted file mode 100644 index c0d1d4de..00000000 --- a/src/config/logging.py +++ /dev/null @@ -1,34 +0,0 @@ -from pydantic import BaseModel -from typing import Any - -class LogConfig(BaseModel): - """Logging configuration to be set for the server""" - - LOGGER_NAME: str = "is_app" - LOG_FORMAT: str = "%(levelprefix)s | %(asctime)s | %(message)s" - LOG_LEVEL: str = "DEBUG" - - # Logging config - version = 1 - disable_existing_loggers = False - formatters = { - "default": { - "()": "uvicorn.logging.DefaultFormatter", - "fmt": LOG_FORMAT, - "datefmt": "%Y-%m-%d %H:%M:%S", - }, - } - handlers = { - "default": { - "formatter": "default", - "class": "logging.StreamHandler", - "stream": "ext://sys.stderr", - }, - } - loggers = { - LOGGER_NAME: {"handlers": ["default"], "level": LOG_LEVEL}, - } - - @property - def to_dict(self) -> Any: - return self.dict() diff --git a/src/config/settings/app.py b/src/config/settings/app.py deleted file mode 100644 index a196ee63..00000000 --- a/src/config/settings/app.py +++ /dev/null @@ -1,45 +0,0 @@ -import logging -from typing import Any, Dict, List, Tuple - -from pydantic import PostgresDsn, SecretStr - -from src.config.rsa_keys import CreateRSAKeypair, RSAKeypair -from src.config.settings.base import BaseAppSettings - - -class AppSettings(BaseAppSettings): - debug: bool = False - docs_url: str = "/docs" - openapi_prefix: str = "/" - openapi_url: str = "/openapi.json" - redoc_url: str = "/redoc" - title: str = "IS POC application" - version: str = "0.1.0" - - database_url: PostgresDsn = ( - "postgresql+asyncpg://postgres:postgres@localhost:5432/is_db" - ) - max_connection_count: int = 10 - - secret_key: SecretStr = "secret" - - allowed_hosts: List[str] = ["*"] - - keys: RSAKeypair = CreateRSAKeypair().execute() - - class Config: - validate_assignment = True - - @property - def fastapi_kwargs(self) -> Dict[str, Any]: - return { - "debug": self.debug, - "docs_url": self.docs_url, - "openapi_prefix": self.openapi_prefix, - "openapi_url": self.openapi_url, - "redoc_url": self.redoc_url, - "title": self.title, - "version": self.version, - "database_url": self.database_url, - "secret_key": self.secret_key, - } diff --git a/src/config/settings/base.py b/src/config/settings/base.py deleted file mode 100644 index 9df7d937..00000000 --- a/src/config/settings/base.py +++ /dev/null @@ -1,17 +0,0 @@ -from enum import Enum - -from pydantic import BaseSettings - - -class AppEnvTypes(Enum): - prod: str = "prod" - dev: str = "dev" - test: str = "test" - docker: str = "docker" - - -class BaseAppSettings(BaseSettings): - app_env: AppEnvTypes = AppEnvTypes.dev - - # class Config: - # env_file = ".env" diff --git a/src/config/settings/cache_time.py b/src/config/settings/cache_time.py deleted file mode 100644 index ef55bd8d..00000000 --- a/src/config/settings/cache_time.py +++ /dev/null @@ -1,14 +0,0 @@ -class CacheTimeSettings: - """Contains time (integer number of seconds OR datetime format) - of expiration of cache for endpoints""" - - # If you've made a mistake - # and wrote too big amaunt of - # time just clean your browser - # history =) - - USERINFO = 30 - USERINFO_JWT = USERINFO - USERINFO_DEFAULT_TOKEN = 3600 - - WELL_KNOWN_OPENID_CONFIG = 10 diff --git a/src/config/settings/development.py b/src/config/settings/development.py deleted file mode 100644 index 04371aed..00000000 --- a/src/config/settings/development.py +++ /dev/null @@ -1,15 +0,0 @@ -import logging -import os - -from src.config.settings.app import AppSettings - - -class DevAppSettings(AppSettings): - debug: bool = True - - title: str = "Dev IS POC application" - - logging_level: int = logging.DEBUG - - class Config(AppSettings.Config): - env_file = os.path.join(os.getcwd(), "envfiles/.env.development") diff --git a/src/config/settings/docker.py b/src/config/settings/docker.py deleted file mode 100644 index 76d75054..00000000 --- a/src/config/settings/docker.py +++ /dev/null @@ -1,15 +0,0 @@ -import logging -import os - -from src.config.settings.app import AppSettings - - -class DockerAppSettings(AppSettings): - debug: bool = True - - title: str = "Docker IS POC application" - - logging_level: int = logging.DEBUG - - class Config(AppSettings.Config): - env_file = os.path.join(os.getcwd(), "envfiles/.env.docker") diff --git a/src/config/settings/production.py b/src/config/settings/production.py deleted file mode 100644 index 56e174c2..00000000 --- a/src/config/settings/production.py +++ /dev/null @@ -1,6 +0,0 @@ -from src.config.settings.app import AppSettings - - -class ProdAppSettings(AppSettings): - class Config(AppSettings.Config): - env_file = "prod.env" diff --git a/src/config/settings/test.py b/src/config/settings/test.py deleted file mode 100644 index af20a481..00000000 --- a/src/config/settings/test.py +++ /dev/null @@ -1,20 +0,0 @@ -import logging -import os -from pydantic import PostgresDsn -from typing import Union -from src.config.settings.app import AppSettings - - -class TestAppSettings(AppSettings): - debug: bool = True - - title: str = "Test IS POC application" - - database_url:PostgresDsn - max_connection_count: int = 5 - min_connection_count: int = 5 - - logging_level: int = logging.DEBUG - - class Config(AppSettings.Config): - env_file = os.path.join(os.getcwd(), "envfiles/.env.test") diff --git a/src/config/setup.py b/src/config/setup.py deleted file mode 100644 index 1dafa15a..00000000 --- a/src/config/setup.py +++ /dev/null @@ -1,25 +0,0 @@ -import os -from functools import lru_cache -from typing import Dict, Type - -from src.config.settings.app import AppSettings -from src.config.settings.base import AppEnvTypes, BaseAppSettings -from src.config.settings.development import DevAppSettings -from src.config.settings.docker import DockerAppSettings -from src.config.settings.production import ProdAppSettings -from src.config.settings.test import TestAppSettings - -environments: Dict[AppEnvTypes, Type[AppSettings]] = { - AppEnvTypes.dev: DevAppSettings, - AppEnvTypes.prod: ProdAppSettings, - AppEnvTypes.test: TestAppSettings, - AppEnvTypes.docker: DockerAppSettings, -} - - -@lru_cache -def get_app_settings() -> AppSettings: - app_env = BaseAppSettings().app_env - - config = environments[app_env] - return config() diff --git a/src/data_access/postgresql/database.py b/src/data_access/postgresql/database.py index 88a9e9a8..2a620d68 100644 --- a/src/data_access/postgresql/database.py +++ b/src/data_access/postgresql/database.py @@ -4,7 +4,6 @@ from sqlalchemy.orm import Session, sessionmaker from sqlalchemy.pool import NullPool from sqlalchemy.ext.asyncio.engine import AsyncEngine -from src.config.settings.app import AppSettings logger = logging.getLogger(__name__) diff --git a/src/data_access/postgresql/events.py b/src/data_access/postgresql/events.py index 9d8ef403..e82e0ea3 100644 --- a/src/data_access/postgresql/events.py +++ b/src/data_access/postgresql/events.py @@ -1,25 +1,27 @@ import logging + + from fastapi import FastAPI from sqlalchemy.ext.asyncio import create_async_engine -from src.config.settings.app import AppSettings +from dynaconf import Dynaconf logger = logging.getLogger(__name__) -async def connect_to_db(app: FastAPI, settings: AppSettings) -> None: +async def connect_to_db(app: FastAPI, settings: Dynaconf) -> None: logger.info('Creating PostgreSQL connection pool.') app.state.pool = create_async_engine( - str(settings.database_url), + str(settings.DATABASE_URL), pool_size=settings.max_connection_count ) logger.info('Connection pool created.') -async def close_db_connection(app: FastAPI, settings: AppSettings) -> None: +async def close_db_connection(app: FastAPI) -> None: logger.info('Closing connection pool.') await app.state.pool.dispose() diff --git a/src/default.toml b/src/default.toml index d331be54..8eab15af 100644 --- a/src/default.toml +++ b/src/default.toml @@ -10,6 +10,7 @@ uri = "" port = 5432 max_connection_count = 10 echo = false +database_url = "postgresql+asyncpg://postgres:postgres@localhost:5432/is_db" [default.redis] @@ -28,4 +29,10 @@ important_logs_filename = "important_identity_server_provider.log" [default.server] base_url_host = "127.0.0.1" base_url_port = "8000" -domain_name = "rnd-identityserver-dev.godeltech.com" \ No newline at end of file +domain_name = "rnd-identityserver-dev.godeltech.com" + +[default.info] +userinfo = 30 +userinfo_default_token = 3600 + +well_known_openid_config = 10 \ No newline at end of file diff --git a/src/di/container.py b/src/di/container.py index 8df7485a..e7f43d87 100644 --- a/src/di/container.py +++ b/src/di/container.py @@ -1,14 +1,17 @@ from dependency_injector import containers, providers -from src.config import get_app_settings +# from src.config import get_app_settings +from src.dyna_config import settings + from src.data_access.postgresql import Database class Container(containers.DeclarativeContainer): - config = providers.Object(get_app_settings()) + # config = providers.Object(get_app_settings()) + config = providers.Object(settings) db = providers.Singleton( Database, - database_url=str(config().database_url), - max_connection_count=config().max_connection_count, + database_url=str(config().db.database_url), + max_connection_count=config().db.max_connection_count, ) diff --git a/src/di/providers/__init__.py b/src/di/providers/__init__.py index 408c34ac..fc4d2bfd 100644 --- a/src/di/providers/__init__.py +++ b/src/di/providers/__init__.py @@ -1,4 +1,4 @@ -from .config import provide_config +# from .config import provide_config from .db import provide_db from .repositories import ( provide_wellknown_repo, diff --git a/src/di/providers/config.py b/src/di/providers/config.py index b7c68f69..435c0e61 100644 --- a/src/di/providers/config.py +++ b/src/di/providers/config.py @@ -1,10 +1,10 @@ -from src.config import get_app_settings -from src.config.settings.base import BaseAppSettings +# from src.config import get_app_settings +# from src.config.settings.base import BaseAppSettings def provide_config_stub() -> None: # pragma: no cover ... -def provide_config() -> BaseAppSettings: - return get_app_settings() +# def provide_config() -> BaseAppSettings: +# return get_app_settings() diff --git a/src/dyna_config.py b/src/dyna_config.py index 0f5d1f8c..465438d8 100644 --- a/src/dyna_config.py +++ b/src/dyna_config.py @@ -1,7 +1,10 @@ +import json import os from dynaconf import Dynaconf +from src.scripts.rsa_keys.create_rsa_keypair import CreateRSAKeypair + APP_DIR = os.path.dirname(os.path.abspath(__file__)) settings = Dynaconf( @@ -12,11 +15,21 @@ env_switcher="identity_server_poc_env", load_dotenv=True, ) +rsa_keypair = CreateRSAKeypair().execute() +settings.set("KEYS", rsa_keypair) +# print(settings.as_dict()) # Display all settings +# print(settings.DATABASE_URL) # Display the DATABASE_URL setting +# print(settings.DB["database_url"]) +# print(settings.default.db.database_url) +print(settings.db.database_url) +# print(settings.db.get("database_url")) DB_URL = settings.db.get("url") DB_MAX_CONNECTION_COUNT = settings.db.get("max_connection_count") # DB_PORT = settings.db.get("port") +# DATABASE_URL = settings.db.get("database_url") + BASE_URL_HOST = settings.server.get("base_url_host") @@ -30,6 +43,12 @@ REDIS_URL = f"{REDIS_SCHEME}{REDIS_HOST}:{REDIS_PORT}" +CACHE_TIME_USERINFO = settings.info.get("userinfo") +CACHE_TIME_USERINFO_JWT = CACHE_TIME_USERINFO +CACHE_TIME_USERINFO_DEFAULT_TOKEN = settings.info.get("userinfo_default_token") + +CACHE_TIME_WELL_KNOWN_OPENID_CONFIG = settings.info.get("well_known_openid_config") + # IS_CLIENT = settings.env_for_dynaconf not in ( # "local", # "development", diff --git a/src/presentation/api/routes/userinfo.py b/src/presentation/api/routes/userinfo.py index e8e22559..dc39447c 100644 --- a/src/presentation/api/routes/userinfo.py +++ b/src/presentation/api/routes/userinfo.py @@ -8,7 +8,8 @@ from src.business_logic.cache.key_builders import builder_with_parametr from src.business_logic.services.jwt_token import JWTService from src.business_logic.services.userinfo import UserInfoServices -from src.config.settings.cache_time import CacheTimeSettings +# from src.config.settings.cache_time import CacheTimeSettings +from src.dyna_config import CACHE_TIME_USERINFO, CACHE_TIME_USERINFO_JWT from src.data_access.postgresql.errors.user import ClaimsNotFoundError from src.di.providers import provide_userinfo_service_stub from src.presentation.api.models.userinfo import ResponseUserInfoModel @@ -20,7 +21,7 @@ @userinfo_router.get("/", response_model=dict) @cache( - expire=CacheTimeSettings.USERINFO, + expire=CACHE_TIME_USERINFO, coder=JsonCoder, # key_builder=builder_with_parametr, ) @@ -54,7 +55,7 @@ async def get_userinfo( @userinfo_router.post("/", response_model=ResponseUserInfoModel) @cache( - expire=CacheTimeSettings.USERINFO, + expire=CACHE_TIME_USERINFO, coder=JsonCoder, key_builder=builder_with_parametr, ) @@ -87,7 +88,7 @@ async def post_userinfo( @userinfo_router.get("/jwt", response_model=str) @cache( - expire=CacheTimeSettings.USERINFO_JWT, + expire=CACHE_TIME_USERINFO_JWT, coder=JsonCoder, key_builder=builder_with_parametr, ) diff --git a/src/presentation/api/routes/well_known.py b/src/presentation/api/routes/well_known.py index f1893267..726059b0 100644 --- a/src/presentation/api/routes/well_known.py +++ b/src/presentation/api/routes/well_known.py @@ -14,7 +14,8 @@ from src.business_logic.cache.key_builders import builder_with_parametr from src.business_logic.services.well_known import WellKnownServices -from src.config.settings.cache_time import CacheTimeSettings +# from src.config.settings.cache_time import CacheTimeSettings +from src.dyna_config import CACHE_TIME_WELL_KNOWN_OPENID_CONFIG from src.presentation.api.models.well_known import ( ResponseJWKS, ResponseOpenIdConfiguration, @@ -27,7 +28,7 @@ @well_known_router.get("/openid-configuration", response_model=ResponseOpenIdConfiguration) -@cache(expire=CacheTimeSettings.WELL_KNOWN_OPENID_CONFIG) +@cache(expire=CACHE_TIME_WELL_KNOWN_OPENID_CONFIG) async def get_openid_configuration( request: Request, well_known_info_class: WellKnownServices = Depends( diff --git a/src/config/settings/__init__.py b/src/scripts/__init__.py similarity index 100% rename from src/config/settings/__init__.py rename to src/scripts/__init__.py diff --git a/src/config/rsa_keys/__init__.py b/src/scripts/rsa_keys/__init__.py similarity index 100% rename from src/config/rsa_keys/__init__.py rename to src/scripts/rsa_keys/__init__.py diff --git a/src/config/rsa_keys/create_rsa_keypair.py b/src/scripts/rsa_keys/create_rsa_keypair.py similarity index 97% rename from src/config/rsa_keys/create_rsa_keypair.py rename to src/scripts/rsa_keys/create_rsa_keypair.py index 1a0b2df5..0975d226 100644 --- a/src/config/rsa_keys/create_rsa_keypair.py +++ b/src/scripts/rsa_keys/create_rsa_keypair.py @@ -18,4 +18,4 @@ def execute(self) -> RSAKeypair: public_key=public_key, n=key.n, e=key.e, - ) + ) \ No newline at end of file diff --git a/src/config/rsa_keys/dto.py b/src/scripts/rsa_keys/dto.py similarity index 100% rename from src/config/rsa_keys/dto.py rename to src/scripts/rsa_keys/dto.py