[TabNews] Mudanças nos TabCoins e mais melhorias 🎉
Fala turma, tudo bem? Mais uma publicação sobre novidades, e parte delas parece invisível, mas são importantes para darmos conta do crescimento de usuários sem impactar na qualidade e disponibilidade do TabNews.
Ganho de Tabcoins ao publicar
Estamos animados em anunciar uma atualização importante em nosso sistema de recompensa por criação de conteúdo com valor concreto. Com base em muitas sugestões e feedbacks, realizamos uma mudanças que visa tornar o processo de ganho de TabCoins mais justo.
A partir de agora o ganho de TabCoins será baseado nas qualificações dos conteúdos já publicados do mesmo usuário. No momento da publicação será computada a média das qualificações de até 10 conteúdos do mesmo usuário. E em cima da média será aplicado um fator que determina o ganho. Mais detalhes podem ser vistos no PR #1366 e na issue #1381 em que expliquei toda a mecânica atual de TabCoins.
Limitar publicações não relevantes
A partir de agora a permissão para publicar também considera os conteúdos já publicados. Caso um usuário tenha muitas publicações classificadas como não relevantes, ele será avisado para excluir esses conteúdos antes de publicar novamente.
Isso garante que o sistema continue recompensando aqueles que produzem conteúdo de qualidade e diminui as chances de publicações não relevantes afetarem negativamente a experiência no TabNews.
Apesar de não haver mudanças recentes na regra de exclusão de conteúdos, vale a pena lembrar resumidamente como ela funciona:
Se o conteúdo estiver classificado como relevante, o usuário devolve tudo que ganhou com esse conteúdo, somando o que ganhou ao publicar e o saldo resultante das qualificações.
Já se o conteúdo estiver zerado ou negativo, a devolução será apenas da quantidade de TabCoins que ganhou ao fazer a publicação. Se um usuário não ganhou nada, ele também não devolve nada na exclusão.
Alterações em conteúdos já publicados
Aqui não houve nenhuma mudança para os usuários das versão web do TabNews, mas pela API é possível usar algumas funcionalidades extras (e não totalmente implementadas), como salvar uma publicação como rascunho.
Então foi preciso criar dois bloqueios de funcionalidades que estavam presentes na API, mas que poderiam ser utilizados para manipular a economia do sistema:
-
Não é mais possível alterar o
parent_id
de um conteúdo. Com isso não é possível criar um comentário em uma publicação e depois de um tempo mudar esse mesmo comentário para outras publicações. -
Não é mais possível mudar o status
published
paradraft
. O padrão ao publicar pela API continua sendo o status rascunho, mas após tornar o conteúdo público, só será possível editar ou excluir, mas não voltar para rascunho.
Cache da API
Foi configurado cache em todos os endpoints que devolvem dados públicos. Todos estão com a estratégia de mostrar o dado obsoleto enquanto ocorre a revalidação (SWR - Stale While Revalidate).
Assim as respostas da API se tornam mais rápidas, e requisições subsequentes não precisam ser processadas em duplicidade pelo backend.
E o fato de não precisar processar requisições subsequentes já nos ajudou demais nessa semana, pois o TabNews foi citado novamente no vídeo do Programador Chaves, no canal do Filipe Deschamps, e isso explodiu mais uma vez os acessos ao sistema.
Vejam no gráfico a seguir, que compara o uso dos endpoints de conteúdos na API com os acessos na home, onde todos os acessos subiram bastante logo após o lançamento do vídeo, mas o uso da API caiu para abaixo do patamar anterior logo após a implantação do cache:
A Cloudflare também nos ajuda bastante com essa configuração de cache na API, pois ela nem repasa as requisições para a Vercel.
No gráfico acima eu comparei a API com os acessos apenas da home ("/"), pois ficava mais fácil de ver a mudança que ocorreu, mas se ficaram curiosos sobre o volume de acessos para todas as páginas estáticas após o lançamento do vídeo, então vejam no gráfico abaixo 🚀:
Revalidação dos dados obsoletos
A versão web já utilizava a estratégia SWR em que as páginas prioritariamente são carregadas com os dados disponíveis em cache e isso dispara a revalidação do cache no servidor. Mas essa estratégia faz com que às vezes vejamos dados que já tenham sofrido modificações no backend, mas que ainda não foram propagadas para o cache.
Uma estratégia bastante utilizada é carregar os dados obsoletos e logo em seguida fazer uma requisição que busca os dados mais atualizados. Incialmente o TabNews utilizava a biblioteca swr
e fazia isso para todas as páginas que poderiam ter dados obsoletos, mas essa revalidação aumenta consideravelmente a utilização de recursos, então desde o lançamento do TabNews não foi possível manter isso em todas as páginas. Do lançamento até agora, essa configuração foi mantida apenas na página dos conteúdos.
Só que agora foi preciso usar a estratégia SWR também na API, o que inviabiliza utilizá-la para recuperar dados atualizados em tempo real. Então a nova estratégia é mostrar os dados em cache, e se eles forem obsoletos, aguardar a revalidação e requisitar os dados atualizados, tudo sem precisar da API, apenas utilizando o Next.js e a biblioteca next-swr
.
E isso nos permitiu voltar a fazer essa revalidação em todas as páginas, então se você ver os dados mudando pouco depois da página carregar, era porque estava vendo dados obsoletos. 🎉
Bug de sessão expirada
Dias atrás, em uma modificação feita às pressas quando o TabNews estava sofrendo um ataque, eu acabei criando um bug que fazia com que sessões expiradas não fossem revalidadas sem a exclusão manual dos dados do usuário no localStorage
, com isso o usuário parecia estar logado, mas não conseguia executar nenhuma ação que precisasse de autorização.
O @RomildoRocha e o @pab-h nos alertaram que não estavam conseguindo publicar, e o @pab-h conseguiu ajudar ainda mais ao passar os detalhes do que estava ocorrendo e nos ajudou a identificar e consertar o bug no useUser()
. Muito obrigado! 💪
Conclusão
A Turma está comprometida em tornar o TabNews o mais justo e transparente possível. Agradecemos a todos pelo apoio contínuo e esperamos que essas mudanças beneficiem a todos os usuários. 🚀