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