-
Notifications
You must be signed in to change notification settings - Fork 403
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Valida metadata
de todos tipos de evento e usa snake_case
#1764
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ótimo que trouxe isso para ser analisado de forma isolada de todo o ruído do #1638 👍
Padronizar metadados em snake_case
Estou em dúvida se vale a pena mudar como armazenamos metadata
. Se mudar isso, a gente deveria atualizar todos dados antigos no Postgres para corresponder ao novo padrão. Não é?
Se não for atualizar os dados antigos, devemos deixar o validador flexível e criar testes para que seja mantido assim, mas isso anularia algum possível ganho com a padronização.
Ou então deixamos os dados antigos em outro padrão e incompatíveis com o código atual, mas precisamos documentar de alguma forma que temos dados antigos em um padrão diferente.
Ou seja, se for adotar esse padrão, é mais fácil atualizar os dados antigos, mas vale a pena? Sei que fui eu que trouxe essa padronização lá no #1638 como uma possibilidade quando foi falado sobre a diferença de dados de entrada e saída, mas não sei se é a melhor opção. Até porque existem outras diferenças de validação de dados de input e output, então pode ser que esse trabalho seja em vão.
Se concluirmos que vale mesmo a pena mudar esse padrão, dá para evitar a sobrecarga do snakeize
atualizando as chamadas de event.create
.
Validar todos os metadados
Relacionado com a preocupação sobre mudar as chaves para snake_case
, chegou a analisar o histórico de modificações desses metadados para descobrir se podemos ser rígidos nessas validações ou se antes é preciso adequar os dados antigos?
Por exemplo, está deixando updated_fields
como required
, mas como vão ficar os eventos criados antes da adoção desse campo?
Superadas as questões acima, e seguindo sua linha de raciocínio, acho que você gostaria de adicionar um otherwise: Joi.object().forbidden()
(ou algo parecido) no último metadata
para obrigar que qualquer novo type
tenha um esquema apropriado.
system:update:tabcoins
É o evento que foi criado manualmente pelo Filipe, depois que os TabCoins foram criados, para executar a distribuição retroativa . Só existe um evento desse tipo, mas tem mais de 5000 linhas nas tabcoin_operations
que são relacionadas com ele.
A metadata
desse evento contém:
{"description": "Backfill all TabCoins from contents created before '2022-07-03 16:48:12.457+00'."}
Não vejo problema em não atualizarmos, tanto que no async function create(object, options = {}) {
const snakeizedWithOriginalMetadata = { ...snakeize(object), metadata: object.metadata };
const cleanObject = validateObject(snakeizedWithOriginalMetadata);
const query = {
text: `INSERT INTO events (type, originator_user_id, originator_ip, metadata)
VALUES($1, $2, $3, $4) RETURNING *;`,
values: [cleanObject.type, cleanObject.originator_user_id, cleanObject.originator_ip, cleanObject.metadata],
};
const results = await database.query(query, options);
return results.rows[0];
} Foi apenas uma sugestão, mas como você mencionou, acho que não faz sentido o trabalho por causa dos dados antigos.
Eu havia pensado apenas nos dados que são criados e retornados, ou seja, tudo novo funcionaria normalmente, e os dados retornados eram apenas os do outro PR, por isso funcionaria. Agora ficou claro que "se quisermos mudar para retornar dados antigos" quebraria, mas o pior é que, se só temos dados no modo antigo em produção, será impossível perceber que quebrou algo ao modificar em ambiente de desenvolvimento, visto que os testes passariam mesmo que talvez não devessem. Meu pensamento era "ou tudo deve ser validado, ou nada, não faz sentido validar metade das coisas".
Ah, entendi. Não tinha visto referências no código, mesmo vendo pelo Bom, como estamos numa situação ruim onde não sabemos como são os dados da tabela, criar a validação agora seria um tiro no escuro, e remover as validações existentes seria dificultar ainda mais no futuro o entendimento de como os eventos estão no banco de dados. Então, vou fechar o PR. A discussão serviu para confirmar o comportamento do |
Mudanças realizadas
O PR #1638 usa
snakeize
noevent.create()
, e ao realizar umrebase
, alguns testes domodels/event
quebraram por terem ummetadata
chamadoupdatedFields
, e nãoupdated_fields
. Também percebi que algunsmetadata
s não são validados novalidator
, então:system:update:tabcoins
.metadata
na formasnake_case
, onde a única que quebrava esse padrão era aupdatedFields
.Tipo de mudança
Checklist: