filipedeschamps / tabnews.com.br

Conteúdos para quem trabalha com Programação e Tecnologia.
https://tabnews.com.br
GNU General Public License v3.0
5.32k stars 388 forks source link

Publicação ao ser removida, devolve TabCoins de quem negativou #1155

Closed filipedeschamps closed 1 year ago

filipedeschamps commented 1 year ago

Contexto

Dado a alguns relatos no passado, as pessoas não gostam muito de usar suas TabCoins para negativar uma publicação, onde apesar da negativação e positivação gerarem o mesmo número de TabCash, eu entendo esta sensação. Mas como esta curadoria é algo importante principalmente para identificar conteúdos que estão seriamente quebrando os Termos de Uso, uma das sugestões que surgiu foi de, ao remover um conteúdo, todas as pessoas que deram down vote acabem recebendo estas TabCoins de volta.

Isto não irá fazer diferença para conteúdos que estão sendo levemente negativados e não serão deletados, mas irá fazer muita diferença quando um conteúdo for seriamente negativado e possui uma altíssima probabilidade de ser deletado. Então acho justo esta mecânica e vai ser algo saudável para a economia, pois a pessoa corretamente sinalizou algo que deveria ser removido.

Execução

Eu imagino que iremos precisar adicionar uma condicional a mais na função creditOrDebitTabCoins() do model content:

https://github.com/filipedeschamps/tabnews.com.br/blob/0bbb0f655dc88847fa741001a83d3f3297bf01a1/models/content.js#L531-L558

Em paralelo, o model balance possui um método para desfazer uma operação (ela é usada no ato de Nuke):

https://github.com/filipedeschamps/tabnews.com.br/blob/0bbb0f655dc88847fa741001a83d3f3297bf01a1/models/balance.js#L118-L131

Mas o model não possui hoje uma forma de selecionar as operações negativas contra um certo conteúdo. Mas dá para fazer isso só analisando a tabela balance_operations, identificando as linhas com amount negativo de um recipient_id (que é o id do conteúdo).

eletroswing commented 1 year ago

Neste caso, os tabcash ganho também seriam removidos? e ao devolver, devolveria diretamente o valor debitadp no post( 1 tabcoin) ou devolveriamos o valor debitado do usúario ( 2 tabcoins)?

aprendendofelipe commented 1 year ago

Bom ponto @eletroswing!

Acho que podemos manter o tabcash ganho. E para isso não virar uma maneira de criar tabcashs do nada, podemos devolver apenas 1 tabcoin para quem qualificou negativamente a publicação deletada.

Resumindo, quem qualificar uma publicação negativamente vai ganhar um desconto no tabcash (vai custar só 1 e não 2 tabcoins) caso essa publicação venha a ser deletada pelo autor que percebeu que publicou algo não relevante.

eletroswing commented 1 year ago

@aprendendofelipe estou testando e cheguei numa possível query que já pega todos os valores negativos de todos conteudos deletados (por usuario) e que pega de um conteudo especifico, se puder dar uma olhada pra comentar, aqui esta: SELECT DISTINCT base.originator_id, base.recipient_id, (SELECT COALESCE(sum(o.amount), 0) FROM balance_operations as o WHERE o.balance_type = 'content:tabcoin' AND o.amount < 0 AND o.originator_id=base.originator_id) as Credit FROM balance_operations as base WHERE base.balance_type = 'content:tabcoin' AND base.amount < 0 AND base.recipient_id = $content_id --aqui definimos o id do conteudo, caso eliminado a clausula AND acima, --todas as transações negativas de todos os posts deletados serão retornadas com o valor credit que --deve ser creditado na conta do usúario, podendo ser inserido por meio de um include AND ( SELECT status FROM contents WHERE id=base.recipient_id ) = 'deleted'

aprendendofelipe commented 1 year ago

@eletroswing desconfio que as queries necessárias já estão prontas e só precisaria definir direito a regra de negócio para inserir no código.

eletroswing commented 1 year ago

@aprendendofelipe

Em paralelo, o model balance possui um método para desfazer uma operação (ela é usada no ato de Nuke):

A função undo(se não me engane se refere a esta originalmente) desfaz uma operação por vez baseado no id da operação, acredito que desfazer todas as operações de down_vote seria um pouco pesado usando ela dependendo do tamanho do conteúdo, uma vez que pode ser resolvida numa única query direta do banco de dados, podendo ser chamada ao deletar o conteúdo e ja desfazendo para todos os usuários de uma vez. Mas em geral, não tenho certeza o que pesaria mais, a query única ou chamar a query de 'undo' para cada operação

eletroswing commented 1 year ago

@aprendendofelipe , ao registrar o evento gerador, reparei que todos os o eventos são do tipo "content", mas ao retornar o tabcoin, usamos o evento do tipo "user", então, como deveria ser o registro do evento gerador?

aprendendofelipe commented 1 year ago

Oi @eletroswing, os eventos de exclusão de conteúdos são do tipo update:content:text_child ou update:content:text_root. Mas não precisa mudar nada na lógica de criação do evento, que é criado aqui:

https://github.com/filipedeschamps/tabnews.com.br/blob/22a6d3aca8e3c6ec24ffa7a24f5a713c48e1a5f7/pages/api/v1/contents/%5Busername%5D/%5Bslug%5D/index.public.js#L143

Só vai ser preciso usar o ID desse evento, obtendo ele de options.eventId, e salvar como originatorId em todos os registros que serão criados relacionados ao mesmo ato de exclusão de um conteúdo.

Daí a função que cria o balanço também já está pronta. É essa aqui:

https://github.com/filipedeschamps/tabnews.com.br/blob/0bbb0f655dc88847fa741001a83d3f3297bf01a1/models/balance.js#L23

O que ainda não existe é a consulta que retorna quais são os Ids de usuários que votaram negativamente no conteúdo que está sendo excluído.

Daí vai ser inserido um novo fluxo ali onde o Filipe citou:

https://github.com/filipedeschamps/tabnews.com.br/blob/0bbb0f655dc88847fa741001a83d3f3297bf01a1/models/content.js#L531-L558

Acho que esse fluxo pode iniciar dentro deste else:

    } else {
      amountToDebit = userDefaultEarnings;
    }

Assim só devolve os TabCoins se o conteúdo estiver zerado ou negativado. Nesse fluxo será realizada a consulta dos Ids, e serão criados os novos registros na tabela balance_operations.

Fazer tudo isso em uma só consulta ao banco seria muito mais performático, mas muito mais difícil de fazer manutenção e ajustes, então seria otimização prematura.

Melhor primeiro fazer funcionar de forma simples, e depois otimizar. 👍

aprendendofelipe commented 1 year ago

Isto não irá fazer diferença para conteúdos que estão sendo levemente negativados e não serão deletados, mas irá fazer muita diferença quando um conteúdo for seriamente negativado e possui uma altíssima probabilidade de ser deletado. Então acho justo esta mecânica e vai ser algo saudável para a economia, pois a pessoa corretamente sinalizou algo que deveria ser removido.

Refletindo melhor eu chego na conclusão de que quando a pessoa vota positivamente em algo que realmente deveria ser destacado como relevante é a mesma situação. Então a retribuição deve ser a mesma, como já é.

E se realmente existe algo psicológico que faça a quantidade de votos positivos ser maior do que negativos, então precisamos lidar com isso:

Por isso eu reconsidero minha resposta abaixo:

Neste caso, os tabcash ganho também seriam removidos? e ao devolver, devolveria diretamente o valor debitadp no post( 1 tabcoin) ou devolveriamos o valor debitado do usúario ( 2 tabcoins)?

Acho que podemos manter o tabcash ganho. E para isso não virar uma maneira de criar tabcashs do nada, podemos devolver apenas 1 tabcoin para quem qualificou negativamente a publicação deletada.

Não podemos criar um incentivo maior para quem vota negativamente do que positivamente, pois isso será aproveitado por quem não quiser qualificar honestamente os conteúdos, já que se ele só estiver interessado em converter seus TabCoins em TabCash, será muito mais vantajoso sair distribuindo votos negativos para quaisquer conteúdos.

Então não só retiro a minha ideia de dar um "desconto" no valor do TabCash para quem negativou, mas também peço que pensem um pouco melhor se ao aplicarmos essa regra de devolver os TabCoins não estamos reforçando a ideia errada de que votar positivamente ou negativamente traz beneficios diferentes, quando não deveria trazer e deveria ser algo totalmente baseado na avaliação da relevância do conteúdo.

aprendendofelipe commented 1 year ago

Vou encerrar esse issue como não planejada, pois ela parte da premissa de que as pessoas não gostam muito de usar suas TabCoins para negativar uma publicação, mas olhei os últimos 100 dias e temos 1 voto negativo para cada 4 positivos.

Então o que é proposto colocaria a economia em risco de colapsar, já que poderia aumentar os votos negativos ao ponto de frear a geração de TabCoins e inviabilizar o sistema de qualificações.

Estou fechando, mas qualquer coisa abrimos novamente. 🤝