Agendamento de PM de script de automação com resultados do Data Explorer não envia PMs

Usamos uma instância hospedada do Discourse e fazemos uso do plugin Automation fornecido com sua gama de scripts e gatilhos, no entanto, estamos tendo problemas para receber PMs do script ‘Schedule PM with data explorer results’.

Parece que o gatilho de Automação está funcionando e a consulta do Data Explorer está sendo executada (esta consulta funciona e produz resultados quando executada manualmente), no entanto, não estamos recebendo nenhuma PM após isso. Tentei comigo mesmo como destinatário e também com o grupo ‘Admin’, mas em ambos os casos nenhuma PM é recebida.

Não tenho certeza se estou perdendo algo óbvio aqui, mas qualquer ajuda seria apreciada.

1 curtida

Olá Christian :wave:

Você vê algo relacionado em /logs?

2 curtidas

Eu acho que estou vendo algo semelhante:

A consulta do explorador de dados parece ter sido executada:

Mas nenhum PM é entregue.

Eu vejo este erro em /logs:

Message (5 copies reported)

Job exception: undefined method `to_sym' for nil:NilClass


Backtrace

/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:20:in `block (2 levels) in convert'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each_with_index'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `block in convert'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `each'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `convert'
/var/www/discourse/plugins/discourse-data-explorer/lib/report_generator.rb:20:in `generate'
/var/www/discourse/plugins/discourse-data-explorer/plugin.rb:117:in `block (4 levels) in activate!'
/var/www/discourse/plugins/discourse-automation/app/models/discourse_automation/automation.rb:83:in `trigger!'
/var/www/discourse/plugins/discourse-automation/app/jobs/scheduled/discourse_automation_tracker.rb:36:in `run_pending_automation'

Eu também recebo um erro ‘500’ se eu tentar acionar a automação manualmente, e este erro (ligeiramente diferente) nos logs:

Message (4 copies reported)

