Где хранить «избранное» юзера?

Ссылка скопирована
1 ответ

У юзера есть товары, которые он может добавить в избранное.
При заходе на товар который уже в избранном у юзера, там должно быть написано "в избранном".

У меня фронт некст + кастомный бэкенд, который при авторизации отдает мне объект юзера, который я записываю в сессию.

Из того что я придумал, это получать вместе с объектом юзера, список его избранного, запихивать это в все в сессию и уже с клиента проверять в избранном даный товар или нет.
Так же можно при заходе на товар, брать айди юзера из сессии, делать запрос в бд на наличие этого товара в избранном и уже тогда узнавать в избранном товар или нет.
Но мне кажется это каким-то неоптимальным решением, какие есть еще варианты?

Дополнительно:

Я для решения аналогичной задачи сделал api-роут, в котором проверяется авторизация - если пользователь авторизован, то запрос проксируется на бэкенд, если не авторизован, то идёт работа с локальной сессией.
Ну а на клиенте просто в компоненте кнопки добавления в избранное через RTK-Query запрашивается id всех товаров из избранного через этот роут.

  • Не совсем понял как это поможет.
    У меня проблема именно с клиента, то есть запрашивать каждый раз объект юзера с клиента и проверять с айди товара как то не очень, помтоу что будет задержка обновления UI до того как запрос выполнится
  • Каждый раз там запрос не идёт, только один при запуске и потом при изменениях (но там можно и оптимистичное обновление реализовать). Для такой мелочи, как получение ID нескольких товаров (или даже нескольких десятков), заброс выполняется за 100-200 мс, никто ничего и не увидит.
    Но если очень хочется получать данные на сервере, то никто не мешает в RSC сделать fetch на этот роут.
  • Хранить избранное авторизованного пользователя в любом случае нужно в БД, потому что иначе он с другого устройства его не увидит. И, раз данные хранятся в БД, то в любом случае придётся в эту БД ходить. Добавлять сюда сессию - только усложнять себе жизнь, поскольку данные начинают храниться в двух местах. В сессии нужно хранить избранное только в том случае, если пользователь не авторизован (а после авторизации синхронизировать его в БД).
  • Ну и ещё важное дополнение - нужно подключать отдельные сессии (iron-session, например), потому что в next-auth для неавторизованного пользователя сессию создать нельзя.
  • Алексей Уколов, да хранение и так будет в бл, тут вопрос больше в синхронизации между беком и клиентом.
    Но в принципе я вашу идею понял, спасибо.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Виктор Sys Ответ

Для хранения "избранного" пользователя можно использовать различные подходы в зависимости от того, какой функционал вы хотите реализовать и какие требования к хранению данных у вас есть. Вот несколько вариантов, которые могут быть полезны в этом случае:

1. Хранение на сервере: Вы можете создать базу данных, где будет храниться информация о "избранных" пользователях. Для этого можно использовать SQL базу данных, такую как MySQL или PostgreSQL. Вы можете создать таблицу, в которой будет храниться ID пользователя и ID его "избранных" элементов. При необходимости, вы также можете хранить дополнительные данные о "избранных" элементах.

```

// Пример кода для создания таблицы избранных элементов в MySQL
CREATE TABLE favorites (
user_id INT,
favorite_id INT
);
```

2. Хранение в куки: Если вам необходимо хранить "избранное" пользователя на клиентской стороне, вы можете использовать куки. Вы можете сохранить ID "избранных" элементов в куки пользователя и при необходимости получить эти данные обратно.

```

// Пример кода для установки куки с избранными элементами
setcookie("favorites", json_encode($favorites), time() + (86400 * 30), "/");
```

3. Хранение в сессии: Если вам нужно хранить "избранное" пользователя только на протяжении текущей сессии, вы можете использовать сессии PHP. Вы можете сохранить ID "избранных" элементов в сессию и получить их обратно в любом месте вашего приложения.

```

// Пример кода для сохранения избранных элементов в сессии
$_SESSION['favorites'] = $favorites;
```

Независимо от того, какой метод хранения "избранного" пользователя вы выберете, важно убедиться, что данные хранятся безопасно и с учетом конфиденциальности пользователей. Также важно обеспечить возможность добавления, удаления и обновления "избранных" элементов пользователя в вашем приложении.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно