GithubHelp home page GithubHelp logo

rmanguinho / clean-ts-api Goto Github PK

View Code? Open in Web Editor NEW
1.8K 51.0 486.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 Introduction

Build Status Coverage Status Known Vulnerabilities js-standard-style GPLv3 License Open Source

Clean Node API

alt text


Essa API faz parte do treinamento do professor Rodrigo Manguinho (Mango) na Udemy.

O objetivo do treinamento é mostrar como criar uma API com uma arquitetura bem definida e desacoplada, utilizando TDD (programação orientada a testes) como metodologia de trabalho, Clean Architecture para fazer a distribuição de responsabilidades em camadas, sempre seguindo os princípios do SOLID e, sempre que possível, aplicando Design Patterns para resolver alguns problemas comuns.

Contribua com esse Projeto <3

Buy Me a Coffee at ko-fi.com


APIs construídas no treinamento

  1. Cadastro
  2. Login
  3. Criar enquete
  4. Listar enquetes
  5. Responder enquete
  6. Resultado da enquete

Princípios

  • Single Responsibility Principle (SRP)
  • Open Closed Principle (OCP)
  • Liskov Substitution Principle (LSP)
  • Interface Segregation Principle (ISP)
  • Dependency Inversion Principle (DIP)
  • Separation of Concerns (SOC)
  • Don't Repeat Yourself (DRY)
  • You Aren't Gonna Need It (YAGNI)
  • Keep It Simple, Silly (KISS)
  • Composition Over Inheritance
  • Small Commits

Design Patterns

  • Factory
  • Adapter
  • Composite
  • Decorator
  • Proxy
  • Dependency Injection
  • Abstract Server
  • Composition Root
  • Builder
  • Singleton

Metodologias e Designs

  • TDD
  • Clean Architecture
  • DDD
  • Conventional Commits
  • GitFlow
  • Modular Design
  • Dependency Diagrams
  • Use Cases
  • Continuous Integration
  • Continuous Delivery
  • Continuous Deployment

Bibliotecas e Ferramentas

  • NPM
  • Typescript
  • Git
  • Docker
  • Jest
  • MongoDb
  • Travis CI
  • Swagger
  • Bcrypt
  • JsonWebToken
  • Faker
  • Coveralls
  • Validator
  • Express
  • Apollo Server Express
  • Graphql
  • Graphql ISO Date
  • Graphql Scalars
  • Graphql Tools
  • Supertest
  • Husky
  • Lint Staged
  • Eslint
  • Standard Javascript Style
  • Sucrase
  • Nodemon
  • Rimraf
  • In-Memory MongoDb Server
  • MockDate
  • Module-Alias
  • Copyfiles
  • Npm Check
  • Bson ObjectId
  • Apollo Server Integration Testing

Features do Node

  • Documentação de API com Swagger
  • API Rest com Express
  • GraphQL com Apollo Server
  • Log de Erro
  • Segurança (Hashing, Encryption e Encoding)
  • CORS
  • Middlewares
  • Nível de Acesso nas Rotas (Admin, User e Anônimo)
  • Deploy no Heroku
  • Servir Arquivos Estáticos

Features do GraphQL

  • Types
  • Queries
  • Mutations
  • Resolvers
  • Directives
  • Scalars
  • Plugins

Features do Git

  • Alias
  • Log Personalizado
  • Branch
  • Reset
  • Amend
  • Tag
  • Stash
  • Rebase
  • Merge

Features do Typescript

  • POO Avançado
  • Interface
  • TypeAlias
  • Namespace
  • Utility Types
  • Modularização de Paths
  • Configurações
  • Build
  • Deploy
  • Uso de Breakpoints

Features do GraphQL

  • Resolvers
  • Type Definitions
  • Directives
  • Scalars
  • Plugins
  • Error Handling

Features de Testes

  • Testes Unitários
  • Testes de Integração (API Rest & GraphQL)
  • Cobertura de Testes
  • Test Doubles
  • Mocks
  • Stubs
  • Spies
  • Fakes

Features do MongoDb

  • Connect e Reconnect
  • Collections
  • InsertOne e InserMany
  • Find, FindOne e FindOneAndUpdate
  • DeleteMany
  • UpdateOne
  • Aggregation (Match, Group, Unwind, Lookup, AddFields, Project, Sort)
  • ObjectId
  • Upsert e ReturnOriginal
  • Push, Divide, Multiply, ArrayElemAt, Cond, Sum
  • Filter, Map, Reduce, MergeObjects, ConcatArrays

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: 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

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

[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 :)

Duplicação no README.md

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

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?

Postman Collections

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

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!!!

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

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 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.

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

"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.

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.

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.