Перейти к основному содержимому
🎉 GP CONF 2026: Конференция о рынке WEB-игр 👾 23 сентября | Подробнее

Подборки

Подборка объединяет локализованное оформление, настроенный фильтр игр, сортировку, закреплённые и скрытые игры. API возвращает итоговый список игр, поэтому frontend не должен повторять логику фильтра.

Контекст выполнения: браузер витрины или сервер площадки. Браузер передаёт Content-Type, X-Game-Platform-ID, совпадающий Origin и credentials: 'include'. Сервер дополнительно передаёт X-Game-Platform-Api-Key. Не добавляйте API-ключ в браузерный код.

Получение списка подборок площадки

query PlatformCollections($lang: Lang) {
result: PlatformFetchGamePlatformCollections {
__typename
... on Problem {
message
}
... on GamePlatformCollectionsList {
count
items {
id
platformId
isActive
name(lang: $lang)
description(lang: $lang)
slug(lang: $lang)
icon(lang: $lang)
cover(lang: $lang)
sort
pinnedGames
hiddenGames
}
}
}
}

Переменные:

{
"lang": "RU"
}

Успешный ответ:

{
"data": {
"result": {
"__typename": "GamePlatformCollectionsList",
"count": 1,
"items": [
{
"id": 7,
"platformId": 42,
"isActive": true,
"name": "Популярное",
"description": "Игры, которые чаще всего выбирают пользователи",
"slug": "popular",
"icon": "https://cdn.example.com/popular.svg",
"cover": "https://cdn.example.com/popular.webp",
"sort": "PLAYERS_MAU",
"pinnedGames": [101],
"hiddenGames": []
}
]
}
}
}

Список может содержать неактивные подборки. Показывайте карточки подборок и создавайте публичные маршруты только для элементов с isActive: true.

Получение метаданных и игр подборки

Запросите в одной GraphQL-операции метаданные маршрута и игры текущей страницы. limit и offset управляют списком игр, а sort позволяет переопределить стандартную сортировку подборки для этого запроса.

query CollectionPage(
$collectionInput: FetchGamePlatformCollectionInput!
$gamesInput: FetchGameViewsByGamePlatformCollectionInput!
$lang: Lang
) {
result: FetchGamePlatformCollection(input: $collectionInput) {
__typename
... on Problem {
message
}
... on GamePlatformCollection {
id
isActive
name(lang: $lang)
description(lang: $lang)
slug(lang: $lang)
icon(lang: $lang)
cover(lang: $lang)
sort
seoSettings {
ogTitle(lang: $lang)
ogDescription(lang: $lang)
ogImage(lang: $lang)
}
}
}
gamesResult: FetchGameViewsByGamePlatformCollection(input: $gamesInput) {
__typename
... on Problem {
message
}
... on GameViewsList {
count
items {
id
name(lang: $lang)
description(lang: $lang)
icon(lang: $lang)
cover(lang: $lang)
platformUrl(lang: $lang)
rating
}
}
}
}

Переменные:

{
"lang": "RU",
"collectionInput": {
"platformId": 42,
"collectionId": 7
},
"gamesInput": {
"gamePlatformId": 42,
"collectionId": 7,
"limit": 12,
"offset": 0,
"targetOS": "Desktop"
}
}

Структура успешного ответа:

{
"data": {
"result": {
"__typename": "GamePlatformCollection",
"id": 7,
"isActive": true,
"name": "Популярное",
"slug": "popular",
"sort": "PLAYERS_MAU"
},
"gamesResult": {
"__typename": "GameViewsList",
"count": 1,
"items": [
{
"id": 101,
"name": "Пример игры",
"platformUrl": "https://games.example.com/game/example-game",
"rating": 8.4
}
]
}
}
}

Проверяйте на Problem и result, и gamesResult. В GameViewsList поле count содержит количество элементов в текущем ответе. Увеличивайте gamesInput.offset на gamesInput.limit, пока gamesResult.items.length равно gamesInput.limit; остановитесь после более короткой страницы. Доступные сортировки: PUBLISHED_AT_ASC, DATE, PLAYERS_MAU, ONLINE, RATING и RELEVANCE_SIMPLE.