from functools import lru_cache from app.common.repository.admin_user_repository import AdminUserRepository from app.core.config import Settings, get_settings from app.core.database import Database from app.lib.jwt.blacklist import InMemoryTokenBlacklist from app.lib.jwt.factory import JwtFactory from app.lib.response.admin_return import AdminReturn from app.service.admin.login.login_service import LoginService from app.service.admin.login.refresh_service import RefreshService from app.service.admin.profile.current_user_service import CurrentUserService from app.service.base_token_service import BaseTokenService # lru_cache 会缓存函数第一次创建出来的对象。 # 这里用它把 Database、JwtFactory、TokenService 等依赖做成应用级单例, # 类似 Hyperf 从容器里反复 get 同一个共享服务。 @lru_cache def get_database() -> Database: return Database(get_settings().database_path) @lru_cache def get_token_blacklist() -> InMemoryTokenBlacklist: return InMemoryTokenBlacklist() @lru_cache def get_jwt_factory() -> JwtFactory: return JwtFactory(get_settings(), get_token_blacklist()) @lru_cache def get_token_service() -> BaseTokenService: return BaseTokenService(get_jwt_factory()) @lru_cache def get_admin_return() -> AdminReturn: return AdminReturn() @lru_cache def get_admin_user_repository() -> AdminUserRepository: return AdminUserRepository(get_database()) def get_login_service() -> LoginService: return LoginService( get_admin_user_repository(), get_token_service(), get_admin_return(), ) def get_refresh_service() -> RefreshService: return RefreshService(get_token_service(), get_admin_return()) def get_current_user_service() -> CurrentUserService: return CurrentUserService(get_admin_user_repository(), get_admin_return()) async def bootstrap_database(settings: Settings | None = None) -> None: settings = settings or get_settings() await get_database().initialize() await get_admin_user_repository().ensure_seed_admin( settings.admin_seed_username, settings.admin_seed_password, )