Skip to content

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 se possível, aplicando Design Patterns para resolver alguns problemas comuns.

Notifications You must be signed in to change notification settings

Manfrinne/node-clean-archt-api

Repository files navigation

Desenvolver uma aplicação node.js orientada a testes (TDD)

O objetivo é mapear os passos de desenvolvimento de acordo com as aulas do curso. A ideia desse projeto é criar uma API completa baseado em Programação Orientada a Testes e Arquitetura Limpa, de acordo com os princípios SOLID - Essa API faz parte do treinamento do professor Rodrigo Manguinho (Mango) na Udemy.

0. SOLID

  • Princípio de única responsabilidade (Single-responsibility principle):

    "uma classe deve ter apenas uma única responsabilidade (mudanças em apenas uma parte da especificação do software, devem ser capaz de afetar a especificação da classe)."

  • Princípio de aberto/fechado (Open-Closed principle):

    "entidades de software devem ser abertas para extensão, mas fechadas para modificação."

  • Princípio da substituição de Liskov (Liskov substitution principle):

    "objetos em um programa devem ser substituíveis por instâncias de seus subtipos, sem alterar a funcionalidade do programa." deve ser capaz de afetar apenas a especificação da

  • Princípio da segregação de Interface (Interface segregation principle):

    "muitas interfaces de clientes específicas, são melhores do que uma para todos propósitos."

  • Princípio da inversão de dependência (Dependency inversion principle):

    "deve-se depender de abstrações, não de objetos concretos."

1. Introdução

  • 1. Configurando o Git
  • 2. Configurando as dependências
  • 3. Clean Architecture

3. SignUp API - Presentation Layer

  • 1. Criando o SignUpController e validando o request
  • 2. Criando erros personalizados
  • 3. Utilizando Mocks da maneira correta
  • 4. Testando exceções e integrando com o EmailValidator
  • 5. Integrando com o AddAccount UseCase

4. Jest

  • 1. Configurando o Jest e criando scripts de testes

5. Utils Layer

  • 1. Criando o EmailValidatorAdapter e mockando o validator

6. SignUp API - Data Layer

  • 1. Criando o DbAddAccount e integrando com o Encrypter
  • 2. Integrando com o AddAccountRepository

7. SignUp API - Infra Layer

  • 1. Criando o BcryptAdapter e mockando o bcrypt

  • 2. Configurando MongoDb em memória

  • 3. Testando o MongoDb

    • Se der problema, usar essa estratégia para mapear o '_id' do MongoDB:

      import { AddAccountRepository } from '../../../../data/protocols/add-account-repository';
      import { AccountModel } from '../../../../domain/models/account';
      import { AddAccountModel } from '../../../../domain/usecases/add-account';
      import { MongoHelper } from '../helpers/mongo-helper';
      
      export class AccountMongoRepository implements AddAccountRepository {
        async add(accountData: AddAccountModel): Promise<AccountModel> {
          const accountCollection = MongoHelper.getCollection('accounts');
          const result = await accountCollection.insertOne(accountData);
          const { _id, ...collectionWithoutId } = result;
      
          // Isso deve retornar um objeto sem o '_id'
          return Object.assign({}, accountWithoutId, { id: _id });
        }
      }

8. SignUp API - Main Layer

  • 1. Testando middlewares do express
  • 2. Criando teste de integração para o SignUp
  • 3. Fazendo a composição do SignUp e desacoplando do express

About

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 se possível, aplicando Design Patterns para resolver alguns problemas comuns.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published