Repo CRUD - write e read in mongoDB

Meli User - userwrite

Este repo é responsável por um cadastro onde teremos somente um recurso que será /v1/user e teremos os métodos: POST,PUT e GET.

As operações serão:

Cadastro;
- Atualização;
- Busca de um único recurso;
- Busca de vários recursos

Irá possuir algumas regras de validação:

Algumas regras:
 - Somente usuários acima de 18 anos serão cadastrados;
 - Não será permitido usuários com e-mail e CPF duplicados;
 - Quando buscar por vários usuários, deve permitir realizar um filtro pelo nome;
 - Permitir a alteração parcial;
 - Validar se o CPF é válido (dígitos verificadores);
 - Validar email
 - Checar a senha e confirm senha
 - Enviar email para validação e confirmação do email pelo usuário
 - Password deverá ser criptografado
 - 

A API desenvolvida foi desfragmentada em 2 serviços:

- Serviço userwrite
- Serviço userget

Para que possamos escalar de forma eficiente e com maior controle dividimos o problema. O Service Write será responsável por fazer todas operações de persistência e atualizações. O Service Get será responsável por fazer as buscas e neste cenário poderemos usar CACHE para deixar tudo ainda mais flexível e rápido.

APICORE

Foi criado um core que chamamos de apicore, ele é um conjunto de pkgs e configurações globais que é usado em diversos serviços, e como Go permite brincarmos com estes pkgs de forma flexível exploramos este recurso da lang ao nosso favor. Tudo que será comum a todos serviços é criado um pkg no apicore, alguns exemplo: envio de email, cryptografia, concatenação, validadores etc.

Arquitetura Hexagonal

Foi utilizado a arquitetura hexagonal, onde iremos explorar todo seu poder quando trata-se de desacoplamento e facilidade de conectar dentre os pacotes etc. O maior objetivo desta arquitetura é criar componentes de aplicativos fracamente acoplados que possam ser facilmente conectados ao ambiente de software.

Desenho da Arquitetura modelo One

Este é uma prévia do projeto e da sua implementação.

O promethes e grafana não subi nesta versão, para instrumentar o código precisamos de mais um tempinho.

Criamos uma saída para Stdout no padrão ElasticSearch para que possamos mapear todo Log para o Elastic ou qualquer outra tecnologia que venhamos utilizar.

operator

Desenho da Arquitetura modelo Two

Este é uma prévia do projeto e da sua implementação se fossemos implementar em Kubernetes. Neste cenário utilizamos um Gateway e autenticações, Cache, toda parte de instrumentações que teriamos em nossa API tudo seria feito pelo nosso Gateway que neste cenário coloquei o Kong.

operator

Swagger

Este é uma prévia do projeto em Swagger, preciso atualiza-lo mas já da para ter uma ideia.

operator

Test Stress

Utilizei o k6 para fazer os test de stress em nossa API. Preciso ainda implementar o POST para N.

operator

Test do Get

operator

A estrutura está organizada da seguinte forma:

├── gusermeli
│    ├── apicore
│	 │	 ├── config
│	 │	 ├── middleware
│	 │	 ├── pkg
├── userwrite
│    ├── controler
│    │   ├── handler
│    │       └── config.go
│    │       └── ping.go
│    │       └── ping_test.go
│    │       └── route.go
│    │       └── user.post.go
│    │       └── user.post_test.go
│    │       └── user.put.go
│    │       └── user.put_test.go
│    │       └── user.get.go
│    │       └── user.get_test.go
│    ├── domain
│    │ 	 ├── repo
│    │       └── user.create.go
│    │       └── user.update.go
│    ├── Makefile
│    ├── Dockerfile
│    ├── README.md
│    ├── docker-compose.yaml
│    ├── go.mod
│    ├── go.sum
├── userget
│    ├── controler
│    │   ├── handler
│    │       └── config.go
│    │       └── ping.go
│    │       └── ping_test.go
│    │       └── route.go
│    │       └── user.get.go
│    │       └── user.get_test.go
│    ├── domain
│    │ 	 ├── repo
│    │       └── user.get.go
│    ├── Makefile
│    ├── Dockerfile
│    ├── README.md
│    ├── docker-compose.yaml
│    ├── go.mod
│    ├── go.sum
├── swagger
├── arquitetura
├── docker-compose.yaml
├── LICENSE
├── README.md
└── 

Docker Compose

Este docker-compose.yaml está configurado para buscar as imagens locais que criamos de cada serviço.

Deploy

Criando as imagens de dando start em todo projeto

$ sh deploy.sh

Saída:

Creating gusermeli_redis_1       ... done
Creating userwrite               ... done
Creating gusermeli_mongo-users_1 ... done
Creating userget                 ... done
         Name                        Command               State                      Ports                    
---------------------------------------------------------------------------------------------------------------
gusermeli_mongo-users_1   docker-entrypoint.sh mongod      Up      0.0.0.0:27017->27017/tcp,:::27017->27017/tcp
gusermeli_redis_1         /opt/bitnami/scripts/redis ...   Up      6379/tcp                                    
userget                   /userget                         Up      0.0.0.0:8082->8082/tcp,:::8082->8082/tcp    
userwrite                 /userwrite                       Up      0.0.0.0:8081->8081/tcp,:::8081->8081/tcp    
 Prontinho .... 

