106 lines
3.6 KiB
Python
106 lines
3.6 KiB
Python
"""
|
||
FastAPI приложение для взаимодействия с Telegram ботом
|
||
"""
|
||
|
||
from fastapi import FastAPI, Depends, HTTPException, status
|
||
from fastapi.middleware.cors import CORSMiddleware
|
||
from sqlalchemy.orm import Session
|
||
from contextlib import asynccontextmanager
|
||
import logging
|
||
import sys
|
||
import os
|
||
|
||
# Добавляем путь к текущей директории
|
||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||
|
||
from database.database import db, get_db_session, init_database, test_db_connection
|
||
from database.models import User, Message, BotSettings
|
||
from routers import (
|
||
users_router, messages_router, settings_router,
|
||
test_categories_router, tests_router, questions_router,
|
||
answer_options_router, images_router
|
||
)
|
||
from schemas import HealthCheckResponse, RootResponse
|
||
from config import config
|
||
|
||
# Настройка логирования
|
||
logging.basicConfig(level=logging.INFO)
|
||
logger = logging.getLogger(__name__)
|
||
|
||
@asynccontextmanager
|
||
async def lifespan(app: FastAPI):
|
||
"""Управление жизненным циклом приложения"""
|
||
# Инициализация при запуске
|
||
logger.info("Запуск FastAPI приложения...")
|
||
|
||
# Проверка подключения к БД
|
||
if not test_db_connection():
|
||
logger.error("Не удалось подключиться к базе данных!")
|
||
raise Exception("Database connection failed")
|
||
|
||
# Создание таблиц если они не существуют
|
||
try:
|
||
init_database()
|
||
logger.info("База данных инициализирована")
|
||
except Exception as e:
|
||
logger.error(f"Ошибка инициализации базы данных: {e}")
|
||
raise
|
||
|
||
yield
|
||
|
||
# Очистка при завершении
|
||
logger.info("Завершение работы FastAPI приложения...")
|
||
db.close()
|
||
|
||
# Создание FastAPI приложения
|
||
app = FastAPI(
|
||
title=config.TITLE,
|
||
description=config.DESCRIPTION,
|
||
version=config.VERSION,
|
||
lifespan=lifespan
|
||
)
|
||
|
||
# Настройка CORS
|
||
app.add_middleware(
|
||
CORSMiddleware,
|
||
allow_origins=config.CORS_ORIGINS,
|
||
allow_credentials=config.CORS_CREDENTIALS,
|
||
allow_methods=config.CORS_METHODS,
|
||
allow_headers=config.CORS_HEADERS,
|
||
)
|
||
|
||
# Подключение роутеров
|
||
app.include_router(users_router, prefix=config.API_V1_PREFIX)
|
||
app.include_router(messages_router, prefix=config.API_V1_PREFIX)
|
||
app.include_router(settings_router, prefix=config.API_V1_PREFIX)
|
||
|
||
# Подключение роутеров для системы тестирования
|
||
app.include_router(test_categories_router, prefix=config.API_V1_PREFIX)
|
||
app.include_router(tests_router, prefix=config.API_V1_PREFIX)
|
||
app.include_router(questions_router, prefix=config.API_V1_PREFIX)
|
||
app.include_router(answer_options_router, prefix=config.API_V1_PREFIX)
|
||
app.include_router(images_router, prefix=config.API_V1_PREFIX)
|
||
|
||
@app.get("/", response_model=RootResponse)
|
||
async def root():
|
||
"""Корневой эндпоинт"""
|
||
return RootResponse(
|
||
message=config.TITLE,
|
||
version=config.VERSION,
|
||
status="running"
|
||
)
|
||
|
||
@app.get("/health", response_model=HealthCheckResponse)
|
||
async def health_check():
|
||
"""Проверка состояния приложения"""
|
||
db_status = test_db_connection()
|
||
return HealthCheckResponse(
|
||
status="healthy" if db_status else "unhealthy",
|
||
database="connected" if db_status else "disconnected"
|
||
)
|
||
|
||
|
||
|
||
if __name__ == "__main__":
|
||
import uvicorn
|
||
uvicorn.run("main:app", host=config.HOST, port=config.PORT, reload=config.RELOAD) |