Resolução desenvolvida por mim, para o desafio de criptografia proposto neste repositório.
As tecnologias utilizadas e o critério de escolha das mesmas foram os seguintes:
-
Go: estou migrando do Java com SpringBoot para essa tecnologia que apresenta um ecosistema muito interessante para desenvolvimento de web services, além disso grandes players, como por exemplo a Uber, fazem grandes contribuições open source, fomentando o amadurecimento do ecosistema da linguagem.
-
MySQL: banco de dados bem estabelecido no mercado e mais apropriado para projetos simples como este. Talvez se o projeto fosse mais complexo, o PostgreSQL seria escolhido.
-
Criptografia Simétrica utilizando AES-256-GCM: equanto que na criptografia assimétrica você precisa de um par de chaves para realizar as operações de criptografia e descriptografia, na criptografia utilizada você precisa apenas de uma chave, essa que será utilizada para criptografar e descriptografar. A escolha foi feita devido ao fluxo de criptografia e descriptografia dos dados, o mesmo ponto (backend) que criptografaria também descriptografaria os dados, logo não faria sentido aumentar a complexidade utilizando uma criptografia assimétrica, por exemplo.
-
Requisição de criação de uma transação
-
Requisição de listagem de transações:
-
Dados criptografados no banco de dados:
Com coverage:
go test -cover ./...
Com coverage e logs completos:
go test -cover -v ./...
Os testes de integração do repositório sobem um contêiner de MySQL utilizando a biblioteca Testcontainers, logo é necessário ter o Docker instalado na sua máquina para que os testes de integração possam executar normalmente.
Caso os testes falhem com a mensagem "testcontainers.go:70: port not found"
verifique se o MySQL do docker-compose.yml
do projeto está desligado, por alguma razão ele causa um conflito com o Testcontainers, mesmo que este último alega mapear
as portas expostas dos contêiners para portas aleatórias no host.
-
Clone o projeto:
git clone https://github.com/marcelsby/crypto-challenge-go.git
-
Entre no diretório:
cd crypto-challenge-go
-
Copie o arquivo das variáveis de ambiente e preencha de acordo com a seção abaixo:
cp .env.example .env
-
Execute os contêiners Docker:
docker compose up -d
-
Faça requests para a API (127.0.0.1:3000) 🎉:
http POST :3000/transactions cpf="28875243981" creditCardToken="937" value:=1299.80
-
Clone o projeto:
git clone https://github.com/marcelsby/crypto-challenge-go.git
-
Entre no diretório:
cd crypto-challenge-go
-
Instale as dependências:
go mod download
-
Inicie o banco de dados:
docker compose up -d mysql
-
Copie o arquivo das variáveis de ambiente e preencha de acordo com a seção abaixo:
cp .env.example .env
-
Execute a aplicação:
go run main.go
-
Faça requests para a API (127.0.0.1:3000) 🎉:
http POST :3000/transactions cpf="28875243981" creditCardToken="937" value:=1299.80
Variável | Descrição | Exemplo |
---|---|---|
DATABASE_USER |
Usuário para se conectar ao banco de dados. | CryptoApp |
DATABASE_PASSWORD |
Senha do usuário do banco de dados. | PyjzGkmqXdC2 |
DATABASE_NAME |
Nome do banco de dados para se conectar. | bank |
CRYPTOGRAPHY_SECRET_KEY |
Chave de criptografia, deve ser uma hex-string com 32 bytes* | 0e18cb28a2... * |
* Nos sistemas operacionais UNIX-like você pode gerar uma com o seguinte comando: openssl rand -hex 32
.