@hartl-services/medusa-base 0.3.0 → 0.4.0
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/.medusa/server/src/admin/index.js +741 -36
- package/.medusa/server/src/admin/index.mjs +743 -38
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/route.js +31 -0
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/runs/route.js +16 -0
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/route.js +14 -0
- package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/settings/route.js +22 -0
- package/.medusa/server/src/api/admin/plugin-features/route.js +6 -4
- package/.medusa/server/src/api/middlewares.js +22 -8
- package/.medusa/server/src/api/plugin-actions.js +221 -0
- package/.medusa/server/src/api/plugin-features-http.js +67 -8
- package/.medusa/server/src/modules/plugin-features/domain/plugin-action-runs.js +92 -0
- package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +213 -0
- package/.medusa/server/src/modules/plugin-features/domain/secret-box.js +56 -0
- package/.medusa/server/src/modules/plugin-features/migrations/Migration20260928205031.js +16 -0
- package/.medusa/server/src/modules/plugin-features/migrations/Migration20260928215428.js +17 -0
- package/.medusa/server/src/modules/plugin-features/models/plugin-action-run.js +43 -0
- package/.medusa/server/src/modules/plugin-features/models/plugin-setting-state.js +32 -0
- package/.medusa/server/src/modules/plugin-features/service.js +419 -17
- package/.medusa/server/src/public/action-progress.js +67 -0
- package/.medusa/server/src/public/descriptor.js +199 -2
- package/.medusa/server/src/public/effective-features.js +9 -5
- package/.medusa/server/src/public/enforcement.js +18 -8
- package/.medusa/server/src/public/index.js +10 -2
- package/.medusa/server/src/public/module-access.js +14 -0
- package/.medusa/server/src/public/settings.js +17 -0
- package/.medusa/server/src/public/shop-master-data.js +95 -0
- package/.medusa/server/src/utils/discover-complete-cart-participants.js +9 -2
- package/.medusa/server/src/utils/discover-plugin-features.js +47 -9
- package/.medusa/server/src/workflows/hooks/complete-cart-participants.js +28 -16
- package/README.md +393 -12
- package/dist/admin-components/features/plugin-features/components/PluginActionsSection.d.ts +6 -0
- package/dist/admin-components/features/plugin-features/components/PluginActionsSection.js +66 -0
- package/dist/admin-components/features/plugin-features/components/PluginDetailPage.d.ts +2 -0
- package/dist/admin-components/features/plugin-features/components/PluginDetailPage.js +9 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeatureGate.d.ts +22 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeatureGate.js +18 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeatureSections.d.ts +11 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeatureSections.js +19 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeaturesCard.d.ts +12 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeaturesCard.js +34 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.d.ts +5 -0
- package/dist/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.js +16 -0
- package/dist/admin-components/features/plugin-features/components/PluginHubCard.d.ts +7 -0
- package/dist/admin-components/features/plugin-features/components/PluginHubCard.js +21 -0
- package/dist/admin-components/features/plugin-features/components/PluginPageShell.d.ts +13 -0
- package/dist/admin-components/features/plugin-features/components/PluginPageShell.js +20 -0
- package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.d.ts +7 -0
- package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +39 -0
- package/dist/admin-components/features/plugin-features/components/PluginStatusChips.d.ts +5 -0
- package/dist/admin-components/features/plugin-features/components/PluginStatusChips.js +8 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +114 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.js +40 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +392 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.js +128 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +93 -0
- package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.js +44 -0
- package/dist/admin-components/features/plugin-features/lib/action-runs.d.ts +19 -0
- package/dist/admin-components/features/plugin-features/lib/action-runs.js +74 -0
- package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +363 -0
- package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.js +9 -0
- package/dist/admin-components/features/plugin-features/lib/plugin-paths.d.ts +4 -0
- package/dist/admin-components/features/plugin-features/lib/plugin-paths.js +4 -0
- package/dist/admin-components/features/plugin-features/lib/settings-draft.d.ts +28 -0
- package/dist/admin-components/features/plugin-features/lib/settings-draft.js +86 -0
- package/dist/admin-components/features/plugin-features/queries/pluginFeatureKeys.d.ts +7 -0
- package/dist/admin-components/features/plugin-features/queries/pluginFeatureKeys.js +7 -0
- package/dist/admin-components/i18n/texts.d.ts +90 -0
- package/dist/admin-components/i18n/texts.js +90 -0
- package/dist/admin-components/index.d.ts +14 -0
- package/dist/admin-components/index.js +14 -0
- package/dist/admin-components/lib/errors.d.ts +6 -0
- package/dist/admin-components/lib/errors.js +27 -0
- package/dist/admin-components/lib/sdk.d.ts +2 -0
- package/dist/admin-components/lib/sdk.js +13 -0
- package/dist/public/action-progress.d.ts +25 -0
- package/dist/public/action-progress.js +66 -0
- package/dist/public/descriptor.d.ts +3 -2
- package/dist/public/descriptor.js +198 -1
- package/dist/public/effective-features.d.ts +2 -1
- package/dist/public/effective-features.js +8 -4
- package/dist/public/enforcement.d.ts +7 -0
- package/dist/public/enforcement.js +17 -7
- package/dist/public/index.d.ts +5 -2
- package/dist/public/index.js +9 -1
- package/dist/public/module-access.d.ts +3 -0
- package/dist/public/module-access.js +13 -0
- package/dist/public/settings.d.ts +11 -0
- package/dist/public/settings.js +16 -0
- package/dist/public/shop-master-data.d.ts +25 -0
- package/dist/public/shop-master-data.js +94 -0
- package/dist/public/types.d.ts +97 -1
- package/dist/utils/discover-plugin-features.d.ts +28 -0
- package/dist/utils/discover-plugin-features.js +96 -0
- package/package.json +7 -3
package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/route.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = void 0;
|
|
4
|
+
const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
|
|
5
|
+
const plugin_actions_1 = require("../../../../../plugin-actions");
|
|
6
|
+
const plugin_features_http_1 = require("../../../../../plugin-features-http");
|
|
7
|
+
const wire_response_1 = require("../../../../../wire-response");
|
|
8
|
+
/**
|
|
9
|
+
* Runs a declared action. `sync` answers 200 after the workflow finished
|
|
10
|
+
* (202 when it is still running on async steps), `background` answers 202
|
|
11
|
+
* right after starting it; both carry the recorded
|
|
12
|
+
* run. 409 with the running run when the same action is still running.
|
|
13
|
+
*/
|
|
14
|
+
const POST = async (req, res) => {
|
|
15
|
+
const descriptor = (0, plugin_features_http_1.requirePluginFeatureDescriptor)(req.scope, String(req.params.plugin_key));
|
|
16
|
+
const action = (0, plugin_actions_1.requirePluginAction)(descriptor, String(req.params.action_key));
|
|
17
|
+
const outcome = await (0, plugin_actions_1.runPluginAction)(req.scope, descriptor, action, req.auth_context.actor_id);
|
|
18
|
+
if (outcome.status === "already_running") {
|
|
19
|
+
res.status(409).json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginActionConflictResponseSchema, {
|
|
20
|
+
type: "conflict",
|
|
21
|
+
message: plugin_actions_1.PLUGIN_ACTION_ALREADY_RUNNING_MESSAGE,
|
|
22
|
+
run: outcome.run,
|
|
23
|
+
}));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
res
|
|
27
|
+
.status(outcome.status === "started" ? 202 : 200)
|
|
28
|
+
.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginActionRunResponseSchema, { action: outcome }));
|
|
29
|
+
};
|
|
30
|
+
exports.POST = POST;
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9bcGx1Z2luX2tleV0vYWN0aW9ucy9bYWN0aW9uX2tleV0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsK0dBR2tGO0FBTWxGLGtFQUlzQztBQUN0Qyw4RUFBb0Y7QUFDcEYsZ0VBQTZEO0FBRTdEOzs7OztHQUtHO0FBQ0ksTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUN2QixHQUErQixFQUMvQixHQUVDLEVBQ0QsRUFBRTtJQUNGLE1BQU0sVUFBVSxHQUFHLElBQUEscURBQThCLEVBQy9DLEdBQUcsQ0FBQyxLQUFLLEVBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQzlCLENBQUE7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFBLG9DQUFtQixFQUNoQyxVQUFVLEVBQ1YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQzlCLENBQUE7SUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEsZ0NBQWUsRUFDbkMsR0FBRyxDQUFDLEtBQUssRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUMxQixDQUFBO0lBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLGlCQUFpQixFQUFFLENBQUM7UUFDekMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQ2xCLElBQUEsOEJBQWMsRUFBQyx5REFBdUMsRUFBRTtZQUN0RCxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsc0RBQXFDO1lBQzlDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztTQUNqQixDQUFDLENBQ0gsQ0FBQTtRQUNELE9BQU07SUFDUixDQUFDO0lBQ0QsR0FBRztTQUNBLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDaEQsSUFBSSxDQUFDLElBQUEsOEJBQWMsRUFBQyxvREFBa0MsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDbEYsQ0FBQyxDQUFBO0FBakNZLFFBQUEsSUFBSSxRQWlDaEIifQ==
|
package/.medusa/server/src/api/admin/plugin-features/[plugin_key]/actions/[action_key]/runs/route.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
|
|
5
|
+
const plugin_actions_1 = require("../../../../../../plugin-actions");
|
|
6
|
+
const plugin_features_http_1 = require("../../../../../../plugin-features-http");
|
|
7
|
+
const wire_response_1 = require("../../../../../../wire-response");
|
|
8
|
+
/** Latest runs of a declared action, newest first (`?limit=`, default 1). */
|
|
9
|
+
const GET = async (req, res) => {
|
|
10
|
+
const descriptor = (0, plugin_features_http_1.requirePluginFeatureDescriptor)(req.scope, String(req.params.plugin_key));
|
|
11
|
+
const action = (0, plugin_actions_1.requirePluginAction)(descriptor, String(req.params.action_key));
|
|
12
|
+
const runs = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).listRecentPluginActionRuns(descriptor.plugin_key, action.key, req.validatedQuery.limit);
|
|
13
|
+
res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginActionRunsResponseSchema, { runs }));
|
|
14
|
+
};
|
|
15
|
+
exports.GET = GET;
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9bcGx1Z2luX2tleV0vYWN0aW9ucy9bYWN0aW9uX2tleV0vcnVucy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSwrR0FHa0Y7QUFHbEYscUVBQXNFO0FBQ3RFLGlGQUcrQztBQUMvQyxtRUFBZ0U7QUFJaEUsNkVBQTZFO0FBQ3RFLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBbUQsRUFDbkQsR0FBa0QsRUFDbEQsRUFBRTtJQUNGLE1BQU0sVUFBVSxHQUFHLElBQUEscURBQThCLEVBQy9DLEdBQUcsQ0FBQyxLQUFLLEVBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQzlCLENBQUE7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFBLG9DQUFtQixFQUNoQyxVQUFVLEVBQ1YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQzlCLENBQUE7SUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsbURBQTRCLEVBQzdDLEdBQUcsQ0FBQyxLQUFLLENBQ1YsQ0FBQywwQkFBMEIsQ0FDMUIsVUFBVSxDQUFDLFVBQVUsRUFDckIsTUFBTSxDQUFDLEdBQUcsRUFDVixHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FDekIsQ0FBQTtJQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSw4QkFBYyxFQUFDLHFEQUFtQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ3pFLENBQUMsQ0FBQTtBQXBCWSxRQUFBLEdBQUcsT0FvQmYifQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
|
|
5
|
+
const plugin_features_http_1 = require("../../../plugin-features-http");
|
|
6
|
+
const wire_response_1 = require("../../../wire-response");
|
|
7
|
+
/** One plugin like in the list; 404 for an unknown plugin key. */
|
|
8
|
+
const GET = async (req, res) => {
|
|
9
|
+
const { descriptor, fallback } = (0, plugin_features_http_1.requireDiscoveredPlugin)(req.scope, String(req.params.plugin_key));
|
|
10
|
+
const plugin = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).describePluginFeatures(descriptor, fallback);
|
|
11
|
+
res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginFeaturesResponseSchema, { plugin }));
|
|
12
|
+
};
|
|
13
|
+
exports.GET = GET;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9bcGx1Z2luX2tleV0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsK0dBQTZIO0FBRzdILHdFQUdzQztBQUN0QywwREFBdUQ7QUFFdkQsa0VBQWtFO0FBQzNELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBZ0QsRUFDaEQsRUFBRTtJQUNGLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBQSw4Q0FBdUIsRUFDdEQsR0FBRyxDQUFDLEtBQUssRUFDVCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FDOUIsQ0FBQTtJQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxtREFBNEIsRUFDL0MsR0FBRyxDQUFDLEtBQUssQ0FDVixDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUM5QyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEsOEJBQWMsRUFBQyxtREFBaUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN6RSxDQUFDLENBQUE7QUFaWSxRQUFBLEdBQUcsT0FZZiJ9
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = exports.GET = void 0;
|
|
4
|
+
const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
|
|
5
|
+
const plugin_features_http_1 = require("../../../../plugin-features-http");
|
|
6
|
+
const wire_response_1 = require("../../../../wire-response");
|
|
7
|
+
/** Settings with their source; secret values are never returned. */
|
|
8
|
+
const GET = async (req, res) => {
|
|
9
|
+
const { descriptor, fallback } = (0, plugin_features_http_1.requireDiscoveredPlugin)(req.scope, String(req.params.plugin_key));
|
|
10
|
+
const settings = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).describePluginSettings(descriptor, fallback);
|
|
11
|
+
res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginSettingsResponseSchema, { settings }));
|
|
12
|
+
};
|
|
13
|
+
exports.GET = GET;
|
|
14
|
+
/** Merges `values` (`null` clears); stale `expected_version` is 409. */
|
|
15
|
+
const POST = async (req, res) => {
|
|
16
|
+
const { descriptor, fallback } = (0, plugin_features_http_1.requireDiscoveredPlugin)(req.scope, String(req.params.plugin_key));
|
|
17
|
+
const { plugin, changed_keys } = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).updatePluginSettings(descriptor, req.validatedBody, fallback);
|
|
18
|
+
await (0, plugin_features_http_1.emitPluginSettingsUpdated)(req.scope, plugin, changed_keys);
|
|
19
|
+
res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginFeaturesResponseSchema, { plugin }));
|
|
20
|
+
};
|
|
21
|
+
exports.POST = POST;
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9bcGx1Z2luX2tleV0vc2V0dGluZ3Mvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsK0dBSWtGO0FBTWxGLDJFQUl5QztBQUN6Qyw2REFBMEQ7QUFJMUQsb0VBQW9FO0FBQzdELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBZ0QsRUFDaEQsRUFBRTtJQUNGLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBQSw4Q0FBdUIsRUFDdEQsR0FBRyxDQUFDLEtBQUssRUFDVCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FDOUIsQ0FBQTtJQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxtREFBNEIsRUFDakQsR0FBRyxDQUFDLEtBQUssQ0FDVixDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUM5QyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEsOEJBQWMsRUFBQyxtREFBaUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUMzRSxDQUFDLENBQUE7QUFaWSxRQUFBLEdBQUcsT0FZZjtBQUVELHdFQUF3RTtBQUNqRSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQTJDLEVBQzNDLEdBQWdELEVBQ2hELEVBQUU7SUFDRixNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUEsOENBQXVCLEVBQ3RELEdBQUcsQ0FBQyxLQUFLLEVBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQzlCLENBQUE7SUFDRCxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sSUFBQSxtREFBNEIsRUFDakUsR0FBRyxDQUFDLEtBQUssQ0FDVixDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sSUFBQSxnREFBeUIsRUFBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUNoRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEsOEJBQWMsRUFBQyxtREFBaUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN6RSxDQUFDLENBQUE7QUFiWSxRQUFBLElBQUksUUFhaEIifQ==
|
|
@@ -4,17 +4,19 @@ exports.POST = exports.GET = void 0;
|
|
|
4
4
|
const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
|
|
5
5
|
const plugin_features_http_1 = require("../../plugin-features-http");
|
|
6
6
|
const wire_response_1 = require("../../wire-response");
|
|
7
|
+
/** Toggles, settings (no secret values), actions and pages of every plugin. */
|
|
7
8
|
const GET = async (req, res) => {
|
|
8
9
|
const service = (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope);
|
|
9
|
-
const plugins = await Promise.all((0, plugin_features_http_1.
|
|
10
|
+
const plugins = await Promise.all((0, plugin_features_http_1.listDiscoveredPlugins)(req.scope).map(({ descriptor, fallback }) => service.describePluginFeatures(descriptor, fallback)));
|
|
10
11
|
res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginFeaturesListResponseSchema, { plugins }));
|
|
11
12
|
};
|
|
12
13
|
exports.GET = GET;
|
|
13
14
|
const POST = async (req, res) => {
|
|
14
15
|
const { plugin_key, ...input } = req.validatedBody;
|
|
15
|
-
const descriptor = (0, plugin_features_http_1.
|
|
16
|
-
const plugin = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).updatePluginFeatures(descriptor, input);
|
|
16
|
+
const { descriptor, fallback } = (0, plugin_features_http_1.requireDiscoveredPlugin)(req.scope, plugin_key);
|
|
17
|
+
const plugin = await (0, plugin_features_http_1.resolvePluginFeaturesService)(req.scope).updatePluginFeatures(descriptor, input, fallback);
|
|
18
|
+
await (0, plugin_features_http_1.emitPluginFeaturesUpdated)(req.scope, plugin);
|
|
17
19
|
res.json((0, wire_response_1.toWireResponse)(plugin_features_1.AdminPluginFeaturesResponseSchema, { plugin }));
|
|
18
20
|
};
|
|
19
21
|
exports.POST = POST;
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi1mZWF0dXJlcy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSwrR0FJa0Y7QUFNbEYscUVBS21DO0FBQ25DLHVEQUFvRDtBQUlwRCwrRUFBK0U7QUFDeEUsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUErQixFQUMvQixHQUFvRCxFQUNwRCxFQUFFO0lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBQSxtREFBNEIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixJQUFBLDRDQUFxQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQ2hFLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQ3JELENBQ0YsQ0FBQTtJQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSw4QkFBYyxFQUFDLHVEQUFxQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQzlFLENBQUMsQ0FBQTtBQVhZLFFBQUEsR0FBRyxPQVdmO0FBRU0sTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUN2QixHQUEyQyxFQUMzQyxHQUFnRCxFQUNoRCxFQUFFO0lBQ0YsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUE7SUFDbEQsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFBLDhDQUF1QixFQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDL0UsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLG1EQUE0QixFQUMvQyxHQUFHLENBQUMsS0FBSyxDQUNWLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNuRCxNQUFNLElBQUEsZ0RBQXlCLEVBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUNsRCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEsOEJBQWMsRUFBQyxtREFBaUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN6RSxDQUFDLENBQUE7QUFYWSxRQUFBLElBQUksUUFXaEIifQ==
|
|
@@ -2,24 +2,38 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const http_1 = require("@medusajs/framework/http");
|
|
4
4
|
const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
|
|
5
|
+
// Authentication: Medusa authenticates every /admin route (actor "user";
|
|
6
|
+
// bearer, session or secret API key) before plugin middlewares run
|
|
7
|
+
// (framework 2.19.0 http/router.js), so no second `authenticate` here.
|
|
5
8
|
// Store GETs need nothing beyond Medusa's publishable-key check on /store.
|
|
6
|
-
// Every authenticated Admin user may read and change
|
|
7
|
-
// design).
|
|
9
|
+
// Every authenticated Admin user may read and change toggles and settings
|
|
10
|
+
// and run actions (no RBAC by design).
|
|
8
11
|
exports.default = (0, http_1.defineMiddlewares)({
|
|
9
12
|
routes: [
|
|
10
13
|
{
|
|
11
14
|
matcher: "/admin/plugin-features",
|
|
12
|
-
methods: ["
|
|
13
|
-
middlewares: [(0, http_1.
|
|
15
|
+
methods: ["POST"],
|
|
16
|
+
middlewares: [(0, http_1.validateAndTransformBody)(plugin_features_1.UpdatePluginFeaturesSchema)],
|
|
14
17
|
},
|
|
15
18
|
{
|
|
16
|
-
matcher: "/admin/plugin-features",
|
|
19
|
+
matcher: "/admin/plugin-features/:plugin_key/settings",
|
|
17
20
|
methods: ["POST"],
|
|
21
|
+
middlewares: [(0, http_1.validateAndTransformBody)(plugin_features_1.UpdatePluginSettingsSchema)],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
matcher: "/admin/plugin-features/:plugin_key/actions/:action_key",
|
|
25
|
+
methods: ["POST"],
|
|
26
|
+
middlewares: [(0, http_1.validateAndTransformBody)(plugin_features_1.RunPluginActionSchema)],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
matcher: "/admin/plugin-features/:plugin_key/actions/:action_key/runs",
|
|
30
|
+
methods: ["GET"],
|
|
18
31
|
middlewares: [
|
|
19
|
-
(0, http_1.
|
|
20
|
-
|
|
32
|
+
(0, http_1.validateAndTransformQuery)(plugin_features_1.ListPluginActionRunsQuerySchema, {
|
|
33
|
+
isList: false,
|
|
34
|
+
}),
|
|
21
35
|
],
|
|
22
36
|
},
|
|
23
37
|
],
|
|
24
38
|
});
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBSWlDO0FBQ2pDLCtHQUtrRjtBQUVsRix5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHVFQUF1RTtBQUN2RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHVDQUF1QztBQUN2QyxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsNkNBQTZDO1lBQ3RELE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLDRDQUEwQixDQUFDLENBQUM7U0FDcEU7UUFDRDtZQUNFLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVBQUMsdUNBQXFCLENBQUMsQ0FBQztTQUMvRDtRQUNEO1lBQ0UsT0FBTyxFQUFFLDZEQUE2RDtZQUN0RSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEIsV0FBVyxFQUFFO2dCQUNYLElBQUEsZ0NBQXlCLEVBQUMsaURBQStCLEVBQUU7b0JBQ3pELE1BQU0sRUFBRSxLQUFLO2lCQUNkLENBQUM7YUFDSDtTQUNGO0tBQ0Y7Q0FDRixDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runPluginAction = exports.requirePluginAction = exports.PLUGIN_ACTION_ALREADY_RUNNING_MESSAGE = void 0;
|
|
4
|
+
const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/events/plugin-features");
|
|
5
|
+
const framework_1 = require("@medusajs/framework");
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
8
|
+
const plugin_action_runs_1 = require("../modules/plugin-features/domain/plugin-action-runs");
|
|
9
|
+
const plugin_features_http_1 = require("./plugin-features-http");
|
|
10
|
+
const MESSAGE_MAX_LENGTH = 1000;
|
|
11
|
+
exports.PLUGIN_ACTION_ALREADY_RUNNING_MESSAGE = "Diese Aktion läuft bereits.";
|
|
12
|
+
/** The declared action; `NOT_FOUND` ("Aktion unbekannt") otherwise. */
|
|
13
|
+
const requirePluginAction = (descriptor, actionKey) => {
|
|
14
|
+
const action = descriptor.actions?.find((entry) => entry.key === actionKey);
|
|
15
|
+
if (!action) {
|
|
16
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Aktion unbekannt: "${actionKey}" (Plugin "${descriptor.plugin_key}").`);
|
|
17
|
+
}
|
|
18
|
+
return action;
|
|
19
|
+
};
|
|
20
|
+
exports.requirePluginAction = requirePluginAction;
|
|
21
|
+
const emitFinished = (container, input, outcome) => (0, plugin_features_http_1.emitAfterCommit)(container, plugin_features_1.PLUGIN_ACTION_FINISHED_EVENT, () => plugin_features_1.PluginActionFinishedEventSchema.parse({
|
|
22
|
+
plugin_key: input.plugin_key,
|
|
23
|
+
action_key: input.action_key,
|
|
24
|
+
run_id: input.run_id,
|
|
25
|
+
status: outcome.status,
|
|
26
|
+
...(outcome.status === "failed"
|
|
27
|
+
? {
|
|
28
|
+
message: (0, plugin_features_http_1.describeError)(outcome.error).slice(0, MESSAGE_MAX_LENGTH),
|
|
29
|
+
}
|
|
30
|
+
: {}),
|
|
31
|
+
}), input.plugin_key);
|
|
32
|
+
/**
|
|
33
|
+
* Records the outcome on the run row; a failed write is logged and never
|
|
34
|
+
* hides the action's own outcome.
|
|
35
|
+
*/
|
|
36
|
+
const finishRun = async (container, input, outcome) => {
|
|
37
|
+
try {
|
|
38
|
+
return await (0, plugin_features_http_1.resolvePluginFeaturesService)(container).finishPluginActionRun(input.run_id, outcome);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
try {
|
|
42
|
+
container
|
|
43
|
+
.resolve(utils_1.ContainerRegistrationKeys.LOGGER)
|
|
44
|
+
.error(`Aktionslauf "${input.run_id}" (Plugin "${input.plugin_key}", Aktion "${input.action_key}") konnte nicht abgeschlossen werden: ${(0, plugin_features_http_1.describeError)(error)}`);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Logging must not replace the original outcome.
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const failureMessage = (error) => (0, plugin_features_http_1.describeError)(error).slice(0, MESSAGE_MAX_LENGTH);
|
|
53
|
+
const FAILED_STATES = [
|
|
54
|
+
utils_1.TransactionState.FAILED,
|
|
55
|
+
utils_1.TransactionState.REVERTED,
|
|
56
|
+
];
|
|
57
|
+
/**
|
|
58
|
+
* Starts the workflow under the run id as transaction id. A workflow with
|
|
59
|
+
* async steps returns from `run()` with `acknowledgement.hasFinished: false`;
|
|
60
|
+
* its outcome then arrives through the engine's `onFinish` notification.
|
|
61
|
+
* The subscription is registered before `run()`, so an early finish is not
|
|
62
|
+
* missed, and removed again when `run()` already finished or threw.
|
|
63
|
+
*/
|
|
64
|
+
const startWorkflow = async (engine, workflowId, input) => {
|
|
65
|
+
const transactionId = input.run_id;
|
|
66
|
+
let settle = () => undefined;
|
|
67
|
+
const outcome = new Promise((resolve) => {
|
|
68
|
+
settle = resolve;
|
|
69
|
+
});
|
|
70
|
+
const subscriber = (event) => {
|
|
71
|
+
if (event.eventType !== "onFinish") {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (event.state && FAILED_STATES.includes(event.state)) {
|
|
75
|
+
settle({
|
|
76
|
+
status: "failed",
|
|
77
|
+
error: event.errors?.find((entry) => entry?.error !== undefined)?.error ??
|
|
78
|
+
new Error(`Workflow "${workflowId}" endete im Zustand "${event.state}".`),
|
|
79
|
+
});
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
settle({ status: "completed", result: event.result });
|
|
83
|
+
};
|
|
84
|
+
const unsubscribe = async () => {
|
|
85
|
+
try {
|
|
86
|
+
await engine.unsubscribe({
|
|
87
|
+
workflowId,
|
|
88
|
+
transactionId,
|
|
89
|
+
subscriberOrId: subscriber,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// A leftover subscription is dropped by the engine on finish.
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
await engine.subscribe({ workflowId, transactionId, subscriber });
|
|
97
|
+
let ret;
|
|
98
|
+
try {
|
|
99
|
+
// The engine JSON-clones its options, so the container is never passed
|
|
100
|
+
// to run(); the engine uses the shared app container.
|
|
101
|
+
ret = await engine.run(workflowId, {
|
|
102
|
+
input,
|
|
103
|
+
transactionId,
|
|
104
|
+
throwOnError: true,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
await unsubscribe();
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
if (ret.acknowledgement?.hasFinished === false) {
|
|
112
|
+
return { finished: false, outcome };
|
|
113
|
+
}
|
|
114
|
+
await unsubscribe();
|
|
115
|
+
return { finished: true, result: ret.result };
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Records the outcome of a run that ended outside the request: through the
|
|
119
|
+
* global framework container, because the request scope may be gone.
|
|
120
|
+
*/
|
|
121
|
+
const recordOutcomeLater = async (descriptor, action, input, outcome) => {
|
|
122
|
+
if (outcome.status === "completed") {
|
|
123
|
+
await finishRun(framework_1.container, input, {
|
|
124
|
+
status: "completed",
|
|
125
|
+
result: outcome.result,
|
|
126
|
+
});
|
|
127
|
+
await emitFinished(framework_1.container, input, { status: "completed" });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
framework_1.container
|
|
132
|
+
.resolve(utils_1.ContainerRegistrationKeys.LOGGER)
|
|
133
|
+
.error(`Hintergrund-Aktion "${action.key}" von Plugin "${descriptor.plugin_key}" (Workflow "${action.workflow_id}", ausgelöst von ${input.triggered_by}) ist fehlgeschlagen: ${(0, plugin_features_http_1.describeError)(outcome.error)}`);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Logging must not hide the finished event.
|
|
137
|
+
}
|
|
138
|
+
await finishRun(framework_1.container, input, {
|
|
139
|
+
status: "failed",
|
|
140
|
+
message: failureMessage(outcome.error),
|
|
141
|
+
});
|
|
142
|
+
await emitFinished(framework_1.container, input, {
|
|
143
|
+
status: "failed",
|
|
144
|
+
error: outcome.error,
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Runs an action's workflow through the workflow engine and records the run
|
|
149
|
+
* in `plugin_action_run`. A second start while the same action is running
|
|
150
|
+
* returns `already_running` (nothing is started). `sync` awaits the workflow
|
|
151
|
+
* (a failure propagates to the MedusaError pipeline); `background` starts it
|
|
152
|
+
* without awaiting and records the outcome through the global container.
|
|
153
|
+
* A workflow that is still running when `run()` returns (async steps) keeps
|
|
154
|
+
* its run row `running`, which keeps the 409 slot taken, until the engine
|
|
155
|
+
* reports its finish; a `sync` action then answers `started`. Every path
|
|
156
|
+
* emits `plugin-action.finished.v1` when the run ends.
|
|
157
|
+
*/
|
|
158
|
+
const runPluginAction = async (container, descriptor, action, triggeredBy) => {
|
|
159
|
+
if (!workflows_sdk_1.MedusaWorkflow.getWorkflow(action.workflow_id)) {
|
|
160
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Workflow "${action.workflow_id}" der Aktion "${action.key}" (Plugin "${descriptor.plugin_key}") ist nicht registriert.`);
|
|
161
|
+
}
|
|
162
|
+
const started = await (0, plugin_features_http_1.resolvePluginFeaturesService)(container).startPluginActionRun({
|
|
163
|
+
plugin_key: descriptor.plugin_key,
|
|
164
|
+
action_key: action.key,
|
|
165
|
+
triggered_by: triggeredBy,
|
|
166
|
+
});
|
|
167
|
+
if (!started.started) {
|
|
168
|
+
return { key: action.key, status: "already_running", run: started.run };
|
|
169
|
+
}
|
|
170
|
+
const input = {
|
|
171
|
+
plugin_key: descriptor.plugin_key,
|
|
172
|
+
action_key: action.key,
|
|
173
|
+
triggered_by: triggeredBy,
|
|
174
|
+
run_id: started.run.id,
|
|
175
|
+
};
|
|
176
|
+
const engine = container.resolve(utils_1.Modules.WORKFLOW_ENGINE);
|
|
177
|
+
const finishLater = (outcome) => {
|
|
178
|
+
void outcome
|
|
179
|
+
.then((settled) => recordOutcomeLater(descriptor, action, input, settled))
|
|
180
|
+
.catch(() => {
|
|
181
|
+
// finishRun and emitAfterCommit already log their own failures.
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
if (action.mode === "sync") {
|
|
185
|
+
let start;
|
|
186
|
+
try {
|
|
187
|
+
start = await startWorkflow(engine, action.workflow_id, input);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
await finishRun(container, input, {
|
|
191
|
+
status: "failed",
|
|
192
|
+
message: failureMessage(error),
|
|
193
|
+
});
|
|
194
|
+
await emitFinished(container, input, { status: "failed", error });
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
if (!start.finished) {
|
|
198
|
+
finishLater(start.outcome);
|
|
199
|
+
return { key: action.key, status: "started", run: started.run };
|
|
200
|
+
}
|
|
201
|
+
const { result } = start;
|
|
202
|
+
const finished = await finishRun(container, input, {
|
|
203
|
+
status: "completed",
|
|
204
|
+
result,
|
|
205
|
+
});
|
|
206
|
+
await emitFinished(container, input, { status: "completed" });
|
|
207
|
+
const compact = (0, plugin_action_runs_1.compactActionResult)(result);
|
|
208
|
+
const record = finished ?? started.run;
|
|
209
|
+
return compact === undefined
|
|
210
|
+
? { key: action.key, status: "completed", run: record }
|
|
211
|
+
: { key: action.key, status: "completed", result: compact, run: record };
|
|
212
|
+
}
|
|
213
|
+
// Background: the request scope may be gone when the run ends, so the
|
|
214
|
+
// outcome is recorded and reported through the global framework container.
|
|
215
|
+
finishLater(startWorkflow(engine, action.workflow_id, input).then((start) => start.finished
|
|
216
|
+
? { status: "completed", result: start.result }
|
|
217
|
+
: start.outcome, (error) => ({ status: "failed", error })));
|
|
218
|
+
return { key: action.key, status: "started", run: started.run };
|
|
219
|
+
};
|
|
220
|
+
exports.runPluginAction = runPluginAction;
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWFjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3BsdWdpbi1hY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDhHQUdpRjtBQUNqRixtREFBcUU7QUFNckUscURBS2tDO0FBQ2xDLHFFQUFrRTtBQU9sRSw2RkFJNkQ7QUFDN0QsaUVBSStCO0FBRS9CLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFBO0FBa0JsQixRQUFBLHFDQUFxQyxHQUFHLDZCQUE2QixDQUFBO0FBRWxGLHVFQUF1RTtBQUNoRSxNQUFNLG1CQUFtQixHQUFHLENBQ2pDLFVBQW1DLEVBQ25DLFNBQWlCLEVBQ08sRUFBRTtJQUMxQixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQTtJQUMzRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixzQkFBc0IsU0FBUyxjQUFjLFVBQVUsQ0FBQyxVQUFVLEtBQUssQ0FDeEUsQ0FBQTtJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMsQ0FBQTtBQVpZLFFBQUEsbUJBQW1CLHVCQVkvQjtBQUVELE1BQU0sWUFBWSxHQUFHLENBQ25CLFNBQTBCLEVBQzFCLEtBQWdDLEVBQ2hDLE9BQXVFLEVBQ3hELEVBQUUsQ0FDakIsSUFBQSxzQ0FBZSxFQUNiLFNBQVMsRUFDVCw4Q0FBNEIsRUFDNUIsR0FBRyxFQUFFLENBQ0gsaURBQStCLENBQUMsS0FBSyxDQUFDO0lBQ3BDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtJQUM1QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7SUFDNUIsTUFBTSxFQUFFLEtBQUss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
|
|
@@ -1,20 +1,79 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.requirePluginFeatureDescriptor = exports.listPluginFeatureDescriptors = exports.resolvePluginFeaturesService = void 0;
|
|
3
|
+
exports.emitPluginSettingsUpdated = exports.emitPluginFeaturesUpdated = exports.emitAfterCommit = exports.describeError = exports.requirePluginFeatureDescriptor = exports.requireDiscoveredPlugin = exports.listDiscoveredPlugins = exports.listPluginFeatureDescriptors = exports.resolvePluginFeaturesService = void 0;
|
|
4
|
+
const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/events/plugin-features");
|
|
4
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
6
|
const constants_1 = require("../public/constants");
|
|
6
7
|
const discover_plugin_features_1 = require("../utils/discover-plugin-features");
|
|
7
8
|
const resolvePluginFeaturesService = (container) => container.resolve(constants_1.PLUGIN_FEATURES_MODULE);
|
|
8
9
|
exports.resolvePluginFeaturesService = resolvePluginFeaturesService;
|
|
9
|
-
const listPluginFeatureDescriptors = (container) => (0, discover_plugin_features_1.
|
|
10
|
+
const listPluginFeatureDescriptors = (container) => (0, discover_plugin_features_1.discoverPluginFeatureProviders)(container).map((provider) => provider.descriptor);
|
|
10
11
|
exports.listPluginFeatureDescriptors = listPluginFeatureDescriptors;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
const listDiscoveredPlugins = (container) => (0, discover_plugin_features_1.discoverPluginFeatureProviders)(container).map((provider) => ({
|
|
13
|
+
descriptor: provider.descriptor,
|
|
14
|
+
fallback: (0, discover_plugin_features_1.readPluginSettingsFallback)(provider),
|
|
15
|
+
}));
|
|
16
|
+
exports.listDiscoveredPlugins = listDiscoveredPlugins;
|
|
17
|
+
/** Descriptor and fallback of an installed plugin; `NOT_FOUND` otherwise. */
|
|
18
|
+
const requireDiscoveredPlugin = (container, pluginKey) => {
|
|
19
|
+
const provider = (0, discover_plugin_features_1.findPluginFeatureProvider)(container, pluginKey);
|
|
20
|
+
if (!provider) {
|
|
15
21
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Plugin "${pluginKey}" hat keine Funktionsschalter.`);
|
|
16
22
|
}
|
|
17
|
-
return
|
|
23
|
+
return {
|
|
24
|
+
descriptor: provider.descriptor,
|
|
25
|
+
fallback: (0, discover_plugin_features_1.readPluginSettingsFallback)(provider),
|
|
26
|
+
};
|
|
18
27
|
};
|
|
28
|
+
exports.requireDiscoveredPlugin = requireDiscoveredPlugin;
|
|
29
|
+
/** Descriptor of an installed plugin; `NOT_FOUND` for an unknown key. */
|
|
30
|
+
const requirePluginFeatureDescriptor = (container, pluginKey) => (0, exports.requireDiscoveredPlugin)(container, pluginKey).descriptor;
|
|
19
31
|
exports.requirePluginFeatureDescriptor = requirePluginFeatureDescriptor;
|
|
20
|
-
|
|
32
|
+
const describeError = (error) => error instanceof Error
|
|
33
|
+
? error.message
|
|
34
|
+
: typeof error?.message === "string"
|
|
35
|
+
? error.message
|
|
36
|
+
: String(error);
|
|
37
|
+
exports.describeError = describeError;
|
|
38
|
+
/**
|
|
39
|
+
* Emits one event after the write committed; a failed emit is logged and
|
|
40
|
+
* never undoes the write (the Admin already sees the new state).
|
|
41
|
+
*/
|
|
42
|
+
const emitAfterCommit = async (container, name, buildData, pluginKey) => {
|
|
43
|
+
try {
|
|
44
|
+
const data = buildData();
|
|
45
|
+
await container
|
|
46
|
+
.resolve(utils_1.Modules.EVENT_BUS)
|
|
47
|
+
.emit({ name, data });
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
try {
|
|
51
|
+
container
|
|
52
|
+
.resolve(utils_1.ContainerRegistrationKeys.LOGGER)
|
|
53
|
+
.error(`Event "${name}" für Plugin "${pluginKey}" konnte nicht gesendet werden: ${(0, exports.describeError)(error)}`);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Logging must not replace the original outcome.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
exports.emitAfterCommit = emitAfterCommit;
|
|
61
|
+
/** Announces a saved toggle update with the plugin's effective values. */
|
|
62
|
+
const emitPluginFeaturesUpdated = (container, plugin) => (0, exports.emitAfterCommit)(container, plugin_features_1.PLUGIN_FEATURES_UPDATED_EVENT, () => plugin_features_1.PluginFeaturesUpdatedEventSchema.parse({
|
|
63
|
+
plugin_key: plugin.plugin_key,
|
|
64
|
+
enabled: plugin.enabled,
|
|
65
|
+
features: Object.fromEntries(plugin.features.map((feature) => [
|
|
66
|
+
feature.key,
|
|
67
|
+
feature.effective_enabled,
|
|
68
|
+
])),
|
|
69
|
+
version: plugin.version,
|
|
70
|
+
}), plugin.plugin_key);
|
|
71
|
+
exports.emitPluginFeaturesUpdated = emitPluginFeaturesUpdated;
|
|
72
|
+
/** Announces a saved settings update; carries keys only, never values. */
|
|
73
|
+
const emitPluginSettingsUpdated = (container, plugin, changedKeys) => (0, exports.emitAfterCommit)(container, plugin_features_1.PLUGIN_SETTINGS_UPDATED_EVENT, () => plugin_features_1.PluginSettingsUpdatedEventSchema.parse({
|
|
74
|
+
plugin_key: plugin.plugin_key,
|
|
75
|
+
version: plugin.settings_version,
|
|
76
|
+
changed_keys: [...changedKeys],
|
|
77
|
+
}), plugin.plugin_key);
|
|
78
|
+
exports.emitPluginSettingsUpdated = emitPluginSettingsUpdated;
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWZlYXR1cmVzLWh0dHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3BsdWdpbi1mZWF0dXJlcy1odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDhHQUtpRjtBQU1qRixxREFJa0M7QUFFbEMsbURBQTREO0FBTTVELGdGQUkwQztBQVFuQyxNQUFNLDRCQUE0QixHQUFHLENBQzFDLFNBQTBCLEVBQ0csRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0NBQXNCLENBQUMsQ0FBQTtBQUY5RCxRQUFBLDRCQUE0QixnQ0FFa0M7QUFFcEUsTUFBTSw0QkFBNEIsR0FBRyxDQUMxQyxTQUEwQixFQUNDLEVBQUUsQ0FDN0IsSUFBQSx5REFBOEIsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQzNDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUNsQyxDQUFBO0FBTFUsUUFBQSw0QkFBNEIsZ0NBS3RDO0FBRUksTUFBTSxxQkFBcUIsR0FBRyxDQUNuQyxTQUEwQixFQUNOLEVBQUUsQ0FDdEIsSUFBQSx5REFBOEIsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0QsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0lBQy9CLFFBQVEsRUFBRSxJQUFBLHFEQUEwQixFQUFDLFFBQVEsQ0FBQztDQUMvQyxDQUFDLENBQUMsQ0FBQTtBQU5RLFFBQUEscUJBQXFCLHlCQU03QjtBQUVMLDZFQUE2RTtBQUN0RSxNQUFNLHVCQUF1QixHQUFHLENBQ3JDLFNBQTBCLEVBQzFCLFNBQWlCLEVBQ0MsRUFBRTtJQUNwQixNQUFNLFFBQVEsR0FBRyxJQUFBLG9EQUF5QixFQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNoRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksbUJB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
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toRunRecord = exports.finishedRunColumns = exports.compactActionResult = exports.PLUGIN_ACTION_RESULT_MAX_BYTES = exports.staleCutoff = exports.isStaleRun = exports.PLUGIN_ACTION_RUN_MESSAGE_MAX_LENGTH = exports.PLUGIN_ACTION_RUN_ABORTED_MESSAGE = exports.PLUGIN_ACTION_RUN_STALE_AFTER_MS = void 0;
|
|
4
|
+
/** A run without a sign of life (start or progress) for this long is dead. */
|
|
5
|
+
exports.PLUGIN_ACTION_RUN_STALE_AFTER_MS = 60 * 60 * 1000;
|
|
6
|
+
/** Message of a run that was declared dead by the stale rule. */
|
|
7
|
+
exports.PLUGIN_ACTION_RUN_ABORTED_MESSAGE = "Abgebrochen (Neustart)";
|
|
8
|
+
/** Longest stored error message of a failed run. */
|
|
9
|
+
exports.PLUGIN_ACTION_RUN_MESSAGE_MAX_LENGTH = 1000;
|
|
10
|
+
/**
|
|
11
|
+
* The lazy restart rule: a `running` run whose last sign of life (start or
|
|
12
|
+
* reported progress) is older than `PLUGIN_ACTION_RUN_STALE_AFTER_MS` counts
|
|
13
|
+
* as aborted. The process that ran it restarted or lost it; nothing will
|
|
14
|
+
* finish it any more.
|
|
15
|
+
*/
|
|
16
|
+
const isStaleRun = (run, now) => run.status === "running" &&
|
|
17
|
+
now.getTime() - run.last_activity_at.getTime() >=
|
|
18
|
+
exports.PLUGIN_ACTION_RUN_STALE_AFTER_MS;
|
|
19
|
+
exports.isStaleRun = isStaleRun;
|
|
20
|
+
/** Cutoff for the stale rule as used in queries. */
|
|
21
|
+
const staleCutoff = (now) => new Date(now.getTime() - exports.PLUGIN_ACTION_RUN_STALE_AFTER_MS);
|
|
22
|
+
exports.staleCutoff = staleCutoff;
|
|
23
|
+
/** Largest workflow result (serialized JSON) returned and stored. */
|
|
24
|
+
exports.PLUGIN_ACTION_RESULT_MAX_BYTES = 4096;
|
|
25
|
+
/** JSON copy of `result` when it is serializable and small, else `undefined`. */
|
|
26
|
+
const compactActionResult = (result) => {
|
|
27
|
+
if (result === undefined) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const json = JSON.stringify(result);
|
|
32
|
+
if (json === undefined ||
|
|
33
|
+
Buffer.byteLength(json, "utf8") > exports.PLUGIN_ACTION_RESULT_MAX_BYTES) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
return JSON.parse(json);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.compactActionResult = compactActionResult;
|
|
43
|
+
/**
|
|
44
|
+
* Columns of a finished run. Only a `running` run changes on progress; a
|
|
45
|
+
* finish always records the real outcome, also for a run the stale rule had
|
|
46
|
+
* already marked failed.
|
|
47
|
+
*/
|
|
48
|
+
const finishedRunColumns = (outcome) => outcome.status === "completed"
|
|
49
|
+
? {
|
|
50
|
+
status: "completed",
|
|
51
|
+
message: null,
|
|
52
|
+
result: (0, exports.compactActionResult)(outcome.result) ?? null,
|
|
53
|
+
}
|
|
54
|
+
: {
|
|
55
|
+
status: "failed",
|
|
56
|
+
message: outcome.message.slice(0, exports.PLUGIN_ACTION_RUN_MESSAGE_MAX_LENGTH) ||
|
|
57
|
+
"Unbekannter Fehler",
|
|
58
|
+
result: null,
|
|
59
|
+
};
|
|
60
|
+
exports.finishedRunColumns = finishedRunColumns;
|
|
61
|
+
const toDate = (value) => value instanceof Date ? value : new Date(String(value));
|
|
62
|
+
const toProgress = (value) => {
|
|
63
|
+
if (!value || typeof value !== "object") {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const candidate = value;
|
|
67
|
+
if (typeof candidate.current !== "number") {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
current: candidate.current,
|
|
72
|
+
total: typeof candidate.total === "number" ? candidate.total : null,
|
|
73
|
+
label: typeof candidate.label === "string" ? candidate.label : null,
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
/** Row (raw SQL or ORM) to record. */
|
|
77
|
+
const toRunRecord = (row) => ({
|
|
78
|
+
id: String(row.id),
|
|
79
|
+
plugin_key: String(row.plugin_key),
|
|
80
|
+
action_key: String(row.action_key),
|
|
81
|
+
status: row.status,
|
|
82
|
+
started_at: toDate(row.started_at),
|
|
83
|
+
finished_at: row.finished_at === null || row.finished_at === undefined
|
|
84
|
+
? null
|
|
85
|
+
: toDate(row.finished_at),
|
|
86
|
+
triggered_by: typeof row.triggered_by === "string" ? row.triggered_by : null,
|
|
87
|
+
message: typeof row.message === "string" ? row.message : null,
|
|
88
|
+
progress: toProgress(row.progress),
|
|
89
|
+
result: row.result ?? null,
|
|
90
|
+
});
|
|
91
|
+
exports.toRunRecord = toRunRecord;
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWFjdGlvbi1ydW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcGx1Z2luLWZlYXR1cmVzL2RvbWFpbi9wbHVnaW4tYWN0aW9uLXJ1bnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsOEVBQThFO0FBQ2pFLFFBQUEsZ0NBQWdDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7QUFFOUQsaUVBQWlFO0FBQ3BELFFBQUEsaUNBQWlDLEdBQUcsd0JBQXdCLENBQUE7QUFFekUsb0RBQW9EO0FBQ3ZDLFFBQUEsb0NBQW9DLEdBQUcsSUFBSSxDQUFBO0FBbUJ4RDs7Ozs7R0FLRztBQUNJLE1BQU0sVUFBVSxHQUFHLENBQ3hCLEdBQThELEVBQzlELEdBQVMsRUFDQSxFQUFFLENBQ1gsR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTO0lBQ3hCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO1FBQzVDLHdDQUFnQyxDQUFBO0FBTnZCLFFBQUEsVUFBVSxjQU1hO0FBRXBDLG9EQUFvRDtBQUM3QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVMsRUFBUSxFQUFFLENBQzdDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyx3Q0FBZ0MsQ0FBQyxDQUFBO0FBRC9DLFFBQUEsV0FBVyxlQUNvQztBQUU1RCxxRUFBcUU7QUFDeEQsUUFBQSw4QkFBOEIsR0FBRyxJQUFJLENBQUE7QUFFbEQsaUZBQWlGO0FBQzFFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUFlLEVBQVcsRUFBRTtJQUM5RCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxN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
|