Skip to content
Ragna13377Public

Repository files navigation

Поиск игры с наименьшей ценой в каталогах Steam, GOG

Ссылка

Stack

  • React
  • Typescript
  • Express
  • Mongo
  • Docker
  • FSD

Steam

В API Steam отсутствует поиск по названию, поэтому получаем полный каталог SteamApps. _~ 200к записей fetchSteamAppList_
Оптимизация:
Каталог фильтруется по первым двум буквам каждого слова в названии игры - filterSteamAppByTwoLetter
Сложность O(n*m), где n - количество игр в каталоге, m - среднее количество слов в названии игр
Исключены из совпадений наиболее встречающиеся артикли и предлоги, что снизило максимальные размеры массивов на 10к Результирующее количество вариаций: 21000 с размером от 10 до 20000

Пользовательский запрос:

  1. Запрашиваем из БД массивы, соответствующие первым 2 буквам каждого слова в запросе fetchByFilteredIndex
  2. С помощью Fuse.js (алгоритм нечеткого поиска) ищем совпадения и фильтруем повторяющиеся результаты fuseSearch
    Количество операций сравнения: средний пользовательский запрос - 2 слова.
    • Худший случай: 40к сравнений
    • Средний случай: 20к сравнений
    • Лучший случай: 20 сравнений
  3. Делается повторный запрос к API для полной информации об игре (6 наиболее точных совпадений) fetchSteamGameById
  4. Результаты отправляются клиенту

GOG

  1. API поддерживает запрос по названию игры. При неточном запросе получаем < 100 результатов fetchGogAppList
  2. Аналогично Steam находим наилучшее совпадение с помощью Fuse.js - fuseSearch
  3. Делаем запрос за более детальной информацией (6 наиболее точных совпадений) fetchGOGGameDetails
  4. Результаты отправляются клиенту

Фильтрация на стороне клиента

  • Фильтр по типу магазина
  • Фильтр по цене (ограничен - фильтруются только бесплатные относительно платных)
    Steam автоматически определяет локаль пользователя без возможности ее изменить

Прочее

Сервер отвязан от MongoDB Atlas Database, для исключения настройки VPN на хостинге.
В Docker созданы image для сервера и для бд, объединенные через docker-compose.

Планируемая доработка

  1. Кэширование пользовательских запросов в Redux в пределах сеанса
  2. Связаться со Steam для уточнения запросов с выбранной локалью

Releases

Packages

Contributors

Languages