@flowselections/floriday-authenticatie-module 1.0.25 → 1.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist-lib/integrations/supabase/auth-middleware.d.ts +45 -0
  2. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  3. package/dist-lib/integrations/supabase/client.d.ts +45 -0
  4. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  5. package/dist-lib/integrations/supabase/client.server.d.ts +45 -0
  6. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  7. package/dist-lib/integrations/supabase/types.d.ts +47 -0
  8. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  9. package/dist-lib/lib/floricode.functions.d.ts +315 -0
  10. package/dist-lib/lib/floricode.functions.d.ts.map +1 -1
  11. package/dist-lib/lib/floriday-auction-letters.functions.d.ts +45 -0
  12. package/dist-lib/lib/floriday-auction-letters.functions.d.ts.map +1 -1
  13. package/dist-lib/lib/floriday-gateway-auth.d.ts +8 -2
  14. package/dist-lib/lib/floriday-gateway-auth.d.ts.map +1 -1
  15. package/dist-lib/lib/floriday-gateway-auth.js +31 -8
  16. package/dist-lib/lib/floriday-gateway-hmac.d.ts +2 -0
  17. package/dist-lib/lib/floriday-gateway-hmac.d.ts.map +1 -1
  18. package/dist-lib/lib/floriday-gateway-hmac.js +13 -2
  19. package/dist-lib/lib/floriday-labels.functions.d.ts +45 -0
  20. package/dist-lib/lib/floriday-labels.functions.d.ts.map +1 -1
  21. package/dist-lib/lib/floriday-public.functions.d.ts +270 -0
  22. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  23. package/dist-lib/lib/floriday-stickers.functions.d.ts +45 -0
  24. package/dist-lib/lib/floriday-stickers.functions.d.ts.map +1 -1
  25. package/dist-lib/lib/floriday-sync.functions.d.ts +1395 -0
  26. package/dist-lib/lib/floriday-sync.functions.d.ts.map +1 -1
  27. package/dist-lib/lib/floriday-writes.functions.d.ts +270 -0
  28. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  29. package/dist-lib/lib/floriday.functions.d.ts +828 -126
  30. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  31. package/dist-lib/lib/floriday.functions.js +11 -5
  32. package/dist-lib/lib/gateway/active-environment.d.ts +1 -0
  33. package/dist-lib/lib/gateway/active-environment.d.ts.map +1 -1
  34. package/dist-lib/lib/gateway/active-environment.js +20 -0
  35. package/dist-lib/lib/gateway/auto-process.d.ts +4 -0
  36. package/dist-lib/lib/gateway/auto-process.d.ts.map +1 -0
  37. package/dist-lib/lib/gateway/auto-process.js +35 -0
  38. package/dist-lib/lib/gateway/cached-list.d.ts +1 -0
  39. package/dist-lib/lib/gateway/cached-list.d.ts.map +1 -1
  40. package/dist-lib/lib/gateway/cached-list.js +32 -0
  41. package/dist-lib/lib/gateway/code-list.d.ts +1 -0
  42. package/dist-lib/lib/gateway/code-list.d.ts.map +1 -1
  43. package/dist-lib/lib/gateway/code-list.js +32 -0
  44. package/dist-lib/lib/gateway/cron-scan.d.ts +4 -0
  45. package/dist-lib/lib/gateway/cron-scan.d.ts.map +1 -0
  46. package/dist-lib/lib/gateway/cron-scan.js +20 -0
  47. package/dist-lib/lib/gateway/diagnostics.d.ts +2 -0
  48. package/dist-lib/lib/gateway/diagnostics.d.ts.map +1 -1
  49. package/dist-lib/lib/gateway/diagnostics.js +63 -0
  50. package/dist-lib/lib/gateway/floricode-records.d.ts +1 -0
  51. package/dist-lib/lib/gateway/floricode-records.d.ts.map +1 -1
  52. package/dist-lib/lib/gateway/floricode-records.js +24 -0
  53. package/dist-lib/lib/gateway/fulfillment-order-send.d.ts +1 -0
  54. package/dist-lib/lib/gateway/fulfillment-order-send.d.ts.map +1 -1
  55. package/dist-lib/lib/gateway/fulfillment-order-send.js +33 -0
  56. package/dist-lib/lib/gateway/index.d.ts +2 -0
  57. package/dist-lib/lib/gateway/index.d.ts.map +1 -1
  58. package/dist-lib/lib/gateway/index.js +2 -0
  59. package/dist-lib/lib/gateway/media-upload.d.ts +2 -0
  60. package/dist-lib/lib/gateway/media-upload.d.ts.map +1 -1
  61. package/dist-lib/lib/gateway/media-upload.js +106 -0
  62. package/dist-lib/lib/gateway/media.d.ts +2 -0
  63. package/dist-lib/lib/gateway/media.d.ts.map +1 -1
  64. package/dist-lib/lib/gateway/media.js +71 -0
  65. package/dist-lib/lib/gateway/pdf-bulk-merged.d.ts +2 -0
  66. package/dist-lib/lib/gateway/pdf-bulk-merged.d.ts.map +1 -1
  67. package/dist-lib/lib/gateway/pdf-bulk-merged.js +49 -0
  68. package/dist-lib/lib/gateway/pdf-bulk.d.ts +2 -0
  69. package/dist-lib/lib/gateway/pdf-bulk.d.ts.map +1 -1
  70. package/dist-lib/lib/gateway/pdf-bulk.js +48 -0
  71. package/dist-lib/lib/gateway/pdf.d.ts +1 -0
  72. package/dist-lib/lib/gateway/pdf.d.ts.map +1 -1
  73. package/dist-lib/lib/gateway/pdf.js +42 -0
  74. package/dist-lib/lib/gateway/product-characteristics.d.ts +1 -0
  75. package/dist-lib/lib/gateway/product-characteristics.d.ts.map +1 -1
  76. package/dist-lib/lib/gateway/product-characteristics.js +53 -0
  77. package/dist-lib/lib/gateway/schema.d.ts +1 -0
  78. package/dist-lib/lib/gateway/schema.d.ts.map +1 -1
  79. package/dist-lib/lib/gateway/schema.js +30 -0
  80. package/dist-lib/lib/gateway/supply-line.d.ts +1 -0
  81. package/dist-lib/lib/gateway/supply-line.d.ts.map +1 -1
  82. package/dist-lib/lib/gateway/supply-line.js +28 -0
  83. package/dist-lib/lib/gateway/write.d.ts +1 -0
  84. package/dist-lib/lib/gateway/write.d.ts.map +1 -1
  85. package/dist-lib/lib/gateway/write.js +30 -0
  86. package/package.json +2 -2
