Este guia explica como criar consultas de badge personalizadas acionadas no Discourse, incluindo os tipos de badges, restrições para badges acionados e uma consulta de exemplo.
Nível de usuário necessário: Administrador
Este recurso está desativado por padrão. Para ativá-lo, siga este guia.
Ao definir badges no Discourse, você encontrará uma opção “Gatilho” (Trigger) com as seguintes escolhas:
- Atualizar diariamente (Update daily)
- Quando um usuário age em uma publicação (When a user acts on post)
- Quando um usuário edita ou cria uma publicação (When a user edits or creates a post)
- Quando um usuário altera o nível de confiança (When a user changes trust level)
- Quando um usuário é editado ou criado (When a user is edited or created)
\u003cimg src=“//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com/original/3X/5/c/5ce31c4163e65073cdb0e2649d99648f5c520b53.png” width=“588” height=“500” alt=“Badge Trigger Options”\u003e
Esses gatilhos forçam a execução dos badges em intervalos mais frequentes que o diário, garantindo que os usuários sejam notificados sobre novos badges mais próximos de quando a ação ocorreu.
Tipos de badges
Existem dois tipos de badges que você pode definir:
- Badges que têm como alvo publicações (posts)
- Badges que não têm como alvo publicações
Todas as definições SQL de badge exigem que você selecione as colunas
user_idegranted_at. Se o seu badge tiver como alvo publicações, você também deverá selecionar uma coluna chamadapost_id.
Se essas colunas não estiverem diretamente disponíveis, você pode apelidá-las (alias). Por exemplo:
u.id as user_idRestrições para badges acionados
Como os badges acionados podem ser executados uma vez por minuto, você precisa fornecer mais “dicas” (hinting) na definição do badge. Não é suficiente retornar o conjunto completo de badges; você também deve fornecer dicas sobre como executar o badge em um subconjunto.
Gatilhos baseados no usuário (User-based triggers)
Se o seu gatilho for baseado no usuário, forneça uma cláusula sobre como filtrá-lo com base em
:user_ids.Gatilhos baseados na publicação (Post-based triggers)
Se o seu gatilho for baseado na publicação, forneça informações sobre como acioná-lo com base em
:post_ids.
Lembre-se de que uma retroalimentação completa (full backfill) é executada diariamente de qualquer maneira, portanto, você deve considerar isso e incluir o tratamento do parâmetro
:backfill.Sua consulta de badge acionado sempre incluirá o parâmetro
:backfille o parâmetro:post_idsou:user_ids.Exemplo de consulta de badge acionado
Aqui está um exemplo de um badge acionado “quando um usuário age em uma publicação”. Neste caso, as aplicações “delta” receberão o parâmetro
:post_ids:SELECT p.user_id, p.id post_id, p.updated_at granted_at FROM badge_posts p WHERE p.like_count >= 25 AND (:backfill OR p.id IN (:post_ids) )A cláusula
(:backfill OR p.id IN (:post_ids) )permite a filtragem dos resultados. Quando o trabalho diário é executado,:backfillé verdadeiro, então o conjunto inteiro é verificado. Quando os trabalhos delta são executados,:backfillé falso e:post_idsé definido.Por que a sugestão manual é necessária
A consulta de concessão de badge executa sua consulta de badge em uma “subconsulta”. Muitas vezes, o otimizador do PostgreSQL tem dificuldades ao verificar o conjunto completo quando a cláusula está na consulta principal. Embora possa lidar bem com consultas triviais, pode falhar com agregações mais complexas.
Para evitar problemas potenciais, essa restrição foi adicionada, permitindo que você aplique filtros no local mais apropriado.
Precisa de ajuda?
Se você está com dificuldades para escrever uma consulta de badge, poste uma pergunta em Support - descreva o que você está tentando alcançar e inclua seu trabalho em andamento. A comunidade tentará ajudar.
Os gatilhos de badge podem ser complexos. Muitas vezes, as atualizações “diárias” são suficientes, e você pode ignorar os aspectos mais intrincados das consultas acionadas.
38 curtidas