diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts
index 97bcabc..cc98d4e 100644
--- a/apps/api/src/app.module.ts
+++ b/apps/api/src/app.module.ts
@@ -140,6 +140,8 @@ export class AppModule implements NestModule {
.exclude(
{ path: 'health', method: RequestMethod.GET },
{ path: 'health/(.*)', method: RequestMethod.GET },
+ { path: 'api/v1/web-vitals', method: RequestMethod.POST }, // sendBeacon cannot send CSRF headers
+ { path: 'web-vitals', method: RequestMethod.POST }, // middleware exclude uses controller-relative path
)
.forRoutes('*');
}
diff --git a/apps/api/src/modules/shared/shared.module.ts b/apps/api/src/modules/shared/shared.module.ts
index 59eb88a..3888891 100644
--- a/apps/api/src/modules/shared/shared.module.ts
+++ b/apps/api/src/modules/shared/shared.module.ts
@@ -72,6 +72,8 @@ export class SharedModule implements NestModule {
{ path: 'auth/refresh', method: RequestMethod.POST },
{ path: 'auth/exchange-token', method: RequestMethod.POST },
{ path: 'auth/logout', method: RequestMethod.POST },
+ { path: 'api/v1/web-vitals', method: RequestMethod.POST }, // sendBeacon cannot send CSRF headers
+ { path: 'web-vitals', method: RequestMethod.POST }, // middleware exclude uses controller-relative path
)
.forRoutes('*');
}
diff --git a/apps/web/app/[locale]/(public)/page.tsx b/apps/web/app/[locale]/(public)/page.tsx
index e35a8ec..d9a5b7d 100644
--- a/apps/web/app/[locale]/(public)/page.tsx
+++ b/apps/web/app/[locale]/(public)/page.tsx
@@ -139,7 +139,7 @@ function KpiStrip({ city }: { city: string }) {
}
loading={isLoading}
@@ -147,7 +147,7 @@ function KpiStrip({ city }: { city: string }) {
}
loading={isLoading}
diff --git a/apps/web/next.config.js b/apps/web/next.config.js
index 0c2190e..b240220 100644
--- a/apps/web/next.config.js
+++ b/apps/web/next.config.js
@@ -43,7 +43,7 @@ const nextConfig = {
"style-src 'self' 'unsafe-inline' https://api.mapbox.com",
"img-src 'self' data: blob: https://*.mapbox.com https://*.tiles.mapbox.com https:",
"font-src 'self' data:",
- `connect-src 'self' https://*.mapbox.com https://api.mapbox.com https://events.mapbox.com https://api.goodgo.vn${process.env.NODE_ENV !== 'production' ? ' http://localhost:3001 http://localhost:3011 http://localhost:9000' : ''}`,
+ `connect-src 'self' https://*.mapbox.com https://api.mapbox.com https://events.mapbox.com https://api.goodgo.vn${process.env.NODE_ENV !== 'production' ? ' http://localhost:3001 http://localhost:3011 http://localhost:9000 ws://localhost:3001 ws://localhost:3011' : ''}`,
"worker-src 'self' blob:",
"child-src 'self' blob:",
"frame-ancestors 'none'",