Как разрешить пользователям ставить лайки постам через REST API

Всем привет. Я довольно новичок в Discourse и проверил раздел Все настройки сайта (/admin/site_settings), чтобы найти соответствующую опцию, позволяющую пользователям любого уровня ставить лайки постам через REST API.

На данный момент все пользователи могут (без публичного доступа) создавать темы, добавлять ответы и т. д. Однако обычный пользователь (tl0, tl1 и т. д.) не может поставить лайк любому посту через API (хотя может сделать это через веб-интерфейс).

Вот мои настройки категории:

Для добавления лайка через API я использую следующий код:

  public async likeOrThrow(contentId: number, username: string) {
    try {
      this.overrideUsername(username);
      const res = await this.client.post(`post_actions.json`, {
        id: contentId,
        post_action_type_id: 2,
        flag_topic: false,
      });
      return res.data;
    } catch (error) {
      throw this.getException(error);
    } finally {
      this.resetUsername();
    }
  }

Получаю ошибку:

У вас нет прав для просмотра запрошенного ресурса.

Однако, если я войду в Discourse как этот пользователь, то он сможет поставить лайк.

На данный момент я интегрировал API для создания тем, создания постов и закладок, используя тот же ключ API, те же категории и имя пользователя, и они работают без проблем с правами доступа.

Не могли бы вы помочь мне понять, что я делаю не так? Дайте знать, если потребуется дополнительная информация.

Спасибо

Думаю, вам понадобится

Я не знаю, но вы можете упростить настройки категории, используя только everyone.

Привет, @Bas, спасибо за комментарий,

но почему только для like? Я уже реализовал создание постов, создание ответов, добавление и удаление закладок через API Discourse, используя глобальный ключ (уровень пользователя: все пользователи, область действия: глобальная).

Также пробовал создать новый глобальный ключ API, но получаю ту же ошибку :frowning:

Если ключ API имеет глобальную область действия и действителен для всех пользователей, то следующий API должен работать, не так ли?

Да, этот код тоже выглядит хорошо.

Как и чему присваивается значение contentId? Это правильный Post.id?

Привет, @RGJ

contentId — это идентификатор поста, и да, это правильный идентификатор поста.

С помощью следующего кода выполняется логирование:

      this.client.interceptors.request.use((config) => {
        Logger.log(`Запрос к ${config.url}`);
        Logger.log(`Заголовки: ${JSON.stringify(config.headers, null, 2)}`);
        Logger.log(`Тело: ${JSON.stringify(config.data, null, 2)}`);
        return config;
      })

Лог:

[Nest] 97134  - 12/02/2024, 16:10:29     LOG Запрос к post_actions.json
[Nest] 97134  - 12/02/2024, 16:10:29     LOG Заголовки: {
  "Accept": "application/json, text/plain, */*",
  "Api-Username": "m...91",
  "Api-Key": "66dc....18b56fbc17bcf"
}
[Nest] 97134  - 12/02/2024, 16:10:29     LOG Тело: {
  "id": 84,
  "post_action_type_id": 2,
  "flag_topic": false
}

Ой, кажется, я нашел проблему. :grimacing:

Когда я проводил тест через веб-панель, я по ошибке выбрал пост другого пользователя (с тем же заголовком, что и тот, который я тестировал), и всё прошло успешно.

Но когда я тестировал это в своей системе, я пытался поставить лайк собственному посту.

Приношу извинения за любые неудобства. Я не знал, что лайкать собственные посты невозможно.

Спасибо и хорошего дня!