Aprendizados da semana (16 a 22)
Semana do dia 16 a 22
- responsabilidades: schema, types e dto
- proteção de dados: unidirecional e bidirecional
- ‘magic strings’ nas autorizações (como eu estava montando x como IA sugeriu - uma forma mais eficiente)
Responsabilidades: schema, types e dto (e o poder do zod no nestjs)
Eu já sabia de alguns detalhes, mas conforme fui desenvolvendo com o TS, fui enfrentando algumas dificuldades e entendendo melhor onde encaixar cada um deles
types
é responsável por definir a forma do dado, ótimo para o momento de desenvolvimento, ao apertar ponto e ver a sugestão das propriedades dentro daquele dado.
dto
Também define a forma do dado, mas com uma responsabilidade diferente: a transferência (Data Transfer Object) do objeto entre camadas da sua API.
schemas
São validações em tempo de execução (runtime), enquanto o seu sistema esta em produção. Eles basicamente dizem ’eu aceito apenas o campo email e senha, e eles precisam atender as seguintes regras’, veja um exemplo:
|
|
O poder do zod com nestjs
Além de cansativo ter que declarar uma forma para cada um desses itens, a probabilidade de gerar inconsistência conforme o tempo é alta. Então, uma forma de resolver o problema é declarando uma vez e aproveitando ela para outros usos. Veja o exemplo de ’loginLocal’:
Primeiro é feito a declaração do schema:
|
|
Depois é criado o tipo com a seguinte linha:
|
|
E, por fim, o DTO é feito da seguinte maneira:
|
|
momento de uso de cada um
Ao estar criando o DTO com base no schema, conforme exemplo anterior, “damos o poder” do DTO possuir as caracteristicas que o schema possui. Portanto, o primeiro local de uso seria na própria controller, em conjunto com um decorator para usar esses “poderes” herdados.
|
|
proteção de dados: unidirecional e bidirecional - diferenças
Podemos comparar a proteção unidirecional como um triturador de papel. Após passar o papel na máquina, não há caminho de volta para restaurar o que foi triturado, é assim que as bibliotecas como argon2 e bcrypt funcionam, elas transformam a senha em um hash e depois não realizam o caminho de volta.
Já o bidirecional seria como um cofre, no qual você joga um conteúdo valioso e tranca o acesso a ele. É muito usado por uma lib de criação de tokens: JWT. Eles são codificados (geralmente, o id e/ou email), (via de ida) e quando necessário (validar que o usuário tem permissão para acessar X recurso) ele pode ser decodificado (via de volta), tornando o id/email em texto puro, digamos assim.
magic strings
Eu já ouvi falar em magic numbers, que são os números jogados em seu sistema que não revelam contexto sobre o que eles representam, exemplo:
|
|
Mas ao tentar implementar o sistema de autorização e pedir ajuda pra IA avaliar, ela me apresentou esse conceito de magic string. Antes eu estava criando um objeto contentendo todas as permissões que dado perfil possui:
|
|
Um dos problemas é o de digitação e sempre precisar incrementar em cada perfil conforme novas permissões apareçam. Porém, me foi apresentado uma abordagem que achei bem mais interessante, em um arquivo ter todas as permissões por “feature”:
|
|
E no arquivo que atribui as permissões ao tipo de perfil, usar algo assim:
|
|
Assim, garantindo que toda atribuição esteja mais explicita, se necessário a criação de uma nova, criar a variável e atribuir aos perfis cabiveis. Alem de ajudar no autocomplete dentro de um guard nas controllers, evitando erros de digitação (o que já aconteceu muitas vezes comigo).