Desafio de back-end com Nest.js, TypeORM, GraphQL e PostgreSQL.
docker compose up -d
cd packages/corrections
# Instale as dependências
yarn install
# Inicie o serviço
yarn start
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
# unit tests
yarn test
# e2e tests
yarn test:e2e
# test coverage
yarn test:cov
Acesse o GraphiQL Playground em http://localhost:3000/graphql.
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!
}
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".
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.
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.
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.
Optei por utilizar o TypeORM porque tem bastante documentação sobre a ferramenta no site do Nest.js.
Feito com 💜 por João Vitor.