# Edições não estão sendo salvas na tabela user\_actions

**URL:** https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025
**Category:** Development
**Created:** [21 Março , 2020 08:34 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025 "2020-03-21T08:34:20Z")
**Posts on this page:** 19
**Page:** 1

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [21 Março , 2020 08:34 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/1 "2020-03-21T08:34:20Z")

</div>

Eu achava que, toda vez que um usuário edita o post de outra pessoa, essa ação seria registrada na tabela `user_actions`, mas acabei percebendo que isso só acontece esporadicamente (apenas para alguns usuários, em alguns momentos).

Isso é o comportamento esperado ou há outra condição que não estou considerando?

É difícil fornecer um passo a passo para reproduzir esse problema, mas foi assim que detectei:

1. Encontre um post com uma notificação de edição:  
 ![image](https://global.discourse-cdn.com/meta/original/3X/1/d/1d8b23fca9965cea2dd188bec2715866bd834517.png)
2. Faça uma consulta na tabela `user_actions` para o `acting_user_id` dado (o editor), o `user_id` dado (o editado) e o `topic_id` dado. No meu caso:

```plaintext
select * from user_actions ua 
where ua.acting_user_id = 229 
and ua.user_id = 259 
and ua.target_topic_id = 1907;

```

Isso é o que obtenho:

- O tipo de ação 2 significa que o usuário editado recebeu um LIKE do editor.
- O tipo de ação 6 significa que o editor respondeu ao usuário editado.

```plaintext
  id | action_type | user_id | target_topic_id | target_post_id | target_user_id | acting_user_id | created_at | updated_at
-------+-------------+---------+-----------------+----------------+----------------+----------------+----------------------------+----------------------------
 78476 | 2 | 259 | 1907 | 17893 | | 229 | 2020-03-20 03:39:12.255619 | 2020-03-20 03:39:12.395574
 78478 | 6 | 259 | 1907 | 17900 | | 229 | 2020-03-20 03:44:04.847102 | 2020-03-20 03:44:04.847102

```

Posso confirmar ambas essas ações na interface, mas também esperaria encontrar um `action_type` 11 indicando a EDIÇÃO.

Além de ver a edição na interface, também posso confirmar sua existência na tabela `post_revisions` consultando usando o `target_post_id`:

```plaintext
select id, user_id, post_id, number, created_at, updated_at from post_revisions pr where post_id = 17893;

  id | user_id | post_id | number | created_at | updated_at |
------+---------+---------+--------+----------------------------+----------------------------+--------
 8927 | 229 | 17893 | 2 | 2020-03-20 03:40:06.644576 | 2020-03-20 03:43:32.769535 |

```

Então, por que essa ação não aparece em `user_actions`?

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [24 Março , 2020 04:14 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/4 "2020-03-24T04:14:26Z")

</div>

Edições não devem ser armazenadas lá; elas são armazenadas em `post_revisions`.

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [24 Março , 2020 07:14 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/5 "2020-03-24T07:14:13Z")

</div>

Certo, não a edição. Quero dizer o evento user\_action EDIT:

> <https://github.com/discourse/discourse/blob/main/app/models/user_action.rb#L19>

O problema é que ele é acionado 90% das vezes. Não entendo por que não funciona nos outros 10%.

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [11 Abril , 2020 10:15 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/6 "2020-04-11T10:15:24Z")

</div>

Acabei de perceber que ou não entendo totalmente os casos em que uma notificação de edição é criada, ou este é um problema muito mais generalizado do que eu pensava.

## Principais suposições

Se o Usuário A edita algo escrito pelo Usuário B, várias coisas acontecem:

- Uma nova linha é adicionada à tabela `post_revisions`.
- Uma nova linha é adicionada à tabela `user_actions` com `action_type = 11`.
- Ao acessar `/u/userB/notifications/edits`, o Usuário B poderá ver que uma nova edição foi feita pelo Usuário A (isso depende de `user_actions`).
- Ao clicar no ícone de lápis em sua postagem, o Usuário B poderá ver a edição real realizada pelo Usuário A (isso depende de `post_revisions`).

## Teste

Se as suposições acima estiverem corretas, esta consulta deve mostrar todas as linhas da tabela `post_revisions` para postagens criadas pelo Usuário B (neste caso, id 259) que foram editadas por qualquer usuário (exceto ele mesmo ou o usuário do sistema), **juntamente com as linhas correspondentes em `user_actions` para `action_type = 11`**.

```sql
with my_user_posts as (
  select
    p.id,
    p.user_id
  from
    posts p
  where
    p.user_id = 259 -- escolha um id de usuário
)
select
  up.user_id as my_user_id,
  ua.user_id as target_user_id,
  pr.post_id,
  ua.target_post_id,
  pr.user_id as editor_user_id,
  ua.acting_user_id,
  ua.action_type,
  pr.created_at as edit_created_at,
  ua.created_at as action_created_at
from
  post_revisions pr
  inner join my_user_posts up on up.id = pr.post_id
  and up.user_id != pr.user_id -- sem autoedições
  and pr.user_id != -1 -- sem edições do sistema
  left join user_actions ua on ua.target_post_id = pr.post_id
  and ua.action_type = 11 -- apenas ações de EDIÇÃO
order by
  pr.post_id,
  pr.created_at;

```

### Saída esperada

Cada linha deve conter dados tanto de `post_revisions` quanto de `user_actions`.

### Saída real

Algumas linhas de `post_revisions` não possuem dados correspondentes em `user_actions`. Portanto, o usuário pode ver as revisões clicando no lápis em cada postagem, mas **não foi notificado sobre várias edições recebidas**.

 ![image](https://global.discourse-cdn.com/meta/original/3X/4/5/4538be4d461c0d93515bd2f9e340dfcc9b98cd96.png)

## Coisas que tentei

- Adicionar uma edição adicional a uma postagem antiga sem dados de `user_action`. **Resultado** : os dados de `user_action` também não apareceram.
- Criar um usuário fictício, copiar o conteúdo pré-edição de uma postagem sem dados de `user_action`, criar uma postagem com ele e aplicar a mesma edição que foi feita com outro usuário. **Resultado** : os dados de `user_action` apareceram corretamente.
- Repetir os procedimentos acima quando o usuário está ativo ou offline. Resultado: nenhuma mudança.
- Repetir os procedimentos acima alterando o período de graça para edições. Resultado: nenhuma mudança.

## Conclusões

- O problema não parece ser:

- O problema parece ser:

- Uma possibilidade é que algo esteja acontecendo durante a criação de postagens específicas que impede que as ações de usuário de EDIÇÃO sejam salvas, mas não tenho ideia do que poderia ser isso.

- Também é possível que isso esteja acontecendo por design e que existam condições específicas nas quais os usuários não são notificados sobre edições, mas não encontrei isso documentado em nenhum lugar.

## Próximos passos

- Se você souber de algum motivo pelo qual as notificações de edição podem não ser acionadas toda vez que há uma edição, por favor, me avise.
- Se você tiver sua própria instância do Discourse, poderia executar a consulta SQL acima em alguns dos ids de usuário para ver se também observa dados ausentes de `user_actions` e me relatar?

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [12 Abril , 2020 03:47 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/7 "2020-04-12T03:47:35Z")

</div>

Eu só quero ter 100% de certeza de que você está claro sobre os períodos de graça para edições, que ainda se aplicariam mesmo que um usuário diferente esteja editando a postagem.

 ![image](https://global.discourse-cdn.com/meta/original/3X/5/3/5349994eaabde177c4de20381cb5f47f9e7cd53b.jpeg)

(Sim, se o usuário A editar a postagem do usuário B, sempre haverá uma revisão de edição forçada, mas isso não significa que, se o usuário A editar a postagem do usuário B 6 vezes em 60 segundos, haverá 6 revisões e 6 notificações criadas. Haverá apenas uma revisão e uma notificação, como você pode ver na captura de tela acima.)

Cada uma dessas edições foi feita com **mais de 5 minutos de intervalo**?

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [12 Abril , 2020 07:31 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/8 "2020-04-12T07:31:19Z")

</div>

Obrigado pelo comentário, Jeff. Posso confirmar que, sim, essas edições estão com mais de 5 minutos de diferença. Mas mesmo que não estivessem, desde que seja criada uma única post\_revision, não deveria haver SEMPRE uma EDIT user\_action correspondente?

Como observação lateral, também tentei alterar o período de tolerância para edição para 0 e, ao fazer isso, são criadas 2 post\_revisions idênticas para cada alteração. Não sei se isso é intencional ou se é um bug não relacionado.

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [12 Abril , 2020 17:17 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/9 "2020-04-12T17:17:14Z")

</div>

> [@Nacho\_Caballero](#):
>
> essas edições estão com mais de 5 minutos de intervalo

Só confirmando isso, bom ter certeza.

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [17 Abril , 2020 18:26 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/10 "2020-04-17T18:26:35Z")

</div>

> [@Nacho\_Caballero](#):
>
> essa consulta

Alguém poderia executar a consulta acima em seu site Discourse para ver se também obtém post\_revisions sem user\_actions correspondentes do tipo 11?

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [22 Abril , 2020 07:05 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/11 "2020-04-22T07:05:26Z")

</div>

Analisando nosso código, acredito que você só recebe o tipo de user\_action 11 se editar a postagem de outra pessoa ou disparar uma notificação sobre a edição de alguma outra forma.

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [22 Abril , 2020 07:28 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/12 "2020-04-22T07:28:06Z")

</div>

Obrigado, Sam. Era isso que eu esperava, mas não é o que eu encontrei (no meu site, pelo menos). Como você pode ver nos resultados da minha consulta, em alguns casos, o usuário A edita uma postagem do usuário B (o que adiciona uma linha em post\_revisions), mas não há uma linha correspondente em user\_actions (com action\_type 11). Isso é o que eu não entendo.

> [@Nacho\_Caballero](#):
>
> Algumas linhas de `post_revisions` não possuem dados correspondentes em `user_actions`. Portanto, o usuário pode ver as revisões clicando no lápis em cada postagem, mas **não foi notificado sobre ter recebido várias edições**.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [22 Abril , 2020 08:16 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/13 "2020-04-22T08:16:16Z")

</div>

Você tem uma reprodução do problema? É algo que ocorreu apenas uma vez?

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [22 Abril , 2020 08:31 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/14 "2020-04-22T08:31:10Z")

</div>

Isso vem acontecendo de forma contínua e esporádica desde que iniciei meu site. Como mencionei acima, não consegui identificar um padrão.

> [@Nacho\_Caballero](#):
>
> ## Coisas que já tentei
> 
> - Adicionar uma edição adicional a uma postagem antiga sem dados de `user_action`. **Resultado** : os dados de `user_action` também não apareceram.
> - Criar um usuário fictício, copiar o conteúdo pré-edição de uma postagem sem dados de `user_action`, criar uma postagem com ele e aplicar a mesma edição feita por outro usuário. **Resultado** : os dados de `user_action` apareceram corretamente.
> - Repetir os procedimentos acima quando o usuário está ativo ou offline. Resultado: nenhuma mudança.
> - Repetir os procedimentos acima alterando o período de graça para edição. Resultado: nenhuma mudança.

Se houver uma maneira de eu fornecer um dump de dados ou se precisar de outras informações, ficarei feliz em ajudar.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [22 Abril , 2020 08:36 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/15 "2020-04-22T08:36:15Z")

</div>

Apenas para garantir que estou entendendo corretamente, o bug real que você está relatando aqui é:

> Em algumas condições, o Usuário A edita uma postagem do Usuário B e o Usuário B não recebe nenhuma notificação?

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [22 Abril , 2020 09:13 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/16 "2020-04-22T09:13:02Z")

</div>

Exatamente. A notificação não aparece [aqui](https://meta.discourse.org/my/notifications/edits) nem na caixa do usuário (já que ambas dependem de user\_actions):

 ![image](https://global.discourse-cdn.com/meta/original/3X/0/0/00e0537ded121cf3317a1980742ce9ce909a1bf1.png)

No entanto, ela aparece no canto superior direito da postagem (já que isso depende de post\_revisions):

 ![image](https://global.discourse-cdn.com/meta/original/3X/5/5/557a5f40fbb0dcf7d631515a9a5c092674acb070.png)

> [@Nacho\_Caballero](#):
>
> ## Teste

Escrevi uma consulta para testar isso. Se você executá-la no seu site (com diferentes IDs de usuário), também deverá ver lacunas.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [22 Abril , 2020 22:42 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/17 "2020-04-22T22:42:37Z")

</div>

Esta é uma instância hospedada por nós ou uma instância auto-hospedada?

Nossa notificação é acionada aqui:

> <https://github.com/discourse/discourse/blob/776caa24c9454b67fd0d2c3737263c126eb3b557/app/services/post_action_notifier.rb#L117-L127>

A condição é bastante rigorosa:

> <https://github.com/discourse/discourse/blob/776caa24c9454b67fd0d2c3737263c126eb3b557/app/services/post_action_notifier.rb#L104-L106>

A notificação é criada aqui:

> <https://github.com/discourse/discourse/blob/776caa24c9454b67fd0d2c3737263c126eb3b557/app/jobs/regular/notify_post_revision.rb#L11-L24>

O que poderia quebrar isso é:

1. O Sidekiq com fila de jobs acumulada ou pausado

2. Condição extremamente rara de interromper o job no meio do processo de notificação

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [23 Abril , 2020 07:17 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/18 "2020-04-23T07:17:14Z")

</div>

Posso dar um exemplo específico em uma instância hospedada por você.

[Esta postagem](https://nachotime.discourse.group/t/re-dia-3-pronunciacion-vocales/165/2) (id 1067), criada pelo usuário 3 em 2019-08-03 19:22 UTC, recebeu uma edição minha (usuário 2) alguns minutos após sua criação.

No entanto, nenhuma user\_action do tipo 11 foi criada (diferentemente das outras 2 edições que esse usuário recebeu naquele dia nas postagens 1001 e 1003)

 ![image](https://global.discourse-cdn.com/meta/original/3X/7/5/7528bdff9217f0147a7268b3b73048b6a6098846.png)

Você pode ver mais claramente se executar esta consulta:

```plaintext
with my_user_posts as (
  select
    p.id,
    p.user_id
  from
    posts p
  where
    p.user_id = 3 -- escolha um user_id
)
select
  up.user_id as my_user_id,
  ua.user_id as target_user_id,
  pr.post_id,
  ua.target_post_id,
  pr.user_id as editor_user_id,
  ua.acting_user_id,
  ua.action_type,
  pr.created_at as edit_created_at,
  ua.created_at as action_created_at
from
  post_revisions pr
  inner join my_user_posts up on up.id = pr.post_id
  and up.user_id != pr.user_id -- sem edições próprias
  and pr.user_id != -1 -- sem edições do sistema
  left join user_actions ua on ua.target_post_id = pr.post_id
  and ua.action_type = 11 -- apenas ações de EDIT  
WHERE
  pr.created_at between '2019-08-03' and '2019-08-04'
order by
  pr.post_id,
  pr.created_at

```

Executei algumas análises e, dependendo da data, entre 7% e 25% das post\_revisions que não são edições próprias não possuem uma user\_action correspondente.

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [2 Maio , 2020 02:28 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/21 "2020-05-02T02:28:45Z")

</div>

Pode ser que, afinal, tenhamos um bug aqui, @Nacho_Caballero… fiquem atentos. Obrigado por persistir nisso.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [4 Maio , 2020 07:58 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/22 "2020-05-04T07:58:39Z")

</div>

Tivemos este bug:

> <https://github.com/discourse/discourse/commit/3d0ccf864243fdfecc07ad3764df499a7b7a55f8>
>
> Due to a refactor in e90f9e5cc47 we stopped notifying on edits if
> a user liked a… post and then edited.
> 
> The like could have happened a long time ago so this gets extra
> confusing.
> 
> This change makes the suppression more deliberate. We only want
> to suppress quite/link/mention if the user already got a reply
> notification.
> 
> We can expand this suppression if it is not enough.

E melhorei a implementação com esta funcionalidade:

> <https://github.com/discourse/discourse/commit/3877ef2cfa17155a4c6063d6d3625c9bd4d5b5df>
>
> This ensures that at a minimum you are notified once a day of
> repeat edits by th…e same user.
> 
> Long term we may consider winding this down to say 1 hour or
> making it configurable.

Tivemos um caso limite em que, quando um usuário curtia uma postagem de outro usuário e, em seguida, a editava, não recebíamos notificação sobre a edição.

Além disso, adicionei uma proteção de segurança que garante que notifiquemos incondicionalmente uma vez por dia, mesmo que seja o mesmo editor. (Suprimimos notificações de edições repetidas do mesmo editor por 1 dia). Isso não é configurável no momento.

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [4 Maio , 2020 08:18 UTC](https://meta.discourse.org/t/edits-not-being-stored-in-user-actions-table/145025/23 "2020-05-04T08:18:51Z")

</div>

Excelente. Isso faz muito sentido. Muito obrigado pela correção!
