@flowselections/floriday-authenticatie-module 1.0.53 → 1.0.54
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/components/TemplatePage.d.ts +1 -1
- package/dist-lib/components/TemplatePage.d.ts.map +1 -1
- package/dist-lib/components/floriday/FlorydayApiLogPage.d.ts +1 -1
- package/dist-lib/components/floriday/FlorydayApiLogPage.d.ts.map +1 -1
- package/dist-lib/components/floriday/FlorydayConnectionPage.d.ts +1 -1
- package/dist-lib/components/floriday/FlorydayConnectionPage.d.ts.map +1 -1
- package/dist-lib/components/floriday/FlorydayConnectionPage.js +2 -1
- package/dist-lib/components/floriday/FlorydayCredentialStatusBanner.d.ts +1 -1
- package/dist-lib/components/floriday/FlorydayCredentialStatusBanner.d.ts.map +1 -1
- package/dist-lib/components/floriday/FlorydayShellRoutesCard.d.ts +2 -0
- package/dist-lib/components/floriday/FlorydayShellRoutesCard.d.ts.map +1 -0
- package/dist-lib/components/floriday/FlorydayShellRoutesCard.js +22 -0
- package/dist-lib/components/floriday/FlorydaySyncHealthBanner.d.ts +1 -1
- package/dist-lib/components/floriday/FlorydaySyncHealthBanner.d.ts.map +1 -1
- package/dist-lib/components/floriday/FlorydaySyncJobsCard.d.ts +1 -1
- package/dist-lib/components/floriday/FlorydaySyncJobsCard.d.ts.map +1 -1
- package/dist-lib/components/floriday/FlorydayWebhooksCard.d.ts +1 -1
- package/dist-lib/components/floriday/FlorydayWebhooksCard.d.ts.map +1 -1
- package/dist-lib/components/floriday/TokenHealthCard.d.ts +1 -1
- package/dist-lib/components/floriday/TokenHealthCard.d.ts.map +1 -1
- package/dist-lib/components/settings/FloricodeSettingsCard.d.ts +1 -1
- package/dist-lib/components/settings/FloricodeSettingsCard.d.ts.map +1 -1
- package/dist-lib/components/settings/FlorydaySettingsCard.d.ts +1 -1
- package/dist-lib/components/settings/FlorydaySettingsCard.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.js +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +2 -32082
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +1043 -3
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/cron/process-stock-queue.d.ts +27 -5
- package/dist-lib/lib/cron/process-stock-queue.d.ts.map +1 -1
- package/dist-lib/lib/cron/process-stock-queue.js +98 -75
- package/dist-lib/lib/floriday-scopes.d.ts +7 -0
- package/dist-lib/lib/floriday-scopes.d.ts.map +1 -1
- package/dist-lib/lib/floriday-scopes.js +34 -0
- package/dist-lib/lib/floriday-sync.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-sync.functions.js +4 -2
- package/dist-lib/lib/floriday.functions.d.ts +11 -0
- package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday.functions.js +76 -22
- package/dist-lib/lib/gateway/diagnostics.d.ts.map +1 -1
- package/dist-lib/lib/gateway/diagnostics.js +12 -0
- package/dist-lib/lib/gateway/floriday-get.d.ts +55 -0
- package/dist-lib/lib/gateway/floriday-get.d.ts.map +1 -0
- package/dist-lib/lib/gateway/floriday-get.js +185 -0
- package/dist-lib/lib/gateway/index.d.ts +1 -0
- package/dist-lib/lib/gateway/index.d.ts.map +1 -1
- package/dist-lib/lib/gateway/index.js +1 -0
- package/dist-lib/lib/gateway/webhook-subscribe.d.ts.map +1 -1
- package/dist-lib/lib/gateway/webhook-subscribe.js +13 -1
- package/dist-lib/lib/shell-base.d.ts +2 -0
- package/dist-lib/lib/shell-base.d.ts.map +1 -0
- package/dist-lib/lib/shell-base.js +31 -0
- package/dist-lib/lib/shell-routes.d.ts +25 -0
- package/dist-lib/lib/shell-routes.d.ts.map +1 -0
- package/dist-lib/lib/shell-routes.js +127 -0
- package/package.json +20 -3
- package/dist-lib/assets/floriday-logo.png.asset.json +0 -11
|
@@ -16,20 +16,42 @@ export declare function isoWeekParts(input?: string | Date): {
|
|
|
16
16
|
/** Tijdelijk (netwerk/5xx/429) versus definitief (gegevensfout). */
|
|
17
17
|
export declare function isPermanentError(message: string): boolean;
|
|
18
18
|
export declare function isRateLimited(message: string): boolean;
|
|
19
|
-
|
|
19
|
+
export declare const SKIPPED_NO_PRICE_MESSAGE = "Prijs ontbreekt, nog niet verzonden";
|
|
20
|
+
export type StockOutcome = {
|
|
21
|
+
outcome: "quantity_sent" | "skipped_no_price" | "error";
|
|
22
|
+
availabilitySent: boolean;
|
|
23
|
+
quantitySent: boolean;
|
|
24
|
+
error: string | null;
|
|
25
|
+
permanent: boolean;
|
|
26
|
+
attemptId: string | null;
|
|
27
|
+
};
|
|
28
|
+
type WriteResult = {
|
|
20
29
|
ok: boolean;
|
|
21
|
-
|
|
30
|
+
status?: number;
|
|
22
31
|
error?: string;
|
|
23
32
|
attemptId?: string | null;
|
|
24
|
-
quantitySkipped?: string;
|
|
25
33
|
};
|
|
26
|
-
/**
|
|
27
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Bepaalt de afsluiting van een regel uit de twee Floriday-antwoorden.
|
|
36
|
+
* Puur (geen I/O) zodat het los te testen is.
|
|
37
|
+
* - quantity_sent alleen bij een 2xx op de base-supply-PATCH.
|
|
38
|
+
* - 404 op de PATCH (geen weekaanbod) = skipped_no_price, nooit verzonden.
|
|
39
|
+
* - beschikbaarheid alleen is nooit quantity_sent.
|
|
40
|
+
*/
|
|
41
|
+
export declare function decideOutcome(availability: WriteResult | null, quantity: WriteResult | null): StockOutcome;
|
|
42
|
+
/**
|
|
43
|
+
* Zet één wachtrijregel door naar Floriday. Gooit nooit.
|
|
44
|
+
* Er wordt bewust GEEN PUT met basePricePerPiece gedaan zolang het prijsplan
|
|
45
|
+
* van de Voorraad-module niet is goedgekeurd: alleen een PATCH op een
|
|
46
|
+
* bestaand weekaanbod (numberOfPieces als queryparameter, geen body).
|
|
47
|
+
*/
|
|
48
|
+
export declare function pushStockRow(supabase: SupabaseClient, env: FlorydayEnvironment, row: StockQueueRow): Promise<StockOutcome>;
|
|
28
49
|
/** Eén verwerkingsronde. Retourneert een compacte samenvatting. */
|
|
29
50
|
export declare function runStockQueueRound(supabase: SupabaseClient, limit?: number): Promise<{
|
|
30
51
|
ok: true;
|
|
31
52
|
claimed: number;
|
|
32
53
|
succeeded: number;
|
|
54
|
+
skippedNoPrice: number;
|
|
33
55
|
failed: number;
|
|
34
56
|
rateLimited: boolean;
|
|
35
57
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-stock-queue.d.ts","sourceRoot":"","sources":["../../../src/lib/cron/process-stock-queue.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"process-stock-queue.d.ts","sourceRoot":"","sources":["../../../src/lib/cron/process-stock-queue.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAKlC,KAAK,aAAa,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,kCAAkC;AAClC,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAYlF;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAazD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAmCD,eAAO,MAAM,wBAAwB,wCAAwC,CAAC;AAE9E,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,eAAe,GAAG,kBAAkB,GAAG,OAAO,CAAC;IACxD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,KAAK,WAAW,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE/F;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,WAAW,GAAG,IAAI,EAChC,QAAQ,EAAE,WAAW,GAAG,IAAI,GAC3B,YAAY,CA0Bd;AAMD;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,mBAAmB,EACxB,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,YAAY,CAAC,CAsDvB;AAeD,mEAAmE;AACnE,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,cAAc,EACxB,KAAK,SAAa,GACjB,OAAO,CAAC;IACT,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC,CAoCD;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAoCnB;AAOD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAUlE"}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
// pakt het weer op.
|
|
14
14
|
// ============================================================================
|
|
15
15
|
import { florydayWrite, getActiveFlorydayEnvironment, syncShellHostRuntimeConfig, } from "../floriday.functions.js";
|
|
16
|
+
import { verifyGatewayRequest, GATEWAY_HEADER_TIMESTAMP } from "../floriday-gateway-hmac.js";
|
|
16
17
|
const BATCH_SIZE = 25;
|
|
17
18
|
/** ISO-weeknummer van vandaag. */
|
|
18
19
|
export function isoWeekParts(input) {
|
|
@@ -69,10 +70,53 @@ async function resolveWarehouseId(supabase, connectionId, tradeItemId, cachedIte
|
|
|
69
70
|
const chosen = own.find((w) => w?.data?.isDefault === true) ?? own[0];
|
|
70
71
|
return chosen?.floriday_id ?? chosen?.data?.warehouseId;
|
|
71
72
|
}
|
|
72
|
-
|
|
73
|
+
export const SKIPPED_NO_PRICE_MESSAGE = "Prijs ontbreekt, nog niet verzonden";
|
|
74
|
+
/**
|
|
75
|
+
* Bepaalt de afsluiting van een regel uit de twee Floriday-antwoorden.
|
|
76
|
+
* Puur (geen I/O) zodat het los te testen is.
|
|
77
|
+
* - quantity_sent alleen bij een 2xx op de base-supply-PATCH.
|
|
78
|
+
* - 404 op de PATCH (geen weekaanbod) = skipped_no_price, nooit verzonden.
|
|
79
|
+
* - beschikbaarheid alleen is nooit quantity_sent.
|
|
80
|
+
*/
|
|
81
|
+
export function decideOutcome(availability, quantity) {
|
|
82
|
+
const availabilitySent = availability?.ok === true;
|
|
83
|
+
const attemptId = quantity?.attemptId ?? availability?.attemptId ?? null;
|
|
84
|
+
if (availability && !availability.ok) {
|
|
85
|
+
const message = availability.error ?? `HTTP ${availability.status}`;
|
|
86
|
+
return { outcome: "error", availabilitySent: false, quantitySent: false, error: message, permanent: isPermanentError(message), attemptId };
|
|
87
|
+
}
|
|
88
|
+
if (!quantity) {
|
|
89
|
+
return { outcome: "skipped_no_price", availabilitySent, quantitySent: false, error: SKIPPED_NO_PRICE_MESSAGE, permanent: false, attemptId };
|
|
90
|
+
}
|
|
91
|
+
if (quantity.ok) {
|
|
92
|
+
return { outcome: "quantity_sent", availabilitySent, quantitySent: true, error: null, permanent: false, attemptId };
|
|
93
|
+
}
|
|
94
|
+
if (quantity.status === 404) {
|
|
95
|
+
return {
|
|
96
|
+
outcome: "skipped_no_price",
|
|
97
|
+
availabilitySent,
|
|
98
|
+
quantitySent: false,
|
|
99
|
+
error: `${SKIPPED_NO_PRICE_MESSAGE} (geen weekaanbod in Floriday)`,
|
|
100
|
+
permanent: false,
|
|
101
|
+
attemptId,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const message = quantity.error ?? `HTTP ${quantity.status}`;
|
|
105
|
+
return { outcome: "error", availabilitySent, quantitySent: false, error: message, permanent: isPermanentError(message), attemptId };
|
|
106
|
+
}
|
|
107
|
+
function errorOutcome(message, permanent) {
|
|
108
|
+
return { outcome: "error", availabilitySent: false, quantitySent: false, error: message, permanent, attemptId: null };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Zet één wachtrijregel door naar Floriday. Gooit nooit.
|
|
112
|
+
* Er wordt bewust GEEN PUT met basePricePerPiece gedaan zolang het prijsplan
|
|
113
|
+
* van de Voorraad-module niet is goedgekeurd: alleen een PATCH op een
|
|
114
|
+
* bestaand weekaanbod (numberOfPieces als queryparameter, geen body).
|
|
115
|
+
*/
|
|
73
116
|
export async function pushStockRow(supabase, env, row) {
|
|
74
|
-
const pieces = Math.max(0, Number(row.number_of_pieces ?? 0) || 0);
|
|
117
|
+
const pieces = Math.max(0, Math.floor(Number(row.number_of_pieces ?? 0) || 0));
|
|
75
118
|
const available = row.desired_available ?? pieces > 0;
|
|
119
|
+
const { year, week } = isoWeekParts();
|
|
76
120
|
try {
|
|
77
121
|
const { data: cached } = await supabase
|
|
78
122
|
.from("floriday_trade_items_cache")
|
|
@@ -81,75 +125,55 @@ export async function pushStockRow(supabase, env, row) {
|
|
|
81
125
|
.eq("floriday_id", row.trade_item_id)
|
|
82
126
|
.maybeSingle();
|
|
83
127
|
if (!cached) {
|
|
84
|
-
return
|
|
85
|
-
ok: false,
|
|
86
|
-
permanent: true,
|
|
87
|
-
error: "Dit artikel staat nog niet in de lokale Floriday-cache. Synchroniseer de artikelen en probeer opnieuw.",
|
|
88
|
-
};
|
|
128
|
+
return errorOutcome("Dit artikel staat nog niet in de lokale Floriday-cache. Synchroniseer de artikelen en probeer opnieuw.", true);
|
|
89
129
|
}
|
|
90
130
|
const item = cached.data ?? {};
|
|
91
131
|
const warehouseId = await resolveWarehouseId(supabase, row.connection_id, row.trade_item_id, item);
|
|
92
|
-
// 1.
|
|
93
|
-
|
|
94
|
-
const { data: supply } = await supabase
|
|
95
|
-
.from("trade_item_supply_lines")
|
|
96
|
-
.select("price_per_piece, currency")
|
|
97
|
-
.eq("connection_id", row.connection_id)
|
|
98
|
-
.eq("trade_item_id", row.trade_item_id)
|
|
99
|
-
.order("updated_at", { ascending: false })
|
|
100
|
-
.limit(1)
|
|
101
|
-
.maybeSingle();
|
|
102
|
-
const pricePerPiece = Number(supply?.price_per_piece ?? NaN);
|
|
103
|
-
let quantitySkipped;
|
|
104
|
-
if (Number.isFinite(pricePerPiece) && pricePerPiece > 0) {
|
|
105
|
-
const qty = await florydayWrite(supabase, env, {
|
|
106
|
-
module: "inventory",
|
|
107
|
-
action: "edit-weekly-base-supply",
|
|
108
|
-
method: "PUT",
|
|
109
|
-
path: `/trade-items/${row.trade_item_id}/base-supply/${year}/${week}`,
|
|
110
|
-
referenceId: row.trade_item_id,
|
|
111
|
-
idempotencyKey: `inventory:weekly-base-supply:${row.trade_item_id}:${year}:${week}:${pieces}`,
|
|
112
|
-
body: {
|
|
113
|
-
basePricePerPiece: {
|
|
114
|
-
currency: supply?.currency ?? "EUR",
|
|
115
|
-
value: pricePerPiece,
|
|
116
|
-
},
|
|
117
|
-
numberOfPieces: pieces,
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
if (!qty.ok) {
|
|
121
|
-
const message = qty.error ?? `HTTP ${qty.status}`;
|
|
122
|
-
return { ok: false, permanent: isPermanentError(message), error: message };
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
quantitySkipped =
|
|
127
|
-
"Aantal niet doorgezet: er is nog geen prijs bekend voor dit artikel.";
|
|
128
|
-
}
|
|
129
|
-
// 2. Beschikbaarheidsschakelaar.
|
|
132
|
+
// 1. Beschikbaarheid. Sleutel zonder aantal, zodat een latere echte
|
|
133
|
+
// aantal-verzending (eigen sleutel) nooit wordt overgeslagen.
|
|
130
134
|
const body = { available };
|
|
131
135
|
if (warehouseId)
|
|
132
136
|
body.warehouseId = warehouseId;
|
|
133
|
-
const
|
|
137
|
+
const availability = (await florydayWrite(supabase, env, {
|
|
134
138
|
module: "inventory",
|
|
135
139
|
action: "publish-continuous-stock",
|
|
136
140
|
method: "PUT",
|
|
137
141
|
path: `/trade-items/${row.trade_item_id}/continuous-stock`,
|
|
138
142
|
referenceId: row.trade_item_id,
|
|
139
|
-
idempotencyKey: `inventory:continuous-stock:${row.trade_item_id}:${available}:${
|
|
143
|
+
idempotencyKey: `inventory:continuous-stock:${row.trade_item_id}:${year}:${week}:${available}:${row.id}`,
|
|
140
144
|
body,
|
|
141
|
-
});
|
|
142
|
-
if (!
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
}));
|
|
146
|
+
if (!availability.ok)
|
|
147
|
+
return decideOutcome(availability, null);
|
|
148
|
+
// 2. Aantal: alleen PATCH op bestaand weekaanbod.
|
|
149
|
+
const quantity = (await florydayWrite(supabase, env, {
|
|
150
|
+
module: "inventory",
|
|
151
|
+
action: "patch-weekly-base-supply",
|
|
152
|
+
method: "PATCH",
|
|
153
|
+
path: `/trade-items/${row.trade_item_id}/base-supply/${year}/${week}?numberOfPieces=${pieces}`,
|
|
154
|
+
referenceId: row.trade_item_id,
|
|
155
|
+
idempotencyKey: `inventory:patch-weekly-base-supply:${row.trade_item_id}:${year}:${week}:${pieces}:${row.id}`,
|
|
156
|
+
}));
|
|
157
|
+
return decideOutcome(availability, quantity);
|
|
147
158
|
}
|
|
148
159
|
catch (e) {
|
|
149
160
|
const message = e instanceof Error ? e.message : String(e);
|
|
150
|
-
return
|
|
161
|
+
return errorOutcome(message, isPermanentError(message));
|
|
151
162
|
}
|
|
152
163
|
}
|
|
164
|
+
async function completeRow(supabase, id, o) {
|
|
165
|
+
const { error } = await supabase.rpc("complete_floriday_stock_queue_outcome", {
|
|
166
|
+
p_id: id,
|
|
167
|
+
p_outcome: o.outcome,
|
|
168
|
+
p_availability_sent: o.availabilitySent,
|
|
169
|
+
p_quantity_sent: o.quantitySent,
|
|
170
|
+
p_error: o.error,
|
|
171
|
+
p_attempt_id: o.attemptId,
|
|
172
|
+
p_permanent: o.permanent,
|
|
173
|
+
});
|
|
174
|
+
if (error)
|
|
175
|
+
console.error("[stock-queue] afsluiten mislukt:", id, error.message);
|
|
176
|
+
}
|
|
153
177
|
/** Eén verwerkingsronde. Retourneert een compacte samenvatting. */
|
|
154
178
|
export async function runStockQueueRound(supabase, limit = BATCH_SIZE) {
|
|
155
179
|
const env = await getActiveFlorydayEnvironment(supabase);
|
|
@@ -158,48 +182,47 @@ export async function runStockQueueRound(supabase, limit = BATCH_SIZE) {
|
|
|
158
182
|
throw new Error(error.message);
|
|
159
183
|
const rows = (claimed ?? []);
|
|
160
184
|
let succeeded = 0;
|
|
185
|
+
let skippedNoPrice = 0;
|
|
161
186
|
let failed = 0;
|
|
162
187
|
let rateLimited = false;
|
|
163
188
|
for (const row of rows) {
|
|
164
189
|
if (rateLimited) {
|
|
165
|
-
|
|
166
|
-
await supabase.rpc("complete_floriday_stock_queue", {
|
|
167
|
-
p_id: row.id,
|
|
168
|
-
p_ok: false,
|
|
169
|
-
p_error: "Snelheidslimiet van Floriday bereikt; volgende ronde opnieuw.",
|
|
170
|
-
p_permanent: false,
|
|
171
|
-
p_attempt_id: null,
|
|
172
|
-
});
|
|
190
|
+
await completeRow(supabase, row.id, errorOutcome("Snelheidslimiet van Floriday bereikt; volgende ronde opnieuw.", false));
|
|
173
191
|
continue;
|
|
174
192
|
}
|
|
175
193
|
const outcome = await pushStockRow(supabase, env, row);
|
|
176
|
-
if (outcome.
|
|
194
|
+
if (outcome.outcome === "quantity_sent")
|
|
177
195
|
succeeded += 1;
|
|
196
|
+
else if (outcome.outcome === "skipped_no_price")
|
|
197
|
+
skippedNoPrice += 1;
|
|
178
198
|
else {
|
|
179
199
|
failed += 1;
|
|
180
200
|
if (outcome.error && isRateLimited(outcome.error))
|
|
181
201
|
rateLimited = true;
|
|
182
202
|
}
|
|
183
|
-
await supabase.
|
|
184
|
-
p_id: row.id,
|
|
185
|
-
p_ok: outcome.ok,
|
|
186
|
-
p_error: outcome.ok ? outcome.quantitySkipped ?? null : outcome.error ?? "Onbekende fout",
|
|
187
|
-
p_permanent: outcome.permanent ?? false,
|
|
188
|
-
p_attempt_id: outcome.attemptId ?? null,
|
|
189
|
-
});
|
|
203
|
+
await completeRow(supabase, row.id, outcome);
|
|
190
204
|
}
|
|
191
|
-
return { ok: true, claimed: rows.length, succeeded, failed, rateLimited };
|
|
205
|
+
return { ok: true, claimed: rows.length, succeeded, skippedNoPrice, failed, rateLimited };
|
|
192
206
|
}
|
|
193
207
|
/**
|
|
194
208
|
* Cron-handler, zelfde vorm en beveiliging als de overige cron-routes:
|
|
195
209
|
* `apikey`-header moet gelijk zijn aan `SUPABASE_PUBLISHABLE_KEY`.
|
|
196
210
|
*/
|
|
197
211
|
export async function handleProcessStockQueue(request, supabase) {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
212
|
+
// Voorkeur: gedeelde HMAC-handtekening. Terugval (tijdelijk, tot de
|
|
213
|
+
// herinplanning in een nieuwe Shell): de bestaande apikey-header.
|
|
214
|
+
let authorized = false;
|
|
215
|
+
if (request.headers.get(GATEWAY_HEADER_TIMESTAMP)) {
|
|
216
|
+
const auth = await verifyGatewayRequest(request.clone());
|
|
217
|
+
authorized = auth.ok;
|
|
218
|
+
}
|
|
219
|
+
if (!authorized) {
|
|
220
|
+
const apikey = request.headers.get("apikey") ?? request.headers.get("x-api-key");
|
|
221
|
+
const expected = process.env.SUPABASE_PUBLISHABLE_KEY;
|
|
222
|
+
authorized = !!expected && !!apikey && apikey === expected;
|
|
202
223
|
}
|
|
224
|
+
if (!authorized)
|
|
225
|
+
return new Response("Unauthorized", { status: 401 });
|
|
203
226
|
// Zelfherstel van de shell-host (fire-and-forget): draait elke minuut mee,
|
|
204
227
|
// zodat een nieuwe of verhuisde shell binnen één cron-tick de juiste
|
|
205
228
|
// callback-URL in `module_runtime_config` heeft staan. De functie cachet
|
|
@@ -26,4 +26,11 @@ export declare const FLORYDAY_CLOCK_SUPPLY_PERMISSION_MESSAGE = "Floriday heeft
|
|
|
26
26
|
export declare const FLORYDAY_CONTRACT_PERMISSION_MESSAGE = "Floriday heeft de Contracten-module nog niet vrijgegeven voor deze koppeling. Laat dit recht in Floriday activeren en vernieuw daarna de verbinding.";
|
|
27
27
|
export declare const FLORYDAY_SALES_STRATEGY_PERMISSION_MESSAGE = "Floriday heeft Verkoopstrategie\u00EBn nog niet vrijgegeven voor deze koppeling. Laat het recht `sales-strategy:read` in Floriday activeren en vernieuw daarna de verbinding.";
|
|
28
28
|
export declare const FLORYDAY_SUPPLY_PERMISSION_MESSAGE = "Floriday heeft het recht `supply:read` (aanvoerregels met prijzen) nog niet vrijgegeven voor deze koppeling. Laat dit recht in Floriday activeren en vernieuw daarna de verbinding.";
|
|
29
|
+
/**
|
|
30
|
+
* Toont een Floriday-foutbody/-bericht aantoonbaar een ontbrekend recht/scope?
|
|
31
|
+
* Een kale `403 Forbidden` (bv. onbekend pad bij Floriday's voordeur) telt NIET.
|
|
32
|
+
*/
|
|
33
|
+
export declare function floridayErrorShowsMissingPermission(text: string | null | undefined): boolean;
|
|
34
|
+
/** Scopes uit een JWT-toegangstoken lezen (alleen payload; token nooit loggen). */
|
|
35
|
+
export declare function scopesFromAccessToken(token: string): string[] | null;
|
|
29
36
|
//# sourceMappingURL=floriday-scopes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floriday-scopes.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-scopes.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,wBAAwB,2QAe3B,CAAC;AAOX,eAAO,MAAM,4BAA4B,sDAG/B,CAAC;AACX,eAAO,MAAM,iCAAiC,gCAAiC,CAAC;AAChF,eAAO,MAAM,kCAAkC,iCAAkC,CAAC;AAElF,eAAO,MAAM,wBAAwB,8CAG3B,CAAC;AACX,eAAO,MAAM,6BAA6B,4BAA6B,CAAC;AACxE,eAAO,MAAM,8BAA8B,6BAA8B,CAAC;AAM1E,eAAO,MAAM,8BAA8B,0DAGjC,CAAC;AACX,eAAO,MAAM,mCAAmC,kCAAmC,CAAC;AACpF,eAAO,MAAM,oCAAoC,mCAAoC,CAAC;AAKtF,eAAO,MAAM,uBAAuB,QAAqC,CAAC;AAE1E,eAAO,MAAM,2BAA2B,QAG7B,CAAC;AACZ,eAAO,MAAM,gCAAgC,QAGlC,CAAC;AACZ,eAAO,MAAM,iCAAiC,QAGnC,CAAC;AAEZ,eAAO,MAAM,uBAAuB,QAGzB,CAAC;AACZ,eAAO,MAAM,4BAA4B,QAG9B,CAAC;AACZ,eAAO,MAAM,6BAA6B,QAG/B,CAAC;AAEZ,eAAO,MAAM,6BAA6B,QAG/B,CAAC;AACZ,eAAO,MAAM,kCAAkC,QAGpC,CAAC;AACZ,eAAO,MAAM,mCAAmC,QAGrC,CAAC;AAGZ,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAQ,GAAG,MAAM,CA4C5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,eAAO,MAAM,wCAAwC,mJAC6F,CAAC;AAEnJ,eAAO,MAAM,oCAAoC,yJACuG,CAAC;AAEzJ,eAAO,MAAM,0CAA0C,kLACqH,CAAC;AAE7K,eAAO,MAAM,kCAAkC,wLACwI,CAAC"}
|
|
1
|
+
{"version":3,"file":"floriday-scopes.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-scopes.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,wBAAwB,2QAe3B,CAAC;AAOX,eAAO,MAAM,4BAA4B,sDAG/B,CAAC;AACX,eAAO,MAAM,iCAAiC,gCAAiC,CAAC;AAChF,eAAO,MAAM,kCAAkC,iCAAkC,CAAC;AAElF,eAAO,MAAM,wBAAwB,8CAG3B,CAAC;AACX,eAAO,MAAM,6BAA6B,4BAA6B,CAAC;AACxE,eAAO,MAAM,8BAA8B,6BAA8B,CAAC;AAM1E,eAAO,MAAM,8BAA8B,0DAGjC,CAAC;AACX,eAAO,MAAM,mCAAmC,kCAAmC,CAAC;AACpF,eAAO,MAAM,oCAAoC,mCAAoC,CAAC;AAKtF,eAAO,MAAM,uBAAuB,QAAqC,CAAC;AAE1E,eAAO,MAAM,2BAA2B,QAG7B,CAAC;AACZ,eAAO,MAAM,gCAAgC,QAGlC,CAAC;AACZ,eAAO,MAAM,iCAAiC,QAGnC,CAAC;AAEZ,eAAO,MAAM,uBAAuB,QAGzB,CAAC;AACZ,eAAO,MAAM,4BAA4B,QAG9B,CAAC;AACZ,eAAO,MAAM,6BAA6B,QAG/B,CAAC;AAEZ,eAAO,MAAM,6BAA6B,QAG/B,CAAC;AACZ,eAAO,MAAM,kCAAkC,QAGpC,CAAC;AACZ,eAAO,MAAM,mCAAmC,QAGrC,CAAC;AAGZ,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAQ,GAAG,MAAM,CA4C5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,eAAO,MAAM,wCAAwC,mJAC6F,CAAC;AAEnJ,eAAO,MAAM,oCAAoC,yJACuG,CAAC;AAEzJ,eAAO,MAAM,0CAA0C,kLACqH,CAAC;AAE7K,eAAO,MAAM,kCAAkC,wLACwI,CAAC;AAExL;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAY5F;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAapE"}
|
|
@@ -129,3 +129,37 @@ export const FLORYDAY_CLOCK_SUPPLY_PERMISSION_MESSAGE = "Floriday heeft Klokaanv
|
|
|
129
129
|
export const FLORYDAY_CONTRACT_PERMISSION_MESSAGE = "Floriday heeft de Contracten-module nog niet vrijgegeven voor deze koppeling. Laat dit recht in Floriday activeren en vernieuw daarna de verbinding.";
|
|
130
130
|
export const FLORYDAY_SALES_STRATEGY_PERMISSION_MESSAGE = "Floriday heeft Verkoopstrategieën nog niet vrijgegeven voor deze koppeling. Laat het recht `sales-strategy:read` in Floriday activeren en vernieuw daarna de verbinding.";
|
|
131
131
|
export const FLORYDAY_SUPPLY_PERMISSION_MESSAGE = "Floriday heeft het recht `supply:read` (aanvoerregels met prijzen) nog niet vrijgegeven voor deze koppeling. Laat dit recht in Floriday activeren en vernieuw daarna de verbinding.";
|
|
132
|
+
/**
|
|
133
|
+
* Toont een Floriday-foutbody/-bericht aantoonbaar een ontbrekend recht/scope?
|
|
134
|
+
* Een kale `403 Forbidden` (bv. onbekend pad bij Floriday's voordeur) telt NIET.
|
|
135
|
+
*/
|
|
136
|
+
export function floridayErrorShowsMissingPermission(text) {
|
|
137
|
+
const t = String(text ?? "").toLowerCase();
|
|
138
|
+
return (t.includes("insufficient_scope") ||
|
|
139
|
+
t.includes("insufficient scope") ||
|
|
140
|
+
t.includes("missing scope") ||
|
|
141
|
+
t.includes("scope") ||
|
|
142
|
+
t.includes("permission") ||
|
|
143
|
+
t.includes("policy evaluation failed") ||
|
|
144
|
+
t.includes("access_denied") ||
|
|
145
|
+
t.includes("not authorized for"));
|
|
146
|
+
}
|
|
147
|
+
/** Scopes uit een JWT-toegangstoken lezen (alleen payload; token nooit loggen). */
|
|
148
|
+
export function scopesFromAccessToken(token) {
|
|
149
|
+
try {
|
|
150
|
+
const part = token.split(".")[1];
|
|
151
|
+
if (!part)
|
|
152
|
+
return null;
|
|
153
|
+
const b64 = part.replace(/-/g, "+").replace(/_/g, "/");
|
|
154
|
+
const json = JSON.parse(atob(b64 + "=".repeat((4 - (b64.length % 4)) % 4)));
|
|
155
|
+
const s = json.scope ?? json.scp;
|
|
156
|
+
if (Array.isArray(s))
|
|
157
|
+
return s.map(String);
|
|
158
|
+
if (typeof s === "string")
|
|
159
|
+
return s.split(/\s+/).filter(Boolean);
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floriday-sync.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-sync.functions.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"floriday-sync.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-sync.functions.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// ============================================================================
|
|
8
8
|
import { createServerFn } from "@tanstack/react-start";
|
|
9
9
|
import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
|
|
10
|
-
import { FLORYDAY_CONTRACT_PERMISSION_MESSAGE, FLORYDAY_SALES_STRATEGY_PERMISSION_MESSAGE, FLORYDAY_SUPPLY_PERMISSION_MESSAGE, } from "./floriday-scopes.js";
|
|
10
|
+
import { FLORYDAY_CONTRACT_PERMISSION_MESSAGE, FLORYDAY_SALES_STRATEGY_PERMISSION_MESSAGE, FLORYDAY_SUPPLY_PERMISSION_MESSAGE, floridayErrorShowsMissingPermission, } from "./floriday-scopes.js";
|
|
11
11
|
import { SUPPLIERS_API_VERSION, getActiveFlorydayCredentials, resolveVerifiedFlorydayCronUrl, syncFloridayEntityBySequence, } from "./floriday.functions.js";
|
|
12
12
|
// Stale-write bescherming (gedeeld met de connections-sync): een vertraagde
|
|
13
13
|
// batch mag een nieuwere cache-rij nooit terugzetten.
|
|
@@ -660,7 +660,9 @@ async function runSyncHandler(context, environment, resource) {
|
|
|
660
660
|
else if (isContractResource && policyDenied) {
|
|
661
661
|
message = FLORYDAY_CONTRACT_PERMISSION_MESSAGE;
|
|
662
662
|
}
|
|
663
|
-
else if (resource === "catalog-prices" &&
|
|
663
|
+
else if (resource === "catalog-prices" &&
|
|
664
|
+
floridayErrorShowsMissingPermission(rawMessage)) {
|
|
665
|
+
// Alleen bij aantoonbaar ontbrekend recht; een kale 403 tonen we ongewijzigd.
|
|
664
666
|
message = FLORYDAY_SUPPLY_PERMISSION_MESSAGE;
|
|
665
667
|
}
|
|
666
668
|
return {
|
|
@@ -178,6 +178,8 @@ export declare function resolveVerifiedFlorydayCronUrl(path: string): Promise<st
|
|
|
178
178
|
export declare function syncShellHostRuntimeConfig(): Promise<{
|
|
179
179
|
base: string | null;
|
|
180
180
|
changed: boolean;
|
|
181
|
+
shellBaseChanged?: boolean;
|
|
182
|
+
skipped?: string;
|
|
181
183
|
}>;
|
|
182
184
|
export declare const getFlorydayShellHostStatus: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
183
185
|
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
@@ -198,6 +200,15 @@ export declare const getFlorydayShellHostStatus: import("@tanstack/start-client-
|
|
|
198
200
|
matches: boolean;
|
|
199
201
|
error?: undefined;
|
|
200
202
|
}>>;
|
|
203
|
+
export declare const getFlorydayShellRoutesStatus: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
204
|
+
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
205
|
+
userId: string;
|
|
206
|
+
claims: import("@supabase/auth-js").JwtPayload;
|
|
207
|
+
}, undefined, undefined, undefined>], (d: {
|
|
208
|
+
force?: boolean;
|
|
209
|
+
} | undefined) => {
|
|
210
|
+
force: boolean;
|
|
211
|
+
}, Promise<import("./shell-routes.js").ShellRoutesReport>>;
|
|
201
212
|
export declare const repairFlorydayShellHost: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
|
|
202
213
|
supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
|
|
203
214
|
userId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floriday.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday.functions.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAc5D,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAaxD;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,mBAAmB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAkBD,eAAO,MAAM,qBAAqB,yBAAyB,CAAC;AAmD5D,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,mBAAmB;;;;;;;;;;;;;;UAWzB;AASD,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,mBAAmB,EACxB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACvD,OAAO,CAAC,MAAM,CAAC,CAyDjB;AAkLD,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,mBAAmB,CAAC,CAQ9B;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,GAAG,mBAAmB,EACvC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,EACjC,SAAS,GAAE,WAAgB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CA8InB;AAKD,eAAO,MAAM,uBAAuB;;;;qFAUhC,CAAC;AAEL,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;YAoBvB,OAAO;mBAAa,GAAG,EAAE;iBAAW,MAAM;gBAAU,MAAM;;;;GAqBlE,CAAC;AAEL,eAAO,MAAM,yBAAyB;;;;8CAEZ;IAAE,WAAW,EAAE,mBAAmB,CAAA;CAAE;iBAArB,mBAAmB;;;;GAkBxD,CAAC;AAGL;;;;GAIG;AACH,eAAO,MAAM,wBAAwB;;;;8CAEX;IACtB,WAAW,EAAE,mBAAmB,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;iBAHc,mBAAmB;YACxB,MAAM;aACL,MAAM;
|
|
1
|
+
{"version":3,"file":"floriday.functions.d.ts","sourceRoot":"","sources":["../../src/lib/floriday.functions.ts"],"names":[],"mappings":"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"}
|
|
@@ -578,6 +578,15 @@ export const upsertFlorydayConnection = createServerFn({ method: "POST" })
|
|
|
578
578
|
catch (e) {
|
|
579
579
|
console.error("[floriday] auto webhook-subscribe failed:", e);
|
|
580
580
|
}
|
|
581
|
+
// Controle of de Shell alle gateway-routes van deze module bedient.
|
|
582
|
+
try {
|
|
583
|
+
const { checkShellRoutes, logShellRoutesReport } = await import("./shell-routes.js");
|
|
584
|
+
const r = await checkShellRoutes({ force: true });
|
|
585
|
+
await logShellRoutesReport(supabaseAdmin, r, "nieuwe/gewijzigde koppeling");
|
|
586
|
+
}
|
|
587
|
+
catch (e) {
|
|
588
|
+
console.error("[floriday] shell-routes check failed:", e);
|
|
589
|
+
}
|
|
581
590
|
// Automatisch (her)plan de uurlijkse token-refresh cron. Niet-fataal
|
|
582
591
|
// bij falen — credentials zijn al opgeslagen.
|
|
583
592
|
try {
|
|
@@ -889,36 +898,69 @@ export async function resolveVerifiedFlorydayCronUrl(path) {
|
|
|
889
898
|
export async function syncShellHostRuntimeConfig() {
|
|
890
899
|
let base = null;
|
|
891
900
|
try {
|
|
892
|
-
//
|
|
893
|
-
//
|
|
894
|
-
// Alleen de actieve tenant-host uit Central Auth mag deze waarde bepalen.
|
|
901
|
+
// Geen project/env-fallback: alleen de actieve tenant-host uit Central
|
|
902
|
+
// Auth mag deze waarden bepalen.
|
|
895
903
|
const { getShellHostFromCentral } = await import("./central-auth.server.js");
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
904
|
+
const { normalizeShellBase } = await import("./shell-base.js");
|
|
905
|
+
const raw = await getShellHostFromCentral();
|
|
906
|
+
if (!raw)
|
|
907
|
+
return { base: null, changed: false, skipped: "Central Auth gaf geen shell-host" };
|
|
908
|
+
base = normalizeShellBase(raw);
|
|
909
|
+
if (!base) {
|
|
910
|
+
console.warn(`[floriday] shell-host uit Central Auth afgewezen (ongeldig): ${String(raw).slice(0, 120)}`);
|
|
911
|
+
return { base: null, changed: false, skipped: "ongeldige shell-host" };
|
|
912
|
+
}
|
|
899
913
|
}
|
|
900
914
|
catch {
|
|
901
|
-
return { base: null, changed: false };
|
|
915
|
+
return { base: null, changed: false, skipped: "Central Auth niet bereikbaar" };
|
|
902
916
|
}
|
|
903
917
|
try {
|
|
904
918
|
const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
|
|
905
|
-
const
|
|
919
|
+
const db = supabaseAdmin;
|
|
920
|
+
const { data: rows } = await db
|
|
906
921
|
.from("module_runtime_config")
|
|
907
|
-
.select("value")
|
|
908
|
-
.
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
922
|
+
.select("key, value")
|
|
923
|
+
.in("key", ["stock_queue_processor_base_url", "shell_base_url"]);
|
|
924
|
+
const cur = new Map((rows ?? []).map((r) => [r.key, r.value]));
|
|
925
|
+
const stockSame = cur.get("stock_queue_processor_base_url") === base;
|
|
926
|
+
const shellSame = cur.get("shell_base_url") === base;
|
|
927
|
+
if (stockSame && shellSame)
|
|
928
|
+
return { base, changed: false, shellBaseChanged: false };
|
|
929
|
+
// Alleen schrijven als dit adres deze module aantoonbaar bedient.
|
|
930
|
+
const pingErr = await checkShellServesCronRoute(base, "/api/public/cron/ping");
|
|
931
|
+
if (pingErr) {
|
|
932
|
+
console.warn(`[floriday] shell-host ${base} niet geschreven: ${pingErr}`);
|
|
933
|
+
return { base, changed: false, skipped: pingErr };
|
|
934
|
+
}
|
|
935
|
+
const now = new Date().toISOString();
|
|
936
|
+
let shellBaseChanged = false;
|
|
937
|
+
if (!shellSame) {
|
|
938
|
+
const previous = cur.get("shell_base_url") ?? null;
|
|
939
|
+
if (previous) {
|
|
940
|
+
await db.from("module_runtime_config").upsert({ key: "shell_base_url_previous", value: previous, updated_at: now }, { onConflict: "key" });
|
|
941
|
+
}
|
|
942
|
+
await db.from("module_runtime_config").upsert({ key: "shell_base_url", value: base, updated_at: now }, { onConflict: "key" });
|
|
943
|
+
shellBaseChanged = true;
|
|
944
|
+
await db.from("floriday_write_log").insert({
|
|
945
|
+
connection_id: null,
|
|
946
|
+
module: "floriday-authenticatie",
|
|
947
|
+
action: "shell-host-changed",
|
|
948
|
+
resource: "module_runtime_config",
|
|
949
|
+
floriday_id: null,
|
|
950
|
+
request: { key: "shell_base_url", from: previous, to: base },
|
|
951
|
+
response: null,
|
|
952
|
+
http_status: 0,
|
|
953
|
+
ok: true,
|
|
954
|
+
error: `shell-host gewijzigd van ${previous ?? "(leeg)"} naar ${base}`,
|
|
955
|
+
idempotency_key: null,
|
|
956
|
+
caller: "shell-host-sync",
|
|
957
|
+
}).then(() => undefined, () => undefined);
|
|
958
|
+
}
|
|
959
|
+
if (!stockSame) {
|
|
960
|
+
await db.from("module_runtime_config").upsert({ key: "stock_queue_processor_base_url", value: base, updated_at: now }, { onConflict: "key" });
|
|
961
|
+
}
|
|
920
962
|
console.log(`[floriday] shell-host bijgewerkt naar ${base}`);
|
|
921
|
-
return { base, changed:
|
|
963
|
+
return { base, changed: !stockSame, shellBaseChanged };
|
|
922
964
|
}
|
|
923
965
|
catch (e) {
|
|
924
966
|
console.warn(`[floriday] shell-host synchroniseren mislukt: ${e?.message ?? e}`);
|
|
@@ -956,6 +998,18 @@ export const getFlorydayShellHostStatus = createServerFn({ method: "GET" })
|
|
|
956
998
|
matches: Boolean(centralHost && processorHost === centralHost),
|
|
957
999
|
};
|
|
958
1000
|
});
|
|
1001
|
+
export const getFlorydayShellRoutesStatus = createServerFn({ method: "POST" })
|
|
1002
|
+
.middleware([requireSupabaseAuth])
|
|
1003
|
+
.inputValidator((d) => ({ force: d?.force === true }))
|
|
1004
|
+
.handler(async ({ data }) => {
|
|
1005
|
+
const { checkShellRoutes, logShellRoutesReport } = await import("./shell-routes.js");
|
|
1006
|
+
const report = await checkShellRoutes({ force: data.force });
|
|
1007
|
+
if (data.force) {
|
|
1008
|
+
const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
|
|
1009
|
+
await logShellRoutesReport(supabaseAdmin, report, "handmatige controle");
|
|
1010
|
+
}
|
|
1011
|
+
return report;
|
|
1012
|
+
});
|
|
959
1013
|
export const repairFlorydayShellHost = createServerFn({ method: "POST" })
|
|
960
1014
|
.middleware([requireSupabaseAuth])
|
|
961
1015
|
.handler(async ({ context }) => {
|
|
@@ -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;AAQD,eAAO,MAAM,0BAA0B,QAAa,CAAC;AAqBrD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,
|
|
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,CA8DnB"}
|
|
@@ -102,6 +102,18 @@ export async function handleDiagnostics(request, supabase) {
|
|
|
102
102
|
if (auth.rawBody.length > DIAGNOSTICS_MAX_BODY_BYTES) {
|
|
103
103
|
return _diagJson({ ok: false, error: "Diagnostics-payload te groot (max 256 KB)" }, { status: 413 });
|
|
104
104
|
}
|
|
105
|
+
// Controle op Shell-routes: { "action": "shell-routes" } (alleen lezen).
|
|
106
|
+
try {
|
|
107
|
+
const peek = auth.rawBody ? JSON.parse(auth.rawBody) : null;
|
|
108
|
+
if (peek && peek.action === "shell-routes") {
|
|
109
|
+
const { checkShellRoutes } = await import("../shell-routes.js");
|
|
110
|
+
const report = await checkShellRoutes({ force: peek.force === true });
|
|
111
|
+
return _diagJson({ ok: true, shellRoutes: report });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
/* geen JSON of controle mislukt → gewone diagnose-afhandeling */
|
|
116
|
+
}
|
|
105
117
|
try {
|
|
106
118
|
const result = await runDiagnostics(supabase, {
|
|
107
119
|
rawBody: auth.rawBody,
|