@@ -902,9 +902,10 @@ export const syncFlorydayConnections = createServerFn({ method: "POST" })
902
902
  }
903
903
  return input;
904
904
  })
905
- .handler(async ({ data, context }) => {
905
+ .handler(async ({ data, context: _context }) => {
906
906
  try {
907
- const result = await runFloridayConnectionsSync(context.supabase, data.environment);
907
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server");
908
+ const result = await runFloridayConnectionsSync(supabaseAdmin, data.environment);
908
909
  return { ok: true, ...result };
909
910
  }
910
911
  catch (e) {
@@ -923,7 +924,8 @@ export const getFlorydaySyncStatus = createServerFn({ method: "POST" })
923
924
  const row = await getActiveFlorydayCredentials(context.supabase, data.environment);
924
925
  if (!row)
925
926
  return { ok: false, error: `Geen actieve koppeling voor ${data.environment}` };
926
- const { data: states } = await context.supabase
927
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server");
928
+ const { data: states } = await supabaseAdmin
927
929
  .from("floriday_sync_state")
928
930
  .select("entity_type, last_sequence_number, last_synced_at, last_error")
929
931
  .eq("connection_id", row.id);
@@ -960,7 +962,10 @@ export const getFlorydaySyncStatus = createServerFn({ method: "POST" })
960
962
  if (!table)
961
963
  continue;
962
964
  let cached_count = 0;
963
- const { count } = await context.supabase
965
+ const client = table === "floriday_connections_cache"
966
+ ? (await import("../integrations/supabase/client.server")).supabaseAdmin
967
+ : context.supabase;
968
+ const { count } = await client
964
969
  .from(table)
965
970
  .select("connection_id", { count: "exact", head: true })
966
971
  .eq("connection_id", row.id);
@@ -1303,7 +1308,8 @@ export const getFlorydaySyncHealth = createServerFn({ method: "POST" })
1303
1308
  const row = await getActiveFlorydayCredentials(context.supabase, data.environment);
1304
1309
  if (!row)
1305
1310
  return { ok: false, error: `Geen actieve koppeling voor ${data.environment}` };
1306
- const { data: states } = await context.supabase
1311
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server");
1312
+ const { data: states } = await supabaseAdmin
1307
1313
  .from("floriday_sync_state")
1308
1314
  .select("entity_type, last_success_at, last_synced_at, last_error")
1309
1315
  .eq("connection_id", row.id);
@@ -4,4 +4,5 @@ export interface ActiveEnvironmentResult {
4
4
  environment: "staging" | "live";
5
5
  }
6
6
  export declare function runActiveEnvironment(supabase: SupabaseClient): Promise<ActiveEnvironmentResult>;
7
+ export declare function handleActiveEnvironment(request: Request, supabase: SupabaseClient): Promise<Response>;
7
8
  //# sourceMappingURL=active-environment.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"active-environment.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/active-environment.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,IAAI,CAAC;IACT,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;CACjC;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,uBAAuB,CAAC,CAGlC"}
1
+ {"version":3,"file":"active-environment.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/active-environment.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,IAAI,CAAC;IACT,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;CACjC;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,uBAAuB,CAAC,CAGlC;AAcD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAanB"}
@@ -6,3 +6,23 @@ export async function runActiveEnvironment(supabase) {
6
6
  const environment = await resolveGatewayEnvironment(supabase);
7
7
  return { ok: true, environment };
8
8
  }
9
+ // ---------------------------------------------------------------------------
10
+ // HTTP-handler
11
+ // ---------------------------------------------------------------------------
12
+ import { verifyGatewayCaller, corsPreflight, withCors, } from "../floriday-gateway-auth";
13
+ const _aeJson = (data, init) => withCors(Response.json(data, init));
14
+ export async function handleActiveEnvironment(request, supabase) {
15
+ if (request.method === "OPTIONS")
16
+ return corsPreflight();
17
+ const auth = await verifyGatewayCaller(request, supabase);
18
+ if (!auth.ok) {
19
+ return _aeJson({ ok: false, error: auth.error }, { status: auth.status });
20
+ }
21
+ try {
22
+ const result = await runActiveEnvironment(supabase);
23
+ return _aeJson(result);
24
+ }
25
+ catch (e) {
26
+ return _aeJson({ ok: false, error: String(e?.message ?? e) }, { status: 409 });
27
+ }
28
+ }
@@ -0,0 +1,4 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ export { runAutoProcess } from "../floriday-auto-process.server";
3
+ export declare function handleAutoProcess(request: Request, supabase: SupabaseClient): Promise<Response>;
4
+ //# sourceMappingURL=auto-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-process.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/auto-process.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAO5D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAKjE,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CA4BnB"}
@@ -0,0 +1,35 @@
1
+ // Gateway module: auto-process (orkestrator) voor één sales order.
2
+ // Spiegel van src/routes/api/public/gateway/auto-process.ts.
3
+ import { verifyGatewayCaller, corsPreflight, withCors, } from "../floriday-gateway-auth";
4
+ export { runAutoProcess } from "../floriday-auto-process.server";
5
+ const json = (data, init) => withCors(Response.json(data, init));
6
+ export async function handleAutoProcess(request, supabase) {
7
+ if (request.method === "OPTIONS")
8
+ return corsPreflight();
9
+ const auth = await verifyGatewayCaller(request, supabase);
10
+ if (!auth.ok)
11
+ return json({ ok: false, error: auth.error }, { status: auth.status });
12
+ let body;
13
+ try {
14
+ body = JSON.parse(auth.rawBody || "{}");
15
+ }
16
+ catch {
17
+ return json({ ok: false, error: "Ongeldige JSON-body" }, { status: 400 });
18
+ }
19
+ const salesOrderId = String(body?.salesOrderId ?? "").trim();
20
+ if (!salesOrderId) {
21
+ return json({ ok: false, error: "salesOrderId is verplicht" }, { status: 400 });
22
+ }
23
+ const force = Boolean(body?.force);
24
+ try {
25
+ const { runAutoProcess } = await import("../floriday-auto-process.server");
26
+ const outcome = await runAutoProcess(supabase, {
27
+ salesOrderId,
28
+ force,
29
+ });
30
+ return json(outcome, { status: outcome.ok ? 200 : 502 });
31
+ }
32
+ catch (e) {
33
+ return json({ ok: false, error: String(e?.message ?? e) }, { status: 500 });
34
+ }
35
+ }
@@ -12,4 +12,5 @@ export type CachedListResult = {
12
12
  error: string;
13
13
  };
14
14
  export declare function runCachedList(supabase: SupabaseClient, parsed: CachedListInput): Promise<CachedListResult>;
15
+ export declare function handleCachedList(request: Request, supabase: SupabaseClient): Promise<Response>;
15
16
  //# sourceMappingURL=cached-list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cached-list.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/cached-list.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,wBAAsB,aAAa,CACjC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA8B3B"}
1
+ {"version":3,"file":"cached-list.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/cached-list.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,wBAAsB,aAAa,CACjC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA8B3B;AAOD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CA+BnB"}
@@ -33,3 +33,35 @@ export async function runCachedList(supabase, parsed) {
33
33
  return { ok: false, error: error.message };
34
34
  return { ok: true, rows: rows ?? [] };
35
35
  }
36
+ // ---------------------------------------------------------------------------
37
+ // HTTP-handler (geen CORS/OPTIONS — bewust, spiegelt route)
38
+ // ---------------------------------------------------------------------------
39
+ import { verifyGatewayCaller } from "../floriday-gateway-auth";
40
+ export async function handleCachedList(request, supabase) {
41
+ const auth = await verifyGatewayCaller(request, supabase);
42
+ if (!auth.ok) {
43
+ return Response.json({ ok: false, error: auth.error }, { status: auth.status });
44
+ }
45
+ let parsed;
46
+ try {
47
+ parsed = JSON.parse(auth.rawBody);
48
+ }
49
+ catch {
50
+ return Response.json({ ok: false, error: "Ongeldige JSON-body" }, { status: 400 });
51
+ }
52
+ if (parsed.environment !== "staging" && parsed.environment !== "live") {
53
+ return Response.json({ ok: false, error: "Ongeldige environment" }, { status: 400 });
54
+ }
55
+ if (!CACHE_TABLES[parsed.entity]) {
56
+ return Response.json({ ok: false, error: `Onbekende entity: ${parsed.entity}` }, { status: 400 });
57
+ }
58
+ try {
59
+ const result = await runCachedList(supabase, parsed);
60
+ return Response.json(result);
61
+ }
62
+ catch (e) {
63
+ const msg = String(e?.message ?? e);
64
+ console.error("[gateway/cached-list] crashed:", msg);
65
+ return Response.json({ ok: false, error: msg }, { status: 500 });
66
+ }
67
+ }
@@ -13,4 +13,5 @@ export declare function runCodeList(supabase: SupabaseClient, parsed: CodeListIn
13
13
  payload: any;
14
14
  }>;
15
15
  }>;
16
+ export declare function handleCodeList(request: Request, supabase: SupabaseClient): Promise<Response>;
16
17
  //# sourceMappingURL=code-list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-list.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/code-list.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA4BD,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAQ5F"}
1
+ {"version":3,"file":"code-list.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/code-list.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA4BD,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAQ5F;AAOD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CA4BnB"}
@@ -26,3 +26,35 @@ export async function runCodeList(supabase, parsed) {
26
26
  const rows = await fetchAllCodeListRows(supabase, parsed.environment, parsed.listName, parsed.codeLike);
27
27
  return { ok: true, values: rows ?? [] };
28
28
  }
29
+ // ---------------------------------------------------------------------------
30
+ // HTTP-handler
31
+ // ---------------------------------------------------------------------------
32
+ import { verifyGatewayCaller } from "../floriday-gateway-auth";
33
+ export async function handleCodeList(request, supabase) {
34
+ const auth = await verifyGatewayCaller(request, supabase);
35
+ if (!auth.ok) {
36
+ return Response.json({ ok: false, error: auth.error }, { status: auth.status });
37
+ }
38
+ let parsed;
39
+ try {
40
+ parsed = JSON.parse(auth.rawBody);
41
+ }
42
+ catch {
43
+ return Response.json({ ok: false, error: "Ongeldige JSON-body" }, { status: 400 });
44
+ }
45
+ if (parsed.environment !== "staging" && parsed.environment !== "live") {
46
+ return Response.json({ ok: false, error: "Ongeldige environment" }, { status: 400 });
47
+ }
48
+ if (!parsed.listName || typeof parsed.listName !== "string") {
49
+ return Response.json({ ok: false, error: "listName is verplicht" }, { status: 400 });
50
+ }
51
+ try {
52
+ const result = await runCodeList(supabase, parsed);
53
+ return Response.json(result);
54
+ }
55
+ catch (e) {
56
+ const msg = String(e?.message ?? e);
57
+ console.error("[gateway/code-list] crashed:", msg);
58
+ return Response.json({ ok: false, error: msg }, { status: 500 });
59
+ }
60
+ }
@@ -0,0 +1,4 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ export { scanAndTriggerAutoProcess } from "../floriday-auto-process.server";
3
+ export declare function handleCronScan(request: Request, supabase: SupabaseClient): Promise<Response>;
4
+ //# sourceMappingURL=cron-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-scan.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/cron-scan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAO5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAK5E,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAenB"}
@@ -0,0 +1,20 @@
1
+ // Gateway module: cron-scan (elke 5 min).
2
+ // Spiegel van src/routes/api/public/gateway/cron.scan.ts.
3
+ import { verifyGatewayCaller, corsPreflight, withCors, } from "../floriday-gateway-auth";
4
+ export { scanAndTriggerAutoProcess } from "../floriday-auto-process.server";
5
+ const json = (data, init) => withCors(Response.json(data, init));
6
+ export async function handleCronScan(request, supabase) {
7
+ if (request.method === "OPTIONS")
8
+ return corsPreflight();
9
+ const auth = await verifyGatewayCaller(request, supabase);
10
+ if (!auth.ok)
11
+ return json({ ok: false, error: auth.error }, { status: auth.status });
12
+ try {
13
+ const { scanAndTriggerAutoProcess } = await import("../floriday-auto-process.server");
14
+ const summary = await scanAndTriggerAutoProcess(supabase);
15
+ return json({ ok: true, ...summary });
16
+ }
17
+ catch (e) {
18
+ return json({ ok: false, error: String(e?.message ?? e) }, { status: 500 });
19
+ }
20
+ }
@@ -10,4 +10,6 @@ export interface DiagnosticsResult {
10
10
  error?: string;
11
11
  }
12
12
  export declare function runDiagnostics(supabase: SupabaseClient, input: DiagnosticsInput): Promise<DiagnosticsResult>;
13
+ export declare const DIAGNOSTICS_MAX_BODY_BYTES: number;
14
+ export declare function handleDiagnostics(request: Request, supabase: SupabaseClient): Promise<Response>;
13
15
  //# sourceMappingURL=diagnostics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/diagnostics.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA4B5D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CA4D5B"}
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/diagnostics.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA4B5D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CA4D5B;AAQD,eAAO,MAAM,0BAA0B,QAAa,CAAC;AAqBrD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAkDnB"}
@@ -64,3 +64,66 @@ export async function runDiagnostics(supabase, input) {
64
64
  attemptId: inserted?.id ?? null,
65
65
  };
66
66
  }
67
+ // ---------------------------------------------------------------------------
68
+ // HTTP-handler (fail-soft, lokale CORS_HEADERS byte-identiek behouden)
69
+ // ---------------------------------------------------------------------------
70
+ import { verifyGatewayCaller } from "../floriday-gateway-auth";
71
+ import { GATEWAY_HEADER_CALLER } from "../floriday-gateway-hmac";
72
+ export const DIAGNOSTICS_MAX_BODY_BYTES = 256 * 1024; // 256 KB
73
+ const DIAGNOSTICS_CORS_HEADERS = {
74
+ "Access-Control-Allow-Origin": "*",
75
+ "Access-Control-Allow-Methods": "POST, OPTIONS",
76
+ "Access-Control-Allow-Headers": [
77
+ "content-type",
78
+ "x-floriday-timestamp",
79
+ "x-floriday-signature",
80
+ "x-floriday-caller",
81
+ ].join(", "),
82
+ "Access-Control-Max-Age": "86400",
83
+ };
84
+ function _diagJson(data, init = {}) {
85
+ return Response.json(data, {
86
+ ...init,
87
+ headers: { ...(init.headers ?? {}), ...DIAGNOSTICS_CORS_HEADERS },
88
+ });
89
+ }
90
+ export async function handleDiagnostics(request, supabase) {
91
+ if (request.method === "OPTIONS") {
92
+ return new Response(null, { status: 204, headers: DIAGNOSTICS_CORS_HEADERS });
93
+ }
94
+ const declared = Number(request.headers.get("content-length") ?? "0");
95
+ if (Number.isFinite(declared) && declared > DIAGNOSTICS_MAX_BODY_BYTES) {
96
+ return _diagJson({ ok: false, error: "Diagnostics-payload te groot (max 256 KB)" }, { status: 413 });
97
+ }
98
+ const auth = await verifyGatewayCaller(request, supabase);
99
+ if (!auth.ok) {
100
+ return _diagJson({ ok: false, error: auth.error }, { status: auth.status });
101
+ }
102
+ if (auth.rawBody.length > DIAGNOSTICS_MAX_BODY_BYTES) {
103
+ return _diagJson({ ok: false, error: "Diagnostics-payload te groot (max 256 KB)" }, { status: 413 });
104
+ }
105
+ try {
106
+ const result = await runDiagnostics(supabase, {
107
+ rawBody: auth.rawBody,
108
+ callerHeader: request.headers.get(GATEWAY_HEADER_CALLER),
109
+ callerAuth: auth.caller,
110
+ });
111
+ if (!result.stored) {
112
+ return _diagJson({
113
+ ok: true,
114
+ stored: false,
115
+ error: result.error ?? "diagnostics-not-stored",
116
+ });
117
+ }
118
+ return _diagJson({
119
+ ok: true,
120
+ stored: true,
121
+ attemptId: result.attemptId,
122
+ });
123
+ }
124
+ catch (e) {
125
+ console.error("[gateway/diagnostics] crashed:", String(e?.message ?? e));
126
+ // Fail-soft: nooit 5xx, anders crasht de consument-app opnieuw.
127
+ return _diagJson({ ok: true, stored: false, error: "internal" });
128
+ }
129
+ }
@@ -19,4 +19,5 @@ export type FloricodeRecordsResult = {
19
19
  error: string;
20
20
  };
21
21
  export declare function runFloricodeRecords(supabase: SupabaseClient, body: FloricodeRecordsInput): Promise<FloricodeRecordsResult>;
22
+ export declare function handleFloricodeRecords(request: Request, supabase: SupabaseClient): Promise<Response>;
22
23
  //# sourceMappingURL=floricode-records.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floricode-records.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/floricode-records.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IACE,EAAE,EAAE,IAAI,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,sBAAsB,CAAC,CA8BjC"}
1
+ {"version":3,"file":"floricode-records.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/floricode-records.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IACE,EAAE,EAAE,IAAI,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,sBAAsB,CAAC,CA8BjC;AAOD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAiBnB"}
@@ -30,3 +30,27 @@ export async function runFloricodeRecords(supabase, body) {
30
30
  nextOffset: (data?.length ?? 0) === limit ? offset + limit : null,
31
31
  };
32
32
  }
33
+ // ---------------------------------------------------------------------------
34
+ // HTTP-handler
35
+ // ---------------------------------------------------------------------------
36
+ import { verifyGatewayCaller } from "../floriday-gateway-auth";
37
+ export async function handleFloricodeRecords(request, supabase) {
38
+ const auth = await verifyGatewayCaller(request, supabase);
39
+ if (!auth.ok) {
40
+ return Response.json({ ok: false, error: auth.error }, { status: auth.status });
41
+ }
42
+ let body;
43
+ try {
44
+ body = JSON.parse(auth.rawBody);
45
+ }
46
+ catch {
47
+ return Response.json({ ok: false, error: "Ongeldige JSON-body" }, { status: 400 });
48
+ }
49
+ try {
50
+ const result = await runFloricodeRecords(supabase, body);
51
+ return Response.json(result);
52
+ }
53
+ catch (e) {
54
+ return Response.json({ ok: false, error: String(e?.message ?? e) }, { status: 500 });
55
+ }
56
+ }
@@ -4,4 +4,5 @@ export interface FulfillmentOrderSendResult {
4
4
  payload: unknown;
5
5
  }
6
6
  export declare function runFulfillmentOrderSend(supabase: SupabaseClient, body: any, caller: string): Promise<FulfillmentOrderSendResult>;
7
+ export declare function handleFulfillmentOrderSend(request: Request, supabase: SupabaseClient): Promise<Response>;
7
8
  //# sourceMappingURL=fulfillment-order-send.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fulfillment-order-send.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/fulfillment-order-send.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAkB5D,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,0BAA0B,CAAC,CA8GrC"}
1
+ {"version":3,"file":"fulfillment-order-send.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/fulfillment-order-send.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAkB5D,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,0BAA0B,CAAC,CA8GrC;AAcD,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAmCnB"}
@@ -121,3 +121,36 @@ export async function runFulfillmentOrderSend(supabase, body, caller) {
121
121
  },
122
122
  };
123
123
  }
124
+ // ---------------------------------------------------------------------------
125
+ // HTTP-handler
126
+ // ---------------------------------------------------------------------------
127
+ import { verifyGatewayCaller, corsPreflight, withCors, } from "../floriday-gateway-auth";
128
+ const _fosJson = (data, init) => withCors(Response.json(data, init));
129
+ export async function handleFulfillmentOrderSend(request, supabase) {
130
+ if (request.method === "OPTIONS")
131
+ return corsPreflight();
132
+ const auth = await verifyGatewayCaller(request, supabase);
133
+ if (!auth.ok)
134
+ return _fosJson({ ok: false, error: auth.error }, { status: auth.status });
135
+ let body;
136
+ try {
137
+ body = JSON.parse(auth.rawBody || "{}");
138
+ }
139
+ catch {
140
+ return _fosJson({ ok: false, error: "Ongeldige JSON-body" }, { status: 400 });
141
+ }
142
+ const deliveryOrderId = String(body?.deliveryOrderId ?? "").trim();
143
+ const explicitLoadCarrierItems = Array.isArray(body?.loadCarrierItems)
144
+ ? body.loadCarrierItems
145
+ : null;
146
+ if (!deliveryOrderId && !explicitLoadCarrierItems) {
147
+ return _fosJson({ ok: false, error: "deliveryOrderId of loadCarrierItems is verplicht" }, { status: 400 });
148
+ }
149
+ try {
150
+ const { status, payload } = await runFulfillmentOrderSend(supabase, body, auth.caller);
151
+ return _fosJson(payload, { status });
152
+ }
153
+ catch (e) {
154
+ return _fosJson({ ok: false, error: String(e?.message ?? e) }, { status: 500 });
155
+ }
156
+ }
@@ -15,4 +15,6 @@ export * from "./diagnostics";
15
15
  export * from "./media";
