šŸš€ Backend challenge

šŸ“‹ Sobre

Este projeto Ʃ um sistema de gerenciamento de pedidos de compra que opera com quatro entidades principais: UsuƔrios, Produtos, Ordens de Compra e Itens de Ordem de Compra.

O sistema fornece uma variedade de rotas para gerenciar essas entidades. As rotas de UsuĆ”rios permitem a criaĆ§Ć£o, listagem, atualizaĆ§Ć£o e exclusĆ£o de usuĆ”rios. As rotas de Produtos permitem a criaĆ§Ć£o, listagem, busca por ID, atualizaĆ§Ć£o e exclusĆ£o de produtos, com suporte para filtros e paginaĆ§Ć£o na listagem de produtos. As rotas de Ordens de Compra permitem a geraĆ§Ć£o de uma ordem de compra para um usuĆ”rio e a listagem das ordens de compra de um usuĆ”rio com a possibilidade de aplicar filtros. AlĆ©m disso, hĆ” uma rota para a geraĆ§Ć£o de um item para uma ordem de compra.

Em resumo, este projeto oferece um sistema robusto e flexƭvel para o gerenciamento de pedidos de compra, proporcionando uma ampla gama de funcionalidades para atender Ơs necessidades dos usuƔrios

šŸ“‹ Tecnologias e Bibliotecas

Krishna-Node Krishna-PSQL Krishna-Ts
  • typeorm
  • reflect-metadata
  • ts-node
  • pg
  • express
  • express-async-errors
  • zod
  • bcryptjs
  • dotenv

šŸ“‹ InstruƧƵes

  • Clone o repositĆ³rio
git clone <URL-GITHUB>
  • Criar banco de dados postegres

Conectado no terminal interativo do PostgreSQL (psql)

psql -U postgres

Postgres user default password

1234

Create Database

CREATE DATABASE <name-your-database> ; 

desconectar terminal interativo do PostgreSQL

ctrl + c
  • Criar arquivo .env
DATABASE_URL="postgres://<USER>:<PASS>@<HOST>:<PORT>/<DATABASE>"
SECRET_KEY="#%$*&**&&-09875$hddsa%TT"
  • exemplo:
DATABASE_URL="postgresql://postgres:1234@localhost:5432/db_store"
  • Executar MigraƧoens
npm run typeorm migration:run -- -d ./src/data-source
  • Instale a node modules
npm install
  • Rodar servidor
npm run dev

Base URL:

 localhost:3000

Endpoints

MĆ©todo Endpoint Responsabilidade
POST /users CriaĆ§Ć£o de usuĆ”rio
GET /users Lista todos os usuƔrios
GET /users/:id Lista um usuƔrio com ordes de compras e filtros
PATCH /users/:id Atualiza um usuƔrio
DELETE /users/:id Deleta um usuƔrio
POST /products CriaĆ§Ć£o de produto
GET /products Lista todos os produtos, com filtros e paginaĆ§Ć£o
GET /products/:id Busca um produto pelo id
PATCH /products/:id Atualiza um produto
DELETE /products/:id Deleta um produto
POST /purchaseOrder Gerar ordem de compra, de um usuƔrio
GET /purchaseOrder/users/:id Listar ordem de compra, de um usuƔrio, com filtros
POST /purchaseOrder/item Gerar item para um ordem de compra

Endpoints - Casos de Sucesso, Produtos āœ”ļø

Busca de produtos com paginaĆ§Ć£o e com a possibilidade de utilizaĆ§Ć£o de filtros

GET /products - FORMATO DA REQUISIƇƃO, SEM PAGINAƇƃO E SEM FILTROS

Resposta: status 200

