Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.env
/node_modules
215 changes: 180 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,61 +1,206 @@
# **TESTE DE BACKEND**
# **TESTE DE BACKEND by Orma Carbon**

## SITUAÇÃO-PROBLEMA
### SITUAÇÃO-PROBLEMA

Você acabou de ser contratado para uma vaga de desenvolvedor backend de uma empresa que revende cervejas do mundo inteiro. O desenvolvedor anterior corrompeu completamente o banco de dados e a API anterior e sobrou apenas um arquivo .JSON com todas as informações do banco. Seu líder confiou a tarefa de recriar a API e o banco de dados a você.
> Você acabou de ser contratado para uma vaga de desenvolvedor backend de uma empresa que revende cervejas do mundo inteiro. O desenvolvedor anterior corrompeu completamente o banco de dados e a API anterior e sobrou apenas um arquivo .JSON com todas as informações do banco. Seu líder confiou a tarefa de recriar a API e o banco de dados a você.

Neste teste, você deverá criar uma API com endpoints a serem consumidos via REST e um banco de dados, utilizando os dados fornecidos no arquivo. ````db.json````.

### Stack utilizadas: Nodejs(Express), Typescript, MongoDB

---------------------------------------------------------------------

## REQUISITOS OBRIGATÓRIOS:
# Passos a seguir

## Clonar repositório

gh repo clone RobertoAthos/backend-test-two

## Instalar dependências

npm install

## Rodar o app

npm run dev


# REST API

Exemplos de requisições.
> você pode usar o link do deploy `https://orma-carbon.onrender.com` para fazer os testes no postman ou insomnia ou o próprio localhost:6000

<br/>


## Inserir os dados do `db.json` no Banco de Dados

### Request

`POST`

http://localhost:6000/api/addData

### Response

Irá adicionar todos os dados do db.json

## Listagem de todos os produtos

### Request
> Talvez demore um pouco de fazer essa requisição, pois faz a listagem de 5000 dados

`GET`

http://localhost:6000/api/products

### Response

{
"abv": 12,
"address":"teste Rua",
"category": "Teste Categoria",
"city": "Teste Cidade",
"coordinates": 124125,
"country": "Teste País",
"description": "Teste descrição",
"ibu":124,
"name":"Teste Nome",
"state":"Teste Estado",
"website": "Teste Website"
}



## Criar novo produto

### Request

`POST`

- Seja original, projetos suspeitos de serem copiados serão descartados.
- Queremos ver o seu código, e não o de outros.
- Criar coleção no Postman (seu teste será testado por aqui).
http://localhost:6000/api/createProduct

## GIT
### Response

- Faça um fork deste repositório.
- Crie uma branch para codar as suas features.
- Faça um pull-request quando o teste for finalizado.
{
"abv": 12,
"address": "teste Rua",
"category": "Teste Categoria",
"city": "Teste Cidade",
"coordinates": [
124125
],
"country": "Teste País",
"description": "Teste descrição",
"ibu": 124,
"name": "Teste Nome",
"state": "Teste Estado",
"website": "Teste Website",
"_id": "63e14b2acb3b517c5075d62a",
"__v": 0
}

##### **NOTA: Será avaliado também se o nome da branch, títulos de commit, push e comentários possuem boa legibilidade.**
## Pegar um produto específico

-----------------------------------------------------
### Request

## FRAMEWORK -
`GET`

- Servidor: Express (Javascript/Typescript) *<u>**OU**</u>* Gin (Golang)
- Banco de dados: MongoDB, DynamoDB, MySQL, Postgres...
http://localhost:6000/api/product/{id-do-produto}

-----------------------------------------------------
### Response

## PROJETO
{
"_id": "63e14b2acb3b517c5075d62a",
"abv": 12,
"address": "teste Rua",
"category": "Teste Categoria",
"city": "Teste Cidade",
"coordinates": [
124125
],
"country": "Teste País",
"description": "Teste descrição",
"ibu": 124,
"name": "Teste Nome",
"state": "Teste Estado",
"website": "Teste Website",
"__v": 0
}

- Api deve conter pelo menos 1 endpoint para cada operação crud (Create, Read, Update, Delete).
- Um endpoint para listagem de conteúdo.
- Banco de dados a escolha do dev.

-------------------------------------------------------

## REQUISITOS DIFERENCIAIS:
## Atualizar dados do produto

- Seguir os princípios de SOLID.
- Fazer o teste em GoLang.
- Codar um código performático.
- Utilizar inglês no projeto todo.
- Utilizar Injeção de dependências.
- Criar um frontend que consuma a API
- Fazer deploy do mesmo (heroku, aws, google cloud ou outro da preferência).
### Request

`PUT` <br/>

`http://localhost:6000/api/update/product/{id-do-produto}`

{
"abv": 12,
"address": "teste Rua 2",
"category": "Teste Categoria 2",
"city": "Teste Cidade",
"coordinates": [124125],
"country": "Teste País",
"description": "Teste descrição",
"ibu": 124,
"name": "Teste Nome",
"state": "Teste Estado",
"website": "Teste Website",
}

### Response

{
"_id": "63e14b2acb3b517c5075d62a",
"abv": 12,
"address": "teste Rua 2",
"category": "Teste Categoria 2",
"city": "Teste Cidade",
"coordinates": [
124125
],
"country": "Teste País",
"description": "Teste descrição",
"ibu": 124,
"name": "Teste Nome",
"state": "Teste Estado",
"website": "Teste Website",
"__v": 0
}

## Deletar produto

### Request

`DELETE`

http://localhost:6000/api/delete/{id-do-produto}

### Response

{
"_id": "63e1479acb3b517c5075d625",
"abv": 12,
"address": "teste Rua",
"category": "Teste Categoria",
"city": "Teste Cidade",
"coordinates": [
124125
],
"country": "Teste País",
"description": "Teste descrição",
"ibu": 124,
"name": "Teste Nome",
"state": "Teste Estado",
"website": "Teste Website",
"__v": 0
}


---

## ENTREGA

- Faça um pull request e nomeie-o como no ex.: Teste de (Seu nome aqui).
- Envie um email para schmidt@repenso.eco e kevin@repenso.eco com o link do pull request, do deploy (tanto do front quanto do back se feito), e anexe a coleção do postman.
- Assim que avaliarmos seu teste, enviaremos uma devolutiva de sucesso ou falha, e um link para agendar sua entrevista técnica.

16 changes: 16 additions & 0 deletions config/db.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import mongoose from "mongoose";
import config from 'config';
mongoose.set("strictQuery", true);

async function connect(){
const MONGO_URL = config.get<string>('MONGO_URL')

try {
await mongoose.connect(MONGO_URL)
console.log('Database Connected')
} catch (error) {
console.log(error)
}
}

export default connect
7 changes: 7 additions & 0 deletions config/default.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import dotenv from 'dotenv'
dotenv.config()

export default {
PORT: process.env.PORT,
MONGO_URL: process.env.MONGO_URL
}
19 changes: 19 additions & 0 deletions controller/AllDataFromJson.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import beerData from '../db.json'
import product from '../model/product'
import {Request,Response} from 'express'
import { IProduct } from '../types/types';

export const AllDataFromJson = async(req:Request,res:Response)=>{
const data = beerData;
let beers = [];

try {
for (let item of data) {
let json: IProduct = await product.create(item);
beers.push(json);
}
res.status(201).json(beers);
} catch (error) {
res.status(500).json({ message: error });
}
}
11 changes: 11 additions & 0 deletions controller/allProducts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import product from "../model/product";
import {Request,Response} from 'express'

export const getProducts = async(req:Request,res:Response)=>{
try {
const products = await product.find()
res.status(200).json(products)
} catch (error) {
res.status(500).json({message: error})
}
}
35 changes: 35 additions & 0 deletions controller/createProduct.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import product from "../model/product";
import { Request, Response } from "express";
import { IProduct } from "../types/types";

export const createProduct = async (req: Request<IProduct>, res: Response) => {
try {

const { abv, category, city, country, ibu, name, state, coordinates,website,description,address } = req.body;

const ProductAlreadyExists = await product.findOne({ name: req.body.name });

if (ProductAlreadyExists)
return res.status(400).json({ message: "Product arealdy exists" });


const items = new product({
abv,
address,
category,
city,
coordinates,
country,
description,
ibu,
name,
state,
website,
});

const savedItems = await items.save();
res.status(201).json(savedItems);
} catch (error) {
res.status(500).json({ message: error });
}
};
15 changes: 15 additions & 0 deletions controller/deleteProduct.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import product from "../model/product";
import {Request,Response} from 'express'
import { IProduct } from "../types/types";

export const deleteProduct = async(req:Request<IProduct>,res:Response)=>{
try {
const {id} = req.params
const SingleProduct = await product.findById(id)
if(!SingleProduct) return res.status(404).json({message: 'Product do not exists'})
const deletedProduct = await product.findByIdAndDelete(id)
res.status(200).json(deletedProduct)
} catch (error) {
res.status(500).json({message: error})
}
}
14 changes: 14 additions & 0 deletions controller/readProduct.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import product from "../model/product";
import {Request,Response} from 'express'
import { IProduct } from "../types/types";


export const getProduct = async(req:Request<IProduct>,res:Response)=>{
try {
const {id} = req.params
const SingleProduct = await product.findById(id)
res.status(200).json(SingleProduct)
} catch (error) {
res.status(500).json({message:error})
}
}
Loading