Acabei de revisar a implementação de “rastreamento” e “acompanhamento” de tags e categorias:
O acompanhamento de categorias e tags sempre foi um recurso bastante limitado. Quando você começava a acompanhar uma categoria, só recebia notificações sobre os tópicos daquela categoria a partir daquele momento. (Havia uma exceção que permitia acompanhar também tópicos antigos recategorizados)
Essa limitação era… hmm… limitante. Comece a acompanhar Contribute > Bug e você não seria notificado sobre uma grande quantidade de discussões atuais em Contribute > Bug em tópicos históricos.
A nova implementação agora resolve o problema do histórico de forma bastante limpa.
Estado de rastreamento de tópicos
Para cada tópico que você visita, o Discourse armazena um registro com informações do usuário sobre aquele tópico.
- Quando você o visitou pela primeira vez?
- Em qual postagem você está?
- Você está rastreando/acompanhando/silenciando?
- E assim por diante
Quando uma conta é criada pela primeira vez, não há registros nessa tabela; eles são criados sob demanda conforme você visita tópicos.
Isso significa que, em um fórum antigo e estabelecido com 200 mil tópicos, não precisamos criar 200 mil linhas por usuário com o estado de rastreamento para cada nova conta.
Esse foi o motivo original pelo qual o “acompanhamento” era limitado ao período “a partir de agora”. Eu não queria ter que preencher centenas de milhares de linhas ao acompanhar uma categoria. Seria um pesadelo de desempenho.
A nova implementação resolve esse problema definindo um conceito de “acompanhamento implícito”. Quando uma nova postagem é criada, também verificamos as preferências de categoria e tag (além das preferências no nível do tópico) para decidir quem deve ser notificado. Isso nos permite notificar de forma limpa sobre tópicos antigos sem precisar manter registros no estado de rastreamento de tópicos (até o último momento).
Quando um novo tópico é acessado e criamos a linha do estado de rastreamento, também verificamos as preferências de tag e categoria do usuário para saber se ele deve estar acompanhando no objeto inicializado.
Nova implementação de rastreamento e acompanhamento
A nova implementação de acompanhamento funciona assim:
Quando um usuário acompanha uma categoria/tag:
- Todos os registros de estado de rastreamento de tópicos antigos que estão em “rastreamento” ou “regular” naquela categoria passam a ser “acompanhados” (com o motivo “você está acompanhando esta categoria”)
- Armazenamos um registro para indicar que o usuário está acompanhando a categoria
- Tópicos com estado ausente são acompanhados implicitamente; um registro de rastreamento é criado quando notificamos os usuários.
Quando um usuário para de acompanhar uma categoria/tag:
- Todos os tópicos acompanhados naquela categoria que foram acompanhados devido ao acompanhamento da categoria passam a ser rastreados
- Removemos o registro que indica que o usuário está acompanhando a categoria
Nota: Removi a “tomada de decisão” sobre o que fazer com o histórico do usuário. Como é bastante simples “parar de rastrear” se necessário, basta clicar em “Dispensar”. Na grande maioria das vezes, a decisão de parar de acompanhar está correta e não há motivo para envolver o usuário aqui.
A implementação de rastreamento é mais simples:
- Todos os registros de estado de rastreamento de tópicos antigos que estão em “regular” passam a ser “rastreados”.
- O restante é rastreado implicitamente, sem registro.
Não “paramos de rastrear” nada para você se você parar de rastrear uma categoria. A expectativa é que você não fique apenas mexendo nas configurações ali, pois reverter não é trivial. E se você leu o tópico, postou nele, o rastreou manualmente ou atingiu o tempo de leitura? Uma implementação mais simples é deixar com que os usuários cliquem no botão “Dispensar” se ficarem presos a tópicos que não querem rastrear.
Categorias como “listas de e-mail”
Essa implementação libera a capacidade de usar o acompanhamento de “categoria” ou “tag” como substituto de listas de e-mail. Esse recurso foi solicitado com frequência.
Período de transição
Não há “migração” do sistema antigo para o novo. Se você tem muitos “estados de rastreamento” para tópicos antigos e um “acompanhamento de categoria”, você deve:
- Parar de acompanhar a categoria
- Voltar a acompanhar a categoria
Isso corrigirá todos os estados de rastreamento. Vou considerar adicionar uma migração para isso talvez em uma semana ou mais, quando o sistema estiver totalmente estabilizado.
Espero que prefiram essa implementação simplificada. Comentários? Perguntas?
