Skip to content

Desafio de back-end com Nest.js, TypeORM, GraphQL e PostgreSQL, aplicando conceitos como DDD e Clean Architecture.

Notifications You must be signed in to change notification settings

jvzaniolo/backend-challenge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

98 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Back-end Challenge

Desafio de back-end com Nest.js, TypeORM, GraphQL e PostgreSQL.

Instalação

Pré-requisitos

Docker containers

docker compose up -d

Microsserviço de correções

cd packages/corrections

# Instale as dependências
yarn install

# Inicie o serviço
yarn start

Aplicação

cd server

# Crie o arquivo .env com as variáveis de ambiente
cp .env.example .env

# Instale as dependências
yarn install

# Inicie a aplicação
yarn start

Testes

# unit tests
yarn test

# e2e tests
yarn test:e2e

# test coverage
yarn test:cov

GraphQL

Acesse o GraphiQL Playground em http://localhost:3000/graphql.

Schema

type Query {
  challenges(description: String, page: Int, perPage: Int = 10, title: String): PaginatedChallenge!

  submissions(
    challengeTitle: String
    dateRange: DateRangeArgs
    page: Int
    perPage: Int = 10
    status: SubmissionStatus
  ): PaginatedSubmissions!
}

type Mutation {
  createChallenge(description: String!, title: String!): Challenge!
  deleteChallenge(id: String!): Challenge!
  updateChallenge(description: String, id: String!, title: String): Challenge!

  submitChallenge(challengeId: String!, repositoryUrl: String!): Submission!
}

Decisões

Nomenclatura: Submissions vs Answers

Na descrição do desafio foi utilizado o nome "Submissões" para se referir às submissões dos desafios, mas no SDL de exemplo, o nome da entidade estava "Answers" (exemplo "query answers()" e "mutation answerChallenge()"). Como a modelagem do SDL era subjetiva, optei por usar o nome "Submissions".

Relação entre as tabelas

Durante o desenvolvimento do desafio, surgiu a dúvida de como deveria ser o filtro das Submissões dos Desafios ("Filtro pelo ID do Desafio? Ou pelo título?"). A resposta que recebi por e-mail foi "que pode ser pelo título, mas você pode pensar na forma que achar que fica melhor o filtro", então optei por relacionar as tabelas para poder pesquisar as Submissões por título do desafio. Caso o filtro fosse pelo ID do desafio, eu teria mantido as tabelas separadas.

Scalar customizado: UUID

Pela descrição de modelagem das entidades não vi necessidade de criar um Scalar customizado já que todos os tipos existem no GraphQL, mas como era um requisito do desafio, optei por seguir com a documentação do Nest.js e criar um Scalar do tipo UUID, para validar os campos ID.

Testes E2E

Como os testes E2E que eu escrevi não esperam pela resposta do Kafka para rodar, o Jest finaliza o teste enquanto o Kafka ainda está executando (mais especificamente, enviando a resposta pelo reply). Isso gera alguns erros como comentado aqui tulios/kafkajs#779 (comment). Como alternativa, adicionei um timeout para dar tempo do Kafka responder antes do Jest finalizar o teste, mas gostaria de saber quais outras alternativas existem para resolver esse problema.

TypeORM

Optei por utilizar o TypeORM porque tem bastante documentação sobre a ferramenta no site do Nest.js.


Feito com 💜 por João Vitor.

About

Desafio de back-end com Nest.js, TypeORM, GraphQL e PostgreSQL, aplicando conceitos como DDD e Clean Architecture.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •