add getting company

This commit is contained in:
2024-04-10 00:33:31 +03:00
parent 361378929f
commit 0e2ecd3449
21 changed files with 142 additions and 83 deletions

View File

@@ -0,0 +1,3 @@
from .main import app_factory
__all__ = ("app_factory",)

View File

@@ -0,0 +1,64 @@
from fastapi import FastAPI
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker
from api.application.abstractions.uow import UnitOfWork
from api.application.protocols.date_time import DateTimeProvider
from api.application.protocols.jwt import JwtTokenProcessor
from api.application.protocols.password_hasher import PasswordHasher
from api.application.usecase.auth.auth_user import LoginUser
from api.application.usecase.auth.create_user import CreateUser
from api.application.usecase.company.get_users_company import GetCompaniesByOwnerEmail
from api.domain.company.repository import CompanyRepository
from api.domain.user.repository import UserRepository
from api.infrastructure.auth.jwt_settings import JwtSettings
from api.infrastructure.dependencies.adapters import (
create_engine,
create_session_maker,
new_session,
new_unit_of_work,
)
from api.infrastructure.dependencies.configs import (
app_settings,
get_db_settings,
get_jwt_settings,
)
from api.infrastructure.dependencies.protocols import (
get_date_time_provider,
get_jwt_token_processor,
get_password_hasher,
get_user_login,
)
from api.infrastructure.dependencies.repositories import (
get_company_repository,
get_user_repository,
)
from api.infrastructure.dependencies.usecases import (
provide_create_user,
provide_get_companies_by_email,
)
from api.infrastructure.persistence.db_setings import DBSettings
from api.infrastructure.settings import Settings
def init_dependencies(app: FastAPI) -> None:
app.dependency_overrides[DBSettings] = get_db_settings
app.dependency_overrides[JwtSettings] = get_jwt_settings
app.dependency_overrides[Settings] = app_settings
app.dependency_overrides[AsyncEngine] = create_engine
app.dependency_overrides[async_sessionmaker[AsyncSession]] = create_session_maker
app.dependency_overrides[AsyncSession] = new_session
app.dependency_overrides[UnitOfWork] = new_unit_of_work
app.dependency_overrides[DateTimeProvider] = get_date_time_provider
app.dependency_overrides[PasswordHasher] = get_password_hasher
app.dependency_overrides[JwtTokenProcessor] = get_jwt_token_processor
app.dependency_overrides[LoginUser] = get_user_login
app.dependency_overrides[UserRepository] = get_user_repository
app.dependency_overrides[CompanyRepository] = get_company_repository
app.dependency_overrides[CreateUser] = provide_create_user
app.dependency_overrides[GetCompaniesByOwnerEmail] = provide_get_companies_by_email

View File

@@ -0,0 +1,41 @@
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
from api.domain.error import DomainValidationError
from api.domain.user.error import (
UserAlreadyExistsError,
UserInvalidCredentialsError,
UserIsNotAuthorizedError,
)
async def validation_error_exc_handler(request: Request, exc: DomainValidationError) -> JSONResponse:
return JSONResponse(status_code=400, content={"detail": exc.message})
async def user_authentication_error_exc_handler(request: Request, exc: UserIsNotAuthorizedError) -> JSONResponse:
return JSONResponse(
status_code=401,
content={"detail": exc.message},
headers={"WWW-Authenticate": "Bearer"},
)
async def user_already_exist_error_exc_handler(request: Request, exc: UserAlreadyExistsError) -> JSONResponse:
return JSONResponse(status_code=409, content={"detail": exc.message})
async def user_invalid_credentials_error_exc_handler(
request: Request, exc: UserInvalidCredentialsError
) -> JSONResponse:
return JSONResponse(status_code=401, content={"detail": exc.message})
def init_exc_handlers(app: FastAPI) -> None:
app.add_exception_handler(
DomainValidationError,
validation_error_exc_handler,
)
app.add_exception_handler(UserIsNotAuthorizedError, user_authentication_error_exc_handler)
app.add_exception_handler(UserAlreadyExistsError, user_already_exist_error_exc_handler)
app.add_exception_handler(UserInvalidCredentialsError, user_invalid_credentials_error_exc_handler)

View File

@@ -0,0 +1,50 @@
from collections.abc import AsyncGenerator
from contextlib import asynccontextmanager
from fastapi import FastAPI
from sqlalchemy.ext.asyncio import AsyncEngine
from api.app_entrypoint.dependencies import init_dependencies
from api.app_entrypoint.error_handlers import init_exc_handlers
from api.infrastructure.auth.jwt_settings import JwtSettings
from api.infrastructure.dependencies.adapters import create_engine
from api.infrastructure.dependencies.configs import (
app_settings,
get_db_settings,
get_jwt_settings,
)
from api.infrastructure.persistence.db_setings import DBSettings
from api.infrastructure.persistence.models import Base
from api.infrastructure.settings import Settings
from .routers import init_routers
@asynccontextmanager
async def lifespan(app: FastAPI) -> AsyncGenerator:
app.dependency_overrides[DBSettings] = get_db_settings
app.dependency_overrides[JwtSettings] = get_jwt_settings
app.dependency_overrides[Settings] = app_settings
app.dependency_overrides[AsyncEngine] = create_engine
engine = app.dependency_overrides[AsyncEngine](
app.dependency_overrides[Settings](
app.dependency_overrides[DBSettings](),
app.dependency_overrides[JwtSettings](),
),
)
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.drop_all)
await conn.run_sync(Base.metadata.create_all)
yield
def app_factory() -> FastAPI:
app = FastAPI(
lifespan=lifespan,
)
init_dependencies(app)
init_routers(app)
init_exc_handlers(app)
return app

View File

@@ -0,0 +1,15 @@
from fastapi import FastAPI
from api.presentation.routers import (
auth_router,
company_router,
healthcheck_router,
user_router,
)
def init_routers(app: FastAPI) -> None:
app.include_router(user_router)
app.include_router(auth_router)
app.include_router(company_router)
app.include_router(healthcheck_router)