16
16
  export * from "./media-upload";
17
17
  export * from "./supply-line";
18
+ export * from "./auto-process";
19
+ export * from "./cron-scan";
18
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
@@ -15,3 +15,5 @@ export * from "./diagnostics";
15
15
  export * from "./media";
16
16
  export * from "./media-upload";
17
17
  export * from "./supply-line";
18
+ export * from "./auto-process";
19
+ export * from "./cron-scan";
@@ -18,4 +18,6 @@ export interface MediaUploadResult {
18
18
  payload: unknown;
19
19
  }
20
20
  export declare function runMediaUpload(supabase: SupabaseClient, input: MediaUploadInput): Promise<MediaUploadResult>;
21
+ export declare const MEDIA_UPLOAD_MAX_BYTES: number;
22
+ export declare function handleMediaUpload(request: Request, supabase: SupabaseClient): Promise<Response>;
21
23
  //# sourceMappingURL=media-upload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"media-upload.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/media-upload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,mBAAmB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAyG5B"}
1
+ {"version":3,"file":"media-upload.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/media-upload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,mBAAmB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAyG5B;AAQD,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AA8BvD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAuGnB"}
@@ -94,3 +94,109 @@ export async function runMediaUpload(supabase, input) {
94
94
  },
95
95
  };
96
96
  }
