Open-Workshop / open-workshop-backend

Backend часть сервиса Open Workshop. Управляет каталогом модов.

Home Page:https://api.openworkshop.su

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Open Workshop - backend

Цель данного проекта - позволить скачивать моды всем!

Проект позволяет скачивать моды для игр с серверов Valve.

Backend сервер

Непосредственно общается с Steam, кэширует моды и отсылает пользователям по запросу. Кэширование нужно для минимизации обращений к серверам Valve. Так как частые запросы туда могут расцениваться сервером как бот-активность (и он будет прав). Из про кэшированных модов сервер составляет список который могут использовать сторонние приложения. Сервер не позволяет скачивать моды со Steam на прямую. Вместо этого нужно создать запрос на кеширование и после некоторое время опрашивать сервер о состоянии запроса. После мод будет добавлен в библиотеку сервера от куда его уже можно скачать.

Документация

Общая важная информация

Структура

Загрузка со Steam реализовано как отдельный модуль. При запросе пользователя загрузить определенный мод со Steam, сервер скачивает его в первую очередь для себя, для пополнения его БД этим модом. Пользователь может периодически опрашивать сервер о состоянии его запроса, и как только состояние мода станет 1 или 0 он может начинать скачивание. Сервер так же имеет свою базу данных модов с полнофункциональным поиском не уступающим Steam.

Использование

Вы можете использовать сервер как для скачивания модов со Steam, так и на основе автоматически постоянно пополняющегося каталога модов сделать клиент который позволяет удобно скачивать и обновлять моды конкретно с этого сервера.

Возможные ошибки в базе данных

БД модов генерируется и обновляется автоматически благодаря запросам пользователей. Из-за этого есть вероятность неполноты информации о каких-то модах (так как часть информации добывается путем парсинга страницы). А так же есть вероятность неактуальности некоторых записей, так как актуализация информации происходит во время запроса конкретного мода через /download/steam/{mod_id} либо /update/steam/{mod_id}. Автоматическое обновление невозможно по причине неоправданного расхода трафика (из-за чего Steam может забанить по IP).

Поведение сервера при скачивании модов

Сервер не отправляет моды напрямую из Steam, вместо этого он сначала скачивает моды себе занося его в БД.

Сначала идет постановка в очередь 3. В этот момент мод только находится в списке задач на скачивание.

Непосредственно скачивание мода 2.

Парсинг страницы мода в Steam и регистрация полной информации о моде в базу данных 1. Во время этого процесса пользователям уже можно скачивать моды.

Загрузка завершена 0.

Состояния модов

0 - загружен.

1 - можно запрашивать, не до конца провалидирован.

2 - скачивается.

3 - в очереди на скачивание

API-функции

GET /download/steam/{mod_id}

Нужно передать ID мода Steam. Если у сервера уже есть этот мод - он его отправит как ZIP архив со сжатием ZIP_LZMA. Если у сервера уже есть этот мод, но он отмечен непубличным (public == 2), то сервер не предоставит его напрямую - запрашивать через микросервис account! Если у сервера нет этого мода он отправит JSON с информацией о постановке мода на скачивание.

JSON ответы:

  1. Успешная постановка запроса на скачивание:
{"message": "request added to queue", "error_id": 0, "unsuccessful_attempts": true / false, "updating": true / false}

HTTP code: 202

  • unsuccessful_attempts - это пометка сообщает о том были ли провальные попытки скачать мод.
  • updating - если true - это значит, что у сервера был загружен мод, но ваш запрос спровоцировал проверку на обновление. Сервер удаляет у себя старую версию мода и начинает загрузку новой.
  1. Сервер запускается:
{"message": "the server is not ready to process requests", "error_id": 1}

HTTP code: 103

  • Это ошибка возникает в ситуации когда сервер ещё не успел запустить службу по скачиванию модов, а на самом сервере этого мода нет.
  1. Мод не найден:
{"message": "this mod was not found", "error_id": 2}}

HTTP code: 404

  1. Отказано в доступе:
Access denied. This case will be reported.

HTTP code: 403

  • В доступе может быть отказано только если мод отмечен не публичным. В таком случае его нужно запрашивать через микросервис account с условием наличия аккаунта с правами на получение этого мода.
  1. Сервер уже пытается скачать этот мод:
{"message": "your request is already being processed", "error_id": 3}

HTTP code: 102

  • Постоянно спрашивать состояние мода через эту функцию не рекомендую, так как она достаточно медленная. Лучше использовать /info/mod/{mod_id}.

GET /download/{mod_id}

Нужно передать ID мода. Если у сервера уже есть этот мод - он его отправит как ZIP архив со сжатием ZIP_BZIP2. Если у сервера уже есть этот мод, но он отмечен непубличным (public == 2), то сервер не предоставит его напрямую - запрашивать через микросервис account! Эта самая быстрая команда загрузки, но если на сервере не будет запрашиваемого мода никаких действий по его загрузке предпринято не будет.

JSON ответы:

  1. Мода нет на сервере:
{"message": "the mod is not on the server", "error_id": 1}

HTTP code: 404 2. Мод поврежден:

{"message": "the mod is damaged", "error_id": 2}

HTTP code: 404

  • Если по какой-то причине мод есть в БД, но его файла нет в системе, запись в БД будет удалена, а вам сообщено что мод был поврежден и отправлен не будет.
  1. Отказано в доступе:
Access denied. This case will be reported.

HTTP code: 403

  • В доступе может быть отказано только если мод отмечен не публичным. В таком случае его нужно запрашивать через микросервис account с условием наличия аккаунта с правами на получение этого мода.

GET /update/steam/{mod_id}

Нужно передать ID мода.

Делает проверку, есть ли в Steam обновления для этого мода.

JSON ответы:

  1. Мода нет у сервера:
{"message": "mod not found on locale", "error_id": 1}

HTTP code: 404

  • Проверка осуществляется с поиском мода с указанным ID + состоянием 0, так что конкретно этот ответ не стоит воспринимать как за реальное отсутствие мода.
  1. Актуальность мода уже ранее проводилась:
{"message": "check for relevance was made earlier", "error_id": 2}

HTTP code: 425

  • Кулдаун проверки обновления для каждого мода - 3 часа.
  1. Мод не найден в Steam:
{"message": "mod not found on steam", "error_id": 3}

HTTP code: 404 4. У мода уже установлено последнее обновление:

{"message": "mod already update", "error_id": 4}

HTTP code: 208 4. Задача на обновление мода поставлена:

{"message": "task of updating is set", "error_id": 0}

HTTP code: 202

GET /list/mods/

Возвращает список модов к конкретной игре, которые есть на сервере и отмечены полностью публичными. Имеет необязательные аргументы:

  1. page_size (int) - количество элементов которое будет возвращено. (диапазон значений 1...50)
  2. page (int) - "страница" которая будет возвращена. Рассчитывается как page_size * page = offeset.
  3. sort (str) - режим сортировки таблицы перед фильтрацией. Префикс i указывает что сортировка должна быть инвертированной. По умолчанию от меньшего к большему, с i от большего к меньшему.
    1. NAME - сортировка по имени.
    2. SIZE - сортировка по размеру.
    3. CREATION_DATE - сортировка по дате создания.
    4. UPDATE_DATE - сортировка по дате обновления.
    5. REQUEST_DATE - сортировка по дате последнего запроса.
    6. SOURCE - сортировка по источнику.
    7. MOD_DOWNLOADS (по умолчанию) - сортировка по количеству загрузок.
  4. tags (list[int]) - список ID тегов которые должны иметь отправленные в ответе игры.
  5. game (int) - ID игры с которой связан мод. По факту 1 мод связан максимум с 1 игрой, но архитектурой сервера это никак не ограничивается.
  6. allowed_ids - если передан хотя бы один элемент, идет выдача конкретно этих модов.
  7. dependencies (bool) - отправлять ли моды имеющие зависимость на другие моды. По умолчанию False.
  8. primary_sources (list[str]) - фильтрация по первоисточникам. Например: steam, local и т.п..
  9. name (str) - фильтрация по имени. Необязательно писать полное имя.
  10. short_description (bool) - отправлять ли короткое описание мода в ответе. В длину оно максимум 256 символов. По умолчанию False.
  11. description (bool) - отправлять ли полное описание мода в ответе. По умолчанию False.
  12. dates (bool) - отправлять ли дату последнего обновления и дату создания в ответе. По умолчанию False.
  13. general (bool) - отправлять ли базовые поля (название, размер, источник, количество загрузок). По умолчанию True.

JSON ответ:

  1. Некорректный размер страницы:
{"message": "incorrect page size", "error_id": 1}

HTTP code: 413

  • Означает что размер страницы не входит в диапазон 1...50.
  1. Сложный запрос:
{"message": "the maximum complexity of filters is 30 elements in sum", "error_id": 2}

HTTP code: 413

  • Максимальное суммарное размер фильтров tags, games, primary_sources не должно превышать 30 элементов.
  1. Нормальный ответ:
{"database_size": int, "offeset": int, "results": list[dict]}

HTTP code: 200

  • database_size - общий размер базы данных с текущими фильтрами (game_id и source).
  • offeset - итоговый рассчитанный сдвиг с 0 элемента в БД.
  • results - возвращает массив массивов в котором содержатся все элементы соответствующие текущему запросу (пустой список если ничего не найдено). Содержание под массива:
      1. id (int) - id мода.
      1. size (int) - размер мода в байтах.
      1. source (str) - первоисточник.
      1. name (str) - название мода.
      1. downloads (int) - количество загрузок данного мода.
    • Со 2 по 5 присылаются только если general=True*
    • Доступно при description=True:
      1. description (str) - описание мода.
    • Доступно при short_description=True:
      1. short_description (str) - короткое описание мода.
    • Доступно при dates=True:
      1. date_creation (YYYY-MM-DD HH:MI:SS) - дата появления в первоисточнике.
      1. date_update (YYYY-MM-DD HH:MI:SS) - дата обновления в первоисточнике.

