Imersão Full Cycle & Full Stack

Aula 01

Full Cycle Developer

Como desenvolvedores Full Cycle, as equipes de desenvolvimento passam a ter que cumprir as seguintes etapas:

  • Arquitetar
  • Desenvolver
  • Testar
  • Deployar
  • Monitorar
  • Dar suporte aos microsserviços

Pricipais pilares do desenvolvimento Full Cycle:

  1. Operate What you Build: O desnvolvedor fica responsável desde a construção até a entrega do projeto.
  2. Ferramentas para escalar: Necessário dominío de ferramentas que auxiliam na entrega contínua do projeto, como pipelines de CI/CD, Docker, Kubernetes, Stacks de monitoramento, etc.

Full Cycle Developer x Full Cycle Stack

  • Full Stack: Habilidades de desenvolvimento. Domínio em stacks e linguagens para desenvolvimento em diversas perspectivas, como Front-End e Back-End.
  • Full Cycle Developer: Além de desenvolver, o desenvolvedor consegue arquitetar e entregar a aplicação de forma testada, com deploy e monitoramento.

Projeto prático

Desenvolvimento de um sistema de venda de ingressos

  • Gerenciamento de eventos / processamento de reservas
    • Integração com sistemas de parceiros
  • Sistemas de parceiros
  • Frontend
  • API Gateway

Dinâmica do projeto

alt text

Tecnologias

  • Docker
  • Linguagem Go
  • Next.js (Frontend)
  • Nest.js
  • Kong API Gateway

alt text

Arquitetura do sistema

alt text

Operação principal - Reservar ingresso

alt text

Microsserviços de parceiros de ingressos com Nest.js

  • Tecnologias utilizadas:

    • TypeScript/JavaScript
    • Nest.js
    • Prisma ORM
    • Rest
    • Autenticação
  • Etapas do projeto:

    • Criação do projeto Nest.js
    • Criação do banco de dados MySQL e integração com o Prisma
    • Criação de uma lib para facilitar na criação de várias APIs de parceiros
    • Criação de uma API dos eventos
    • Criação de uma API dos spots
    • Criação do endpoint da API para reserva
    • Criação de vários Apps para serem as APIs dos parceiros
    • Permissão do acesso as APIs via token

Sobre o Nest.js

O Nest.js é um framework Node.js, que trabalha tanto com JavaScript e TypeScript, que visa principalmente ter uma arquitetura modular e escalável.

Permite a criação de aplicaçções web com integração a vários meios de comunicação:

  • REST
  • GraphQL
  • Outros (RabbitMQ, Redis, Kafka, Nats, etc.)

Possui integração com vários bancos de dados por meio de vários ORMs famosos:

  • Sequelize
  • Prisma
  • TypeORM
  • Mikro ORM
  • etc.

alt text

Extensões VSCode
  • Eslint
  • Prettier
  • Rest Client
  • Prisma

Iniciando o projeto via WSL/ubuntu

  1. Abra o terminal WSL e execute o seguinte comando:
sudo apt-get install curl

curl: ferramenta usada para baixar conteúdo da Internet na linha de comando.

  1. Instale o NVM:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
  1. Instale o Node.js:
nvm install 20
  1. Instale o Nestjs/Cli:
npm install -g @nestjs/cli
  1. Crie uma nova aplicação:
nest new nestjs-partners-api
  1. Execute o projeto com o comando:
npm run start:dev 
  1. O projeto vai estar rodando em:
http://127.0.0.1:3000

alt text

alt text alt text

  • Criação de controller de eventos:
nest generate controller event
  • Criação de recurso com todos endponts do CRUD:

alt text

Obs.: A convensão dos nomes dos arquivos gerados automaticamente é chamada de CoC (Convention over configuration)

./docker-compose.yaml:

services:
  db:
    image: mysql:8.0.30-debian
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: nest
    
    ports:
     - 3306:3306

Entrar no container docker:

docker compose exec db bash

Entrar no console MySQL:

mysql -uroot -proot

Prisma

npx prisma init

./prisma/schema.prisma

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

.env

DATABASE_URL="mysql://root:root@localhost:3306/nest"

./prisma/schema.prisma

model Event{
  id String @id @default(uuid())
  name String
  description String
  date DateTime
  price Float
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}
npx prisma migrate dev

console MySQL

#
use Event;

#
show tables;

#
describe Event;