Consultas de medalhas usando a tabela "badge_posts" não são concedidas para categorias não públicas

Um de nossos usuários tinha 5 emblemas de “Resposta Legal” (curtiu 100 posts e deu 100 curtidas). Depois, movemos alguns tópicos para uma categoria privada, e agora ele tem apenas 3 emblemas. Parece que a consulta de emblemas não está contando as curtidas dadas ou recebidas nos tópicos movidos, talvez porque foram movidos ou porque agora são privados.

Ao depurar isso, copiei a consulta de emblemas para o Data Explorer:

select p.user_id, p.id post_id, current_timestamp granted_at
from badge_posts p
where p.post_number > 1
and p.like_count >= 10

A consulta acima retorna apenas 3 resultados para o usuário, mas deveria ser 5. Percebi que ela usa a tabela “badge_posts”. Não consigo encontrar a tabela badge_posts na visualização em árvore do Data Explorer. Então, alterei “badge_posts” para “posts”, e aí ela retorna 5, como esperado.

De onde vem a tabela “badge_posts” e a consulta de emblemas não deveria usar a tabela “posts” em vez disso?

Essa tabela me confundiu por muito tempo. Ela é definida aqui: discourse/lib/badge_posts_view_manager.rb at main · discourse/discourse · GitHub. É uma view do PostgreSQL. Minha compreensão de uma view é que ela é um nome atribuído a uma consulta.

Postagens na view badge_posts são postagens visíveis que não estão em categorias com restrição de leitura. Quando você moveu seus tópicos para uma categoria privada, você removeu suas postagens da view badge_posts.

Nossa categoria privada não é tão privada assim — você só precisa aceitar uma política para obter acesso. Então, gostaria de incluir posts dessa categoria. Acredito que precisaria criar uma insígnia personalizada com aparência semelhante à de ‘Resposta Legal’ (e ‘Resposta Boa’ e ‘Resposta Excelente’), mas usando posts em vez de badge_posts.