favorite.md 3.5 KB

FavoriteService

Назначение

Сервис управляет избранными товарами пользователей. Предоставляет базовые CRUD-операции: добавление, удаление, получение списка. Используется клиентской PWA (личный кабинет, карточки товаров) для формирования «Избранного» и быстрых переходов к сохранённым товарам. Контроль доступа основан на данных NBSession - то есть все действия выполняются от имени текущего авторизованного пользователя.

Публичные методы

  • SetFavoriteProductAsync(productId): void - добавить товар в избранное для текущего пользователя.
  • UnsetFavoriteProductAsync(productId): void - удалить товар из избранного.
  • SubsetFavoriteProductsFromListAsync(userId, productIds[]): int[] - проверить, какие из переданных товаров находятся в избранном; вернуть массив совпавших productId.
  • GetAllFavoriteProductsAsync(userId): int[] - получить все избранные товары пользователя.

Внешний API позволяет работать с userId, однако фактический контроль (право получить/изменить избранное) обеспечивается сессией (NBSession). Это защищает от прямого доступа к чужим спискам. Таким образом, пользователь может запросить только данные по себе, если у него нет доступов. Если же есть доступы (AccessTypeEnum.FavoritesView) в NBSession, то можно укажать чужой userId.

Модели

FavoritePairDBO

Простейшая сущность для хранения связки «пользователь - товар». Используется в базе/репозитории:

  • UserId (long) - идентификатор пользователя.
  • ProductId (int) - идентификатор товара.

Эта модель позволяет хранить и искать избранное по составному ключу (UserId + ProductId).

Типовой поток

  1. Пользователь нажимает «добавить в избранное» на карточке товара.
  2. PWA вызывает SetFavoriteProductAsync(productId).
  3. Сервис создаёт запись FavoritePairDBO(UserId, ProductId) и сохраняет её.
  4. При запросе списка (GetAllFavoriteProductsAsync) сервис возвращает все ProductId, закреплённые за текущим пользователем.
  5. Для массовой проверки используется SubsetFavoriteProductsFromListAsync (например, при отрисовке каталога отметить «сердечками» сохранённые товары).

DB

Содержит таблицы и индексы

-- Migration 1
favorites (
    UserId INTEGER NOT NULL,
    ProductId INTEGER NOT NULL,
    PRIMARY KEY (UserId, ProductId)
);

Назад