618B / CleannetCodeBot

0 stars 0 forks source link

Реализовать логику получения списка вопросов из гитхаб #16

Open pingvin1308 opened 11 months ago

pingvin1308 commented 11 months ago

Вопросы будут храниться в директории quiz на гитхаб сервере.

формат вопросов будет таким:

{
  "title": "first quiz",
  "questions": [
    {
      "text": "text question",
      "options": ["option 1", "option tsetse", "option 3", "option 4"],
      "answer": 0
    },
    {
      "text": "text question",
      "options": ["option 1", "option tsetse", "option 3", "option 4"],
      "answer": 2
    }
  ]
}

Логику получения можно реализовать один из двух путей: 1) pull based - сделать сервис, который будет раз в сутки обращаться в репозиторий и проверять не поменялись ли вопросы. 2) push based - сделать сервис/апи точка, которая будет триггериться на обновления файлов в директории quiz. Такой вариант обработки можно сделать за счет webhook-ов

618B commented 11 months ago

Снимок экрана_2023-11-20_20-57-16

618B commented 11 months ago

Раз в X часов BackgroundService выполняет:

Downloader.UpdateRepository(); List = DirectoryScaner.Files();

QuizFilesSynchronizer.Synchronize(List data);

===============================================

QuizFilesSynchronizer.Synchronize(List data):

List currentQuizsList = DataBase.GetCurrentQuizList();

List updatedQuizsList = currentQuizsList.WherePathExistsButHashChanged(data); List deletedQuizsList = currentQuizsList.WherePathDoesNotExists(data); List createdQuizsList = data.WherePathDoesNotExists(currentQuizsList);

updatedQuizsList.Select(QuizService.UpdateQuiz); deletedQuizsList.Select(QuizService.DeleteQuiz); List createdQuizsId = createdQuizsList.Select(QuizService.CreateQuiz);

UpdateQuizFileMatchHashesAndId();

DataBase.SaveChanges();

===============================================

618B commented 11 months ago

Обновлять(Удалять, Загружать) вопросы темы

Варианты:

Использовать индекс в списке как id вопроса

Проблема: Сложно удалить конкретный вопрос (Нужно хранить мета данные) Добавлять новые вопросы необходимо в конец списка


После внесения изменений в вопросы - подтянуть файл и проставить в нем id (Синхронизировать с базой)

Проблема: На время синхронизации вопрсоов с базой необходимо блокировать внесение изменений в репозиторий


Использовать как id текст вопроса

Проблема: При редактировании появится новый вопрос.   (Например, если используется какой-то трекер   отвеченных вопросов на пользователя)


Добавить id в схему и присваивать его сразу при создаении вопроса

Проблема: Необходимо генерировать id при создании вопроса в ручную

618B commented 11 months ago

Способ получать файлы из github

Варианты:

Качать в виде архива

Минусы: Каждый раз репозиторий загружается целиком


Использовать git pull

Минусы: Возможны конфликты (Пр.: rebase) Необходимо межпроцессное взаимодействие для использование git (Отлавливать успешное/не успешное завершение операции)

====================

Триггер для начала операции получения файлов

Подписаться на событие push, получить список коммитов, проверить, запулить, парсить

Минусы: Может быть множество источников изменений (Пуш, мердж) Может быть rebase Ивент содержит 20 последних коммитов, но не всегда


Парсинг по расписанию

Минусы: Задержка при обновлении вопросов

pingvin1308 commented 11 months ago

По итогу мы будем обновлять весь файл теста целиком, даже если там поменялся всего 1 вопрос.

Сервис статистики при этом не удаляет вопросы, а просто хранит их все.

pingvin1308 commented 11 months ago

Простестировать возможность качать файлы в гитхабе https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28