# FavoriteService ## Назначение Сервис управляет избранными товарами пользователей. Предоставляет базовые CRUD-операции: добавление, удаление, получение списка. Используется клиентской PWA (личный кабинет, карточки товаров) для формирования «Избранного» и быстрых переходов к сохранённым товарам. Контроль доступа основан на данных **NBSession** - то есть все действия выполняются от имени текущего авторизованного пользователя. ## Публичные методы * `SetFavoriteProductAsync(productId): void` - добавить товар в избранное для текущего пользователя. * `UnsetFavoriteProductAsync(productId): void` - удалить товар из избранного. * `SubsetFavoriteProductsFromListAsync(userId, productIds[]): int[]` - проверить, какие из переданных товаров находятся в избранном; вернуть массив совпавших `productId`. * `GetAllFavoriteProductsAsync(userId): int[]` - получить все избранные товары пользователя. > Внешний API позволяет работать с `userId`, однако фактический контроль (право получить/изменить избранное) обеспечивается сессией (NBSession). Это защищает от прямого доступа к чужим спискам. Таким образом, пользователь может запросить только данные по себе, если у него нет доступов. Если же есть доступы ([AccessTypeEnum](/common/accessTypeEnum.md).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) ); ``` [Назад](/index.md)