FAQ — частые вопросы
Ответы на типичные вопросы администраторов и разработчиков DM Shop. Если нужного вопроса здесь нет — загляните в обзор или в технические разделы.
Общее
Как войти в админ-панель?
Откройте /signin на витрине, войдите учётной записью с ролью EDITOR, MANAGER, ADMIN или SUPER_ADMIN, затем перейдите на /admin. Набор разделов зависит от роли.
Какие есть роли и чем они отличаются?
Пять ролей: USER (покупатель), EDITOR (контент), MANAGER (контент + продажи), ADMIN (всё, кроме управления лицензией), SUPER_ADMIN (всё). Подробности — в разделе Безопасность.
Я ничего не вижу в админке / получаю 403
Скорее всего у учётной записи недостаточная роль. Доступ проверяется на бэкенде (Spring Security), а не только в интерфейсе. Попросите администратора повысить роль в разделе Пользователи.
Каталог и синхронизация
Откуда берутся товары и почему их нельзя создать вручную?
Товары, категории и бренды загружаются из внешней системы mphone по расписанию (каждые 5 минут). Ручное создание не предусмотрено — можно редактировать отдельные поля (цена сайта, описание, ручные атрибуты, изображения).
Как часто обновляется каталог?
Синхронизация mphone запускается по cron 0 */5 * * * * — каждые 5 минут. XML-пайплайн (атрибуты и картинки) — тоже каждые 5 минут. Это не 30 секунд.
Данные из mphone выглядят устаревшими — что делать?
В разделе Настройки → Синхронизация нажмите «Сбросить» у нужного потока (категории/бренды/товары) — следующий прогон загрузит данные с нуля. Кнопка «Запустить» запускает синхронизацию немедленно.
Можно ли отключить автоматические задачи?
Да. Каждая фоновая задача управляется флагом в таблице app_config: job_sync_enabled, xml_feed_pipeline_enabled, job_category_visibility_enabled, job_gbstore_mapping_enabled. По умолчанию все включены.
Как задать цену, отличную от mphone?
В карточке товара укажите «Цену сайта» (site_price) — она перекрывает цену из mphone на витрине. Полезно для акций.
Почему категория пропала из меню?
Фоновая задача авто-скрытия прячет категории без активных товаров (помечает auto_hidden_by_visibility_sync). Включить категорию обратно можно вручную в разделе Категории.
Как изменить порядок категорий?
Перетаскиванием (drag-and-drop) в дереве категорий. При большом числе видимых строк (>400) DnD отключается — используйте кнопки «вверх/вниз».
Изображения
Почему у товара нет картинки и как её добавить?
Картинки скрейпятся со страницы товара у поставщика. Если их нет — проверьте статус в карточке товара (раздел «Парсинг изображений») или в Каталог → Очередь картинок, при необходимости запустите повторный парсинг. Также можно загрузить фото вручную через медиатеку. См. Парсинг изображений.
Картинки спарсились неправильно — как заменить?
Задайте ручное переопределение в XML Пайплайн → Переопределения картинок: режим REPLACE (заменить все) или APPEND (добавить к спарсенным).
Как обновить фото, не теряя привязки к товарам?
В медиатеке используйте «Заменить» — ID изображения сохраняется, все ссылки на него остаются. Не удаляйте и не загружайте заново.
Какой максимальный размер файла?
10 МБ. Поддерживаются JPG, PNG, WebP, GIF.
Заказы
Какие статусы у заказа?
NEW → PROCESSING → SENT → COMPLETED, а также ERROR, CANCELLED, ARCHIVED. Статус ERROR не финальный — заказ можно передать в mphone повторно.
Заказ завис в статусе «Ошибка» — что делать?
Откройте заказ и нажмите «Передать в mphone» ещё раз. Частая причина — недоступность mphone API в момент отправки.
Меняются ли суммы старых заказов при изменении каталога?
Нет. Каждая позиция хранит снимок названия и цену на момент заказа (price_at_order), поэтому сумма не меняется.
Как учитывается доставка?
Стоимость доставки задаётся менеджером в карточке заказа (delivery_cost) и прибавляется к сумме. В карточке есть справочник тарифов по зонам.
Как удалить старые заказы массово?
В списке заказов есть блок очистки: предпросмотр покажет, сколько заказов старше N дней будет удалено, после чего их можно удалить одной операцией (только ADMIN/SUPER_ADMIN).
XML-фид и атрибуты
Чем отличается синхронизация mphone от XML-пайплайна?
mphone даёт сам каталог (товары, цены, остатки). XML-фид (Яндекс.Маркет YML) даёт атрибуты и ссылки на изображения. XML обрабатывается многоэтапным пайплайном.
Я добавил правило атрибутов, но ничего не изменилось
Запустите синк с галочкой «Сбросить кеш хеша» — иначе фид считается неизменным (по SHA-256) и пропускается. См. Правила атрибутов.
Где посмотреть, что именно пришло в фиде?
В XML Пайплайн → Снепшоты: для каждого оффера видны параметры и фрагмент исходного XML.
Разработка
Как поднять проект локально?
docker-compose up -d (PostgreSQL, SeaweedFS, mock-api), затем ./gradlew bootRun в back/ и npm run dev в front/. Подробно — в Быстром старте.
Какой порт у чего?
Фронтенд 3000, бэкенд 8080, PostgreSQL 45432, SeaweedFS S3 8333, mock-api 8010.
Где Swagger?
http://localhost:8080/swagger-ui.html. Эндпоинты /swagger-ui/** и /v3/api-docs/** открыты без авторизации.
Как добавить миграцию БД?
Создайте новый changeset в back/src/main/resources/db/changelog/changes/ и зарегистрируйте его в db.changelog-master.xml. Никогда не меняйте уже применённые changeset'ы. Hibernate работает в режиме validate.
Почему падают тесты?
Интеграционные тесты используют Testcontainers — нужен запущенный Docker. Также для JWT задайте корректный JWT_SECRET (валидный base64). См. заметку о тестах в репозитории.