GET /list/games/

Возвращает список игр, моды к которым есть на сервере. Имеет необязательные аргументы:

  1. page_size (int) - количество элементов которое будет возвращено.
  2. page (int) - "страница" которая будет возвращена. Рассчитывается как page_size * page = offeset.
  3. sort (str) - режим сортировки таблицы перед фильтрацией. Префикс i указывает что сортировка должна быть инвертированной.
    1. NAME - сортировка по имени.
    2. TYPE - сортировка по типу (game или app).
    3. CREATION_DATE - сортировка по дате регистрации на сервере.
    4. MOD_DOWNLOADS - сортировка по суммарному количеству скачанных модов для игры (по умолчанию).
    5. MODS_COUNT - сортировка по суммарному количеству модов для игры.
    6. SOURCE - сортировка по источнику.
  4. type_app (list[str]) - фильтрация по типу (game или app).
  5. genres (list[int]) - фильтрация по жанрам игр.
  6. primary_sources (list[str]) - фильтрация по первоисточникам. Например: steam, local и т.п..
  7. name (str) - фильтрация по имени. Необязательно писать полное имя.
  8. short_description - отправлять ли короткое описание. По умолчанию False.
  9. description - отправлять ли описание. По умолчанию False.
  10. dates - отправлять ли даты. По умолчанию False.
  11. statistics - отправлять ли статистику. По умолчанию False.

JSON ответ:

  1. Некоректный размер страницы:
{"message": "incorrect page size", "error_id": 1}

HTTP code: 413

  • Означает что размер страницы не входит в диапазон 1...50.
  1. Слишком сложный запрос:
{"message": "the maximum complexity of filters is 30 elements in sum", "error_id": 2}

HTTP code: 413

  • Максимальное суммарное размер фильтров type_app, genres, primary_sources не должно превышать 30 элементов.
  1. Нормальный ответ:
{"database_size": int, "offeset": int, "results": list[list]}

HTTP code: 200

  • database_size - общий размер базы данных с текущими фильтрами.
  • offeset - итоговый рассчитанный сдвиг с 0 элемента в БД.
  • results - возвращает массив массивов в котором содержатся все элементы соответствующие текущему запросу (пустой список если ничего не найдено). Содержание под массива:
      1. id (int) - id игры.
      1. name (str) - название игры.
      1. type (str) - тип приложения (game или app).
      1. logo (str) - url ведущий на лого игры.
      1. source (str) - первоисточник.
    • Доступно при short_description=True:
      1. short_description (str) - короткое описание игры.
    • Доступно при description=True:
      1. description (str) - описание игры.
    • Доступно при statistics=True:
      1. mods_downloads (int) - суммарное количество загрузок у связанных с игрой модов.
      1. mods_count (int) - количество связанных модов.
    • Доступно при dates=True:
      1. creation_date (YYYY-MM-DD HH:MI:SS.MS) - дата регистрации на сервере

GET /list/tags/{game_id}

Возвращает список тегов закрепленных за игрой и её модами. Нужно передать ID интересующей игры. Имеет необязательные аргументы:

  1. page_size (int) - размер 1 страницы. Диапазон - 1...50 элементов.
  2. page (int) - номер странице. Не должна быть отрицательной.

JSON ответы:

  1. Некорректный размер страницы:
{"message": "incorrect page size", "error_id": 1}

HTTP code: 413 2. Нормальный ответ:

{"database_size": genres_count, "offset": offset, "results": genres}

HTTP code: 200

  • Структура подсловаря в results:
    1. id (int) - ID элемента.
    1. name (str) - название тега.

GET /list/tags/mods/{mods_ids_list}

Возвращает ассоциации модов с тегами. Если в переданном списке модов есть ID непубличного мода, то будет отказано в доступе, делать такие запросы через микросервис account!

  1. mods_ids_list (list[int]) - список модов к которым нужно вернуть ассоциации (принимает список ID модов).
  2. tags (list[int]) - если не пуст возвращает ассоциации конкретно с этими тегами (принимает список ID тегов).
  3. only_ids (bool) - если True возвращает только ID ассоцируемых тегов, если False возвращает всю информацию о каждом ассоцируемом теге.

JSON ответы:

  1. Сложный запрос:
{"message": "the maximum complexity of filters is 80 elements in sum", "error_id": 2}

HTTP code: 413 2. Нормальный ответ:

