Skip to content

Commit 2020dce

Browse files
committed
components; (#2)
1 parent c843763 commit 2020dce

File tree

2 files changed

+512
-0
lines changed

2 files changed

+512
-0
lines changed

src/routes/cart.routes.js

Lines changed: 281 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
1+
const express = require('express');
2+
const router = express.Router();
3+
4+
// Simulação de banco de dados de carrinhos
5+
let carts = {}; // { userId: { userId: '...', items: [{ productId, name, quantity, price }], totalPrice: ... } }
6+
7+
// Helper para encontrar produto (simulação)
8+
const findProductById = (id) => {
9+
// Em um cenário real, você buscaria isso em um serviço de produtos ou DB
10+
const products = [
11+
{ id: 'prod_001', name: 'Smartphone X', price: 2500.00 },
12+
{ id: 'prod_002', name: 'Fone de Ouvido Bluetooth', price: 350.00 },
13+
{ id: 'prod_003', name: 'Tablet Pro', price: 1800.00 }
14+
];
15+
return products.find(p => p.id === id);
16+
};
17+
18+
/**
19+
* @swagger
20+
* /cart/{userId}:
21+
* get:
22+
* summary: Retorna o carrinho de compras de um usuário.
23+
* description: Permite buscar o carrinho de compras associado a um ID de usuário específico. Se o carrinho não existir, pode ser criado um novo (se a lógica da API permitir) ou retornada uma resposta de "não encontrado".
24+
* tags:
25+
* - Carrinhos
26+
* parameters:
27+
* - in: path
28+
* name: userId
29+
* required: true
30+
* schema:
31+
* type: string
32+
* description: O ID único do usuário.
33+
* example: user_abc
34+
* responses:
35+
* 200:
36+
* description: Carrinho retornado com sucesso.
37+
* content:
38+
* application/json:
39+
* schema:
40+
* $ref: '#/components/schemas/Cart'
41+
* 404:
42+
* description: Carrinho para o usuário não encontrado.
43+
* content:
44+
* application/json:
45+
* schema:
46+
* type: object
47+
* properties:
48+
* error:
49+
* type: string
50+
* example: Carrinho para o usuário 'user_xyz' não encontrado.
51+
*/
52+
router.get('/cart/:userId', (req, res) => {
53+
const { userId } = req.params;
54+
const cart = carts[userId];
55+
if (cart) {
56+
res.json(cart);
57+
} else {
58+
// Em um cenário real, você pode criar um carrinho vazio aqui ou retornar 404
59+
res.status(404).json({ error: `Carrinho para o usuário '${userId}' não encontrado.` });
60+
}
61+
});
62+
63+
/**
64+
* @swagger
65+
* /cart/{userId}/items:
66+
* post:
67+
* summary: Adiciona um item ao carrinho de um usuário.
68+
* description: Adiciona uma determinada quantidade de um produto ao carrinho de compras do usuário. Se o produto já estiver no carrinho, a quantidade será atualizada.
69+
* tags:
70+
* - Carrinhos
71+
* parameters:
72+
* - in: path
73+
* name: userId
74+
* required: true
75+
* schema:
76+
* type: string
77+
* description: O ID único do usuário.
78+
* example: user_abc
79+
* requestBody:
80+
* required: true
81+
* content:
82+
* application/json:
83+
* schema:
84+
* $ref: '#/components/schemas/CartItemInput'
85+
* example:
86+
* productId: prod_003
87+
* quantity: 1
88+
* responses:
89+
* 200:
90+
* description: Item adicionado/atualizado no carrinho com sucesso.
91+
* content:
92+
* application/json:
93+
* schema:
94+
* $ref: '#/components/schemas/Cart'
95+
* 400:
96+
* description: Dados de entrada inválidos ou quantidade inválida.
97+
* content:
98+
* application/json:
99+
* schema:
100+
* type: object
101+
* properties:
102+
* error:
103+
* type: string
104+
* example: Quantidade inválida para o produto 'prod_003'.
105+
* 404:
106+
* description: Produto não encontrado ou usuário não existe para criar carrinho.
107+
* content:
108+
* application/json:
109+
* schema:
110+
* type: object
111+
* properties:
112+
* error:
113+
* type: string
114+
* example: Produto com ID 'prod_999' não encontrado.
115+
*/
116+
router.post('/cart/:userId/items', (req, res) => {
117+
const { userId } = req.params;
118+
const { productId, quantity } = req.body;
119+
120+
if (!productId || quantity === undefined || quantity <= 0) {
121+
return res.status(400).json({ error: 'productId e quantity (maior que zero) são obrigatórios.' });
122+
}
123+
124+
const product = findProductById(productId);
125+
if (!product) {
126+
return res.status(404).json({ error: `Produto com ID '${productId}' não encontrado.` });
127+
}
128+
129+
if (!carts[userId]) {
130+
carts[userId] = { userId: userId, items: [], totalPrice: 0 };
131+
}
132+
133+
const cart = carts[userId];
134+
const existingItemIndex = cart.items.findIndex(item => item.productId === productId);
135+
136+
if (existingItemIndex > -1) {
137+
cart.items[existingItemIndex].quantity += quantity;
138+
} else {
139+
cart.items.push({
140+
productId: product.id,
141+
name: product.name,
142+
quantity: quantity,
143+
price: product.price
144+
});
145+
}
146+
147+
cart.totalPrice = cart.items.reduce((sum, item) => sum + (item.quantity * item.price), 0);
148+
res.status(200).json(cart);
149+
});
150+
151+
/**
152+
* @swagger
153+
* /cart/{userId}/items/{productId}:
154+
* delete:
155+
* summary: Remove um item específico do carrinho de um usuário.
156+
* description: Remove um produto completamente do carrinho de compras do usuário.
157+
* tags:
158+
* - Carrinhos
159+
* parameters:
160+
* - in: path
161+
* name: userId
162+
* required: true
163+
* schema:
164+
* type: string
165+
* description: O ID único do usuário.
166+
* example: user_abc
167+
* - in: path
168+
* name: productId
169+
* required: true
170+
* schema:
171+
* type: string
172+
* description: O ID único do produto a ser removido.
173+
* example: prod_002
174+
* responses:
175+
* 200:
176+
* description: Item removido do carrinho com sucesso.
177+
* content:
178+
* application/json:
179+
* schema:
180+
* type: object
181+
* properties:
182+
* message:
183+
* type: string
184+
* example: Produto 'prod_002' removido do carrinho do usuário 'user_abc'.
185+
* 404:
186+
* description: Carrinho ou item não encontrado.
187+
* content:
188+
* application/json:
189+
* schema:
190+
* type: object
191+
* properties:
192+
* error:
193+
* type: string
194+
* example: Produto 'prod_999' não encontrado no carrinho do usuário 'user_abc'.
195+
*/
196+
router.delete('/cart/:userId/items/:productId', (req, res) => {
197+
const { userId, productId } = req.params;
198+
const cart = carts[userId];
199+
200+
if (!cart) {
201+
return res.status(404).json({ error: `Carrinho para o usuário '${userId}' não encontrado.` });
202+
}
203+
204+
const initialLength = cart.items.length;
205+
cart.items = cart.items.filter(item => item.productId !== productId);
206+
207+
if (cart.items.length === initialLength) {
208+
return res.status(404).json({ error: `Produto '${productId}' não encontrado no carrinho do usuário '${userId}'.` });
209+
}
210+
211+
cart.totalPrice = cart.items.reduce((sum, item) => sum + (item.quantity * item.price), 0);
212+
res.status(200).json({ message: `Produto '${productId}' removido do carrinho do usuário '${userId}'.` });
213+
});
214+
215+
// Definições de Schemas (Modelos de Dados) para reutilização na documentação
216+
/**
217+
* @swagger
218+
* components:
219+
* schemas:
220+
* CartItem:
221+
* type: object
222+
* required:
223+
* - productId
224+
* - name
225+
* - quantity
226+
* - price
227+
* properties:
228+
* productId:
229+
* type: string
230+
* description: O ID único do produto.
231+
* example: prod_001
232+
* name:
233+
* type: string
234+
* description: O nome do produto.
235+
* example: Smartphone X
236+
* quantity:
237+
* type: integer
238+
* description: A quantidade do produto no carrinho.
239+
* example: 1
240+
* price:
241+
* type: number
242+
* format: float
243+
* description: O preço unitário do produto no momento da adição.
244+
* example: 2500.00
245+
* Cart:
246+
* type: object
247+
* required:
248+
* - userId
249+
* - items
250+
* - totalPrice
251+
* properties:
252+
* userId:
253+
* type: string
254+
* description: O ID único do usuário.
255+
* example: user_abc
256+
* items:
257+
* type: array
258+
* items:
259+
* $ref: '#/components/schemas/CartItem'
260+
* description: Lista de itens no carrinho.
261+
* totalPrice:
262+
* type: number
263+
* format: float
264+
* description: O preço total do carrinho.
265+
* example: 3200.00
266+
* CartItemInput:
267+
* type: object
268+
* required:
269+
* - productId
270+
* - quantity
271+
* properties:
272+
* productId:
273+
* type: string
274+
* description: O ID do produto a ser adicionado ou atualizado.
275+
* example: prod_003
276+
* quantity:
277+
* type: integer
278+
* description: A quantidade do produto a ser adicionada.
279+
* example: 1
280+
*/
281+
module.exports = router;

0 commit comments

Comments
 (0)