evertonlopesc / nlwapi

Curso Rocketseat

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

nlwapi

Curso Rocketseat

Banner NLW#4 Rocketseat

Meu passo à passo

Estou anotando, versionando e compartilhando aqui no Github a fim de aprender mais explicando ele. Estarei atualizando até finalizar.

Criar Pasta do projeto

cria um package, o -y criar as informações com o que tem, default.

yarn init -y

micro framework e mais utilizados

yarn add express

criar pasta src

criar dentro da pasta src/ o arquivo server.ts

com -D a dependencia vai ficar apenas em desenvolvimento.

yarn add @types/express -D

add no arquivo

server.ts: app.Listen(porta, () => mensagem)

para o node identificar o arquivo server.ts ao rodar o servidor criado.

yarn add typescript -D

inicializa o typescript na aplicação

yarn tsc --init

alterar arquivo tsconfig.json,

strict = false.

converte o arquivo em tempo de execução.

yarn add ts-node-dev -D

package.json - criar linha:

scripts {
    "dev": "ts-node-dev src/server.ts"
}

package.json - adicionar no scripts

dev: "--trasnspile-only --ignore-watch node_modules"
server.ts {
//    app.get("/users", (request, response) => {
//       return response.send("Hello world - NLW#04")
//    }); Antigo

    app.get("/", (request, response) => {
        return response.json({ message: "Hello world - NLW#04"});
    }); Novo

    app.post("/", (request, response) => {
        return response.json({message: "Os dados foram salvos com sucesso!"});
    });

}

Install Insomnia: Site Insomnia

Configurando com TypeORM

Site TypeORM

Adicionar ao projeto TypeORM e a dependencia reflect-metadata

yarn add typeorm reflect-metadata

Adicionar o sqlite como DB por ser fácil de utilizar sem grandes configurações.

yarn add sqlite3

criar arquivo ormconfig.json

{
    "type": "sqlite",
    "database": "./src/database/database.sqlite"
}

criar dentro de src um diretório database com o arquivo index.ts

add no arquivo index.ts

{
    import { createConnection } from "typeorm";

        createConnection();
}

add no arquivo server.ts

import "reflect-metadata"
import "./database"

obs.: reflect-metadata torna-se o primeiro import do arquivo.

add no arquivo package.json em scripts

"typeorm": "ts-node-dev node_modules/typeorm/cli.js"

criar diretório .src/database/migrateions/

add no arquivo ormconfig.json

"cli": {
    "migrationsDir": "./src/database/migrations"
}

o caminha para direcionar as migrations criadas.

Criando a primeira migration Users

public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.createTable (
        new Table({
            name: "users",
            columns: [
                {
                    name: "id",
                    type: "uuid",
                    isPrimary: true
                },
                ...
            ],
        })
    );
}

add em ormconfig.json o caminho para salvar os arquivos criados pela migration:rum

{
    "migrations": ["./src/database/migrations/**.ts"],
}

Criar os dados no DB Sqlite

yarn typeorm migration:run

Desfazendo a última migration

yarn typeorm migration:revert

Criar diretório ./src/controllers com o arquivo UserController.ts

add no arquivo UserController.ts

import {Request, Response} from "express";

class UserController {
    async create(request: Request, response: Response) {
        const body = request.body;
        console.log(body);
        return response.send();
    }
}

export { UserController }

Criar o arquivo ./src/routes.ts

add no arquivo routes.ts

import { Router } from "express";
import { UserController } from "./controllers/UserController";

const router = Router();

const userController = new UserController();

router.post("/users", userController.create);

export { router };

Deletar no arquivos server.ts o post e get

Incluir no arquivo server.ts chamadas as rotas para o controller e a opção de receber Json

app.use(express.json());
app.use(router);

Criar o arquivo ./src/models e o arquivo models/User.ts

add no arquivo User.ts

import { Entity } from "typeorm";

@Entity("users")
class User{

}

export { User }

No arquivo tsconfig.json, habilite a opção Experimental Options e stricPropertyInitialization, para o stric deixe ele com false

Alterar o arquivo User.ts incluindo os atributos na classe

@Entity("users")
class User{
    @PrimaryColumn()
    id: string;

    @Column()
    name: string;

    @Column()
    email: string;

    @CreateDateColumn()
    created_at: Date;
}

Adicionar a biblioteca uuid e sua dependência

yarn add uuid
yarn add @types/uuid -D

Importar para o arquivo User.ts a biblioteca uuid

import { v4 as uuid } from "uuid";

Adicionar no arquivo User.ts readonly para o id do user

@PrimaryColumn()
readonly id: string;

Criar no arquivo User.ts um construtor para tornar o id único usnado a biblioteca uuid

constructor() {
    if(!this.id) {
        this.id = uuid();
    }
}

Incluir no arquivo ormconfig.json o entities informando a rota do models

"entities": ["./src/models/**.ts"],

Altualizando o arquivo UserController.ts com create user

const user = userRepository.create({
    name,
    email,
});

Altualizando o arquivo UserController.ts com save user

await userRepository.save(user);

Altualizando o arquivo UserController.ts com autenticação

//SELECT * FROM USERS WHERE EMAIL = "EMAIL"
const userAlreadyExists = await userRepository.findOne({
    email,
});

if (userAlreadyExists) {
    return response.status(400).json({
        error: "User already exists!",

    });
}

Adicionando para o ambiente de desenvolvimento no arquivo ormconfig.json a opção logging

"logging": true,

About

Curso Rocketseat


Languages

Language:TypeScript 100.0%