@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.
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +45 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +45 -0
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +45 -0
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +47 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/floricode.functions.d.ts +315 -0
- package/dist-lib/lib/floricode.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-auction-letters.functions.d.ts +45 -0
- package/dist-lib/lib/floriday-auction-letters.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-gateway-auth.d.ts +8 -2
- package/dist-lib/lib/floriday-gateway-auth.d.ts.map +1 -1
- package/dist-lib/lib/floriday-gateway-auth.js +31 -8
- package/dist-lib/lib/floriday-gateway-hmac.d.ts +2 -0
- package/dist-lib/lib/floriday-gateway-hmac.d.ts.map +1 -1
- package/dist-lib/lib/floriday-gateway-hmac.js +13 -2
- package/dist-lib/lib/floriday-labels.functions.d.ts +45 -0
- package/dist-lib/lib/floriday-labels.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-public.functions.d.ts +270 -0
- package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-stickers.functions.d.ts +45 -0
- package/dist-lib/lib/floriday-stickers.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-sync.functions.d.ts +1395 -0
- package/dist-lib/lib/floriday-sync.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-writes.functions.d.ts +270 -0
- package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday.functions.d.ts +828 -126
- package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday.functions.js +11 -5
- package/dist-lib/lib/gateway/active-environment.d.ts +1 -0
- package/dist-lib/lib/gateway/active-environment.d.ts.map +1 -1
- package/dist-lib/lib/gateway/active-environment.js +20 -0
- package/dist-lib/lib/gateway/auto-process.d.ts +4 -0
- package/dist-lib/lib/gateway/auto-process.d.ts.map +1 -0
- package/dist-lib/lib/gateway/auto-process.js +35 -0
- package/dist-lib/lib/gateway/cached-list.d.ts +1 -0
- package/dist-lib/lib/gateway/cached-list.d.ts.map +1 -1
- package/dist-lib/lib/gateway/cached-list.js +32 -0
- package/dist-lib/lib/gateway/code-list.d.ts +1 -0
- package/dist-lib/lib/gateway/code-list.d.ts.map +1 -1
- package/dist-lib/lib/gateway/code-list.js +32 -0
- package/dist-lib/lib/gateway/cron-scan.d.ts +4 -0
- package/dist-lib/lib/gateway/cron-scan.d.ts.map +1 -0
- package/dist-lib/lib/gateway/cron-scan.js +20 -0
- package/dist-lib/lib/gateway/diagnostics.d.ts +2 -0
- package/dist-lib/lib/gateway/diagnostics.d.ts.map +1 -1
- package/dist-lib/lib/gateway/diagnostics.js +63 -0
- package/dist-lib/lib/gateway/floricode-records.d.ts +1 -0
- package/dist-lib/lib/gateway/floricode-records.d.ts.map +1 -1
- package/dist-lib/lib/gateway/floricode-records.js +24 -0
- package/dist-lib/lib/gateway/fulfillment-order-send.d.ts +1 -0
- package/dist-lib/lib/gateway/fulfillment-order-send.d.ts.map +1 -1
- package/dist-lib/lib/gateway/fulfillment-order-send.js +33 -0
- package/dist-lib/lib/gateway/index.d.ts +2 -0
- package/dist-lib/lib/gateway/index.d.ts.map +1 -1
- package/dist-lib/lib/gateway/index.js +2 -0
- package/dist-lib/lib/gateway/media-upload.d.ts +2 -0
- package/dist-lib/lib/gateway/media-upload.d.ts.map +1 -1
- package/dist-lib/lib/gateway/media-upload.js +106 -0
- package/dist-lib/lib/gateway/media.d.ts +2 -0
- package/dist-lib/lib/gateway/media.d.ts.map +1 -1
- package/dist-lib/lib/gateway/media.js +71 -0
- package/dist-lib/lib/gateway/pdf-bulk-merged.d.ts +2 -0
- package/dist-lib/lib/gateway/pdf-bulk-merged.d.ts.map +1 -1
- package/dist-lib/lib/gateway/pdf-bulk-merged.js +49 -0
- package/dist-lib/lib/gateway/pdf-bulk.d.ts +2 -0
- package/dist-lib/lib/gateway/pdf-bulk.d.ts.map +1 -1
- package/dist-lib/lib/gateway/pdf-bulk.js +48 -0
- package/dist-lib/lib/gateway/pdf.d.ts +1 -0
- package/dist-lib/lib/gateway/pdf.d.ts.map +1 -1
- package/dist-lib/lib/gateway/pdf.js +42 -0
- package/dist-lib/lib/gateway/product-characteristics.d.ts +1 -0
- package/dist-lib/lib/gateway/product-characteristics.d.ts.map +1 -1
- package/dist-lib/lib/gateway/product-characteristics.js +53 -0
- package/dist-lib/lib/gateway/schema.d.ts +1 -0
- package/dist-lib/lib/gateway/schema.d.ts.map +1 -1
- package/dist-lib/lib/gateway/schema.js +30 -0
- package/dist-lib/lib/gateway/supply-line.d.ts +1 -0
- package/dist-lib/lib/gateway/supply-line.d.ts.map +1 -1
- package/dist-lib/lib/gateway/supply-line.js +28 -0
- package/dist-lib/lib/gateway/write.d.ts +1 -0
- package/dist-lib/lib/gateway/write.d.ts.map +1 -1
- package/dist-lib/lib/gateway/write.js +30 -0
- 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
|
|
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 {
|
|
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
|
|
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 {
|
|
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
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -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"}
|
|
@@ -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"}
|