Roberto Umbelino
11/2/2022 Roberto Umbelino

Transformando valores no TypeORM

blog-feature-image

Oláááá meus caros amigos 🙃. Estou de volta para compartilhar mais um conteúdo da série “De Forma Rápida” que é focada em apresentar um conteúdo direto ao ponto e de forma mais resumida mas que agregue para quem estiver lendo. 🤗

E o conteúdo da vez será sobre o TypeORM e como transformar valores consultados no banco de dados.

📑 Sobre

Como a ideia do post é ser bem direto ao ponto, vou assumir que você já conheça o TypeORM (mas caso não conheça ainda, dá uma olhadinha na documentação deles, é um ORM muito maneiro para trabalhar com Javascript + Typescript).

Vamos prosseguir com o conteúdo?! 💪


📚 Transformando valores

Conforme um projeto vai evoluindo, novas tecnologias vão sendo adicionadas para solucionar novos tipos de problemas, todavia um Banco de dados normalmente é uma camada que acaba sendo mais esquecida por justamente ser algo mais complexo de migrar, por exemplo, migrar uma tabela já existente e com milhões de registros para novas tabelas normalizadas e que façam mais sentido para atual regra de negócio do sistema, isso não é uma tarefa fácil, pois afeta muitas camadas do ecossistema da aplicação, banco de dados, as linguagens, regras de negócio, etc.

Então, algo que possa vir a acontecer é você trabalhar com uma tecnologia nova, porém com uma base de dados “antiga” e que os valores não vão estar normalizados da forma que você queira, fazendo com que você necessite criar uma camada de normalização do dado em sua aplicação.

Vamos a um exemplo para simplificar isso 😅

Você tem uma tabela de usuários e dentro dessa tabela tem uma coluna de email e nesse campo é armazenado o email dos usuários, porém essa base cheia de registros nunca teve um cuidado de salvar emails válidos, então tem emails em letra maiúscula, com espaço e até emails inválidos.

TESTE@GMAIL.COM             // Com letras maiúsculas
  meuemail@hotmail.com      // Com espaços em branco
emailteste@                 // Email inválido
roberto.umbelino@fw7.com.br // Email válido

(Exemplo de emails em nossa base de dados fictícia)

Ao usar esses emails dentro da sua aplicação seria muito chato ter que toda hora ficar validando para fazer qualquer operação que envolva esse campo. Seria muito melhor ter essa responsabilidade de normalização centralizada em um único lugar, e é isso que o TypeORM contempla com o transformer.

Vamos a um exemplo de como poderia normalizar todos os emails diretamente pelo TypeORM.

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"

/**
 * Regex para verificar se o email é válido.
 */
const mailformat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number

    @Column()
    name: string

    @Column({
      transformer: {
        // quando está lendo o registro do banco
        from: email => {
          /**
           * Normalizar email.
           * Somente letras minúsculas e sem espaços.
           */
          const normalizedEmail = email.toLowerCase().trim()

          /**
           * Verifica se é um email válido.
           */
          const isValidEmail = !!normalizedEmail.match(mailformat)

          /**
           * Retorna o email válido ou um null caso email for inválido.
           */
          return isValidEmail ? normalizedEmail : null
        },

        // quando está salvando o registro no banco
        to: email => email
      }
    })
    email: string

}

(Exemplo normalizando email ao consultar dados)

Simples não é mesmo? 😜

E podemos fazer isso para diversas situações, por exemplo, salvar o nome de um usuário de forma capitalizada.

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number
 
    @Column({
      transformer: {
        // quando está lendo o registro do banco
        from: name => name,        

        // quando está salvando o registro no banco
        to: name => {
          /**
           * Tornando todas as primeiras letras como maiúscula.
           * roberto umbelino => Roberto Umbelino
           */
          return name.split(' ').map(text => text[0].toUpperCase() + text.slice(1))
        }
      }
    })
    name: string

}

(Exemplo normalizando nome do usuário ao salvar na base)

São exemplos simples, mas é uma forma muito bacana de conseguir normalizar algumas informações na sua aplicação direto da fonte, não precisando ficar tratando o dado sempre que precisar consultar.


Então é isso meu povo 🤩, é uma pequena funcionalidade do TypeORM mas que é bem interessante ter conhecimento da existência dela, pode vir a ser muito útil. 😉


🔗 Referências

Você pode estudar um pouco mais do assunto nos links:


Se você curtiu esse conteúdo deixe o seu like e compartilhe com a galera. 😋

Roberto Umbelino.

comments powered by Disqus

NOS ACOMPANHE NAS REDES SOCIAIS