From 6a36b468e53c9859f4246780607ea5a53e66caa7 Mon Sep 17 00:00:00 2001 From: "MH.Dmitrii" Date: Wed, 2 Sep 2026 14:42:48 +0300 Subject: [PATCH] seed for the first user creation --- main.py | 12 +++++++++--- src/database/users/crud.py | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index 19aa7c7..95d74d7 100644 --- a/main.py +++ b/main.py @@ -4,6 +4,7 @@ from pathlib import Path # import uvicorn from fastapi import FastAPI +from src.database.users.crud import Seed from src.logging.logger import LoggingMiddleware, ProcessingTimeMiddleware from src.web.protected_routes.auth_routes import router as protected_router from src.web.protected_routes.protected_user_action_routes import ( @@ -14,8 +15,8 @@ from src.web.protected_routes.protected_user_action_routes import ( @asynccontextmanager async def lifespan(app: FastAPI): create_dirs() + await create_first_user() yield - print("shutting down") app=FastAPI(root_path="/", lifespan=lifespan) @@ -30,7 +31,7 @@ async def root()->dict: return {"root":"hello, this is root"} -def create_dirs(): +def create_dirs()->None: dirs_to_create=("./DB", "./uploads/upload", @@ -39,4 +40,9 @@ def create_dirs(): "./logs") for x in dirs_to_create: - Path(x).mkdir(parents=True, exist_ok=True) \ No newline at end of file + Path(x).mkdir(parents=True, exist_ok=True) + +async def create_first_user()->None: + seed=Seed() + await seed.seed() + \ No newline at end of file diff --git a/src/database/users/crud.py b/src/database/users/crud.py index de6b43a..757e2c8 100644 --- a/src/database/users/crud.py +++ b/src/database/users/crud.py @@ -10,6 +10,7 @@ from src.models.database_models.model import ( engine, ) from src.models.pydantic_models.model import UserOutDB +from src.service.auth.jwt import HashService class UsersCrudActions: @@ -121,4 +122,36 @@ class UsersCrudActions: user_edit.direct_permissions=list(groups) await session.flush() - return UserOutDB.model_validate(user_edit) \ No newline at end of file + return UserOutDB.model_validate(user_edit) + +class Seed: + def __init__(self) -> None: + self.Session=async_sessionmaker(bind=engine) + self.hash_service=HashService() + + async def seed(self) -> None: + async with self.Session() as session, session.begin(): + + existing = (await session.execute(select(User).limit(1))).scalar_one_or_none() + if existing is not None: + print("Seed skipped: one user is already exist") + return + + admin_permission = Permissions(permission="admin") + session.add(admin_permission) + + admin_group = PermissionsGroups(group="admin_group", permissions=[admin_permission]) + session.add(admin_group) + + admin_user = User( + first_name="Admin", + last_name="Admin", + middle_name="Admin", + email="admin@admin.com", + hashed_password=self.hash_service.plain_to_hash("1234"), + direct_permissions=[admin_permission], + group=[admin_group], + ) + session.add(admin_user) + + print("Seed completed: admin user and permissions are created, credentials: email - admin@admin.com, password - 1234") \ No newline at end of file