97
+ // ---------------------------------------------------------------------------
98
+ // HTTP-handler (binair; lokale CORS_HEADERS byte-identiek behouden)
99
+ // ---------------------------------------------------------------------------
100
+ import { verifyGatewayBinaryCaller } from "../floriday-gateway-auth";
101
+ import { GATEWAY_HEADER_CALLER } from "../floriday-gateway-hmac";
102
+ export const MEDIA_UPLOAD_MAX_BYTES = 15 * 1024 * 1024; // 15 MB
103
+ const MEDIA_UPLOAD_CORS_HEADERS = {
104
+ "Access-Control-Allow-Origin": "*",
105
+ "Access-Control-Allow-Methods": "POST, OPTIONS",
106
+ "Access-Control-Allow-Headers": [
107
+ "content-type",
108
+ "x-floriday-timestamp",
109
+ "x-floriday-signature",
110
+ "x-floriday-caller",
111
+ "x-floriday-environment",
112
+ "x-floriday-path",
113
+ "x-floriday-method",
114
+ "x-floriday-filename",
115
+ "x-floriday-content-type",
116
+ "x-floriday-form-field",
117
+ "x-floriday-reference-id",
118
+ "x-floriday-extra-fields",
119
+ "x-floriday-idempotency-key",
120
+ ].join(", "),
121
+ "Access-Control-Max-Age": "86400",
122
+ };
123
+ function _muJson(data, init = {}) {
124
+ return Response.json(data, {
125
+ ...init,
126
+ headers: { ...(init.headers ?? {}), ...MEDIA_UPLOAD_CORS_HEADERS },
127
+ });
128
+ }
129
+ export async function handleMediaUpload(request, supabase) {
130
+ if (request.method === "OPTIONS") {
131
+ return new Response(null, { status: 204, headers: MEDIA_UPLOAD_CORS_HEADERS });
132
+ }
133
+ const declared = Number(request.headers.get("content-length") ?? "0");
134
+ if (Number.isFinite(declared) && declared > MEDIA_UPLOAD_MAX_BYTES) {
135
+ return _muJson({ ok: false, error: `Bestand te groot (max ${MEDIA_UPLOAD_MAX_BYTES} bytes)` }, { status: 413 });
136
+ }
137
+ const auth = await verifyGatewayBinaryCaller(request, supabase);
138
+ if (!auth.ok) {
139
+ return _muJson({ ok: false, error: auth.error }, { status: auth.status });
140
+ }
141
+ if (auth.bodyBytes.byteLength === 0) {
142
+ return _muJson({ ok: false, error: "Lege body" }, { status: 400 });
143
+ }
144
+ if (auth.bodyBytes.byteLength > MEDIA_UPLOAD_MAX_BYTES) {
145
+ return _muJson({ ok: false, error: `Bestand te groot (max ${MEDIA_UPLOAD_MAX_BYTES} bytes)` }, { status: 413 });
146
+ }
147
+ const environment = request.headers.get("x-floriday-environment");
148
+ const path = request.headers.get("x-floriday-path");
149
+ const method = request.headers.get("x-floriday-method") ?? "POST";
150
+ const fileName = request.headers.get("x-floriday-filename");
151
+ const contentType = request.headers.get("x-floriday-content-type");
152
+ const formField = request.headers.get("x-floriday-form-field") ?? "file";
153
+ const referenceId = request.headers.get("x-floriday-reference-id");
154
+ const idempotencyKey = request.headers.get("x-floriday-idempotency-key");
155
+ const extraFieldsRaw = request.headers.get("x-floriday-extra-fields");
156
+ if (environment !== "staging" && environment !== "live") {
157
+ return _muJson({ ok: false, error: "Ongeldige x-floriday-environment header" }, { status: 400 });
158
+ }
159
+ if (!path || !path.startsWith("/")) {
160
+ return _muJson({ ok: false, error: "Ongeldig x-floriday-path (moet met '/' beginnen)" }, { status: 400 });
161
+ }
162
+ if (!fileName || !contentType) {
163
+ return _muJson({
164
+ ok: false,
165
+ error: "x-floriday-filename en x-floriday-content-type zijn verplicht",
166
+ }, { status: 400 });
167
+ }
168
+ if (method !== "POST" && method !== "PUT") {
169
+ return _muJson({ ok: false, error: "x-floriday-method moet POST of PUT zijn" }, { status: 400 });
170
+ }
171
+ let extraFields = null;
172
+ if (extraFieldsRaw) {
173
+ try {
174
+ extraFields = JSON.parse(extraFieldsRaw);
175
+ }
176
+ catch {
177
+ return _muJson({ ok: false, error: "x-floriday-extra-fields is geen geldige JSON" }, { status: 400 });
178
+ }
179
+ }
180
+ const caller = request.headers.get(GATEWAY_HEADER_CALLER) ?? auth.caller;
181
+ try {
182
+ const { status, payload } = await runMediaUpload(supabase, {
183
+ bytes: auth.bodyBytes,
184
+ environment,
185
+ path,
186
+ method,
187
+ fileName,
188
+ contentType,
189
+ formField,
190
+ referenceId,
191
+ idempotencyKey,
192
+ extraFields,
193
+ caller,
194
+ });
195
+ return _muJson(payload, { status });
196
+ }
197
+ catch (e) {
198
+ const msg = String(e?.message ?? e);
199
+ console.error("[gateway/media-upload] crashed:", msg);
200
+ return _muJson({ ok: false, error: msg }, { status: 500 });
201
+ }
202
+ }
@@ -16,4 +16,6 @@ export interface MediaResult {
16
16
  payload: unknown;
17
17
  }
18
18
  export declare function runMedia(supabase: SupabaseClient, body: MediaBody, caller: string): Promise<MediaResult>;
19
+ export declare const MEDIA_MAX_BASE64_REQUEST_BYTES: number;
20
+ export declare function handleMedia(request: Request, supabase: SupabaseClient): Promise<Response>;
19
21
  //# sourceMappingURL=media.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/media.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,mBAAmB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAUD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CA6FtB"}
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/lib/gateway/media.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,mBAAmB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAUD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CA6FtB;AAQD,eAAO,MAAM,8BAA8B,QAAkB,CAAC;AAqB9D,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAkEnB"}