Сервис управляет избранными товарами пользователей. Предоставляет базовые CRUD-операции: добавление, удаление, получение списка. Используется клиентской PWA (личный кабинет, карточки товаров) для формирования «Избранного» и быстрых переходов к сохранённым товарам. Контроль доступа основан на данных NBSession - то есть все действия выполняются от имени текущего авторизованного пользователя.
SetFavoriteProductAsync(productId): void - добавить товар в избранное для текущего пользователя.UnsetFavoriteProductAsync(productId): void - удалить товар из избранного.SubsetFavoriteProductsFromListAsync(userId, productIds[]): int[] - проверить, какие из переданных товаров находятся в избранном; вернуть массив совпавших productId.GetAllFavoriteProductsAsync(userId): int[] - получить все избранные товары пользователя.Внешний API позволяет работать с
userId, однако фактический контроль (право получить/изменить избранное) обеспечивается сессией (NBSession). Это защищает от прямого доступа к чужим спискам. Таким образом, пользователь может запросить только данные по себе, если у него нет доступов. Если же есть доступы (AccessTypeEnum.FavoritesView) в NBSession, то можно укажать чужой userId.
Простейшая сущность для хранения связки «пользователь - товар». Используется в базе/репозитории:
UserId (long) - идентификатор пользователя.ProductId (int) - идентификатор товара.Эта модель позволяет хранить и искать избранное по составному ключу (UserId + ProductId).
SetFavoriteProductAsync(productId).FavoritePairDBO(UserId, ProductId) и сохраняет её.GetAllFavoriteProductsAsync) сервис возвращает все ProductId, закреплённые за текущим пользователем.SubsetFavoriteProductsFromListAsync (например, при отрисовке каталога отметить «сердечками» сохранённые товары).Содержит таблицы и индексы
-- Migration 1
favorites (
UserId INTEGER NOT NULL,
ProductId INTEGER NOT NULL,
PRIMARY KEY (UserId, ProductId)
);