@hartl-services/medusa-base 0.2.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/sentry-logger.js +82 -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 +416 -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/sentry-logger.d.ts +11 -0
- package/dist/public/sentry-logger.js +81 -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 +20 -4
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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
|