Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
6 changes: 4 additions & 2 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import morgan from "morgan";
import cors from "cors";
import cookieParser from "cookie-parser";
import storeRoutes from "./modules/commerce/commerces/store.routes.js";
import commerceAddressRoutes from "./modules/commerce/addresses/routes/addresses.routes.js";
import storeCategoryRoutes from "./modules/commerce/store-categories/store-category.routes.js";
import productRoutes from "./modules/commerce/products/product.routes.js";
import categoriesRoutes from "./modules/global/categories/categories.routes.js";
Expand All @@ -29,11 +30,12 @@ app.use(cors({
app.use('/api/session', sessionRoutes);
app.use("/api/commerces/categories", storeCategoryRoutes);
app.use("/api/commerces",storeRoutes);
app.use("/products", productRoutes);
app.use("/api/commerces", commerceAddressRoutes);
app.use("/products", productRoutes);
//Desde aqui pueden usarse dos endpoints, para productos /api/categories/products, y /api/categories/stores
//Se encuentra indexado
app.use("/api/categories", categoriesRoutes);
app.use("/products/tags", productTagRoutes);
app.use("/api/product-tags", productTagRoutes);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Posible cambio breaking de contrato en la ruta de product-tags.

En Line 38 el prefijo quedó en /api/product-tags. Si clientes ya consumen la ruta anterior (p. ej. /products/tags), esto rompe integración sin compatibilidad temporal ni aviso de migración.

💡 Sugerencia para compatibilidad backward temporal
+app.use("/products/tags", productTagRoutes); // compatibilidad transitoria
 app.use("/api/product-tags", productTagRoutes);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/index.js` at line 38, La ruta registrada cambió de contrato a
"/api/product-tags" y puede romper clientes que usan la ruta previa (p.ej.
"/products/tags"); en el archivo donde se llama a app.use con productTagRoutes,
restaura compatibilidad temporal añadiendo también el antiguo prefijo (por
ejemplo registrando productTagRoutes en "/products/tags") o añade un
redirect/alias que reenvíe requests de "/products/tags" hacia
"/api/product-tags" para mantener ambas rutas funcionando mientras se comunica
la migración.

app.use("/api/users", userRoutes);
app.use("/api/users", addressRoutes);

Expand Down
128 changes: 128 additions & 0 deletions src/modules/commerce/addresses/controllers/addresses.controllers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
//addresses.controllers.js
import {
createStoreAddressService,
deleteStoreAddressService,
getStoreAddressByIdService,
getStoreAddressesService,
updateStoreAddressService,
} from "../services/addresses.services.js";

const getErrorStatusCode = (error) => error.statusCode || error.status || 500;

// crea una direccion para el comercio autenticado
export const createStoreAddress = async (req, res) => {
try {
const { id_store } = req.params;

const address = await createStoreAddressService(
req.user?.id_user,
id_store,
req.body
);

return res.status(201).json({
success: true,
message: "Direccion del comercio creada exitosamente",
data: address,
});
} catch (error) {
return res.status(getErrorStatusCode(error)).json({
success: false,
message: error.message || "Error interno del servidor",
});
}
};

// devuelve la lista de direcciones del comercio autenticado
export const getStoreAddresses = async (req, res) => {
try {
const { id_store } = req.params;

const addresses = await getStoreAddressesService(
req.user?.id_user,
id_store
);

return res.status(200).json({
success: true,
data: addresses,
});
} catch (error) {
return res.status(getErrorStatusCode(error)).json({
success: false,
message: error.message || "Error interno del servidor",
});
}
};

// devuelve una direccion puntual del comercio autenticado
export const getStoreAddressById = async (req, res) => {
try {
const { id_store, id_address } = req.params;

const address = await getStoreAddressByIdService(
req.user?.id_user,
id_store,
id_address
);

return res.status(200).json({
success: true,
data: address,
});
} catch (error) {
return res.status(getErrorStatusCode(error)).json({
success: false,
message: error.message || "Error interno del servidor",
});
}
};

// actualiza una direccion puntual del comercio autenticado
export const updateStoreAddress = async (req, res) => {
try {
const { id_store, id_address } = req.params;

const address = await updateStoreAddressService(
req.user?.id_user,
id_store,
id_address,
req.body
);

return res.status(200).json({
success: true,
message: "Direccion del comercio actualizada exitosamente",
data: address,
});
} catch (error) {
return res.status(getErrorStatusCode(error)).json({
success: false,
message: error.message || "Error interno del servidor",
});
}
};

// desactiva una direccion puntual del comercio autenticado
export const deleteStoreAddress = async (req, res) => {
try {
const { id_store, id_address } = req.params;

const address = await deleteStoreAddressService(
req.user?.id_user,
id_store,
id_address
);

return res.status(200).json({
success: true,
message: "Direccion del comercio desactivada correctamente",
data: address,
});
} catch (error) {
return res.status(getErrorStatusCode(error)).json({
success: false,
message: error.message || "Error interno del servidor",
});
}
};
25 changes: 25 additions & 0 deletions src/modules/commerce/addresses/routes/addresses.routes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//addresses.routes.js
import { Router } from "express";
import authenticate from "../../../../config/jwt.config.js";
import {
createStoreAddress,
deleteStoreAddress,
getStoreAddressById,
getStoreAddresses,
updateStoreAddress,
} from "../controllers/addresses.controllers.js";

const router = Router();

// crea una nueva direccion para el comercio
router.post("/:id_store/addresses", authenticate, createStoreAddress);
// lista las direcciones activas del comercio
router.get("/:id_store/addresses", authenticate, getStoreAddresses);
// obtiene una direccion puntual del comercio
router.get("/:id_store/addresses/:id_address", authenticate, getStoreAddressById);
// edita una direccion puntual del comercio
router.put("/:id_store/addresses/:id_address", authenticate, updateStoreAddress);
// desactiva una direccion puntual del comercio
router.delete("/:id_store/addresses/:id_address", authenticate, deleteStoreAddress);

export default router;
Loading