NoMethodError (undefined method `to_sym' for nil:NilClass)
app/controllers/application_controller.rb:418:in `block in with_resolved_locale'
app/controllers/application_controller.rb:418:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:369:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:228:in `call'

Backtrace

plugins/discourse-data-explorer/lib/result_to_markdown.rb:20:in `block (2 levels) in convert'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each_with_index'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `block in convert'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `each'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `convert'
plugins/discourse-data-explorer/lib/report_generator.rb:20:in `generate'
plugins/discourse-data-explorer/plugin.rb:117:in `block (4 levels) in activate!'
plugins/discourse-automation/app/models/discourse_automation/automation.rb:83:in `trigger!'
plugins/discourse-automation/app/controllers/discourse_automation/automations_controller.rb:10:in `trigger'

Vamos mover isso para Bug e ver se conseguimos que alguém dê uma olhada. :+1:

2 curtidas

Após um pouco mais de investigação, acho que pode estar relacionado ao tipo de consulta que você está tentando executar. Acabei de tentar com uma bem simples e consegui executá-la e enviar uma mensagem privada. Você poderia compartilhar qual é a sua consulta?

1 curtida

Obrigado por investigar isso.
A consulta não é totalmente simples e se parece com isto:

WITH
ua AS (
  SELECT target_topic_id, COUNT(id) FROM user_actions
  WHERE action_type = 15
  GROUP BY target_topic_id
)
SELECT
  t.id,
  t.title,
  t.created_at,
  t.last_posted_at,
  t.views,
  t.posts_count,
  t.user_id,
  t.last_post_user_id
FROM topics t
INNER JOIN users us ON us.id = t.user_id
LEFT JOIN ua ON ua.target_topic_id = t.id
WHERE t.deleted_at IS NULL
  AND t.closed = false
  AND t.archived = false
  AND t.visible = true
  AND ua.target_topic_id IS NULL
  AND us.username_lower != 'system'
  AND t.created_at > now() - INTERVAL '7' DAY
ORDER BY created_at DESC

Como eu disse, ela é executada manualmente e produz resultados.

1 curtida

Por manualmente, você quer dizer acionar a consulta do explorador de dados ou acionar o script do plugin de automação?

1 curtida

Do explorador de dados.

1 curtida

Acho que tem a ver com a mágica de estilo user_id que o explorador de dados faz ao convertê-los de IDs brutos para links utilizáveis. Se eu executar seu relatório como está, ele dá erro como você está vendo, mas se eu remover t.user_id e t.last_post_user_id do SELECT, ele funciona.

Se eu converter esses para nomes de usuário simples, também parece funcionar corretamente através da automação:


WITH
ua AS (
  SELECT target_topic_id, COUNT(id) FROM user_actions
  WHERE action_type = 15
  GROUP BY target_topic_id
)
SELECT
  t.id,
  t.title,
  t.created_at,
  t.last_posted_at,
  t.views,
  t.posts_count,
  us.username,
  u2.username
FROM topics t
INNER JOIN users us ON us.id = t.user_id
LEFT JOIN ua ON ua.target_topic_id = t.id
JOIN users u2 ON u2.id = t.last_post_user_id
WHERE t.deleted_at IS NULL
  AND t.closed = false
  AND t.archived = false
  AND t.visible = true
  AND ua.target_topic_id IS NULL
  AND us.username_lower != 'system'
  AND t.created_at > now() - INTERVAL '7' DAY
ORDER BY created_at DESC

Embora também tenhamos contatado alguém mais experiente para analisar com mais detalhes. :+1: :slight_smile:


Embora separadamente, não tenho certeza se sua consulta faz o que você quer. Está de alguma forma relacionada à Solução, pois estou vendo muitos PMs nos meus resultados?

3 curtidas

Obrigado, vou tentar com alterações no ID do usuário.

Eu não escrevi essa consulta originalmente, então ainda não determinei se ela nos dará o que queremos de qualquer maneira, então provavelmente a reescreverei.

2 curtidas

É esta linha: https://github.com/discourse/discourse-data-explorer/blob/705753216cc632b4f6505d2000926ab3b73d8628/lib/result_to_markdown.rb#L20

related = relations.dig(colrender[col_index].to_sym) if col_index < colrender.size

A condição if no final está incorreta: colrender deveria ser esparso, não empacotado. Ele conterá nulos se algumas, mas não todas, as colunas fornecerem dados de renderização adicionais.

A verificação correta provavelmente seria unless colrender[col_index].nil?

Além disso, este código parece negligenciar os tipos de renderização url, reltime e html porque eles não são classes ActiveRecord.

6 curtidas

Para mim, parece que não consigo acionar com sucesso este script de automação, qualquer que seja a consulta do explorador de dados. Por exemplo:

SELECT username from users
LIMIT 10

Erro 500 ao acionar manualmente da Automação:

Mensagem (3 cópias relatadas)

TypeError (Nil não é uma fonte JSON válida.)
app/controllers/application_controller.rb:418:in `block in with_resolved_locale'
app/controllers/application_controller.rb:418:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:369:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:228:in `call'

Backtrace

plugins/discourse-data-explorer/lib/report_generator.rb:42:in `parse'
plugins/discourse-data-explorer/lib/report_generator.rb:42:in `params_to_hash'
plugins/discourse-data-explorer/lib/report_generator.rb:15:in `generate'
plugins/discourse-data-explorer/plugin.rb:117:in `block (4 levels) in activate!'
plugins/discourse-automation/app/models/discourse_automation/automation.rb:83:in `trigger!'
plugins/discourse-automation/app/controllers/discourse_automation/automations_controller.rb:10:in `trigger'
actionpack (7.0.4.3) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (7.0.4.3) lib/abstract_controller/base.rb:215:in `process_action'
actionpack (7.0.4.3) lib/action_controller/metal/rendering.rb:53:in `process_action'
actionpack (7.0.4.3) lib/abstract_controller/callbacks.rb:234:in `block in process_action'

Env

HTTP HOSTS: discourse.canapin.dev

Estes problemas experimentados devem ser corrigidos com este PR:

4 curtidas

Este tópico foi automaticamente fechado após 2 dias. Novas respostas não são mais permitidas.