{"id_mod": [...]}

HTTP code: 200 3. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403

GET /list/genres

Возвращает список жанров для игр. Имеет необязательные аргументы:

  1. page_size (int) - размер 1 страницы. Диапазон - 1...50 элементов.
  2. page (int) - номер странице. Не должна быть отрицательной.

JSON ответы:

  1. Некорректный размер страницы:
{"message": "incorrect page size", "error_id": 1}

HTTP code: 413 2. Нормальный ответ:

{"database_size": genres_count, "offset": offset, "results": genres}

HTTP code: 200

  • Структура подсловаря в results:
    1. id (int) - ID элемента.
    1. name (str) - название жанра.

GET /list/genres/games/{games_ids_list}

Возвращает ассоциации игр с жанрами

  1. games_ids_list (list[int]) - список игр к которым нужно вернуть ассоциации (принимает список ID игр).
  2. genres (list[int]) - если не пуст возвращает ассоциации конкретно с этими жанрами (принимает список ID жанров).
  3. only_ids (bool) - если True возвращает только ID ассоцируемых жанров, если False возвращает всю информацию о каждом ассоцируемом жанре.

JSON ответы:

  1. Сложный запрос:
{"message": "the maximum complexity of filters is 80 elements in sum", "error_id": 2}

HTTP code: 413 2. Нормальный ответ:

{"id_game": [...]}

HTTP code: 200

GET /list/resources_mods/{mods_list_id}

Возвращает список ресурсов у конкретного мода/списка модов. Нужно передать ID интересующих модов. Пример: [2955709750, 3024527775]. Имеет необязательные аргументы:

  1. page_size (int) - размер 1 страницы. Диапазон - 1...50 элементов.
  2. page (int) - номер странице. Не должна быть отрицательной.
  3. types_resources (list[str]) - фильтрация по типам ресурсов. (logo / screenshot), ограничение - 20 элементов.

Если в переданном списке модов есть ID непубличного мода, то будет отказано в доступе, делать такие запросы через микросервис account!

JSON ответы:

  1. Некорректный размер страницы:
{"message": "incorrect page size", "error_id": 1}

HTTP code: 413

  • Означает что размер страницы не входит в диапазон 1...50.
  1. Слишком сложный запрос:
{"message": "the maximum complexity of filters is 30 elements in sum", "error_id": 2}

HTTP code: 413

  • Максимальный размер фильтра types_resources не должен превышать 30 элементов.
  1. Нормальный ответ:
{"database_size": int, "offset": int, "results": list[dict]}

HTTP code: 200

  • Структура подсловаря в results:
    1. date_event (YYYY-MM-DD HH:MI:SS.MS) - дата последнего изменения записи на сервере.
    1. id (int) - ID ресурса.
    1. url (str) - ссылка на ресурс.
    1. type (str) - тип ресурса (logo / screenshot).
    1. owner_id (int) - ID мода-владельца.
  1. Отказано в доступе:
Access denied. This case will be reported.

HTTP code: 403

GET /info/mod/{mod_id}

Возвращает информацию об конкретном моде, а так же его состояние на сервере. Если мод отмечен непубличным (public == 2), то сервер не предоставит его напрямую - запрашивать через микросервис account's! Нужно передать ID мода.

Имеет необязательные аргументы:

  1. dependencies (bool) - передать ли список ID модов от которых зависит этот мод (ограничено 20 элементами) (по умолчанию false).
  2. short_description (bool) - отправлять ли короткое описание мода в ответе. В длину оно максимум 256 символов. По умолчанию False.
  3. description (bool) - отправлять ли полное описание мода в ответе. По умолчанию False.
  4. dates (bool) - отправлять ли дату последнего обновления и дату создания в ответе. По умолчанию False.
  5. general (bool) - отправлять ли базовые поля (название, размер, источник, количество загрузок). По умолчанию True.
  6. game (bool) - отправлять ли краткую информацию (id+название) об игре-владельце. По умолчанию False.
  7. token (str) - токен для доступа для непубличных модов, передавать обычным пользователям не нужно, т.к. параметр нужен для общения микросервисов.

JSON ответ:

  1. Нормальный ответ:
{"result": dict / null, ...}

HTTP code: 200

  • results - возвращает либо null, либо словарь с результатом поиска. Структура словаря:

      1. name (str) - название мода.
      1. size (int) - размер мода в байтах.
      1. source (str) - первоисточник.
      1. downloads (int) - количество загрузок данного мода.
    • Первые 4 поля доступны при general=True*
      1. condition (int) - состояние мода (0 - загружен, 1 - можно запрашивать, не до конца провалидирован, 2 - скачивается, 3 - в очереди на скачивание).
    • Доступно при short_description=True:
      1. short_description (str) - короткое описание мода (максимум 256 символов).
    • Доступно при description=True:
      1. description (str) - описание мода.
    • Доступно при dates=True:
      1. date_creation (YYYY-MM-DD HH:MI:SS) - дата появления в первоисточнике.
      1. date_update (YYYY-MM-DD HH:MI:SS) - дата обновления в первоисточнике.
    • Доступно при game=True:
        1. game -> id (int) - id игры которой принадлежит мод.
        1. game -> name (string) - название игры которой принадлежит мод.
  • При dependencies=true возвращает дополнительные пункты: dependencies (list[int]) - ограничено 20 элементами. dependencies_count (int) - возвращает общее число элементов.

  1. Отказано в доступе:
Access denied. This case will be reported.

HTTP code: 403

  • В доступе может быть отказано только если мод отмечен не публичным. В таком случае его нужно запрашивать через микросервис account с условием наличия аккаунта с правами на получение этого мода.

GET /info/game/{game_id}

Возвращает информацию о конкретной игре. Обязательно нужно передать только ID игры. Имеет необязательные аргументы:

  1. short_description (bool) - отправлять ли короткое описание. По умолчанию False.
  2. description (bool) - отправлять ли описание. По умолчанию False.
  3. dates (bool) - отправлять ли даты. По умолчанию False.
  4. statistics (bool) - отправлять ли статистику. По умолчанию False.

JSON ответ:

  1. Нормальный ответ:
{"result": list / null}

HTTP code: 200

  • results - возвращает словарь в котором содержится информация об игре. Если игра не найдена, возвращает null. Содержание словаря:
      1. name (str) - название игры.
      1. type (str) - тип приложения (game или app).
      1. logo (str) - url ведущий на лого игры.
      1. source (str) - первоисточник.
    • Доступно при short_description=True:
      1. short_description (str) - короткое описание игры.
    • Доступно при description=True:
      1. description (str) - описание игры.
    • Доступно при dates=True:
      1. mods_downloads (int) - суммарное количество загрузок у связанных с игрой модов.
      1. mods_count (int) - количество связанных модов.
    • Доступно при statistics=True:
      1. creation_date (YYYY-MM-DD HH:MI:SS.MS) - дата регистрации на сервере

GET /info/queue/size

Возвращает размер очереди (int).

JSON ответ:

  1. Некорректный ответ:
-1

HTTP code: 200

  • Означает что при подсчете очереди возникла ошибка.
  1. Нормальный ответ:
int

HTTP code: 200

GET /condition/mod/{ids_array}

Возвращает информацию о состоянии мода/модов на сервере. Нужно передать массив с интересующими ID модов. Диапазон - 1...50 элементов

JSON ответ:

  1. Некорректный запрос:
{"message": "the size of the array is not correct", "error_id": 1}

HTTP code: 413

  • Означает что массив вышел за диапазон в 1...50 элементов.
  1. Нормальный ответ:
{id: 0/1/2, ...}

HTTP code: 200

  • В ответе возвращает только те элементы которые были переданы в запросе И есть на сервере.
  • Об состояниях: (0 - загружен, 1 - можно запрашивать, не до конца провалидирован, 2 - скачивается, 3 - в очереди на скачивание).
  • Если мода нет в ответе - значит его нет на сервере.

GET /statistics/delay

Возвращает информацию о скорости обработки запросов (измеряется в миллисекундах). В расчеты попадают 20 последних запросов.

JSON ответ:

  1. Нормальный ответ:
{"fast": int, "full": int}

HTTP code: 200

  • fast - скорость ответа сервера на запрос о моде который есть на сервере.

  • full - скорость ответа сервера на запрос о моде которого нет на сервере. Замер идет от момента получения запроса до момента переключение мода на состояние 1 (можно запрашивать, не до конца провалидирован).

  • Если сервер прислал (в одном из двух параметров) 0 - недостаточно данных для статистики по этому пункту.

GET /statistics/hour

Возвращает подробную статистику о запросах и работе сервера в конкретный день. Имеет необязательные аргументы:

  1. select_date (YYYY-MM-DD; str) - день по которому нужна статистика. По умолчанию - сегодня.
  2. start_hour (int) - фильтрация по минимальному значению часа (диапазон 0...23). По умолчанию - 0.
  3. end_hour (int) - фильтрация по максимальному значению часа (диапазон 0...23). По умолчанию - 23.

При фильтрации по часу отсекаются крайние значения, но не указанное. Т.е. - если указать в start_hour и в end_hour одно и тоже значение, то на выходе получите статистику только по этому часу.

JSON ответ:

  1. Выход начального времени из 24-часового диапазона:
{"message": "start_hour exits 24 hour format", "error_id": 1}

HTTP code: 412 2. Выход конечного времени из 24-часового диапазона:

{"message": "end_hour exits 24 hour format", "error_id": 2}

HTTP code: 412 3. Противоречивый запрос:

