60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
"""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,
|
|
)
|