Executando verificação de segurança...
20

Novas melhorias: Novo Algoritmo de Ranqueamento e mais 3 melhorias (+1 Breaking Change) 🎉

Fala turma! Se passaram 8 dias desde a última publicação de melhorias e temos 4 melhorias interessantes (+1 Breaking Change) e uma conversa muito importante sobre como beneficiar com TabCoins as pessoas que estão contribuindo no core do projeto.

Caso queira acompanhar esta conversa e dar sua opinião, peço encarecidamente que leia isto: Procuro Opiniões: Como fazer "core committers" do TabNews ganharem TabCoins?.

Agora vamos para as melhorias dessa última semana :)

1) Novo algoritmo de ranqueamento

Dois novos algoritmos de ranqueamento foram publicados nestes últimas dias, sendo que o último (Beta4) lida melhor com o que acontece na lista de Relevantes quando ela é vista num final de semana onde a quantidade de publicações é menor. Na versão atual há um balanço melhor entre os itens recentes e itens não tão recentes mas muito relevantes.

Os dois algoritmos foram implementados por aprendendofelipe e saga com todas as informações das versões de ranqueamento, incluindo todos os PRs, podem ser conferidas por essa Issue* 🎉

2) Bug nas respostas

A interface do TabNews estava com um bug levemente irritante que surgiu após trazermos a otimização do componente Link que faz as páginas abrirem instantâneamente para grande parte dos casos. O bug era revelado quando você publicava uma resposta e em seguida navegava para qualquer outra URL que fosse de algum conteúdo carregado pelo modo instantâneo (usando o componente Link), onde neste caso, a resposta que você publicou (em outro lugar) aparecia também nesta nova página que você acabou de entrar. Este era apenas um glitch visual que não alterava nada no backend, mas poderia confundir completamente o usuário ao ponto de talvez fazer ele deletar a sua publicação ao acreditar que publicou no lugar errado (ou que a publicação foi duplicada).

O ajuste disso foi executado inicialmente por Rafaelb4rros através desse PR* e alguns dias depois o aprendendofelipe fez uma proposta mais simples através desse PR* que foi merged 👍 comunidade do TabNews continuando ser simplesmente sensacional 😍 em paralelo, outras informações podem ser conferidas por essa Issue* 🎉

3) Lidar com caracteres especiais que quebram o Postgres

Você sabia que se enviar para o Postgres o caractere \u0000 em qualquer lugar de uma string ele retorna um erro invalid byte sequence for encoding "UTF8": 0x00?

Muito massa e quem descobriu esse comportamento foi 33gustavo33 ao fazer alguns testes no nosso ambiente de homologação. Do nada comecei a receber alertas especializados de ServiceError com o seguinte:

{
   "level":50,
   "time":1662855718038,
   "environment":"preview",
   "payload":{
      "name":"ServiceError",
      "message":"invalid byte sequence for encoding \"UTF8\": 0x00",
      "action":"Verifique se o serviço está disponível.",
      "status_code":503,
      "error_id":"9dfeb486-5b1a-458c-9b08-da27fe56fdff",
      "context":{
         "query":"\n      WITH\n        updated_content as (\n          UPDATE contents SET\n            parent_id = $2,\n            slug = $3,\n            title = $4,\n            body = $5,\n            status = $6,\n            source_url = $7,\n            published_at = $8,\n            updated_at = (now() at time zone 'utc'),\n            deleted_at = $9\n          WHERE\n            id = $1\n          RETURNING *\n        )\n      SELECT\n        updated_content.id,\n        updated_content.owner_id,\n        updated_content.parent_id,\n        updated_content.slug,\n        updated_content.title,\n        updated_content.body,\n        updated_content.status,\n        updated_content.source_url,\n        updated_content.created_at,\n        updated_content.updated_at,\n        updated_content.published_at,\n        updated_content.deleted_at,\n        users.username as owner_username\n      FROM\n        updated_content\n      INNER JOIN\n        users ON updated_content.owner_id = users.id\n      ;"
      },
      "error_location_code":"INFRA:DATABASE:QUERY",
      "database_error_code":"22021"
   }
}

Onde para gerar isto, bastava você criar ou atualizar uma publicação com o seguinte:

{
    "body":"\u0000"
}

Delícia demais 😍 e há vários outros caracteres com comportamento interessantes, então eu sinceramente sugiro você ler sobre a implementação que foi realizada por aprendendofelipe que estão centralizadas nesta Issue*, principalmente o link para o PR na seção Execução que novamente tem uma discussão sensacional da comunidade open source mais sensacional do Brasil 🎉

4) Altera request.connection por estar deprecado

O developerdavi estava navegando pelo projeto e encontrou uma propriedade que foi deprecada a partir da versão 16 do Node.js (que é a versão que atualmente usamos):

Erro no TypeScript

Se aprofundando um pouco mais, o Davi encontrou que a propriedade connection vai ser substituída pela propriedade socket em versões futuras do Node.js:

Mensagem de deprecado do Node.js

O legal, é que ajustar isso foi realizado pelo próprio developerdavi e as informações podem ser conferidas por essa Issue* 🎉

5) Breaking Change em /api/v1/contents/[username]

No passado anunciamos que o 33gustavo33 através do PR* está fazendo uma implementação na rota que retorna os conteúdos de um usuário para que retorne tanto conteúdos root (os que aparecem na raiz do TabNews), quanto conteúdos child (que são respostas contra outros conteúdos).

Apesar do objeto retornado no endpoint ser idêntico, esta alteração fará aparecer itens que possuem a propriedade title com o valor null, como no caso das respostas. Na interface do TabNews iremos implementar um comportamento para identificar quando a propriedade parent_id está preenchida, e ao invés de mostrar na lista o title, mostrar uma parte do body com uma identificação que aquele item ali é uma resposta.

Não há data para isto entrar em vigor, mas caso você tenha algum client do TabNews que liste as publicações de um usuário, você já pode realizar esta implementação sem problema algum. Inclusive, é o que iremos fazer no TabNews, onde primeiro iremos preparar a interface para esse tipo de comportamento, e depois realizar o deploy do backend (ou os dois ao mesmo tempo).

Conclusão

A turma é muito massa, está mais do que provado, e chegou a hora de encontrarmos uma forma de contribuir com TabCoins, então peço novamente que participe desta discussão: Procuro Opiniões: Como fazer "core committers" do TabNews ganharem TabCoins?.


⚠️ O repositório Open Source do TabNews ainda está em Modo Privado. Caso queira receber um convite para participar, leia esta publicação.

3

É interessante notar como esses posts de melhorias estão ficando cada vez mais técnicos e apenas com consertos de bugs.

Pra mim isso mostra que o projeto está amadurecendo!