{"message": "conflicting request", "error_id": 3}

HTTP code: 409

  • Возникает когда начальное время > конечного времени.
  1. Нормальный ответ:
list[dict]

HTTP code: 200

  • Содержание словаря:
    1. count (int) - количество чего-то в этот период времени.
    1. type (str) - тип поля.
    1. date_time (YYYY-MM-DD HH:MI:SS.MS - где все что меньше часа всегда равно 0) - дата и час.

GET /statistics/day

Возвращает подробную статистику о запросах и работе сервера в конкретный день.

Принимает необязательные параметры:

  1. start_date (YYYY-MM-DD; str) - день от начала которого нужна статистика (включительно). По умолчанию = end_date-7 days.
  2. end_date (YYYY-MM-DD; str) - день до которого нужна статистика (включительно). По умолчанию - текущая дата.

При фильтрации по дня отсекаются крайние значения, но не указанные. Т.е. - если указать в start_date и в end_date одно и тоже значение, то на выходе получите статистику только по этому дню.

JSON ответ:

  1. Противоречивый запрос:
{"message": "conflicting request", "error_id": 3}

HTTP code: 409

  • Возникает когда начальная дата > конечной даты.
  1. Нормальный ответ:
list[dict]

HTTP code: 200

  • Содержание словаря:
    1. count (int) - количество чего-то в этот период времени.
    1. type (str) - тип поля.
    1. date (YYYY-MM-DD) - дата.

GET /statistics/info/all

Возвращает общую информацию о состоянии базы данных. Не принимает аргументов.

JSON ответ:

  1. Нормальный ответ:
{"mods": int, "games": int, "genres": int, "mods_tags": int, "mods_dependencies": int, "statistics_days": int, "mods_sent_count": int}

HTTP code: 200

  • mods (int) - суммарное по всем играм количество модов на сервере.
  • games (int) - количество проиндексированных.
  • genres (int) - количество проиндексированных жанров игр.
  • mods_tags (int) - суммарное по всем играм количество тегов для модов.
  • mods_dependencies (int) - количество модов у которых есть зависимости на другие моды.
  • statistics_days (int) - сколько уже дней ведётся статистика.
  • mods_sent_count (int) - сколько раз сервер отправил пользователям файлы с модами.

GET /statistics/info/type_map

Возвращает карту переводов для типов в статистической ветке. Не принимает аргументов. Определяет на каком языке отправить ответ через поле Accept-Language в headers запроса.

JSON ответ:

  1. Нормальный ответ:
{"language": select_language, "result": stc.cache_types_data(select_language)}

HTTP code: 200

  • language (str) - выбранный сервером язык. Пытается найти самый перевод для языков (по пользовательскому приоритету). Если не удалось найти язык по пользовательскому приоритету - устанавливается ru как значение по умолчанию.
  • result (dict[str] = str) - возвращает словарь с переводами для типов которые получаются в /statistics/day и /statistics/hour.

POST /account/add/game

Локальная функция!

Добавляет игры в базу.

Принимает следующие обязательные параметры:

  1. game_name (str) - название игры.
  2. game_short_desc (str) - короткое описание игры.
  3. game_desc (str) - полное описание игры.
  4. game_type (str) - тип игры. Типы приложений не ограничены, но есть следующие "официально поддерживаемые" типы: game, app, tool.
  5. game_logo (str) - ссылка на лого игры

JSON ответ:

  1. Успешно:
game_id

HTTP code: 202

  • Возвращает ID созданного элемента.
  1. Отказано в доступе:
Access denied. This case will be reported.

HTTP code: 403

POST /account/add/genre

Локальная функция!

Добавляет жанры в базу.

Принимает следующие обязательные параметры:

  1. genre_name (str) - название жанра.

JSON ответ:

  1. Успешно:
genre_id

HTTP code: 202

  • Возвращает ID созданного элемента.
  1. Отказано в доступе:
Access denied. This case will be reported.

HTTP code: 403

POST /account/add/tag

Локальная функция!

Добавляет тег в базу.

Принимает следующие обязательные параметры:

  1. tag_name (str) - название тега.

JSON ответ:

  1. Успешно:
tag_id

HTTP code: 202

  • Возвращает ID созданного элемента.
  1. Отказано в доступе:
Access denied. This case will be reported.

HTTP code: 403

POST /account/add/resource

Локальная функция!

Добавляет ресурс мода в базу.

Принимает следующие обязательные параметры:

  1. resource_type_name (str) - тип ресурса. Типы ресурсов не ограничены, но есть следующие "официально поддерживаемые" типы: logo, screenshot.
  2. resource_url (str) - ссылка на ресурс.
  3. resource_owner_id (int) - ID мода владельца.

JSON ответ:

  1. Успешно:
resource_id

HTTP code: 202

  • Возвращает ID созданного элемента.
  1. Отказано в доступе:
