Backend (commerce-backend):
- Módulo product-review (tabla nueva product_review; migración generada con
medusa db:generate, no toca tablas existentes).
- GET /store/reviews?product_id (solo aprobadas), /store/reviews/summary,
GET /store/reviews/me y POST /store/reviews con auth de cliente: exige que
el pedido sea del cliente, no esté cancelado y contenga el producto
("Compra verificada"); 1 reseña por cliente y producto; nace "pending".
- /admin/reviews (+ /:id POST status, DELETE) y página "Reseñas" en el admin
para aprobar/rechazar/borrar.
Storefront (ecommerce):
- /cuenta/pedidos ("Mis pedidos"): historial real + diálogo "Califica tu
compra" (radiogroup accesible, flechas de teclado).
- Ficha: sección de reseñas con "Compra verificada" y estrellas junto al
título; tarjetas: promedio y cantidad (una llamada /api/reviews/summary).
- Accesos: "Mis pedidos y reseñas" en la cuenta y en Ayuda.
Validado en entorno descartable (Postgres/Redis/Meilisearch/Medusa propios):
E2E de API 20/20 (incluye pedido interno por draft order, cancelación y
borrado), E2E de tienda con navegador 15/15, admin "Reseñas" verificado en
build de producción. Revisado por frontend-critic (contraste de estrellas
amber-600, patrón radiogroup).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_018r19s4H8MBGegqToqw5guP
37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
import { authenticate, defineMiddlewares } from "@medusajs/framework/http"
|
|
|
|
// GET /store/products descarta en silencio la relacion `categories`
|
|
// aunque `/admin/products` si la expone -- confirmado en vivo en la
|
|
// auditoria de Fase 5 (ver docs/decisiones/0004-evaluacion-stack-multi-categoria.md).
|
|
// Este es el patron oficial de Medusa v2 para ampliar los campos
|
|
// permitidos de una ruta core restringida (middleware global sobre
|
|
// req.allowed), no un query-config custom:
|
|
// https://docs.medusajs.com/learn/fundamentals/api-routes/retrieve-custom-links
|
|
export default defineMiddlewares({
|
|
routes: [
|
|
// Reseñas: crear una y ver las propias exige cliente autenticado --
|
|
// la verificacion de compra usa auth_context.actor_id (ver
|
|
// src/api/store/reviews/route.ts). GET /store/reviews y /summary
|
|
// siguen publicos.
|
|
{
|
|
matcher: "/store/reviews",
|
|
method: ["POST"],
|
|
middlewares: [authenticate("customer", ["session", "bearer"])],
|
|
},
|
|
{
|
|
matcher: "/store/reviews/me",
|
|
method: ["GET"],
|
|
middlewares: [authenticate("customer", ["session", "bearer"])],
|
|
},
|
|
{
|
|
matcher: "/store/products",
|
|
middlewares: [
|
|
(req, res, next) => {
|
|
;(req.allowed ??= []).push("categories")
|
|
next()
|
|
},
|
|
],
|
|
},
|
|
],
|
|
})
|