Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0eea6234d6 | ||
|
|
77bf6089fb | ||
|
|
0134a4dd0b | ||
|
|
3fe63591ec | ||
|
|
c6cf394c26 | ||
|
|
7a09202c27 | ||
|
|
a902dc0a26 | ||
|
|
04dc6bd8bc | ||
|
|
60072cfcbe | ||
|
|
c9b376c4e6 |
@@ -25,6 +25,16 @@ module.exports = defineConfig({
|
|||||||
jwtSecret: required("JWT_SECRET"),
|
jwtSecret: required("JWT_SECRET"),
|
||||||
cookieSecret: required("COOKIE_SECRET"),
|
cookieSecret: required("COOKIE_SECRET"),
|
||||||
},
|
},
|
||||||
|
// Todos los Ingress del lab terminan en Traefik por HTTP plano
|
||||||
|
// (entrypoint "web", sin TLS); Cloudflare es quien atiende HTTPS de
|
||||||
|
// cara al navegador. Con `secure: true` (el default en producción),
|
||||||
|
// express-session nunca emite Set-Cookie porque no detecta la
|
||||||
|
// conexión como HTTPS, y el dashboard admin queda con 401 en
|
||||||
|
// /admin/users/me pese a loguear bien. La API con Bearer token no se
|
||||||
|
// ve afectada por esto.
|
||||||
|
cookieOptions: {
|
||||||
|
secure: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
admin: {
|
admin: {
|
||||||
|
|||||||
@@ -9,6 +9,13 @@ import { getProductBySlug, getProducts } from "@/lib/headless/client";
|
|||||||
|
|
||||||
interface ProductPageProps { params: Promise<{ slug: string }> }
|
interface ProductPageProps { params: Promise<{ slug: string }> }
|
||||||
|
|
||||||
|
// Sin esto, la página queda estática para siempre con los datos del build
|
||||||
|
// (que usa el catálogo mock porque HEADLESS_PROVIDER/MEDUSA_* no existen en
|
||||||
|
// el contexto del Docker build). El listado sí se refresca porque su ruta
|
||||||
|
// es dinámica por searchParams; esta ruta necesita el revalidate explícito
|
||||||
|
// para que el runtime (que sí tiene las env vars de Medusa) la regenere.
|
||||||
|
export const revalidate = 60;
|
||||||
|
|
||||||
export async function generateStaticParams() {
|
export async function generateStaticParams() {
|
||||||
const products = await getProducts();
|
const products = await getProducts();
|
||||||
return products.map((product) => ({ slug: product.slug }));
|
return products.map((product) => ({ slug: product.slug }));
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ spec:
|
|||||||
memory: 64Mi
|
memory: 64Mi
|
||||||
|
|
||||||
- name: migrations
|
- name: migrations
|
||||||
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.85
|
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.88
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
command:
|
command:
|
||||||
- npx
|
- npx
|
||||||
@@ -73,7 +73,7 @@ spec:
|
|||||||
|
|
||||||
containers:
|
containers:
|
||||||
- name: medusa
|
- name: medusa
|
||||||
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.85
|
image: gitea.cruzcloud.net/devops/ecommerce-medusa:v1.0.88
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
envFrom:
|
envFrom:
|
||||||
- configMapRef:
|
- configMapRef:
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ spec:
|
|||||||
- name: gitea-registry-secret
|
- name: gitea-registry-secret
|
||||||
containers:
|
containers:
|
||||||
- name: web
|
- name: web
|
||||||
image: gitea.cruzcloud.net/devops/ecommerce-frontend:v1.0.77
|
image: gitea.cruzcloud.net/devops/ecommerce-frontend:v1.0.87
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 80
|
- containerPort: 80
|
||||||
env:
|
env:
|
||||||
@@ -24,6 +24,8 @@ spec:
|
|||||||
value: medusa
|
value: medusa
|
||||||
- name: MEDUSA_BACKEND_URL
|
- name: MEDUSA_BACKEND_URL
|
||||||
value: http://medusa-svc:9000
|
value: http://medusa-svc:9000
|
||||||
|
- name: MEDUSA_REGION_ID
|
||||||
|
value: reg_01KZT86WPAH7A7ZZRDSX3350V2
|
||||||
envFrom:
|
envFrom:
|
||||||
- secretRef:
|
- secretRef:
|
||||||
name: commerce-storefront
|
name: commerce-storefront
|
||||||
|
|||||||
@@ -258,6 +258,14 @@ function backendUrl(): string {
|
|||||||
return value.replace(/\/$/, "");
|
return value.replace(/\/$/, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function regionId(): string {
|
||||||
|
const value = process.env.MEDUSA_REGION_ID;
|
||||||
|
if (!value) {
|
||||||
|
throw new Error("MEDUSA_REGION_ID no está configurado.");
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
async function medusaFetch<T>(
|
async function medusaFetch<T>(
|
||||||
path: string,
|
path: string,
|
||||||
searchParams?: URLSearchParams,
|
searchParams?: URLSearchParams,
|
||||||
@@ -515,7 +523,10 @@ async function fetchProducts(
|
|||||||
): Promise<Product[]> {
|
): Promise<Product[]> {
|
||||||
const params = new URLSearchParams({
|
const params = new URLSearchParams({
|
||||||
limit: String(limit),
|
limit: String(limit),
|
||||||
currency_code: "cop",
|
// El validador de /store/products no acepta currency_code (400
|
||||||
|
// "Unrecognized fields"); el precio calculado solo se resuelve con
|
||||||
|
// region_id.
|
||||||
|
region_id: regionId(),
|
||||||
fields:
|
fields:
|
||||||
"+metadata,+images,+tags,+categories,+collection,+variants.inventory_quantity,+variants.calculated_price,+variants.options",
|
"+metadata,+images,+tags,+categories,+collection,+variants.inventory_quantity,+variants.calculated_price,+variants.options",
|
||||||
});
|
});
|
||||||
@@ -543,7 +554,10 @@ export const medusaCatalogProvider: CatalogProvider = {
|
|||||||
const params = new URLSearchParams({
|
const params = new URLSearchParams({
|
||||||
handle: slug,
|
handle: slug,
|
||||||
limit: "1",
|
limit: "1",
|
||||||
currency_code: "cop",
|
// El validador de /store/products no acepta currency_code (400
|
||||||
|
// "Unrecognized fields"); el precio calculado solo se resuelve con
|
||||||
|
// region_id.
|
||||||
|
region_id: regionId(),
|
||||||
fields:
|
fields:
|
||||||
"+metadata,+images,+tags,+categories,+collection,+variants.inventory_quantity,+variants.calculated_price,+variants.options",
|
"+metadata,+images,+tags,+categories,+collection,+variants.inventory_quantity,+variants.calculated_price,+variants.options",
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user