/
pavlovado
/
testingSubsystem
Обзор
Документация
Войти
/
pavlovado
/
testingSubsystem
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
mockpatch/server.py
105 строк
5 KB
pavlovado
final
25 май 2025, 18:04
25 май 2025, 18:04
e2e1bf8
Код
Авторство
О чём код?
# Клиентская часть для работы с MongoDB с использованием асинхронного драйвера Motor from motor.motor_asyncio import AsyncIOMotorClient # Импорт моделей данных и вспомогательных библиотек from mockpatch.models import ConductedSurvey from bson import Binary from uuid import UUID, uuid4 from datetime import datetime from pytz import timezone # Импорт компонентов FastAPI from fastapi import FastAPI, HTTPException from fastapi.staticfiles import StaticFiles from fastapi.responses import RedirectResponse # Работа с переменными окружения import os from dotenv import load_dotenv load_dotenv() # Загрузка конфигурационных параметров из .env файла MONGO_URL = os.getenv("MONGO_URL") # URL MongoDB сервера MONGO_DB_NAME = os.getenv("MONGO_DB_NAME") # Название базы данных MONGO_COLLECTION_SURVEY = os.getenv("MONGO_COLLECTION_SURVEY") # Коллекция для опросов MONGO_COLLECTION_CONDUCT = os.getenv("MONGO_COLLECTION_CONDUCT") # Коллекция для проведенных опросов MONGO_COLLECTION_RESPONDENTS = os.getenv("MONGO_COLLECTION_RESPONDENTS") # Коллекция респондентов MONGO_USER = os.getenv("MONGO_USER") # Пользователь БД MONGO_PASS = os.getenv("MONGO_PASS") # Пароль пользователя # Формирование строки подключения с аутентификацией MOCLINENT = f"mongodb://{MONGO_USER}:{MONGO_PASS}@{MONGO_URL}/" # Инициализация FastAPI приложения application = FastAPI() # Монтирование статической директории для обслуживания фронтенда application.mount( "/static", StaticFiles(directory="static"), name="static" ) # Перенаправление на главную страницу фронтенда @application.get("/", response_class=RedirectResponse) async def root(): return "/static/index.html" # Инициализация подключения к MongoDB client = AsyncIOMotorClient(MOCLINENT, uuidRepresentation="standard") # Использование стандартного UUID surveyDb = client[f"{MONGO_DB_NAME}"] # Выбор базы данных surveysCollection = surveyDb[f"{MONGO_COLLECTION_SURVEY}"] # Коллекция опросов conductedSurveysCollection = surveyDb[f"{MONGO_COLLECTION_CONDUCT}"] # Коллекция проведенных опросов respondentsCollection = surveyDb[f"{MONGO_COLLECTION_RESPONDENTS}"] # Коллекция респондентов # Закрытие соединения с БД при завершении работы приложения @application.on_event("shutdown") async def shutdown_db_client(): client.close() # Эндпоинт для добавления результатов опроса @application.post("/api/2.0/addConductedSurvey/") async def add_conducted_survey(survey: ConductedSurvey): # Преобразование модели в словарь и добавление временной метки doc = survey.model_dump(exclude_none=True) doc["conducted_date"] = datetime.utcnow() # UTC время для единообразия # Составной ключ для поиска существующей записи filter_query = { "survey_uuid": survey.survey_uuid, "respondent_id": survey.respondent_id } # Операция обновления с созданием новой записи при отсутствии update = {"$set": doc} result = await conductedSurveysCollection.update_one( filter_query, update, upsert=True ) # Обработка результатов операции if result.upserted_id: return {"message": "Ответ создан", "id": str(result.upserted_id)} elif result.modified_count > 0: return {"message": "Ответ обновлен"} else: raise HTTPException(status_code=404, detail="Документ не найден") # Получение опроса по UUID @application.get("/api/2.0/survey/{subject}") async def get_survey(subject: UUID): try: # Поиск опроса с преобразованием UUID в бинарный формат survey = await surveysCollection.find_one({ "survey_uuid": Binary.from_uuid(subject) }) if survey is None: raise HTTPException(status_code=404, detail="Нет такого опросника!") # Преобразование ObjectId в строку для сериализации survey["_id"] = str(survey["_id"]) return survey except Exception as e: raise HTTPException(status_code=400, detail=str(e))