Este é um back-end que desenvolve uma API para que os usuários possam cadastrar produtos acrescentando seus names, preços e descrições, dentro de alguma categoria existente. O usuário também pode cadastrar as suas categorias.
Criado na linguagem TypeScript, com o framework Node, utiliza TypeORM e PostGresql nos bancos de dados e seus relacionamentos. Também foram utilizadas bibliotecas como uuid, yup, jwt, e bcrypt.
Para utilizá-la na sua máquina, basta seguir os passos a seguir:
O arquivo irá ser baixado na sua máquina, assim, basta extraí-lo e entrar na pasta liberada.
Você deverá fazer um fork, caso queira criar um repositório no seu próprio perfil. De qualquer forma, você deverá clonar com alguma das três opções disponíveis, copiando o link apresentado.
Em seguida, acesse o terminal da sua máquina e rode o comando
git clone [email protected]:bercardosoc/EVA.git
Assim, você pode entrar na pasta agora disponível.
Logo, acesse o terminal e rode yarn
ou npm install
para que sejam baixadas as dependências da aplicação como node_modules
. Este processo pode ser um pouco demorado.
Para usuários de VS Code, basta rodar um simples code .
dentro do terminal no mesmo diretório/pasta e assim você poderá fazer o que deseja na aplicação.
Para que ela funcione corretamente, necessita configurar as variáveis de ambiente, copiando o que há disponível no seu .env.example
e preenchendo seus dados no seu .env
local, que você deverá criar na raiz do projeto.
Quando suas variáveis estiverem prontas, você pode rodar as migrations para que estas se integrem com o seu banco de dados local. Para isso, basta rodar:
yarn typeorm migration:run -d src/data-source.ts
Agora que você cumpre todos os pré-requisitos, você pode rodá-la com um simples yarn dev
e ela estará disponível em alguma porta, mas por padrão, provavelmente será a 3000.
Caso tenha dúvidas, basta checar o terminal, a aplicação tem um console.log que informa.
POST /users/signup - FORMATO DA REQUISIÇÃO
json
{
"name": "Bernardo",
"email": "[email protected]",
"password": "senhaforte"
}
`POST /users/signup - FORMATO DA RESPOSTA - STATUS 201`
```json
{
"email": "[email protected]",
"name": "Bernardo",
"id": "5858cbb7-31b1-49e8-a572-ec21a8c3e744"
}
POST /users/signin - FORMATO DA REQUISIÇÃO
{
"email": "[email protected]",
"password": "senhaforte"
}
POST /users/signup - FORMATO DA RESPOSTA - STATUS 200
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU4NThjYmI3LTMxYjEtNDllOC1hNTcyLWVjMjFhOGMzZTc0NCIsImlhdCI6MTY1NjM2OTc0OCwiZXhwIjoxNjU2MzczMzQ4fQ.e2pctoTfPMo4f6ko9eM4aHUhbiQH2ln3Ipy0uj2xG1c"
}
GET /products - FORMATO DA RESPOSTA - STATUS 200
{
"products": [
{
"id": "67a3be9d-6c80-4044-964c-a4d72c54c616",
"name": "Patinho de borracha",
"description": "Um objeto para decoração.",
"price": 5
},
{
"id": "d8ffe37d-c1db-4377-84e5-d58cfbc20cf5",
"name": "Biscoito integral",
"description": "Biscoito de morango e banana com aveia.",
"price": 10
},
{
"id": "3e68013e-2dcf-4cc3-a18a-01615fc6dc7b",
"name": "Caneca estampada",
"description": "Caneca com códigos de git na estampa.",
"price": 15
}
]
}
GET /products/:maior - FORMATO DA RESPOSTA - STATUS 200
{
"products": [
{
"id": "3dd70396-cacd-4417-933c-4642efd46802",
"name": "barraca de acampamento",
"description": "acampe sem preocupação",
"price": 100
},
{
"id": "11b755f2-a4d7-487c-afea-f0863da0b1b9",
"name": "patinho de borracha",
"description": "o seu melhor amigo para pair coding",
"price": 1
}
]
}
GET /products/:menor - FORMATO DA RESPOSTA - STATUS 200
{
"products": [
{
"id": "11b755f2-a4d7-487c-afea-f0863da0b1b9",
"name": "patinho de borracha",
"description": "o seu melhor amigo para pair coding",
"price": 1
},
{
"id": "3dd70396-cacd-4417-933c-4642efd46802",
"name": "barraca de acampamento",
"description": "acampe sem preocupação",
"price": 100
}
]
}
Esta é uma rota que além de retornar as categorias propriamente ditas, também tem a importância de trazer os produtos por categoria.
GET /categories - FORMATO DA RESPOSTA - STATUS 200
{
"categories": [
{
"categoryId": "2f397495-1c59-4506-b803-bc1fb86e10f0",
"name": "lazer",
"description": "os melhores produtos de lazer",
"products": [
{
"id": "b52ffdaf-0f64-4158-b123-e28a886249a5",
"name": "barraca de acampamento",
"description": "acampe sem preocupação",
"price": 100
}
]
},
{
"categoryId": "ea6294fe-3bd3-4603-91d2-45c7f1bd68ab",
"name": "decoração",
"description": "os melhores produtos de decoração",
"products": [
{
"id": "c4333adc-b1c6-4217-92a4-7c25ec57d632",
"name": "patinho de borracha",
"description": "seu melhor amigo de pair coding",
"price": 1
}
]
}
]
}
Nesta opção, é possível selecionar uma única categoria, o que facilita a leitura do seu array de produtos.
GET /categories/:name - FORMATO DA RESPOSTA - STATUS 200
{
"products": [
{
"description": "acampe sem preocupação",
"price": 100,
"name": "barraca de acampamento"
},
{
"description": "seu melhor amigo de pair coding",
"price": 1,
"name": "patinho de borracha"
},
{
"description": "seu melhor amigo de pair coding",
"price": 1,
"name": "gatinho de borracha"
}
],
"description": "os melhores produtos de lazer",
"name": "lazer",
"categoryId": "2f397495-1c59-4506-b803-bc1fb86e10f0"
}
GET /categories/:name - FORMATO DA RESPOSTA - NOT FOUND 404
{
"error": "Categoria não encontrada"
}
São rotas onde é necessário o login do usuário, cujo token de acesso irá disponibilizar informações, como o seu id, para que assim possa ser atribuído como criador.
Assim, onde estas APIs forem testadas, será necessário adicionar algo como Authorization: Bearer {token}
no cabeçalho da requisição.
POST /categories - FORMATO DE REQUISIÇÃO
{
"name": "lazer",
"description": "os melhores produtos de lazer"
}
POST /categories - FORMATO DE RESPOSTA - 201 CREATED
{
"description": "os melhores produtos de lazer",
"name": "lazer",
"categoryId": "0ac9cb6b-d8bc-46ba-bc8b-1c6c8e643a8a"
}
POST /categories - FORMATO DE RESPOSTA - 409 CONFLICT
{
"message": "lazer already exists"
}
Você pode passar apenas um dos campos de uma categoria já existente.
PATCH /categories/:id - FORMATO DE REQUISIÇÃO
{
"name": "diversão",
"description": "as melhores formas de lazer"
}
POST /categories - FORMATO DE RESPOSTA - 200 OK
{
"categoryId": "0ac9cb6b-d8bc-46ba-bc8b-1c6c8e643a8a",
"name": "diversão",
"description": "as melhores formas de lazer"
}
PATCH /categories/:id - FORMATO DE REQUISIÇÃO
{
"name": "roupa",
"description": "as melhores roupas por um preço que cabe no seu bolso"
}
POST /categories/:id - FORMATO DE RESPOSTA - 409 CONFLICT
{
"message": "A categoria roupa já existe"
}
DELETE /categories/:id
Não é necessário corpo de requisição
DELETE /categories/:id - FORMATO DE RESPOSTA - 200 OK
Deletado com sucesso!
POST /products - FORMATO DE REQUISIÇÃO
{
"name": "patinho de borracha",
"price": 1,
"description": "o seu melhor amigo para pair coding",
"category": "decoração"
}
POST /products - FORMATO DE RESPOSTA - 201 CREATED
{
"description": "o seu melhor amigo para pair coding",
"price": 1,
"name": "patinho de borracha",
"category": {
"categoryId": "d5b6043c-fab5-432f-82e9-abfe094d44dc",
"name": "roupa",
"description": "as melhores roupas por um preço que cabe no seu bolso"
},
"owner": {
"id": "a4a20853-ee10-4f80-bee6-2eede6d51c06",
"iat": 1656424429,
"exp": 1656428029
},
"id": "11b755f2-a4d7-487c-afea-f0863da0b1b9"
}
`POST /products - FORMATO DE REQUISIÇÃO
{
"name": "barraca de acampamento",
"price": 100,
"description": "acampe sem preocupação",
"category": "lazer"
}
POST /products - FORMATO DE RESPOSTA - 400 BAD REQUEST
{
"message": "A categoria lazer não existe"
}
DELETE /products/:id
Não é necessário corpo de requisição
DELETE /products/:id - FORMATO DE RESPOSTA - 200 OK
Deletado com sucesso!