Como posso permitir que os usuários curtam posts usando REST API

Olá a todos. Sou bem novo no Discourse e verifiquei a seção Todas as Configurações do Site (/admin/site_settings) para encontrar uma opção correspondente que permita a qualquer nível de usuário curtir posts usando a RESTapi.

No momento, todos os usuários podem (sem ser público) criar tópicos, adicionar respostas, etc. No entanto, um usuário normal (tl0, tl1 etc) não pode curtir nenhum post através da API (mas pode curtir usando o painel web).

Aqui estão as configurações da minha categoria:

Estou usando o seguinte código para adicionar uma curtida através da 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();
    }
  }

Ele retorna:

Você não tem permissão para visualizar o recurso solicitado.

No entanto, se eu fizer login no Discourse como o usuário, então esse usuário pode dar uma curtida.

Até agora, integrei as APIs de criação de tópico, criação de post e marcador com a mesma chave de API, com as mesmas categorias e nome de usuário, e elas funcionam sem problemas de permissão.

Você poderia me ajudar a descobrir o que estou fazendo de errado? Me avise se mais informações forem necessárias.

Obrigado.

1 curtida

Eu acho que você vai precisar de

Não sei, mas você pode facilitar as configurações da sua categoria usando apenas everyone.

2 curtidas

Olá @Bas, obrigado pelo comentário,

mas por que apenas para like? Eu já implementei a criação de posts, criação de respostas, adição e remoção de favoritos usando a API do Discourse com chave global (usuário: todos-os-usuários, escopo: global)

Também tentei criar uma nova chave de API global, ainda recebo o mesmo erro :frowning:

Se a chave de API tiver escopo global e for válida para todos os usuários, então a seguinte API deveria funcionar. não é?

Sim, este código parece bom para mim também.

Como / para que contentId está sendo definido? É o Post.id correto?

Olá @RGJ

contentId é o ID da postagem e sim, é o ID correto da postagem.

Com o seguinte código, ele registra:

      this.client.interceptors.request.use((config) => {
        Logger.log(`Request to ${config.url}`);
        Logger.log(`Headers: ${JSON.stringify(config.headers, null, 2)}`);
        Logger.log(`Body: ${JSON.stringify(config.data, null, 2)}`);
        return config;
      })

Log:

[Nest] 97134  - 12/02/2024, 4:10:29 PM     LOG Request to post_actions.json
[Nest] 97134  - 12/02/2024, 4:10:29 PM     LOG Headers: {
  "Accept": "application/json, text/plain, */*",
  "Api-Username": "m...91",
  "Api-Key": "66dc....18b56fbc17bcf"
}
[Nest] 97134  - 12/02/2024, 4:10:29 PM     LOG Body: {
  "id": 84,
  "post_action_type_id": 2,
  "flag_topic": false
}

Oh, caramba, acho que encontrei o problema. :grimacing:

Quando fiz o teste usando o painel web, escolhi acidentalmente uma postagem de outro usuário (mesmo título do que eu estava testando) e funcionou.

Mas quando testei usando meu sistema, estava tentando adicionar um like a uma postagem própria.

Peço desculpas por qualquer inconveniente. Eu não sabia que não era possível dar like em postagens próprias.

Obrigado e tenha um bom dia.

3 curtidas

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.