Depois que subimos todos os serviços podemos agora alimentar para que nossos exemplos funcionem lindamente 😍 .

Buscar na Base usando Filtro para first_name

$ curl -i -XGET \
-H "Content-Type:application/json" \
"localhost:8082/v1/user?firstname=\[Paul,Jefferson\]"

Buscando por Cpf

$ curl -i -XGET \
-H "Content-Type:application/json" \
"localhost:8082/v1/user?cpf=\[29145037094,20182384004\]"

Buscando por Last Name

$ curl -i -XGET \
-H "Content-Type:application/json" \
"localhost:8082/v1/user?lastname=\[Otoni\]"

Buscando por Email

$ curl -i -XGET \
-H "Content-Type:application/json" \
"localhost:8082/v1/user?email=\[Otoni\]"
Owner
Jefferson Otoni Lima
Senior Software Enginer and Architect entrepreneur since 2006, currently as Senior Software Enginer at Engineering Brasil and CEO & Co-Fundador S3WF
Jefferson Otoni Lima
Similar Resources

This repo contains the metadata of EdgeX snaps

edgex-snap-metadata This repo contains the metadata of EdgeX snaps along with utility scripts to generate dummy snaps that can used to update the meta

Dec 6, 2021

This repo includes several winrm applications like transfering files, running commands.

This repo includes several winrm applications like transfering files, running commands.

WinRM Tools This repo includes several WinRM tools written with Go: File transfering between two Powershell session. Running command on remote Powersh

Nov 26, 2022

This repo houses some Golang introductory files, sample codes and implementations

This repo houses some Golang introductory files, sample codes and implementations. I will be updating it as I keep getting a hang of the language.

Aug 27, 2022

repo de teste para executar á pipeline do rancher

pipeline-example-go This is a sample golang project to demonstrate the integration with rancher pipeline. Building go build -o ./bin/hello-server Runn

Dec 19, 2021

Output all versions of a local git repo, which could be used as test data for your ML program.

gitwalker Output all versions of a local git repo, which could be used as test data for your ML program. Notice This program is under development. Cur

Dec 27, 2021

Kubectl golang - kubectl krew template repo

kubectl krew template repo There's a lot of scaffolding needed to set up a good

Jan 11, 2022

Clones github projects into ~/Projects/github/{org}/{repo}

Tidy clone Github cli extension (gh extension) to clone repos into ~/Projects/github/{org}/{repo} on the local filesystem Install gh extension install

Jan 19, 2022

Turn repo with markdown files into a nice looking blog

Chameleon Chameleon is web application (blog engine) that reflects content from markdown files from a git repository. Powers articles.orsinium.dev. Fe

Oct 30, 2022

Cli tool to save useful links to read it later

Cli tool to save useful links to read it later

lnk - Cli tool to save useful links still in development Usage lnk new|list [url] - new: creates a new link url: required params, which i

Jun 23, 2022
Go-Mongodb API - A sample REST API ( CRUD operations ) created using Golang

Go-Mongodb_API This is a sample REST API ( CRUD operations ) created using the G

May 31, 2022
Litestream-read-replica-demo - A demo application for running live read replication on fly.io with Litestream

Litestream Read Replica Demo A demo application for running live read replicatio

Oct 18, 2022
MongoDB generic REST server in Go
MongoDB generic REST server in Go

Mora - Mongo Rest API REST server for accessing MongoDB documents and meta data Documents When querying on collections those parameters are available:

Dec 17, 2022
MongoBackup - This is container that takes backup of MongoDB

MongoBackup This is container that takes backup of MongoDB. It is ment to be ran

Feb 15, 2022
crud is a cobra based CLI utility which helps in scaffolding a simple go based micro-service along with build scripts, api documentation, micro-service documentation and k8s deployment manifests

crud crud is a CLI utility which helps in scaffolding a simple go based micro-service along with build scripts, api documentation, micro-service docum

Nov 29, 2021
Golang CRUD using database PostgreSQL, adding some fremework like mux and pq.

Golang CRUD with PostgreSQL Table of contents ?? General info Technologies Blog Setup General info GOPOST or Go-Post is a Golang REST API made to show

Nov 27, 2021
Book-API was made using Golang and PostgreSQL with technique CRUD with mux and pq

Book-API CRUD with PostgreSQL Table of contents ?? General info Technologies Blog Setup General info BAPI or Book-API is a Golang REST API made to sho

Feb 18, 2022
[WIP] Basic Echo CRUD template (no pagination)

echo-crud-template [WIP] Basic Echo CRUD template (no pagination) Overview Based on https://github.com/xesina/golang-echo-realworld-example-app. Echo

Jan 11, 2022
The mec platform for service register/discovery/subscribe and other functions.roject main repo.

EdgeGallery MEP project Introduction Edgegallery MEP is an open source implementation of MEC platform according to ETSI MEC 003 [1] and 011 [2] docume

Nov 15, 2022
This repo contains example on how to consume secrets from Google Secret Manager from GKE

GKE Secret Manager. Environment setup This repo contains examples of how to consume secrets from Google Secret Manager (GSM) from Google Kubernetes En

Dec 5, 2022