Git Product home page Git Product logo

rmanguinho / clean-ts-api Goto Github PK

View Code? Open in Web Editor NEW
1.8K 51.0 488.0 4.23 MB

API em NodeJs usando Typescript, TDD, Clean Architecture, Design Patterns e SOLID principles

Home Page: https://rmanguinho.github.io/

License: GNU General Public License v3.0

JavaScript 0.47% TypeScript 99.46% Shell 0.06%
tdd typescript solid mongodb design-patterns nodejs clean-architecture clean-code docker docker-compose

clean-ts-api's People

Contributors

rmanguinho avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

clean-ts-api's Issues

Dúvida em relação ao Presenter

Opa! Beleza??
Tenho uma dúvida em relação aos Controllers da Presentation.
Como eu poderia fazer para usar eles desacoplados do HTTP? Por exemplo, utilizar alguns casos de usos via CMD?

Valeu!!!

Bug no RequiredFieldValidation para fields com valor 0

Olá

O RequiredFieldValidation verifica apenas se o valor do campo é false. Isso ocasiona erros de validação quando um para um field com valor 0. Por exemplo:

const test = {
 distance: 0
}

Nesse caso o RequiredFieldValidation vai retornar missingParam 'distance'.

Uma solução seria:

  validate (data: any): Error {
    if (data[this.fieldName] === undefined || data[this.fieldName] === null) {
      return new MissingParamError(this.fieldName)
    }
  }

Abraços

Baixa performance nos testes causada pelo banco de dados (sugestão)

Salve.

Notei que todo teste faz uma nova conexão ao banco de dados e logo em seguida desconecta. Eu estava fazendo exatamente dessa forma em um projeto pessoal meu que tem bastante teste. Os testes de integração levavam cerca de 2 minutos para concluir.
Para contornar esse problema, criei um arquivo integration.test.ts que faz uma leitura de todos os testes de integração (que são os que têm conexão ao banco de dados) e encapsulei todos os testes dentro desse arquivo. Só certifique-se de rodar apenas o integration.test.ts.

O resultado foi impressionante, caiu de 2 minutos para apenas 21 segundos!! A alta performance se dá por conta de apenas uma conexão ao banco de dados, ao invés de se conectar/desconectar em cada teste.

// integration.test.ts
const tests = (): void =>
  glob.sync(`${resolve(__dirname)}/**/*.ts`).forEach((content) => {
    if (content.match(/\.(test|steps)\.ts$/) && !content.match(/integration\.test\.ts$/)) {
      require(content)
    }
  })


describe('integration tests', () => {
  afterAll(async () => {
    const client = makeMongoDb()

    await client.disconnect()
  })

  beforeAll(async () => {
    await MongoAdapter.connect(global.__MONGO_URI__)
  })

  tests()
})

Caso eu queira rodar apenas um teste, ao invés de ter que rodar todos, fiz uma verificação antes em cada teste, pois assim torna os testes flexíveis. Dessa forma posso depurar apenas um teste, caso seja necessário.

// user.test.ts

describe ...
  let isConnected = true

  afterAll(async () => {
    if (!isConnected) await client.disconnect()
  })

  beforeAll(async () => {
    isConnected = MongoAdapter.client != null
    if (!isConnected) await MongoAdapter.connect(global.__MONGO_URI__)
  })
...

Conectando/desconectando em cada teste (a forma que tava antes):
Sem

Conectando/desconectando apenas uma vez antes de todos os testes:
com

Dúvida com exceptions

Estou em dúvida de como tratar corretamente as exceptions que existem nos use-case.
Por exemplo, eu tenho o use-case emprestar-livro

Nele eu tenho os seguintes passos:
Verificar se livro está disponível -> gera um exception de negócio
Verificar se Leitor possui pendencias -> gera um exception de negocio
Inserir empréstimo -> pode ocorrer um exception, mas é erro interno

Os exceptions gerados nas duas verificações, são pertinentes ao usuário e seria legal souber da existência deles.
Minha dúvida fica em relação ao controller, pois se eu gerar algo no formato abaixo, eu não consigo capturar o erro.

try {
   await emprestar-livro(...params)
   return noContent()
} catch(err) {
   return serverError(error)
}

Qual seria a abordagem mais correta para essa situação?

Dúvida: por que criar diversos repositórios para o mesmo ator?

Fala, Manguinho, blz?

Gosto muito dos seus vídeos e vi que na Live que fez com o Branas e nesse repositório do curso você criou vários repositórios para um mesmo ator (podendo ser observados data/protocols/db/{ator}).

Há algum motivo pra não criarmos um arquivo account-repository, por exemplo, e termos nele os métodos add, checkByEmail, loadByEmail, etc.?

Valeu

Postman Collections

se possivel poderia colocar as collections do postman em uma pasta do repositório para versionar junto com o projeto

Dúvida: como gerar arquivo swagger.json?

Desenvolvi uma aplicação usando os ensinamentos apresentados pelo curso, porém minha aplicação necessita estar na AWS API Gateway e para mapear as rotas preciso do arquivo swagger.json.

Como gerar apartir dos arquivos que já temos com o Typescript?

@rmanguinho

Problemas com mLab MongoDB na Heroku.

MLab MongoDB não está mais acessível na Heroku.

Olá, estava realizando uma das aulas Bônus quando me deparei com a seguinte situação, no Episódio "Subindo API para o Heroku", ao tentar buscar o banco de dados mLab MongoDB na Heroku em Add-ons, ele não se encontrava mais disponível. Pesquisando mais a fundo sobre essa questão cheguei a seguinte informação.

Gostaria apenas de saber se teria alguma maneira de usar outro banco de dados MongoDB contendo um plano gratuito para hospedar a API.

Atenciosamente,
Daniel Sansão Araldi.

husky funciona só quando quer.

Olá boa tarde.
Por algum motivo quando fiz o setup do projeto, o husky nao funcionava, ai dps do nada ele começou a funcionar.
Agora dps da aula de mudar os scripts para testes ele parou de funcionar de novo.
O pior que não da pra saber o pq, ele não gera erro, log nem nada.
Como da pra saber como resolver isso?
Obrigadoooo

[SUGESTÃO] Newman

Rodrigo, beleza? Primeiramente parabéns pelo conteúdo do curso e do repositório!

Gostaria de fazer uma sugestão:

Acha que vale a pena abordar um pouco sobre o uso do Newman? Já que temos a collection do Postman criada de forma estruturada e com as API's, talvez seja legal para mostrar a possibilidade de um "smoke test" assim que o deploy é feito no ambiente através do mesmo.

Acredito que seria de grande valia para enriquecer ainda mais o conteúdo do curso :)

Dúvida em relação a filtros

Como faço para filtrar os resultados por data por exemplo? ou por um período?
Não sei onde deveria ficar essa lógica.

Duplicação no README.md

Fala mangoo! Só uma observação, no README do projeto você descreve duas vezes as "Features GraphQL"

"Access Denied" mesmo com "role: admin"

Ola Mango... clonei o repo pra rodar a API localmente e mesmo passando a role admin no banco de dados, continuo com "Access Denied".

image

Sabe dizer se é preciso fazer algo além disso? Gostaria de manter essa regra do admin, mas não consigo fazer funcionar =/

Não fiz nenhuma alteração no código, só mesmo clonei e rodei o container.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.