Access denied. This case will be reported.

HTTP code: 403

POST /account/add/mod

Локальная функция!

Добавляет мод в базу.

Принимает следующие обязательные параметры:

  1. mod_name (str) - название мода.
  2. mod_short_description (str) - короткое описание мода (до 256 символов).
  3. mod_description (str) - описание мода.
  4. mod_source (str) - источник мода, в данном случае всегда local.
  5. mod_game (int) - ID игры-владельца мода.
  6. mod_public (int) - публичность мода. 0 - публичен; 1 - доступен по прямой ссылке; 2 - доступ только через микросервис account.
  7. mod_file (file) - сам мод. Ограничение на архив - 800МБ. Ограничения на не сжатый размер мода нет.

JSON ответ:

  1. Успешно:
mod_id

HTTP code: 202

  • Возвращает ID созданного элемента.
  1. Отказано в доступе:
Access denied. This case will be reported.

HTTP code: 403 3. Превышен размер файла:

The file is too large.

HTTP code: 413 4. Прислан не ZIP архив:

Only ZIP archives are accepted.

HTTP code: 400 4. Ошибка обработки файла:

An unknown error occurred while checking the archive standard.

HTTP code: 500

POST /account/edit/game

Локальная функция!

Редактирует игру в базе.

Обязательно передать ID игры - game_id (int).

Нужно передать хотя бы 1 из необязательных параметров. Принимает следующие необязательные параметры:

  1. game_name (str) - название игры.
  2. game_short_desc (str) - короткое описание игры.
  3. game_desc (str) - полное описание игры.
  4. game_type (str) - тип игры. Типы приложений не ограничены, но есть следующие "официально поддерживаемые" типы: game, app, tool.
  5. game_logo (str) - ссылка на лого игры.
  6. game_source (str) - источник игры.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403 3. Элемент не найден:

The element does not exist.

HTTP code: 404 3. Запрос пустой:

The request is empty

HTTP code: 418

POST /account/edit/genre

Локальная функция!

Редактирует жанр в базе.

Обязательно передать ID жанра - genre_id (int).

Нужно передать хотя бы 1 из необязательных параметров. Принимает следующие необязательные параметры:

  1. genre_name (str) - название жанра.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403 3. Элемент не найден:

The element does not exist.

HTTP code: 404 3. Запрос пустой:

The request is empty

HTTP code: 418

POST /account/edit/tag

Локальная функция!

Редактирует тег в базе.

Обязательно передать ID тега - tag_id (int).

Нужно передать хотя бы 1 из необязательных параметров. Принимает следующие необязательные параметры:

  1. tag_name (str) - название тега.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403 3. Элемент не найден:

The element does not exist.

HTTP code: 404 3. Запрос пустой:

The request is empty

HTTP code: 418

POST /account/edit/resource

Локальная функция!

Редактирует ресурс игры в базе.

Обязательно передать ID ресурса - resource_id (int).

Нужно передать хотя бы 1 из необязательных параметров. Принимает следующие необязательные параметры:

  1. resource_type (str) - тип ресурса. Типы ресурсов не ограничены, но есть следующие "официально поддерживаемые" типы: logo, screenshot.
  2. resource_url (str) - ссылка на ресурс.
  3. resource_owner_id (int) - id мода-владельца ресурса.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403 3. Элемент не найден:

The element does not exist.

HTTP code: 404 3. Запрос пустой:

The request is empty

HTTP code: 418

POST /account/edit/mod

Локальная функция!

Редактирует моды в базе.

Обязательно передать ID мода - mod_id (int).

Нужно передать хотя бы 1 из необязательных параметров. Принимает следующие необязательные параметры:

  1. mod_name (str) - название мода.
  2. mod_short_description (str) - короткое описание (до 256 символов).
  3. mod_description (str) - описание.
  4. mod_source (str) - источник мода.
  5. mod_game (int) - ID игры-владельца.
  6. mod_public (int) - режим публичности.
  7. mod_file (file) - ZIP файл, ограничение 800МБ.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403 3. Элемент не найден:

The element does not exist.

HTTP code: 404 4. Запрос пустой:

The request is empty

HTTP code: 418 5. Превышен размер файла:

The file is too large.

HTTP code: 413 6. Прислан не ZIP архив:

Only ZIP archives are accepted.

HTTP code: 400 7. Ошибка обработки файла:

An unknown error occurred while checking the archive standard.

HTTP code: 500

POST /account/delete/game

Локальная функция!

Удаляет игру из базы.

Обязательно передать ID игры - game_id (int).

Записи об ассоциации этой игры с тегами и жанрами автоматически удаляются.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403

POST /account/delete/genre

Локальная функция!

Удаляет жанр из базы.

Обязательно передать ID игры - genre_id (int).

Записи об ассоциации этого жанра с играми автоматически удаляются.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403

POST /account/delete/tag

Локальная функция!

Удаляет тег из базы.

Обязательно передать ID тега - tag_id (int).

Записи об ассоциации этого тега с играми и модами автоматически удаляются.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403

POST /account/delete/resource

Локальная функция!

Удаляет ресурс мода из базы.

Обязательно передать ID ресурса - resource_id (int).

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403

POST /account/delete/mod

Локальная функция!

Удаляет мод из базы.

Обязательно передать ID ресурса - mod_id (int).

Записи об ассоциации этого мода с тегами и жанрами, а так же ресурсы и зависимости мода автоматически удаляются. ZIP архив мода так же удаляется.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403

POST /account/association/game/genre

Локальная функция!

Управляет ассоциацией игра-жанры.

Обязательно передать ID игры - game_id (int), ID жанра - genre_id (int), а так же режим действия mode (bool). Режим работы (mode): mode = True - добавить ассоциацию; mode = False - удалить ассоциацию.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403 3. Ассоциация уже существует (при добавлении):

The association is already present

HTTP code: 409

POST /account/association/game/tag

Локальная функция!

Управляет ассоциацией игра-теги.

Обязательно передать ID игры - game_id (int), ID тега - tag_id (int), а так же режим действия mode (bool). Режим работы (mode): mode = True - добавить ассоциацию; mode = False - удалить ассоциацию.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403 3. Ассоциация уже существует (при добавлении):

The association is already present

HTTP code: 409

POST /account/association/mod/tag

Локальная функция!

Управляет ассоциацией мод-теги.

Обязательно передать ID мода - mod_id (int), ID тега - tag_id (int), а так же режим действия mode (bool). Режим работы (mode): mode = True - добавить ассоциацию; mode = False - удалить ассоциацию.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403 3. Ассоциация уже существует (при добавлении):

The association is already present

HTTP code: 409

POST /account/association/mod/dependencie

Локальная функция!

Управляет ассоциацией мод-зависимости_мода.

Обязательно передать ID мода - mod_id (int), ID мода от которого зависим - dependencie (int), а так же режим действия mode (bool). Режим работы (mode): mode = True - добавить ассоциацию; mode = False - удалить ассоциацию.

JSON ответ:

  1. Успешно:
Complite

HTTP code: 202 2. Отказано в доступе:

Access denied. This case will be reported.

HTTP code: 403 3. Ассоциация уже существует (при добавлении):

The association is already present

HTTP code: 409

Установка на свой сервер

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

  1. Убедитесь что вы установили все зависимости из requirements.txt и у вас не возникли ошибки!
  2. Для корректного запуска сервера на Linux вам нужно выполнить этот пункт
  3. Если у вас возникли какие-то проблемы с установкой - пишите мне!

Установка на Ubuntu:

Одной командой:

sudo adduser steam; sudo apt update; sudo apt upgrade; sudo apt-get install lib32stdc++6 -y; sudo apt install git -y; sudo apt install python3.10 -y; sudo apt -y install python3-pip; sudo apt install htop -y; sudo apt install screen -y; cd /home/steam; git clone https://github.com/Miskler/pytorrent.git; cd pytorrent; chmod -R 777 .; pip3 install -r requirements.txt; sudo snap install --classic certbot; sudo certbot certonly --standalone

Это займет некоторое время :) После перейти к шагу 7!

Последовательно:

  1. Создание пользователя:
sudo adduser steam
  1. Обновление всех пакетов:
sudo apt update; sudo apt upgrade
  1. Установка по: (после рекомендую перезапустить ОС)
sudo apt-get install lib32stdc++6 -y; sudo apt install git -y; sudo apt install python3.10 -y; sudo apt -y install python3-pip; sudo apt install htop -y; sudo apt install screen -y
  1. Установка репозитория:
cd /home/steam; git clone https://github.com/Miskler/pytorrent.git; cd pytorrent; chmod -R 777 .
  1. Установка зависимостей:
pip3 install -r requirements.txt
  1. Установка CertBot (SSL сертификат):
sudo snap install --classic certbot; sudo ln -s /snap/bin/certbot /usr/bin/certbot; sudo certbot certonly --standalone
  1. Файл настроек Gunicorn: Переименовываем файл gunicorn_config_sample.py в gunicorn_config.py и заполняем поля certfile и keyfile.
  2. Запуск (должны находится в каталоге backend):
screen -S pytorrent_backend ./start.sh

Жмем сочитание клавиш CTRL + A + D После проверяем адрес - https://YOU_DOMEN.com:8000/docs. Если все ок вы увидете документацию.

About

Backend часть сервиса Open Workshop. Управляет каталогом модов.

https://api.openworkshop.su

License:Mozilla Public License 2.0


Languages

Language:Python 99.6%Language:Shell 0.2%Language:Batchfile 0.2%