Роутер shop отвечает за витрину магазина: категории, товары, корзину, промокоды и покупки. Административные операции (создание товаров, управление заказами) находятся в отдельном роутере admin.shop. Путь: trpc.shop.*

Вложенные роутеры

categories

Работа с категориями товаров.

categories.list

Получение списка видимых категорий, отсортированных по полю order.
  • Тип: query
  • Доступ: publicProcedure
serverId
number
Фильтр по серверу (опционально)

categories.getBySlug

Получение категории по slug. Возвращает категорию или null.
  • Тип: query
  • Доступ: publicProcedure
slug
string
required
Slug категории
serverId
number
Фильтр по серверу

items

Работа с товарами. Поля images и metadata возвращаются распарсенными из JSON.

items.list

Получение списка видимых товаров с пагинацией, отсортированных по полю order.
  • Тип: query
  • Доступ: publicProcedure
serverId
number
Фильтр по серверу
categoryId
number
Фильтр по категории
Только рекомендуемые товары
limit
number
Количество (1–100, по умолчанию 50)
offset
number
Смещение (минимум 0, по умолчанию 0)

items.getBySlug

Получение видимого товара по slug. Возвращает товар или null.
  • Тип: query
  • Доступ: publicProcedure
slug
string
required
Slug товара
serverId
number
Фильтр по серверу

items.getById

Получение товара по ID. Возвращает товар или null.
  • Тип: query
  • Доступ: publicProcedure
id
number
required
ID товара

cart

Работа с корзиной текущего пользователя.

cart.get

Получение содержимого корзины. Каждый элемент включает связанный товар (item) с распарсенными полями images и metadata.
  • Тип: query
  • Доступ: protectedProcedure
serverId
number
Фильтр по серверу (опционально)

cart.add

Добавление товара в корзину. Если товар уже в корзине, его количество увеличивается. Проверяется наличие на складе (stock).
  • Тип: mutation
  • Доступ: protectedProcedure
itemId
number
required
ID товара
quantity
number
Количество (минимум 1, по умолчанию 1)
serverId
number
ID сервера (опционально)
Ответ: { success: true }

cart.updateQuantity

Изменение количества товара в корзине. Проверяется наличие на складе.
  • Тип: mutation
  • Доступ: protectedProcedure
cartItemId
number
required
ID позиции корзины
quantity
number
required
Новое количество (минимум 1)
Ответ: { success: true }

cart.remove

Удаление позиции из корзины.
  • Тип: mutation
  • Доступ: protectedProcedure
cartItemId
number
required
ID позиции корзины
Ответ: { success: true }

cart.clear

Очистка корзины.
  • Тип: mutation
  • Доступ: protectedProcedure
serverId
number
Очистить только для указанного сервера (опционально)
Ответ: { success: true }

promocodes

Работа с промокодами.

promocodes.validate

Проверка промокода для текущего пользователя.
  • Тип: query
  • Доступ: protectedProcedure
code
string
required
Промокод (минимум 1 символ, проверяется без учёта регистра)
serverId
number
ID сервера для проверки привязки промокода (опционально)
Ответ при ошибке:
valid
boolean
false, если промокод невалиден
error
string
Причина невалидности (промокод не найден, неактивен, ещё не активен, истёк, исчерпан, не действует на этом сервере, уже использован)
Ответ при успехе:
valid
boolean
true
promocode
object
Объект промокода: { id, code, discountType, discountValue, minOrderAmount, maxDiscount }. Поле discountType принимает значения percent или fixed; minOrderAmount и maxDiscount могут быть null.

purchases

Покупки и история заказов.

purchases.checkout

Оформление заказа из корзины. Списывает средства с баланса пользователя, применяет промокод (если указан), уменьшает остатки на складе, очищает корзину и записывает активность. При наличии RCON-соединения и валидного имени игрока пытается выдать товары на сервере командами.
  • Тип: mutation
  • Доступ: protectedProcedure
serverId
number
ID сервера (опционально). Также используется для фильтрации позиций корзины и выдачи через RCON.
promocode
string
Промокод для скидки
Ответ:
success
boolean
Успешность оформления заказа
orderId
string
Уникальный ID заказа (формат ORD-XXXXX-XXXXXXXX)
totalAmount
number
Сумма до скидки
discountAmount
number
Размер скидки по промокоду
finalAmount
number
Итоговая сумма к списанию
balance
number
Остаток на балансе после списания
delivered
boolean
Были ли товары выданы на сервере через RCON

purchases.history

История покупок текущего пользователя, отсортированная по дате создания (новые первыми). Денежные поля приводятся к числам, items распарсивается из JSON.
  • Тип: query
  • Доступ: protectedProcedure
limit
number
Количество (1–50, по умолчанию 20)
offset
number
Смещение (минимум 0, по умолчанию 0)

purchases.getByOrderId

Получение заказа текущего пользователя по orderId. Возвращает заказ или null.
  • Тип: query
  • Доступ: protectedProcedure
orderId
string
required
ID заказа

purchases.pending

Список оплаченных, но ещё не выданных заказов текущего пользователя (статус paid).
  • Тип: query
  • Доступ: protectedProcedure
serverId
number
Фильтр по серверу (опционально)