diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..c184d2e7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+node_modules/
+*.lock
+.env
+migrations/
\ No newline at end of file
diff --git a/README.md b/README.md
index f36cc9af..8b6b19a4 100644
--- a/README.md
+++ b/README.md
@@ -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) ***OU*** 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
+```
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..611acd19
--- /dev/null
+++ b/package.json
@@ -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 ",
+ "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"
+ }
+}
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
new file mode 100644
index 00000000..f3bd9d68
--- /dev/null
+++ b/prisma/schema.prisma
@@ -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")
+}
+
diff --git a/src/.gitignore b/src/.gitignore
new file mode 100644
index 00000000..11ddd8db
--- /dev/null
+++ b/src/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+# Keep environment variables out of version control
+.env
diff --git a/src/controllers/AllClientsController.ts.ts b/src/controllers/AllClientsController.ts.ts
new file mode 100644
index 00000000..cd545db1
--- /dev/null
+++ b/src/controllers/AllClientsController.ts.ts
@@ -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);
+ }
+}
diff --git a/src/controllers/CreateClientController.ts b/src/controllers/CreateClientController.ts
new file mode 100644
index 00000000..91ee52fe
--- /dev/null
+++ b/src/controllers/CreateClientController.ts
@@ -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);
+ }
+}
diff --git a/src/controllers/DeleteClientController.ts b/src/controllers/DeleteClientController.ts
new file mode 100644
index 00000000..b61f9715
--- /dev/null
+++ b/src/controllers/DeleteClientController.ts
@@ -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);
+ }
+}
diff --git a/src/controllers/DetailsClientController.ts b/src/controllers/DetailsClientController.ts
new file mode 100644
index 00000000..5f60888c
--- /dev/null
+++ b/src/controllers/DetailsClientController.ts
@@ -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);
+ }
+}
diff --git a/src/controllers/GetFilteredClientsController.ts b/src/controllers/GetFilteredClientsController.ts
new file mode 100644
index 00000000..1cfc926b
--- /dev/null
+++ b/src/controllers/GetFilteredClientsController.ts
@@ -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);
+ }
+}
diff --git a/src/controllers/UpdateClientController.ts b/src/controllers/UpdateClientController.ts
new file mode 100644
index 00000000..10dcc15c
--- /dev/null
+++ b/src/controllers/UpdateClientController.ts
@@ -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);
+ }
+}
diff --git a/src/helpers/CoordinatesClient.ts b/src/helpers/CoordinatesClient.ts
new file mode 100644
index 00000000..6e9484a0
--- /dev/null
+++ b/src/helpers/CoordinatesClient.ts
@@ -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;
+}
diff --git a/src/helpers/RemoveEmpty.ts b/src/helpers/RemoveEmpty.ts
new file mode 100644
index 00000000..e8a81fd7
--- /dev/null
+++ b/src/helpers/RemoveEmpty.ts
@@ -0,0 +1,3 @@
+export function removeEmpty(client: object) {
+ return Object.fromEntries(Object.entries(client).filter(([_, v]) => v != ""));
+}
diff --git a/src/prisma.ts b/src/prisma.ts
new file mode 100644
index 00000000..11bbdfef
--- /dev/null
+++ b/src/prisma.ts
@@ -0,0 +1,3 @@
+import { PrismaClient } from "@prisma/client";
+
+export const prismaClient = new PrismaClient();
diff --git a/src/routes.ts b/src/routes.ts
new file mode 100644
index 00000000..6f9e1d3c
--- /dev/null
+++ b/src/routes.ts
@@ -0,0 +1,24 @@
+import { Router } from "express";
+
+import { CreateClientController } from "./controllers/CreateClientController";
+import { DetailsClientController } from "./controllers/DetailsClientController";
+import { AllClientsController } from "./controllers/AllClientsController.ts";
+import { GetFilteredClientsController } from "./controllers/GetFilteredClientsController";
+import { UpdateClientController } from "./controllers/UpdateClientController";
+import { DeleteClientController } from "./controllers/DeleteClientController";
+
+const router = Router();
+
+router.post("/client", new CreateClientController().handle);
+
+router.get("/detail", new DetailsClientController().handle);
+
+router.get("/clients", new AllClientsController().handle);
+
+router.get("/filtered", new GetFilteredClientsController().handle);
+
+router.put("/update", new UpdateClientController().handle);
+
+router.delete("/remove", new DeleteClientController().handle);
+
+export { router };
diff --git a/src/server.ts b/src/server.ts
new file mode 100644
index 00000000..c4a90ba2
--- /dev/null
+++ b/src/server.ts
@@ -0,0 +1,18 @@
+import express, { Request, Response, NextFunction } from "express";
+import "express-async-errors";
+import { router } from "./routes";
+
+const app = express();
+app.use(express.json());
+app.use(router);
+
+app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
+ if (err instanceof Error) {
+ return res.status(400).json({ error: err.message });
+ }
+ return res
+ .status(500)
+ .json({ status: "error", message: "Internal server error" });
+});
+
+app.listen(3000, () => console.log("Server is running!"));
diff --git a/src/services/AllClientsService.ts b/src/services/AllClientsService.ts
new file mode 100644
index 00000000..90a4dfdc
--- /dev/null
+++ b/src/services/AllClientsService.ts
@@ -0,0 +1,38 @@
+import { prismaClient } from "../prisma";
+
+export class AllClientsService {
+ async execute() {
+ const clients = await prismaClient.client.findMany({
+ orderBy: {
+ name: "asc",
+ },
+ });
+
+ const clientsArray = [] as Array