У юзера есть товары, которые он может добавить в избранное.
При заходе на товар который уже в избранном у юзера, там должно быть написано "в избранном".
У меня фронт некст + кастомный бэкенд, который при авторизации отдает мне объект юзера, который я записываю в сессию.
Из того что я придумал, это получать вместе с объектом юзера, список его избранного, запихивать это в все в сессию и уже с клиента проверять в избранном даный товар или нет.
Так же можно при заходе на товар, брать айди юзера из сессии, делать запрос в бд на наличие этого товара в избранном и уже тогда узнавать в избранном товар или нет.
Но мне кажется это каким-то неоптимальным решением, какие есть еще варианты?
Алексей Уколов
@alexey-m-ukolov Куратор тега Веб-разработка
Я для решения аналогичной задачи сделал api-роут, в котором проверяется авторизация - если пользователь авторизован, то запрос проксируется на бэкенд, если не авторизован, то идёт работа с локальной сессией.
Ну а на клиенте просто в компоненте кнопки добавления в избранное через RTK-Query запрашивается id всех товаров из избранного через этот роут.
Не совсем понял как это поможет.
У меня проблема именно с клиента, то есть запрашивать каждый раз объект юзера с клиента и проверять с айди товара как то не очень, помтоу что будет задержка обновления UI до того как запрос выполнится
Написано
Алексей Уколов
@alexey-m-ukolov Куратор тега Веб-разработка
Каждый раз там запрос не идёт, только один при запуске и потом при изменениях (но там можно и оптимистичное обновление реализовать). Для такой мелочи, как получение ID нескольких товаров (или даже нескольких десятков), заброс выполняется за 100-200 мс, никто ничего и не увидит.
Но если очень хочется получать данные на сервере, то никто не мешает в RSC сделать fetch на этот роут.
Написано
Алексей Уколов
@alexey-m-ukolov Куратор тега Веб-разработка
Хранить избранное авторизованного пользователя в любом случае нужно в БД, потому что иначе он с другого устройства его не увидит. И, раз данные хранятся в БД, то в любом случае придётся в эту БД ходить. Добавлять сюда сессию - только усложнять себе жизнь, поскольку данные начинают храниться в двух местах. В сессии нужно хранить избранное только в том случае, если пользователь не авторизован (а после авторизации синхронизировать его в БД).
Написано
Алексей Уколов
@alexey-m-ukolov Куратор тега Веб-разработка
Ну и ещё важное дополнение - нужно подключать отдельные сессии (iron-session, например), потому что в next-auth для неавторизованного пользователя сессию создать нельзя.