@flowselections/logistiek-engine 1.0.233 → 1.0.234
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/types.d.ts +586 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/handlers/logistics-plan-now.server.d.ts +8 -0
- package/dist-lib/lib/handlers/logistics-plan-now.server.d.ts.map +1 -1
- package/dist-lib/lib/handlers/logistics-plan-now.server.js +45 -14
- package/dist-lib/lib/moduleVersion.d.ts +1 -1
- package/dist-lib/lib/moduleVersion.js +1 -1
- package/package.json +91 -1
|
@@ -9,6 +9,14 @@ export declare function leesOrderIds(raw: string): {
|
|
|
9
9
|
ok: false;
|
|
10
10
|
fout: string;
|
|
11
11
|
};
|
|
12
|
+
/**
|
|
13
|
+
* Ronde A (overgang): twee aanroepvormen worden geaccepteerd tot alle shells over zijn.
|
|
14
|
+
* 1. oud: header x-logistics-key = module_runtime_config 'logistics_tick_apikey'
|
|
15
|
+
* 2. nieuw: flowselections_cron_post — header apikey = openbare sleutel van deze
|
|
16
|
+
* omgeving én x-flowselections-cron-key = flowselections_cron_secret().
|
|
17
|
+
* Leesfouten worden gelogd; ontbreekt alle configuratie, dan "geen_configuratie".
|
|
18
|
+
*/
|
|
19
|
+
export declare function controleerAanroeper(request: Request, supabase: SupabaseClient): Promise<"ok" | "geweigerd" | "geen_configuratie">;
|
|
12
20
|
type WaitUntil = (p: Promise<unknown>) => void;
|
|
13
21
|
export declare function handleLogisticsPlanNow(request: Request, supabase: SupabaseClient, opts?: {
|
|
14
22
|
moduleProject?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logistics-plan-now.server.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/logistics-plan-now.server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAW5D,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ5D;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAgBnG;AAED,KAAK,SAAS,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;AAc/C,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE,GACxD,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"logistics-plan-now.server.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/logistics-plan-now.server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAW5D,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ5D;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAgBnG;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,GAAG,WAAW,GAAG,mBAAmB,CAAC,CA8BnD;AAED,KAAK,SAAS,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;AAc/C,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE,GACxD,OAAO,CAAC,QAAQ,CAAC,CAqCnB"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { engineIdent, runLockedTickRound } from "./logistics-tick.server.js";
|
|
14
14
|
const CORS_HEADERS = {
|
|
15
15
|
"Access-Control-Allow-Origin": "*",
|
|
16
|
-
"Access-Control-Allow-Headers": "x-logistics-key, content-type",
|
|
16
|
+
"Access-Control-Allow-Headers": "x-logistics-key, x-flowselections-cron-key, apikey, content-type",
|
|
17
17
|
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
18
18
|
};
|
|
19
19
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
@@ -51,6 +51,45 @@ export function leesOrderIds(raw) {
|
|
|
51
51
|
}
|
|
52
52
|
return { ok: true, ids: ids };
|
|
53
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Ronde A (overgang): twee aanroepvormen worden geaccepteerd tot alle shells over zijn.
|
|
56
|
+
* 1. oud: header x-logistics-key = module_runtime_config 'logistics_tick_apikey'
|
|
57
|
+
* 2. nieuw: flowselections_cron_post — header apikey = openbare sleutel van deze
|
|
58
|
+
* omgeving én x-flowselections-cron-key = flowselections_cron_secret().
|
|
59
|
+
* Leesfouten worden gelogd; ontbreekt alle configuratie, dan "geen_configuratie".
|
|
60
|
+
*/
|
|
61
|
+
export async function controleerAanroeper(request, supabase) {
|
|
62
|
+
let configAanwezig = false;
|
|
63
|
+
const oud = request.headers.get("x-logistics-key") ?? "";
|
|
64
|
+
const { data: cfg, error: cfgError } = await supabase
|
|
65
|
+
.from("module_runtime_config")
|
|
66
|
+
.select("value")
|
|
67
|
+
.eq("key", "logistics_tick_apikey")
|
|
68
|
+
.maybeSingle();
|
|
69
|
+
if (cfgError)
|
|
70
|
+
console.error("[logistics-plan-now] oude sleutel niet leesbaar:", cfgError.message);
|
|
71
|
+
const verwachtOud = String(cfg?.value ?? "").trim();
|
|
72
|
+
if (verwachtOud) {
|
|
73
|
+
configAanwezig = true;
|
|
74
|
+
if (oud && gelijkeSleutel(oud, verwachtOud))
|
|
75
|
+
return "ok";
|
|
76
|
+
}
|
|
77
|
+
const platform = request.headers.get("x-flowselections-cron-key") ?? "";
|
|
78
|
+
const apikey = request.headers.get("apikey") ?? "";
|
|
79
|
+
const openbaar = (process.env["SUPABASE_PUBLISHABLE_KEY"] ?? process.env["SUPABASE_ANON_KEY"] ?? "")
|
|
80
|
+
.replace(/^["']|["']$/g, "");
|
|
81
|
+
const { data: geheim, error: geheimError } = await supabase.rpc("flowselections_cron_secret");
|
|
82
|
+
if (geheimError)
|
|
83
|
+
console.error("[logistics-plan-now] platformsleutel niet leesbaar:", geheimError.message);
|
|
84
|
+
const verwachtPlatform = typeof geheim === "string" ? geheim : "";
|
|
85
|
+
if (verwachtPlatform && openbaar) {
|
|
86
|
+
configAanwezig = true;
|
|
87
|
+
if (platform && apikey && gelijkeSleutel(platform, verwachtPlatform) && gelijkeSleutel(apikey, openbaar)) {
|
|
88
|
+
return "ok";
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return configAanwezig ? "geweigerd" : "geen_configuratie";
|
|
92
|
+
}
|
|
54
93
|
async function vindWaitUntil(opts) {
|
|
55
94
|
if (opts?.waitUntil)
|
|
56
95
|
return opts.waitUntil;
|
|
@@ -75,22 +114,14 @@ export async function handleLogisticsPlanNow(request, supabase, opts) {
|
|
|
75
114
|
return new Response(null, { status: 204, headers: CORS_HEADERS });
|
|
76
115
|
if (request.method !== "POST")
|
|
77
116
|
return json(405, { ok: false, error: "Alleen POST" });
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
.eq("key", "logistics_tick_apikey")
|
|
82
|
-
.maybeSingle();
|
|
83
|
-
const expected = String(cfg?.value ?? "").trim();
|
|
84
|
-
if (cfgError || !expected) {
|
|
85
|
-
return json(500, {
|
|
117
|
+
const toegang = await controleerAanroeper(request, supabase);
|
|
118
|
+
if (toegang === "geen_configuratie") {
|
|
119
|
+
return json(200, {
|
|
86
120
|
ok: false,
|
|
87
|
-
|
|
88
|
-
? `Sleutel kon niet worden gelezen: ${cfgError.message}`
|
|
89
|
-
: "logistics_tick_apikey ontbreekt in module_runtime_config; vul deze voor deze omgeving in.",
|
|
121
|
+
melding: "Geen sleutel ingesteld (logistics_tick_apikey en platformsleutel ontbreken); niets gestart.",
|
|
90
122
|
});
|
|
91
123
|
}
|
|
92
|
-
|
|
93
|
-
if (!gelijkeSleutel(given, expected))
|
|
124
|
+
if (toegang !== "ok")
|
|
94
125
|
return json(401, { ok: false, error: "Unauthorized" });
|
|
95
126
|
const body = leesOrderIds(await request.text());
|
|
96
127
|
if (!body.ok)
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const MODULE_VERSION = "1.0.
|
|
1
|
+
export declare const MODULE_VERSION = "1.0.234";
|
|
2
2
|
//# sourceMappingURL=moduleVersion.d.ts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Automatisch gegenereerd door prebuild:lib; niet handmatig aanpassen.
|
|
2
|
-
export const MODULE_VERSION = "1.0.
|
|
2
|
+
export const MODULE_VERSION = "1.0.234";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowselections/logistiek-engine",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.234",
|
|
4
4
|
"flowselections": {
|
|
5
5
|
"moduleId": "logistiek-engine",
|
|
6
6
|
"pages": [
|
|
@@ -102,6 +102,96 @@
|
|
|
102
102
|
"schema": {
|
|
103
103
|
"file": "db/schema/logistiek-engine.sql",
|
|
104
104
|
"order": 60
|
|
105
|
+
},
|
|
106
|
+
"crons": [
|
|
107
|
+
{
|
|
108
|
+
"name": "cron-history-prune-weekly",
|
|
109
|
+
"schedule": "10 4 * * 0",
|
|
110
|
+
"kind": "sql",
|
|
111
|
+
"sql": "SELECT public.logistics_prune_cron_history(7)"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"name": "logistics_cart_barcode_opschonen",
|
|
115
|
+
"schedule": "*/10 1-4 * * *",
|
|
116
|
+
"kind": "sql",
|
|
117
|
+
"sql": "SELECT public.logistics_cart_barcode_opschonen(10000)"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"name": "logistics-base-url-check",
|
|
121
|
+
"schedule": "7 * * * *",
|
|
122
|
+
"kind": "sql",
|
|
123
|
+
"sql": "SELECT public.logistics_tick_base_url_check()"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "logistics-history-prune",
|
|
127
|
+
"schedule": "20 3 * * *",
|
|
128
|
+
"kind": "sql",
|
|
129
|
+
"sql": "SELECT public.logistics_cleanup_history(50000)"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"name": "logistics-order-finalize-prune",
|
|
133
|
+
"schedule": "23 3 * * *",
|
|
134
|
+
"kind": "sql",
|
|
135
|
+
"sql": "SELECT public.logistics_order_finalize_prune(7)"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"name": "logistics-order-finalize-reconcile",
|
|
139
|
+
"schedule": "*/15 * * * *",
|
|
140
|
+
"kind": "sql",
|
|
141
|
+
"sql": "SELECT public.logistics_order_finalize_reconcile(14, 200)"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"name": "logistics-packing-reconcile",
|
|
145
|
+
"schedule": "17 * * * *",
|
|
146
|
+
"kind": "sql",
|
|
147
|
+
"sql": "SELECT public.logistics_packing_reconcile(500, 100)"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"name": "logistics-plan-coverage-check",
|
|
151
|
+
"schedule": "*/15 * * * *",
|
|
152
|
+
"kind": "sql",
|
|
153
|
+
"sql": "SELECT public.logistics_plan_coverage_check(50)"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"name": "logistics-reapply-buffer-decisions",
|
|
157
|
+
"schedule": "*/5 * * * *",
|
|
158
|
+
"kind": "sql",
|
|
159
|
+
"sql": "SELECT public.logistics_reapply_buffer_decisions()"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"name": "logistics-recalc-tick",
|
|
163
|
+
"schedule": "* * * * *",
|
|
164
|
+
"kind": "sql",
|
|
165
|
+
"sql": "SELECT public.logistics_recalc_tick_kick()"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"name": "logistics-reserved-stock-nightly",
|
|
169
|
+
"schedule": "10 2 * * *",
|
|
170
|
+
"kind": "sql",
|
|
171
|
+
"sql": "SELECT public.logistics_reserved_stock_nightly()"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"name": "logistics-tasks-prune",
|
|
175
|
+
"schedule": "41 3 * * *",
|
|
176
|
+
"kind": "sql",
|
|
177
|
+
"sql": "SELECT public.logistics_tasks_prune(30)"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"name": "logistics-tick",
|
|
181
|
+
"schedule": "* * * * *",
|
|
182
|
+
"kind": "sql",
|
|
183
|
+
"sql": "SELECT public.logistics_tick()"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"name": "logistics-tick-runs-prune",
|
|
187
|
+
"schedule": "33 3 * * *",
|
|
188
|
+
"kind": "sql",
|
|
189
|
+
"sql": "SELECT public.logistics_tick_runs_prune()"
|
|
190
|
+
}
|
|
191
|
+
],
|
|
192
|
+
"install": {
|
|
193
|
+
"ensureDefaults": "logistics_ensure_defaults",
|
|
194
|
+
"installCheck": "logistics_install_check"
|
|
105
195
|
}
|
|
106
196
|
},
|
|
107
197
|
"private": false,
|