{
	"page": null,
	"perPage": null,
	"data": [
		{
			"id": "60096951-81d5-4569-ae70-c2deed1d9d43",
			"title": "A Tester",
			"price": 59.99,
			"description": "tester description",
			"category": "electronics",
			"image": "urlfakesjdjfs"
		},
		{
			"id": "81b46858-2d5f-4980-864d-70656e858791",
			"title": "B Tester",
			"price": 69.99,
			"description": "tester description",
			"category": "electronics",
			"image": "urlfakesjdjfs"
		},
		{
			"id": "befed5e5-734a-4a1c-99cd-966348df1bf0",
			"title": "c Tester",
			"price": 7.89,
			"description": "tester description",
			"category": "food",
			"image": "urlfakesjdjfs"
		},
		{
			"id": "f21eb44c-3eab-4c69-8778-f9ad8071510c",
			"title": "D Tester",
			"price": 7.89,
			"description": "tester description",
			"category": "food",
			"image": "urlfakesjdjfs"
		}
	]
}

GET /products?filters[category]=electronics - FORMATO DA REQUISIƇƃO, SEM PAGINAƇƃO E COM FILTRO

Resposta: status 200

{
	"page": null,
	"perPage": null,
	"data": [
		{
			"id": "60096951-81d5-4569-ae70-c2deed1d9d43",
			"title": "A Tester",
			"price": 59.99,
			"description": "tester description",
			"category": "electronics",
			"image": "urlfakesjdjfs"
		},
		{
			"id": "81b46858-2d5f-4980-864d-70656e858791",
			"title": "B Tester",
			"price": 69.99,
			"description": "tester description",
			"category": "electronics",
			"image": "urlfakesjdjfs"
		}
	]
}

GET /products?page=1&perPage=3 - FORMATO DA REQUISIƇƃO, COM PAGINAƇƃO E SEM FILTROS

Resposta: status 200

{
	"page": 1,
	"perPage": 3,
	"data": [
		{
			"id": "60096951-81d5-4569-ae70-c2deed1d9d43",
			"title": "A Tester",
			"price": 59.99,
			"description": "tester description",
			"category": "electronics",
			"image": "urlfakesjdjfs"
		},
		{
			"id": "81b46858-2d5f-4980-864d-70656e858791",
			"title": "B Tester",
			"price": 69.99,
			"description": "tester description",
			"category": "electronics",
			"image": "urlfakesjdjfs"
		},
		{
			"id": "befed5e5-734a-4a1c-99cd-966348df1bf0",
			"title": "c Tester",
			"price": 7.89,
			"description": "tester description",
			"category": "food",
			"image": "urlfakesjdjfs"
		}
	]
}

GET /products?page=1&perPage=3&filters[category]=electronics - FORMATO DA REQUISIƇƃO, COM PAGINAƇƃO E COM FILTRO

Resposta: status 200

{
	"page": 1,
	"perPage": 3,
	"data": [
		{
			"id": "60096951-81d5-4569-ae70-c2deed1d9d43",
			"title": "A Tester",
			"price": 59.99,
			"description": "tester description",
			"category": "electronics",
			"image": "urlfakesjdjfs"
		},
		{
			"id": "81b46858-2d5f-4980-864d-70656e858791",
			"title": "B Tester",
			"price": 69.99,
			"description": "tester description",
			"category": "electronics",
			"image": "urlfakesjdjfs"
		}
	]
}

GET /products?page=1&perPage=3&filters[category]=electronics&filters[price]=69.99 - FORMATO DA REQUISIƇƃO, COM PAGINAƇƃO E COM FILTROS MULTIPLOS

Resposta: status 200

{
	"page": 1,
	"perPage": 3,
	"data": [
		{
			"id": "81b46858-2d5f-4980-864d-70656e858791",
			"title": "B Tester",
			"price": 69.99,
			"description": "tester description",
			"category": "electronics",
			"image": "urlfakesjdjfs"
		}
	]
}

Bucar produto pelo id

GET /products/60096951-81d5-4569-ae70-c2deed1d9d43 -- FORMATO DA REQUISIƇƃO

NĆ£o necessita corpo de requisiĆ§Ć£o

Resposta: status 200

