"""Frontend dependencies.""" from dataclasses import dataclass from collections.abc import AsyncGenerator, Callable, Awaitable from typing import Self from sqlalchemy.orm import Session from sqlalchemy.ext.asyncio import AsyncSession from jinja2_fragments.fastapi import Jinja2Blocks from fastapi import Request from sshecret_admin.core.dependencies import AdminDep, BaseDependencies from sshecret_admin.auth.models import IdentityClaims, LocalUserInfo, User UserTokenDep = Callable[[Request, Session], Awaitable[User]] LoginStatusDep = Callable[[Request], Awaitable[bool]] AsyncSessionDep = Callable[[], AsyncGenerator[AsyncSession, None]] UserInfoDep = Callable[[Request, AsyncSession], Awaitable[LocalUserInfo]] RefreshTokenDep = Callable[[Request], IdentityClaims] LoginGuardDep = Callable[[Request], Awaitable[None]] @dataclass class FrontendDependencies(BaseDependencies): """Frontend dependencies.""" get_admin_backend: AdminDep templates: Jinja2Blocks get_refresh_claims: RefreshTokenDep get_login_status: LoginStatusDep get_user_info: UserInfoDep get_async_session: AsyncSessionDep require_login: LoginGuardDep @classmethod def create( cls, deps: BaseDependencies, get_admin_backend: AdminDep, templates: Jinja2Blocks, get_refresh_claims: RefreshTokenDep, get_login_status: LoginStatusDep, get_user_info: UserInfoDep, get_async_session: AsyncSessionDep, require_login: LoginGuardDep, ) -> Self: """Create from base dependencies.""" return cls( settings=deps.settings, get_db_session=deps.get_db_session, get_admin_backend=get_admin_backend, templates=templates, get_refresh_claims=get_refresh_claims, get_login_status=get_login_status, get_user_info=get_user_info, get_async_session=get_async_session, require_login=require_login, )