- React
- Typescript
- Express
- Mongo
- Docker
- FSD
В API Steam отсутствует поиск по названию, поэтому получаем полный каталог SteamApps. _~ 200к записей fetchSteamAppList_
Оптимизация:
Каталог фильтруется по первым двум буквам каждого слова в названии игры - filterSteamAppByTwoLetter
Сложность O(n*m), где n - количество игр в каталоге, m - среднее количество слов в названии игр
Исключены из совпадений наиболее встречающиеся артикли и предлоги, что снизило максимальные размеры массивов на 10к
Результирующее количество вариаций: 21000 с размером от 10 до 20000
Пользовательский запрос:
- Запрашиваем из БД массивы, соответствующие первым 2 буквам каждого слова в запросе
fetchByFilteredIndex - С помощью
Fuse.js(алгоритм нечеткого поиска) ищем совпадения и фильтруем повторяющиеся результатыfuseSearch
Количество операций сравнения: средний пользовательский запрос - 2 слова.- Худший случай: 40к сравнений
- Средний случай: 20к сравнений
- Лучший случай: 20 сравнений
- Делается повторный запрос к API для полной информации об игре (6 наиболее точных совпадений)
fetchSteamGameById - Результаты отправляются клиенту
- API поддерживает запрос по названию игры. При неточном запросе получаем < 100 результатов
fetchGogAppList - Аналогично Steam находим наилучшее совпадение с помощью
Fuse.js-fuseSearch - Делаем запрос за более детальной информацией (6 наиболее точных совпадений)
fetchGOGGameDetails - Результаты отправляются клиенту
- Фильтр по типу магазина
- Фильтр по цене (ограничен - фильтруются только бесплатные относительно платных)
Steam автоматически определяет локаль пользователя без возможности ее изменить
Сервер отвязан от MongoDB Atlas Database, для исключения настройки VPN на хостинге.
В Docker созданы image для сервера и для бд, объединенные через docker-compose.
- Кэширование пользовательских запросов в Redux в пределах сеанса
- Связаться со Steam для уточнения запросов с выбранной локалью