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
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules/
*.lock
.env
migrations/
70 changes: 17 additions & 53 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,61 +1,25 @@
# **TESTE DE BACKEND**
# Instalação

## SITUAÇÃO-PROBLEMA
## Alterar nome de example.env para .env e atualizar o conteúdo com os dados do seu banco:

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ê.
```code
DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=public"
```

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````.
## Instalar dependências

---------------------------------------------------------------------
```
npm install
```

## REQUISITOS OBRIGATÓRIOS:
## Fazer a migração para o banco de dados Postgresql

- 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).
```
npx prisma migrate dev
```

## GIT

- 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.

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

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

## FRAMEWORK -

- Servidor: Express (Javascript/Typescript) *<u>**OU**</u>* Gin (Golang)
- Banco de dados: MongoDB, DynamoDB, MySQL, Postgres...

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

## PROJETO

- 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:

- 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).



---

## 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 caso seja aprovado, um link para agendar sua entrevista técnica.
## Rodar a API na porta 3000

```
npm start
```
23 changes: 23 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "backend-orma",
"version": "1.0.0",
"main": "src/server.ts",
"repository": "https://github.com/K0dax/backend-test-two.git",
"author": "K0dax <yancarlosbrg@outlook.com>",
"license": "MIT",
"scripts": {
"start": "ts-node-dev src/server.ts"
},
"dependencies": {
"@prisma/client": "^4.9.0",
"dotenv": "^16.0.3",
"express": "^4.18.2",
"express-async-errors": "^3.1.1",
"prisma": "^4.9.0"
},
"devDependencies": {
"@types/express": "^4.17.17",
"ts-node-dev": "^2.0.0",
"typescript": "^4.9.5"
}
}
30 changes: 30 additions & 0 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

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

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

model Client{
id String @id @default(uuid())
abv Float
address String
category String
city String
lat Float
long Float
country String
description String
ibu Int
name String
state String
website String

@@map("clients")
}

3 changes: 3 additions & 0 deletions src/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules
# Keep environment variables out of version control
.env
12 changes: 12 additions & 0 deletions src/controllers/AllClientsController.ts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { Request, Response } from "express";
import { AllClientsService } from "../services/AllClientsService";

export class AllClientsController {
async handle(req: Request, res: Response) {
const allClientsService = await new AllClientsService();

const clients = await allClientsService.execute();

return res.json(clients);
}
}
52 changes: 52 additions & 0 deletions src/controllers/CreateClientController.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { Request, Response } from "express";
import { CreateClientService } from "../services/CreateClientService";

export class CreateClientController {
async handle(req: Request, res: Response) {
const {
abv,
address,
category,
city,
lat,
long,
country,
description,
ibu,
name,
state,
website,
} = req.body;

if (!category) {
category == "";
}

if (!description) {
description == "";
}

if (!website) {
website == "";
}

const createClientService = new CreateClientService();

const client = await createClientService.execute({
abv,
address,
category,
city,
lat,
long,
country,
description,
ibu,
name,
state,
website,
});

return res.json(client);
}
}
16 changes: 16 additions & 0 deletions src/controllers/DeleteClientController.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Request, Response } from "express";
import { DeleteClientService } from "../services/DeleteClientService";

interface ClientRequest {
id: string;
}
export class DeleteClientController {
async handle(req: Request, res: Response) {
const { id } = req.query;
const deleteClientService = await new DeleteClientService();

const client = await deleteClientService.execute({ id } as ClientRequest);

res.json(client);
}
}
14 changes: 14 additions & 0 deletions src/controllers/DetailsClientController.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Request, Response } from "express";
import { DetailsClientService } from "../services/DetailsClientService";

export class DetailsClientController {
async handle(req: Request, res: Response) {
const { id } = req.body;

const detailsClientService = new DetailsClientService();

const client = await detailsClientService.execute(id);

return res.json(client);
}
}
51 changes: 51 additions & 0 deletions src/controllers/GetFilteredClientsController.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { Request, Response } from "express";
import { GetFilteredClientsService } from "../services/GetFilteredClientsService";

interface ClientRequest {
abv?: number;
address?: string;
category?: string;
city?: string;
lat?: number;
long?: number;
country?: string;
description?: string;
ibu?: number;
name?: string;
state?: string;
website?: string;
}

export class GetFilteredClientsController {
async handle(req: Request, res: Response) {
const {
abv,
address,
category,
city,
country,
description,
ibu,
name,
state,
website,
} = req.query;

const getFilteredClientsService = await new GetFilteredClientsService();

const clients = await getFilteredClientsService.execute({
abv,
address,
category,
city,
country,
description,
ibu,
name,
state,
website,
} as ClientRequest);

res.json(clients);
}
}
57 changes: 57 additions & 0 deletions src/controllers/UpdateClientController.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { Request, Response } from "express";
import { UpdateClientService } from "../services/UpdateClientService";

interface ClientRequest {
id: string;
abv?: number;
address?: string;
category?: string;
city?: string;
lat?: number;
long?: number;
country?: string;
description?: string;
ibu?: number;
name?: string;
state?: string;
website?: string;
}
export class UpdateClientController {
async handle(req: Request, res: Response) {
const { id } = req.query;
const {
abv,
address,
category,
city,
lat,
long,
country,
description,
ibu,
name,
state,
website,
} = req.body;

const updateClientService = await new UpdateClientService();

const client = await updateClientService.execute({
id,
abv,
address,
category,
city,
lat,
long,
country,
description,
ibu,
name,
state,
website,
} as ClientRequest);

res.json(client);
}
}
31 changes: 31 additions & 0 deletions src/helpers/CoordinatesClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
interface IClient {
abv: number;
address: string;
category: string;
city: string;
lat: number;
long: number;
country: string;
description: string;
ibu: number;
name: string;
state: string;
website: string;
}

export function Coord(client: IClient) {
const clientCoord = {
abv: client.abv,
address: client.address,
category: client.category,
city: client.city,
coordinates: [client.lat, client.long],
country: client.country,
description: client.description,
ibu: client.ibu,
name: client.name,
state: client.state,
website: client.website,
};
return clientCoord;
}
3 changes: 3 additions & 0 deletions src/helpers/RemoveEmpty.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function removeEmpty(client: object) {
return Object.fromEntries(Object.entries(client).filter(([_, v]) => v != ""));
}
3 changes: 3 additions & 0 deletions src/prisma.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { PrismaClient } from "@prisma/client";

export const prismaClient = new PrismaClient();
Loading