@hartl-services/medusa-payload-sync 0.1.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 +26 -0
- package/.medusa/server/src/admin/index.mjs +27 -0
- package/.medusa/server/src/modules/payload-sync/domain/contracts.js +35 -0
- package/.medusa/server/src/modules/payload-sync/domain/errors.js +54 -0
- package/.medusa/server/src/modules/payload-sync/domain/options.js +43 -0
- package/.medusa/server/src/modules/payload-sync/domain/reconciliation.js +31 -0
- package/.medusa/server/src/modules/payload-sync/domain/status.js +7 -0
- package/.medusa/server/src/modules/payload-sync/index.js +15 -0
- package/.medusa/server/src/modules/payload-sync/loaders/register-payload-client.js +108 -0
- package/.medusa/server/src/modules/payload-sync/service.js +213 -0
- package/.medusa/server/src/modules/payload-sync/services/payload-rest-client.js +326 -0
- package/.medusa/server/src/scripts/reconcile-payload-catalog.js +160 -0
- package/.medusa/server/src/subscribers/payload-sync-product-deleted.js +18 -0
- package/.medusa/server/src/subscribers/payload-sync-product-upserted.js +18 -0
- package/.medusa/server/src/subscribers/payload-sync-variant-deleted.js +18 -0
- package/.medusa/server/src/subscribers/payload-sync-variant-upserted.js +21 -0
- package/.medusa/server/src/types/index.js +18 -0
- package/.medusa/server/src/types/public.js +3 -0
- package/.medusa/server/src/workflows/payload-sync/authoritative-reconciliation.js +357 -0
- package/.medusa/server/src/workflows/payload-sync/external-step-failure.js +14 -0
- package/.medusa/server/src/workflows/payload-sync/reconcile-catalog.js +103 -0
- package/.medusa/server/src/workflows/payload-sync/sync-product.js +78 -0
- package/.medusa/server/src/workflows/payload-sync/sync-variant.js +129 -0
- package/.medusa/server/src/workflows/payload-sync/unpublish-product.js +36 -0
- package/.medusa/server/src/workflows/payload-sync/unpublish-variant.js +36 -0
- package/LICENSE +21 -0
- package/README.md +507 -0
- package/package.json +52 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const widgetModule = { widgets: [] };
|
|
3
|
+
const routeModule = {
|
|
4
|
+
routes: []
|
|
5
|
+
};
|
|
6
|
+
const menuItemModule = {
|
|
7
|
+
menuItems: []
|
|
8
|
+
};
|
|
9
|
+
const formModule = { customFields: {} };
|
|
10
|
+
const displayModule = {
|
|
11
|
+
displays: {}
|
|
12
|
+
};
|
|
13
|
+
const i18nModule = { resources: {} };
|
|
14
|
+
const cellRendererModule = {};
|
|
15
|
+
const layoutModule = { layouts: [] };
|
|
16
|
+
const plugin = {
|
|
17
|
+
widgetModule,
|
|
18
|
+
routeModule,
|
|
19
|
+
menuItemModule,
|
|
20
|
+
formModule,
|
|
21
|
+
displayModule,
|
|
22
|
+
i18nModule,
|
|
23
|
+
cellRendererModule,
|
|
24
|
+
layoutModule
|
|
25
|
+
};
|
|
26
|
+
module.exports = plugin;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const widgetModule = { widgets: [] };
|
|
2
|
+
const routeModule = {
|
|
3
|
+
routes: []
|
|
4
|
+
};
|
|
5
|
+
const menuItemModule = {
|
|
6
|
+
menuItems: []
|
|
7
|
+
};
|
|
8
|
+
const formModule = { customFields: {} };
|
|
9
|
+
const displayModule = {
|
|
10
|
+
displays: {}
|
|
11
|
+
};
|
|
12
|
+
const i18nModule = { resources: {} };
|
|
13
|
+
const cellRendererModule = {};
|
|
14
|
+
const layoutModule = { layouts: [] };
|
|
15
|
+
const plugin = {
|
|
16
|
+
widgetModule,
|
|
17
|
+
routeModule,
|
|
18
|
+
menuItemModule,
|
|
19
|
+
formModule,
|
|
20
|
+
displayModule,
|
|
21
|
+
i18nModule,
|
|
22
|
+
cellRendererModule,
|
|
23
|
+
layoutModule
|
|
24
|
+
};
|
|
25
|
+
export {
|
|
26
|
+
plugin as default
|
|
27
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PayloadAccessResponseSchema = exports.PayloadFieldAccessSchema = exports.PayloadPermissionSchema = exports.MirrorDocumentSchema = exports.PayloadDocumentIdSchema = void 0;
|
|
4
|
+
const zod_1 = require("@medusajs/framework/zod");
|
|
5
|
+
exports.PayloadDocumentIdSchema = zod_1.z.union([zod_1.z.string(), zod_1.z.number()]);
|
|
6
|
+
exports.MirrorDocumentSchema = zod_1.z.object({
|
|
7
|
+
id: exports.PayloadDocumentIdSchema,
|
|
8
|
+
medusaId: zod_1.z.string().min(1),
|
|
9
|
+
_status: zod_1.z.enum(["draft", "published"]),
|
|
10
|
+
});
|
|
11
|
+
exports.PayloadPermissionSchema = zod_1.z.union([
|
|
12
|
+
zod_1.z.boolean(),
|
|
13
|
+
zod_1.z.object({
|
|
14
|
+
permission: zod_1.z.boolean(),
|
|
15
|
+
}),
|
|
16
|
+
]);
|
|
17
|
+
exports.PayloadFieldAccessSchema = zod_1.z.object({
|
|
18
|
+
read: exports.PayloadPermissionSchema.optional(),
|
|
19
|
+
create: exports.PayloadPermissionSchema.optional(),
|
|
20
|
+
update: exports.PayloadPermissionSchema.optional(),
|
|
21
|
+
});
|
|
22
|
+
exports.PayloadAccessResponseSchema = zod_1.z.object({
|
|
23
|
+
collections: zod_1.z.record(zod_1.z.string(), zod_1.z.object({
|
|
24
|
+
fields: zod_1.z
|
|
25
|
+
.union([
|
|
26
|
+
zod_1.z.boolean(),
|
|
27
|
+
zod_1.z.record(zod_1.z.string(), zod_1.z.union([zod_1.z.boolean(), exports.PayloadFieldAccessSchema])),
|
|
28
|
+
])
|
|
29
|
+
.default({}),
|
|
30
|
+
read: exports.PayloadPermissionSchema.optional(),
|
|
31
|
+
create: exports.PayloadPermissionSchema.optional(),
|
|
32
|
+
update: exports.PayloadPermissionSchema.optional(),
|
|
33
|
+
})),
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcGF5bG9hZC1zeW5jL2RvbWFpbi9jb250cmFjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQTJDO0FBRzlCLFFBQUEsdUJBQXVCLEdBQUcsT0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBOEIzRCxRQUFBLG9CQUFvQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0MsRUFBRSxFQUFFLCtCQUF1QjtJQUMzQixRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0IsT0FBTyxFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7Q0FDeEMsQ0FBQyxDQUFBO0FBaUJXLFFBQUEsdUJBQXVCLEdBQUcsT0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3QyxPQUFDLENBQUMsT0FBTyxFQUFFO0lBQ1gsT0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNQLFVBQVUsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFO0tBQ3hCLENBQUM7Q0FDSCxDQUFDLENBQUE7QUFHVyxRQUFBLHdCQUF3QixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0MsSUFBSSxFQUFFLCtCQUF1QixDQUFDLFFBQVEsRUFBRTtJQUN4QyxNQUFNLEVBQUUsK0JBQXVCLENBQUMsUUFBUSxFQUFFO0lBQzFDLE1BQU0sRUFBRSwrQkFBdUIsQ0FBQyxRQUFRLEVBQUU7Q0FDM0MsQ0FBQyxDQUFBO0FBR1csUUFBQSwyQkFBMkIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2xELFdBQVcsRUFBRSxPQUFDLENBQUMsTUFBTSxDQUNuQixPQUFDLENBQUMsTUFBTSxFQUFFLEVBQ1YsT0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sRUFBRSxPQUFDO2FBQ04sS0FBSyxDQUFDO1lBQ0wsT0FBQyxDQUFDLE9BQU8sRUFBRTtZQUNYLE9BQUMsQ0FBQyxNQUFNLENBQ04sT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUNWLE9BQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsZ0NBQXdCLENBQUMsQ0FBQyxDQUNqRDtTQUNGLENBQUM7YUFDRCxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2QsSUFBSSxFQUFFLCtCQUF1QixDQUFDLFFBQVEsRUFBRTtRQUN4QyxNQUFNLEVBQUUsK0JBQXVCLENBQUMsUUFBUSxFQUFFO1FBQzFDLE1BQU0sRUFBRSwrQkFBdUIsQ0FBQyxRQUFRLEVBQUU7S0FDM0MsQ0FBQyxDQUNIO0NBQ0YsQ0FBQyxDQUFBIn0=
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PayloadSyncError = void 0;
|
|
4
|
+
exports.redactPayloadSyncText = redactPayloadSyncText;
|
|
5
|
+
exports.formatPayloadSyncLog = formatPayloadSyncLog;
|
|
6
|
+
class PayloadSyncError extends Error {
|
|
7
|
+
constructor(message, options) {
|
|
8
|
+
super(redactAuthorizationData(message));
|
|
9
|
+
this.name = "PayloadSyncError";
|
|
10
|
+
this.code = options.code;
|
|
11
|
+
this.retryable = options.retryable;
|
|
12
|
+
this.httpStatus = options.httpStatus;
|
|
13
|
+
this.collection = options.collection;
|
|
14
|
+
this.medusaId = options.medusaId;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.PayloadSyncError = PayloadSyncError;
|
|
18
|
+
function redactPayloadSyncText(value, sensitiveValues = []) {
|
|
19
|
+
let redacted = redactAuthorizationData(value);
|
|
20
|
+
for (const sensitiveValue of sensitiveValues) {
|
|
21
|
+
if (sensitiveValue.length > 0) {
|
|
22
|
+
redacted = redacted.replaceAll(sensitiveValue, "[REDACTED]");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return redacted;
|
|
26
|
+
}
|
|
27
|
+
function redactAuthorizationData(value) {
|
|
28
|
+
return value
|
|
29
|
+
.replace(/bearer\s+[^\s,;]+/gi, "Bearer [REDACTED]")
|
|
30
|
+
.replace(/(?:response\s+)?headers?\s*[:=]\s*\{[^}]*\}/gi, "headers: [REDACTED]")
|
|
31
|
+
.replace(/(authorization|x-api-key|api[-_ ]?key)\s*[:=]\s*[^\r\n,;]+/gi, "$1: [REDACTED]");
|
|
32
|
+
}
|
|
33
|
+
function toSafePayloadSyncError(error) {
|
|
34
|
+
if (error instanceof PayloadSyncError) {
|
|
35
|
+
return error;
|
|
36
|
+
}
|
|
37
|
+
const message = error instanceof Error ? error.message : "Unknown Payload sync error.";
|
|
38
|
+
return new PayloadSyncError(redactPayloadSyncText(message), {
|
|
39
|
+
code: "PAYLOAD_UNKNOWN_ERROR",
|
|
40
|
+
retryable: false,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function formatPayloadSyncLog(error, context, sensitiveValues = []) {
|
|
44
|
+
const safeError = toSafePayloadSyncError(error);
|
|
45
|
+
return JSON.stringify({
|
|
46
|
+
...context,
|
|
47
|
+
code: safeError.code,
|
|
48
|
+
message: redactPayloadSyncText(safeError.message, sensitiveValues),
|
|
49
|
+
retryable: safeError.retryable,
|
|
50
|
+
collection: safeError.collection,
|
|
51
|
+
httpStatus: safeError.httpStatus,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcGF5bG9hZC1zeW5jL2RvbWFpbi9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEJBLHNEQWFDO0FBaUNELG9EQWVDO0FBL0VELE1BQWEsZ0JBQWlCLFNBQVEsS0FBSztJQU96QyxZQUFZLE9BQWUsRUFBRSxPQUFnQztRQUMzRCxLQUFLLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFBO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUE7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFBO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQTtRQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUE7SUFDbEMsQ0FBQztDQUNGO0FBaEJELDRDQWdCQztBQUVELFNBQWdCLHFCQUFxQixDQUNuQyxLQUFhLEVBQ2Isa0JBQXFDLEVBQUU7SUFFdkMsSUFBSSxRQUFRLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFN0MsS0FBSyxNQUFNLGNBQWMsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUM3QyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQztBQWFELFNBQVMsdUJBQXVCLENBQUMsS0FBYTtJQUM1QyxPQUFPLEtBQUs7U0FDVCxPQUFPLENBQUMscUJBQXFCLEVBQUUsbUJBQW1CLENBQUM7U0FDbkQsT0FBTyxDQUFDLCtDQUErQyxFQUFFLHFCQUFxQixDQUFDO1NBQy9FLE9BQU8sQ0FBQyw4REFBOEQsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO0FBQzlGLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQWM7SUFDNUMsSUFBSSxLQUFLLFlBQVksZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQTtJQUV0RixPQUFPLElBQUksZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDMUQsSUFBSSxFQUFFLHVCQUF1QjtRQUM3QixTQUFTLEVBQUUsS0FBSztLQUNqQixDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQ2xDLEtBQWMsRUFDZCxPQUE4QixFQUM5QixrQkFBcUMsRUFBRTtJQUV2QyxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUUvQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEIsR0FBRyxPQUFPO1FBQ1YsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO1FBQ3BCLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQztRQUNsRSxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7UUFDOUIsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1FBQ2hDLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtLQUNqQyxDQUFDLENBQUE7QUFDSixDQUFDIn0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PayloadSyncPluginOptionsSchema = void 0;
|
|
4
|
+
exports.normalizePayloadSyncOptions = normalizePayloadSyncOptions;
|
|
5
|
+
const zod_1 = require("@medusajs/framework/zod");
|
|
6
|
+
const slugSchema = zod_1.z
|
|
7
|
+
.string()
|
|
8
|
+
.trim()
|
|
9
|
+
.regex(/^[a-z0-9][a-z0-9-_]*$/, "Must be a lowercase slug.");
|
|
10
|
+
const payloadUrlSchema = zod_1.z
|
|
11
|
+
.string()
|
|
12
|
+
.trim()
|
|
13
|
+
.refine((value) => {
|
|
14
|
+
try {
|
|
15
|
+
const protocol = new URL(value).protocol;
|
|
16
|
+
return protocol === "http:" || protocol === "https:";
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}, "Must be an http or https URL.")
|
|
22
|
+
.transform((value) => value.replace(/\/$/, ""));
|
|
23
|
+
exports.PayloadSyncPluginOptionsSchema = zod_1.z.object({
|
|
24
|
+
payloadUrl: payloadUrlSchema,
|
|
25
|
+
payloadApiKey: zod_1.z.string().trim().min(1, "Payload API key is required."),
|
|
26
|
+
payloadAuthCollection: slugSchema.default("users"),
|
|
27
|
+
collections: zod_1.z
|
|
28
|
+
.object({
|
|
29
|
+
product: slugSchema.default("medusa-products"),
|
|
30
|
+
variant: slugSchema.default("medusa-product-variants"),
|
|
31
|
+
})
|
|
32
|
+
.default({
|
|
33
|
+
product: "medusa-products",
|
|
34
|
+
variant: "medusa-product-variants",
|
|
35
|
+
}),
|
|
36
|
+
requestTimeoutMs: zod_1.z.number().int().min(100).max(120_000).default(10_000),
|
|
37
|
+
backfillBatchSize: zod_1.z.number().int().min(1).max(500).default(50),
|
|
38
|
+
backfillBatchDelayMs: zod_1.z.number().int().min(0).max(60_000).default(250),
|
|
39
|
+
});
|
|
40
|
+
function normalizePayloadSyncOptions(options) {
|
|
41
|
+
return exports.PayloadSyncPluginOptionsSchema.parse(options);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3BheWxvYWQtc3luYy9kb21haW4vb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnREEsa0VBSUM7QUFwREQsaURBQTJDO0FBSTNDLE1BQU0sVUFBVSxHQUFHLE9BQUM7S0FDakIsTUFBTSxFQUFFO0tBQ1IsSUFBSSxFQUFFO0tBQ04sS0FBSyxDQUFDLHVCQUF1QixFQUFFLDJCQUEyQixDQUFDLENBQUE7QUFFOUQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFDO0tBQ3ZCLE1BQU0sRUFBRTtLQUNSLElBQUksRUFBRTtLQUNOLE1BQU0sQ0FDTCxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ1IsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFBO1FBRXhDLE9BQU8sUUFBUSxLQUFLLE9BQU8sSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFBO0lBQ3RELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7QUFDSCxDQUFDLEVBQ0QsK0JBQStCLENBQ2hDO0tBQ0EsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBRXBDLFFBQUEsOEJBQThCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyRCxVQUFVLEVBQUUsZ0JBQWdCO0lBQzVCLGFBQWEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSw4QkFBOEIsQ0FBQztJQUN2RSxxQkFBcUIsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNsRCxXQUFXLEVBQUUsT0FBQztTQUNYLE1BQU0sQ0FBQztRQUNOLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBQzlDLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDO0tBQ3ZELENBQUM7U0FDRCxPQUFPLENBQUM7UUFDUCxPQUFPLEVBQUUsaUJBQWlCO1FBQzFCLE9BQU8sRUFBRSx5QkFBeUI7S0FDbkMsQ0FBQztJQUNKLGdCQUFnQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDeEUsaUJBQWlCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMvRCxvQkFBb0IsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO0NBQ3ZFLENBQUMsQ0FBQTtBQU1GLFNBQWdCLDJCQUEyQixDQUN6QyxPQUFpQztJQUVqQyxPQUFPLHNDQUE4QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUN0RCxDQUFDIn0=
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findStaleIds = findStaleIds;
|
|
4
|
+
exports.emptyReconciliationSummary = emptyReconciliationSummary;
|
|
5
|
+
exports.mergeReconciliationSummary = mergeReconciliationSummary;
|
|
6
|
+
function findStaleIds(mirroredIds, currentIds) {
|
|
7
|
+
return mirroredIds.filter((id) => !currentIds.has(id)).sort();
|
|
8
|
+
}
|
|
9
|
+
function emptyReconciliationSummary() {
|
|
10
|
+
return {
|
|
11
|
+
scannedProducts: 0,
|
|
12
|
+
syncedProducts: 0,
|
|
13
|
+
syncedVariants: 0,
|
|
14
|
+
draftedOrphanProducts: 0,
|
|
15
|
+
draftedOrphanVariants: 0,
|
|
16
|
+
failedProductIds: [],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function mergeReconciliationSummary(left, right) {
|
|
20
|
+
return {
|
|
21
|
+
scannedProducts: left.scannedProducts + right.scannedProducts,
|
|
22
|
+
syncedProducts: left.syncedProducts + right.syncedProducts,
|
|
23
|
+
syncedVariants: left.syncedVariants + right.syncedVariants,
|
|
24
|
+
draftedOrphanProducts: left.draftedOrphanProducts + right.draftedOrphanProducts,
|
|
25
|
+
draftedOrphanVariants: left.draftedOrphanVariants + right.draftedOrphanVariants,
|
|
26
|
+
failedProductIds: [
|
|
27
|
+
...new Set([...left.failedProductIds, ...right.failedProductIds]),
|
|
28
|
+
].sort(),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb25jaWxpYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wYXlsb2FkLXN5bmMvZG9tYWluL3JlY29uY2lsaWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsb0NBS0M7QUFXRCxnRUFTQztBQUVELGdFQWdCQztBQTNDRCxTQUFnQixZQUFZLENBQzFCLFdBQThCLEVBQzlCLFVBQStCO0lBRS9CLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7QUFDL0QsQ0FBQztBQVdELFNBQWdCLDBCQUEwQjtJQUN4QyxPQUFPO1FBQ0wsZUFBZSxFQUFFLENBQUM7UUFDbEIsY0FBYyxFQUFFLENBQUM7UUFDakIsY0FBYyxFQUFFLENBQUM7UUFDakIscUJBQXFCLEVBQUUsQ0FBQztRQUN4QixxQkFBcUIsRUFBRSxDQUFDO1FBQ3hCLGdCQUFnQixFQUFFLEVBQUU7S0FDckIsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFnQiwwQkFBMEIsQ0FDeEMsSUFBMkIsRUFDM0IsS0FBNEI7SUFFNUIsT0FBTztRQUNMLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlO1FBQzdELGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjO1FBQzFELGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjO1FBQzFELHFCQUFxQixFQUNuQixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLHFCQUFxQjtRQUMxRCxxQkFBcUIsRUFDbkIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxxQkFBcUI7UUFDMUQsZ0JBQWdCLEVBQUU7WUFDaEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDbEUsQ0FBQyxJQUFJLEVBQUU7S0FDVCxDQUFBO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toPayloadStatus = toPayloadStatus;
|
|
4
|
+
function toPayloadStatus(status) {
|
|
5
|
+
return status === "published" ? "published" : "draft";
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcGF5bG9hZC1zeW5jL2RvbWFpbi9zdGF0dXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSwwQ0FJQztBQUpELFNBQWdCLGVBQWUsQ0FDN0IsTUFBMkI7SUFFM0IsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtBQUN2RCxDQUFDIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PAYLOAD_SYNC_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const register_payload_client_1 = __importDefault(require("./loaders/register-payload-client"));
|
|
9
|
+
const service_1 = __importDefault(require("./service"));
|
|
10
|
+
exports.PAYLOAD_SYNC_MODULE = "payload_sync";
|
|
11
|
+
exports.default = (0, utils_1.Module)(exports.PAYLOAD_SYNC_MODULE, {
|
|
12
|
+
service: service_1.default,
|
|
13
|
+
loaders: [register_payload_client_1.default],
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wYXlsb2FkLXN5bmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBRWxELGdHQUFxRTtBQUNyRSx3REFBZ0Q7QUFFbkMsUUFBQSxtQkFBbUIsR0FBRyxjQUFjLENBQUE7QUFFakQsa0JBQWUsSUFBQSxjQUFNLEVBQUMsMkJBQW1CLEVBQUU7SUFDekMsT0FBTyxFQUFFLGlCQUF3QjtJQUNqQyxPQUFPLEVBQUUsQ0FBQyxpQ0FBcUIsQ0FBQztDQUNqQyxDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PAYLOAD_SYNC_OPTIONS = exports.PAYLOAD_SYNC_REST_CLIENT = void 0;
|
|
4
|
+
exports.runPayloadPreflight = runPayloadPreflight;
|
|
5
|
+
exports.registerPayloadClient = registerPayloadClient;
|
|
6
|
+
const awilix_1 = require("@medusajs/framework/awilix");
|
|
7
|
+
const errors_1 = require("../domain/errors");
|
|
8
|
+
const options_1 = require("../domain/options");
|
|
9
|
+
const payload_rest_client_1 = require("../services/payload-rest-client");
|
|
10
|
+
exports.PAYLOAD_SYNC_REST_CLIENT = "payloadSyncRestClient";
|
|
11
|
+
exports.PAYLOAD_SYNC_OPTIONS = "payloadSyncOptions";
|
|
12
|
+
async function runPayloadPreflight(client, options, logger) {
|
|
13
|
+
try {
|
|
14
|
+
const access = await client.getAccess();
|
|
15
|
+
assertPayloadCapabilities(access, options);
|
|
16
|
+
return { ok: true, degraded: false };
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (!isDegradedPayloadFailure(error)) {
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
logger?.warn((0, errors_1.formatPayloadSyncLog)(error, { operation: "payload-preflight" }, [options.payloadApiKey]));
|
|
23
|
+
return { ok: false, degraded: true };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function registerPayloadClient({ container, options, logger, dataLoaderOnly }) {
|
|
27
|
+
const normalizedOptions = (0, options_1.normalizePayloadSyncOptions)(options);
|
|
28
|
+
const client = new payload_rest_client_1.PayloadRestClient(normalizedOptions);
|
|
29
|
+
container.register({
|
|
30
|
+
[exports.PAYLOAD_SYNC_REST_CLIENT]: (0, awilix_1.asValue)(client),
|
|
31
|
+
[exports.PAYLOAD_SYNC_OPTIONS]: (0, awilix_1.asValue)(normalizedOptions),
|
|
32
|
+
});
|
|
33
|
+
if (dataLoaderOnly === true) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
await runPayloadPreflight(client, normalizedOptions, logger);
|
|
37
|
+
}
|
|
38
|
+
const REQUIRED_OPERATIONS = ["read", "create", "update"];
|
|
39
|
+
function assertPayloadCapabilities(access, options) {
|
|
40
|
+
assertCollectionCapabilities(access, options.collections.product, [
|
|
41
|
+
"medusaId",
|
|
42
|
+
"title",
|
|
43
|
+
"handle",
|
|
44
|
+
]);
|
|
45
|
+
assertCollectionCapabilities(access, options.collections.variant, [
|
|
46
|
+
"medusaId",
|
|
47
|
+
"title",
|
|
48
|
+
"product",
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
51
|
+
function assertCollectionCapabilities(access, collection, requiredFields) {
|
|
52
|
+
if (!(collection in access.collections)) {
|
|
53
|
+
throw missingCapabilityError(collection, collection);
|
|
54
|
+
}
|
|
55
|
+
const collectionAccess = access.collections[collection];
|
|
56
|
+
for (const operation of REQUIRED_OPERATIONS) {
|
|
57
|
+
if (!hasPermission(collectionAccess[operation])) {
|
|
58
|
+
throw missingCapabilityError(collection, `${collection}.${operation}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (collectionAccess.fields === true) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (collectionAccess.fields === false) {
|
|
65
|
+
throw missingCapabilityError(collection, `${collection}.${requiredFields[0]}`);
|
|
66
|
+
}
|
|
67
|
+
for (const field of requiredFields) {
|
|
68
|
+
const fieldAccess = collectionAccess.fields[field];
|
|
69
|
+
if (fieldAccess === undefined || typeof fieldAccess === "boolean") {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
for (const operation of REQUIRED_OPERATIONS) {
|
|
73
|
+
if (!hasFieldPermission(fieldAccess, operation)) {
|
|
74
|
+
throw missingCapabilityError(collection, `${collection}.${field}.${operation}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function hasFieldPermission(fieldAccess, operation) {
|
|
80
|
+
const permission = fieldAccess[operation];
|
|
81
|
+
return permission !== undefined && hasPermission(permission);
|
|
82
|
+
}
|
|
83
|
+
function hasPermission(permission) {
|
|
84
|
+
return (permission === true ||
|
|
85
|
+
(typeof permission === "object" && permission.permission === true));
|
|
86
|
+
}
|
|
87
|
+
function missingCapabilityError(collection, capability) {
|
|
88
|
+
return new errors_1.PayloadSyncError(`Payload capability ${capability} is missing.`, {
|
|
89
|
+
code: "PAYLOAD_CAPABILITY_MISSING",
|
|
90
|
+
retryable: false,
|
|
91
|
+
collection,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function isDegradedPayloadFailure(error) {
|
|
95
|
+
if (!(error instanceof errors_1.PayloadSyncError) || !error.retryable) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
if (error.code === "PAYLOAD_NETWORK_ERROR" ||
|
|
99
|
+
error.code === "PAYLOAD_TIMEOUT") {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
const status = error.httpStatus;
|
|
103
|
+
return (status === 408 ||
|
|
104
|
+
status === 429 ||
|
|
105
|
+
(status !== undefined && status >= 500 && status < 600));
|
|
106
|
+
}
|
|
107
|
+
exports.default = registerPayloadClient;
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItcGF5bG9hZC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wYXlsb2FkLXN5bmMvbG9hZGVycy9yZWdpc3Rlci1wYXlsb2FkLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1QkEsa0RBNEJDO0FBRUQsc0RBa0JDO0FBdkVELHVEQUFvRDtBQVVwRCw2Q0FHeUI7QUFDekIsK0NBRzBCO0FBQzFCLHlFQUFtRTtBQUV0RCxRQUFBLHdCQUF3QixHQUFHLHVCQUF1QixDQUFBO0FBQ2xELFFBQUEsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUE7QUFFakQsS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxNQUF1QixFQUN2QixPQUFxQyxFQUNyQyxNQUFlO0lBSWYsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUE7UUFFdkMseUJBQXlCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRTFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQTtJQUN0QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztRQUVELE1BQU0sRUFBRSxJQUFJLENBQ1YsSUFBQSw2QkFBb0IsRUFDbEIsS0FBSyxFQUNMLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLEVBQ2xDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUN4QixDQUNGLENBQUE7UUFFRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUE7SUFDdEMsQ0FBQztBQUNILENBQUM7QUFFTSxLQUFLLFVBQVUscUJBQXFC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
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const contracts_1 = require("./domain/contracts");
|
|
4
|
+
const errors_1 = require("./domain/errors");
|
|
5
|
+
const reconciliation_1 = require("./domain/reconciliation");
|
|
6
|
+
const status_1 = require("./domain/status");
|
|
7
|
+
class PayloadSyncModuleService {
|
|
8
|
+
constructor({ payloadSyncRestClient, payloadSyncOptions, }) {
|
|
9
|
+
this.client = payloadSyncRestClient;
|
|
10
|
+
this.options = payloadSyncOptions;
|
|
11
|
+
}
|
|
12
|
+
async findProductMirror(medusaId) {
|
|
13
|
+
return await this.client.findByMedusaId(this.options.collections.product, medusaId);
|
|
14
|
+
}
|
|
15
|
+
async syncProductSnapshot(snapshot) {
|
|
16
|
+
const status = (0, status_1.toPayloadStatus)(snapshot.status);
|
|
17
|
+
const productInput = {
|
|
18
|
+
medusaId: snapshot.id,
|
|
19
|
+
title: snapshot.title,
|
|
20
|
+
handle: snapshot.handle,
|
|
21
|
+
status,
|
|
22
|
+
};
|
|
23
|
+
const product = await this.upsertByMedusaId(this.options.collections.product, productInput.medusaId, {
|
|
24
|
+
medusaId: productInput.medusaId,
|
|
25
|
+
title: productInput.title,
|
|
26
|
+
handle: productInput.handle,
|
|
27
|
+
_status: productInput.status,
|
|
28
|
+
});
|
|
29
|
+
const currentVariantIds = [];
|
|
30
|
+
for (const variant of snapshot.variants) {
|
|
31
|
+
currentVariantIds.push(variant.id);
|
|
32
|
+
await this.syncVariantSnapshot({
|
|
33
|
+
variant,
|
|
34
|
+
payloadProductId: product.id,
|
|
35
|
+
productStatus: snapshot.status,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const mirroredVariants = await this.listRelatedVariantMirrors(product.id);
|
|
39
|
+
assertUniqueMedusaIds(mirroredVariants, this.options.collections.variant);
|
|
40
|
+
const currentVariantIdSet = new Set(currentVariantIds);
|
|
41
|
+
const draftedStaleVariantIds = (0, reconciliation_1.findStaleIds)(mirroredVariants.map(({ medusaId }) => medusaId), currentVariantIdSet);
|
|
42
|
+
for (const staleId of draftedStaleVariantIds) {
|
|
43
|
+
const staleVariant = mirroredVariants.find(({ medusaId }) => medusaId === staleId);
|
|
44
|
+
if (staleVariant !== undefined) {
|
|
45
|
+
await this.client.updateDocument(this.options.collections.variant, staleVariant.id, { _status: "draft" });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
product,
|
|
50
|
+
currentVariantIds,
|
|
51
|
+
draftedStaleVariantIds,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async syncVariantSnapshot(input) {
|
|
55
|
+
const variantInput = {
|
|
56
|
+
medusaId: input.variant.id,
|
|
57
|
+
payloadProductId: input.payloadProductId,
|
|
58
|
+
title: input.variant.title,
|
|
59
|
+
status: (0, status_1.toPayloadStatus)(input.productStatus),
|
|
60
|
+
};
|
|
61
|
+
return await this.upsertByMedusaId(this.options.collections.variant, variantInput.medusaId, {
|
|
62
|
+
medusaId: variantInput.medusaId,
|
|
63
|
+
title: variantInput.title,
|
|
64
|
+
product: variantInput.payloadProductId,
|
|
65
|
+
_status: variantInput.status,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async unpublishProduct(medusaId) {
|
|
69
|
+
await this.draftProductMirror(medusaId);
|
|
70
|
+
}
|
|
71
|
+
async draftProductMirror(medusaId) {
|
|
72
|
+
const product = await this.client.findByMedusaId(this.options.collections.product, medusaId);
|
|
73
|
+
if (product === null) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const draftedProduct = await this.client.updateDocument(this.options.collections.product, product.id, {
|
|
77
|
+
_status: "draft",
|
|
78
|
+
});
|
|
79
|
+
const variants = await this.listRelatedVariantMirrors(product.id);
|
|
80
|
+
const draftedStaleVariantIds = [];
|
|
81
|
+
for (const variant of variants) {
|
|
82
|
+
await this.client.updateDocument(this.options.collections.variant, variant.id, {
|
|
83
|
+
_status: "draft",
|
|
84
|
+
});
|
|
85
|
+
draftedStaleVariantIds.push(variant.medusaId);
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
product: draftedProduct,
|
|
89
|
+
currentVariantIds: [],
|
|
90
|
+
draftedStaleVariantIds,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
async unpublishVariant(medusaId) {
|
|
94
|
+
await this.draftVariantMirror(medusaId);
|
|
95
|
+
}
|
|
96
|
+
async draftVariantMirror(medusaId) {
|
|
97
|
+
const variant = await this.client.findByMedusaId(this.options.collections.variant, medusaId);
|
|
98
|
+
if (variant === null) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
return await this.client.updateDocument(this.options.collections.variant, variant.id, {
|
|
102
|
+
_status: "draft",
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async listProductMirrorPage(page, limit) {
|
|
106
|
+
return await this.client.listDocuments({
|
|
107
|
+
collection: this.options.collections.product,
|
|
108
|
+
page,
|
|
109
|
+
limit,
|
|
110
|
+
sort: "medusaId",
|
|
111
|
+
where: new URLSearchParams({ draft: "true" }),
|
|
112
|
+
schema: contracts_1.MirrorDocumentSchema,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async listVariantMirrorPage(page, limit) {
|
|
116
|
+
return await this.client.listDocuments({
|
|
117
|
+
collection: this.options.collections.variant,
|
|
118
|
+
page,
|
|
119
|
+
limit,
|
|
120
|
+
sort: "medusaId",
|
|
121
|
+
where: new URLSearchParams({ draft: "true" }),
|
|
122
|
+
schema: contracts_1.MirrorDocumentSchema,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
async draftProductMirrorIds(ids) {
|
|
126
|
+
return await this.draftMirrorIds(this.options.collections.product, ids);
|
|
127
|
+
}
|
|
128
|
+
async draftVariantMirrorIds(ids) {
|
|
129
|
+
return await this.draftMirrorIds(this.options.collections.variant, ids);
|
|
130
|
+
}
|
|
131
|
+
getReconciliationOptions() {
|
|
132
|
+
return {
|
|
133
|
+
batchSize: this.options.backfillBatchSize,
|
|
134
|
+
batchDelayMs: this.options.backfillBatchDelayMs,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async upsertByMedusaId(collection, medusaId, body) {
|
|
138
|
+
const existing = await this.client.findByMedusaId(collection, medusaId);
|
|
139
|
+
if (existing !== null) {
|
|
140
|
+
return await this.client.updateDocument(collection, existing.id, body);
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
return await this.client.createDocument(collection, body);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
if (!isPayloadUniqueConflict(error)) {
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
const raced = await this.client.findByMedusaId(collection, medusaId);
|
|
150
|
+
if (raced === null) {
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
return await this.client.updateDocument(collection, raced.id, body);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async listRelatedVariantMirrors(payloadProductId) {
|
|
157
|
+
const documents = [];
|
|
158
|
+
let page = 1;
|
|
159
|
+
while (true) {
|
|
160
|
+
const where = new URLSearchParams();
|
|
161
|
+
where.set("where[product][equals]", String(payloadProductId));
|
|
162
|
+
const result = await this.client.listDocuments({
|
|
163
|
+
collection: this.options.collections.variant,
|
|
164
|
+
page,
|
|
165
|
+
limit: this.options.backfillBatchSize,
|
|
166
|
+
sort: "medusaId",
|
|
167
|
+
where,
|
|
168
|
+
schema: contracts_1.MirrorDocumentSchema,
|
|
169
|
+
});
|
|
170
|
+
documents.push(...result.docs);
|
|
171
|
+
if (result.nextPage === null) {
|
|
172
|
+
return documents;
|
|
173
|
+
}
|
|
174
|
+
page = result.nextPage;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async draftMirrorIds(collection, ids) {
|
|
178
|
+
let changed = 0;
|
|
179
|
+
for (const medusaId of ids) {
|
|
180
|
+
const document = await this.client.findByMedusaId(collection, medusaId);
|
|
181
|
+
if (document === null) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
await this.client.updateDocument(collection, document.id, {
|
|
185
|
+
_status: "draft",
|
|
186
|
+
});
|
|
187
|
+
changed += 1;
|
|
188
|
+
}
|
|
189
|
+
return changed;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function isPayloadUniqueConflict(error) {
|
|
193
|
+
return (error instanceof errors_1.PayloadSyncError &&
|
|
194
|
+
(error.httpStatus === 409 ||
|
|
195
|
+
(error.httpStatus === 400 &&
|
|
196
|
+
error.code === "PAYLOAD_UNIQUE_MEDUSA_ID_CONFLICT")));
|
|
197
|
+
}
|
|
198
|
+
function assertUniqueMedusaIds(documents, collection) {
|
|
199
|
+
const seen = new Set();
|
|
200
|
+
for (const document of documents) {
|
|
201
|
+
if (seen.has(document.medusaId)) {
|
|
202
|
+
throw new errors_1.PayloadSyncError("Payload contains duplicate Medusa IDs.", {
|
|
203
|
+
code: "PAYLOAD_DUPLICATE_MEDUSA_ID",
|
|
204
|
+
retryable: false,
|
|
205
|
+
collection,
|
|
206
|
+
medusaId: document.medusaId,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
seen.add(document.medusaId);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.default = PayloadSyncModuleService;
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3BheWxvYWQtc3luYy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0Esa0RBQXlEO0FBQ3pELDRDQUFrRDtBQUVsRCw0REFBc0Q7QUFDdEQsNENBQWlEO0FBRWpELE1BQU0sd0JBQXdCO0lBSTVCLFlBQVksRUFDVixxQkFBcUIsRUFDckIsa0JBQWtCLEdBSW5CO1FBQ0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQTtRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLGtCQUFrQixDQUFBO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBZ0I7UUFDdEMsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQ2hDLFFBQVEsQ0FDVCxDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUIsQ0FDdkIsUUFBK0I7UUFFL0IsTUFBTSxNQUFNLEdBQUcsSUFBQSx3QkFBZSxFQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMvQyxNQUFNLFlBQVksR0FBdUI7WUFDdkMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFO1lBQ3JCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztZQUNyQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsTUFBTTtTQUNQLENBQUE7UUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUNoQyxZQUFZLENBQUMsUUFBUSxFQUNyQjtZQUNFLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUTtZQUMvQixLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7WUFDekIsTUFBTSxFQUFF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
|