While building a Users CRUD with NestJS, GraphQL, REST, TypeORM, PostgreSQL, and Docker, I dealt with API failures, database connection/configuration problems, TypeORM query or migration errors, docker containerization and networking problems. This project was made within a deadline for a job application and I was responsible to communicate the progress, decisions and development time of the features.
CRUD de usuários em GraphQL utilizando NestJS, TypeORM e MySQL.
Os usuários possuem seus dados de nome, email e senha junto com possíveis configurações da sua conta em um sistema. Essa configuração é armazenada no banco de dados através de um relacionamento um-para-um. A arquitetura do projeto foi criada a partir da CLI do NestJS.
Clone esse repositório e dentro dele execute:
docker-compose -f docker-compose.yaml up --build
e a API vai estar disponível na porta :3000.
Para conseguir o token de autenticação para testar a API, utilize a rota POST /auth/signup para criar uma conta, enviando os dados "name", "email" e "password" no Body x-www-form-urlencoded do Request. Após isso basta logar com seu "email" e "password" no Body x-www-form-urlencoded do Request na rota auth/signin e ela retornará o token jwt.
Disponibilizei uma collection do Postman com tudo isso pronto para facilitar esse processo aqui :)
Utilize a rota /graphql para testar as querys e mutations, com o header authorization: "Bearer seu-token-jwt".
Queries e Mutations ↴
- getUsers
{
getUsers {
id
name
email
settings {
userId
receiveEmails
receiveNotifications
}
}
}
- getUser
{
getUser(id: 1) {
id
name
email
password
settings {
userId
receiveEmails
receiveNotifications
}
}
}
- createUser
mutation {
createUser (createUserInput: {name: "maria", email: "maria@gmail.com", password: "m4r14"}){
id
name
email
password
settings {
userId
receiveEmails
receiveNotifications
}
}
}
- updateUser
mutation {
updateUser (id: 1, updateUserInput: {name:"maria", email: "maria@gmail.com", password:"maria123"}){
id
name
email
password
settings {
userId
receiveEmails
receiveNotifications
}
}
}
- removeUser
mutation {
removeUser (id: 1)
}
- createUserSettings
mutation {
createUserSettings (createUserSettingsInput: {userId: 22, receiveEmails: false, receiveNotifications: true}) {
userId
receiveEmails
receiveNotifications
}
}
- updateUserSettings
mutation {
updateUserSettings (userId: 22, updateUserSettingsInput: {receiveEmails: true, receiveNotifications: true}) {
userId
receiveEmails
receiveNotifications
}
}
A API foi dockerizada para os ambientes de produção e de desenvolvimento, utilizando Dockerfiles e docker-composes.
A aplicação possui testes end-2-end, que podem ser executados com os seguintes comandos:
# test database
$ docker-compose -f docker-compose.test.yaml up --build
com o banco de dados para teste rodando, é possível executar os testes:
# testes unitários
$ npm run test
# testes e2e
$ npm run test:e2e
# cobertura de testes
$ npm run test:cov
Foi utilizada a biblioteca nestjs-graphql-tools para configurar na query getUser a paginação, que deve seguir a formatação (documentação
{
getUsers(paginate: {per_page:1, page: 0}){
id
name
email
password
settings {
userId
receiveEmails
receiveNotifications
}
}
}
os filtros, que devem seguir a formatação (documentação
{
getUsers(where: {name: {eq: "joao"}}){
id
name
email
password
settings {
userId
receiveEmails
receiveNotifications
}
}
}
e a ordenação, que deve seguir a formatação (documentação
{
getUsers(order_by: {id: ASC}){
id
name
email
password
settings {
userId
receiveEmails
receiveNotifications
}
}
}
- Api Graphql com NestJS
- Crud de Usuarios (com Graphql)
- Rota Rest para autenticação
- Estruturação de entity e db com typeorm
- Imagem Docker
- Testes com Jest
- Paginação, Filtros e Ordenacão na Query Graphql