{
	"id": "60096951-81d5-4569-ae70-c2deed1d9d43",
	"title": "A Tester",
	"price": 59.99,
	"description": "Product, A Tester, update ",
	"category": "electronics",
	"image": "urlfakesjdjfs"
}

CriaĆ§Ć£o de produto

POST /products -- FORMATO DA REQUISIƇƃO

Corpo:

{
	"title": "A Tester",
	"price": 59.99,
	"description": "tester description",
	"category": "electronics",
	"image": "urlfakesjdjfs"
}

Resposta: status 201

{
	"title": "A Tester",
	"price": 59.99,
	"description": "tester description",
	"category": "electronics",
	"image": "urlfakesjdjfs",
	"id": "60096951-81d5-4569-ae70-c2deed1d9d43"
}

AtualizaĆ§Ć£o de produto

PATCH /products/60096951-81d5-4569-ae70-c2deed1d9d43 -- FORMATO DA REQUISIƇƃO

Corpo:

{
	"description": "Product, A Tester, update "
}

Resposta: status 200

{
	"id": "60096951-81d5-4569-ae70-c2deed1d9d43",
	"title": "A Tester",
	"price": 59.99,
	"description": "Product, A Tester, update ",
	"category": "electronics",
	"image": "urlfakesjdjfs"
}

DeleĆ§Ć£o de produto

DELETE - /products/86bc6ac6-6762-4fb6-8256-e5b462e8b1c1 -- FORMATO DA REQUISIƇƃO

NĆ£o necessita corpo de requisiĆ§Ć£o

Resposta: status 204

Endpoints - Casos de Sucesso, Users āœ”ļø

CriaĆ§Ć£o de UsuĆ”rio

POST /users -- FORMATO DA REQUISIƇƃO

Corpo:

{
	"email": "tester.a@gmail.com",
	"username": "Tester 1000",
	"password": "1234",
	"first_name": "Tester",
	"last_name": "1000"
}

Resposta: status 201

{
	"id": "76438565-cb26-439f-a423-63816a7fb810",
	"email": "tester.a@gmail.com",
	"username": "Tester 1000",
	"first_name": "Tester",
	"last_name": "1000"
}

AtualizaĆ§Ć£o de usuĆ”rio

PATCH /users/76438565-cb26-439f-a423-63816a7fb810 -- FORMATO DA REQUISIƇƃO

Corpo:

{
	"email": "tester.update@gmail.com"
}

Resposta: status 200

{
	"id": "76438565-cb26-439f-a423-63816a7fb810",
	"email": "tester.update@gmail.com",
	"username": "Tester 1000",
	"first_name": "Tester",
	"last_name": "1000"
}

Listar todos usuƔrios

GET - /users -- FORMATO DA REQUISIƇƃO

NĆ£o necessita corpo de requisiĆ§Ć£o

Resposta: status 200

[
	{
		"id": "07eeb39a-3ad0-4632-9f86-bafffb3796d4",
		"email": "varela.a@gmail.com",
		"username": "KVA",
		"first_name": "Krishna",
		"last_name": "Varela"
	},
	{
		"id": "76438565-cb26-439f-a423-63816a7fb810",
		"email": "tester.update@gmail.com",
		"username": "Tester 1000",
		"first_name": "Tester",
		"last_name": "1000"
	}
]

Listar um usuƔrio, pelo Id

GET - /users/07eeb39a-3ad0-4632-9f86-bafffb3796d4 -- FORMATO DA REQUISIƇƃO, SEM FILTROS

NĆ£o necessita corpo de requisiĆ§Ć£o

Resposta: status 200

{
	"id": "07eeb39a-3ad0-4632-9f86-bafffb3796d4",
	"email": "varela.a@gmail.com",
	"username": "KVA",
	"password": "$2a$10$PGmOGq7C82x/TMqs2x9F5eCNuKci2vr7Fudczv5Fdx9ofxJHkXedi",
	"first_name": "Krishna",
	"last_name": "Varela",
	"purchase_orders": [
		{
			"id": "054a4479-11cf-4c98-9bc6-ea6b35aff881",
			"date": "2024-02-02",
			"items": [
				{
					"id": "f16928be-963a-4739-9903-06e098542ab6",
					"quantity": 2,
					"price": "119.98"
				},
				{
					"id": "4439758c-d89e-4b7e-b602-e0da11c87298",
					"quantity": 5,
					"price": "39.45"
				}
			]
		},
		{
			"id": "d01dd31d-d308-46b8-8707-b151d6a92734",
			"date": "2024-02-04",
			"items": []
		},
		{
			"id": "8cc5cbb7-befe-40d9-8cb3-3959fee0b9a3",
			"date": "2024-02-04",
			"items": []
		},
		{
			"id": "10eb13ec-9883-4275-b140-6fc72e8e7ac1",
			"date": "2024-02-04",
			"items": []
		},
		{
			"id": "f9e5c293-06e5-4cb9-b752-90768047803c",
			"date": "2024-02-02",
			"items": []
		},
		{
			"id": "2dbb1953-2ece-45b4-9a13-39c6d9ea94fc",
			"date": "2024-02-04",
			"items": []
		}
	]
}

GET - /users/07eeb39a-3ad0-4632-9f86-bafffb3796d4?filters={"date":"2024-02-02"} -- FORMATO DA REQUISIƇƃO, COM FILTROS

NĆ£o necessita corpo de requisiĆ§Ć£o

Resposta: status 200

{
	"id": "07eeb39a-3ad0-4632-9f86-bafffb3796d4",
	"email": "varela.a@gmail.com",
	"username": "KVA",
	"password": "$2a$10$PGmOGq7C82x/TMqs2x9F5eCNuKci2vr7Fudczv5Fdx9ofxJHkXedi",
	"first_name": "Krishna",
	"last_name": "Varela",
	"purchase_orders": [
		{
			"id": "054a4479-11cf-4c98-9bc6-ea6b35aff881",
			"date": "2024-02-02",
			"items": [
				{
					"id": "f16928be-963a-4739-9903-06e098542ab6",
					"quantity": 2,
					"price": "119.98"
				},
				{
					"id": "4439758c-d89e-4b7e-b602-e0da11c87298",
					"quantity": 5,
					"price": "39.45"
				}
			]
		},
		{
			"id": "f9e5c293-06e5-4cb9-b752-90768047803c",
			"date": "2024-02-02",
			"items": []
		}
	]
}

DeleĆ§Ć£o de usuĆ”rio

DELETE - /users/76438565-cb26-439f-a423-63816a7fb810 -- FORMATO DA REQUISIƇƃO

NĆ£o necessita corpo de requisiĆ§Ć£o

Resposta: status 204

Endpoints - Casos de Sucesso, PurchaseOrders āœ”ļø

CriaĆ§Ć£o de ordem de compra

POST /purchaseOrder -- FORMATO DA REQUISIƇƃO

Corpo:

{
	"user_id": "07eeb39a-3ad0-4632-9f86-bafffb3796d4"
}

Resposta: status 201

{
	"user": {
		"id": "07eeb39a-3ad0-4632-9f86-bafffb3796d4",
		"email": "varela.a@gmail.com",
		"username": "KVA",
		"password": "$2a$10$PGmOGq7C82x/TMqs2x9F5eCNuKci2vr7Fudczv5Fdx9ofxJHkXedi",
		"first_name": "Krishna",
		"last_name": "Varela"
	},
	"id": "054a4479-11cf-4c98-9bc6-ea6b35aff881",
	"date": "2024-02-02T16:52:52.192Z"
}

Listagem de ordens de compra por usuƔrio

GET /purchaseOrder/users/07eeb39a-3ad0-4632-9f86-bafffb3796d4 -- FORMATO DA REQUISIƇƃO SEM FILTROS

Resposta: status 200

[
	{
		"id": "054a4479-11cf-4c98-9bc6-ea6b35aff881",
		"date": "2024-02-02",
		"items": [
			{
				"id": "f16928be-963a-4739-9903-06e098542ab6",
				"quantity": 2,
				"price": "119.98",
				"product": {
					"id": "60096951-81d5-4569-ae70-c2deed1d9d43",
					"title": "A Tester",
					"price": "59.99",
					"description": "Product, A Tester, update ",
					"category": "electronics",
					"image": "urlfakesjdjfs"
				}
			},
			{
				"id": "4439758c-d89e-4b7e-b602-e0da11c87298",
				"quantity": 5,
				"price": "39.45",
				"product": {
					"id": "befed5e5-734a-4a1c-99cd-966348df1bf0",
					"title": "c Tester",
					"price": "7.89",
					"description": "tester description",
					"category": "food",
					"image": "urlfakesjdjfs"
				}
			}
		]
	},
	{
		"id": "d01dd31d-d308-46b8-8707-b151d6a92734",
		"date": "2024-02-04",
		"items": []
	},
	{
		"id": "8cc5cbb7-befe-40d9-8cb3-3959fee0b9a3",
		"date": "2024-02-04",
		"items": []
	},
	{
		"id": "10eb13ec-9883-4275-b140-6fc72e8e7ac1",
		"date": "2024-02-04",
		"items": []
	},
	{
		"id": "f9e5c293-06e5-4cb9-b752-90768047803c",
		"date": "2024-02-02",
		"items": []
	},
	{
		"id": "2dbb1953-2ece-45b4-9a13-39c6d9ea94fc",
		"date": "2024-02-04",
		"items": []
	}
]

GET /purchaseOrder/users/07eeb39a-3ad0-4632-9f86-bafffb3796d4?filters={"id":"054a4479-11cf-4c98-9bc6-ea6b35aff881"} -- FORMATO DA REQUISIƇƃO COM FILTROS

Resposta: status 200

[
	{
		"id": "054a4479-11cf-4c98-9bc6-ea6b35aff881",
		"date": "2024-02-02",
		"items": [
			{
				"id": "f16928be-963a-4739-9903-06e098542ab6",
				"quantity": 2,
				"price": "119.98",
				"product": {
					"id": "60096951-81d5-4569-ae70-c2deed1d9d43",
					"title": "A Tester",
					"price": "59.99",
					"description": "Product, A Tester, update ",
					"category": "electronics",
					"image": "urlfakesjdjfs"
				}
			},
			{
				"id": "4439758c-d89e-4b7e-b602-e0da11c87298",
				"quantity": 5,
				"price": "39.45",
				"product": {
					"id": "befed5e5-734a-4a1c-99cd-966348df1bf0",
					"title": "c Tester",
					"price": "7.89",
					"description": "tester description",
					"category": "food",
					"image": "urlfakesjdjfs"
				}
			}
		]
	}
]

Endpoints - Casos de Sucesso, PurchaseOrdersItems āœ”ļø

Adicionar produto em uma ordem de compra

POST /purchaseOrder/item -- FORMATO DA REQUISIƇƃO

Corpo:

{
	"product_id": "60096951-81d5-4569-ae70-c2deed1d9d43",
	"purchase_order_id": "054a4479-11cf-4c98-9bc6-ea6b35aff881",
	"quantity": 2
}

Resposta: status 201

{
	"quantity": 2,
	"price": 119.98,
	"product": {
		"id": "60096951-81d5-4569-ae70-c2deed1d9d43",
		"title": "A Tester",
		"price": "59.99",
		"description": "tester description",
		"category": "electronics",
		"image": "urlfakesjdjfs"
	},
	"purchaseOrder": {
		"id": "054a4479-11cf-4c98-9bc6-ea6b35aff881",
		"date": "2024-02-02T16:52:52.192Z"
	},
	"id": "f16928be-963a-4739-9903-06e098542ab6"
}