@devx-commerce/strapi
Version:
Medusa plugin for Strapi as CMS
92 lines • 8.98 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = syncContentModelsLoader;
const utils_1 = require("@medusajs/framework/utils");
const qs_1 = __importDefault(require("qs"));
async function syncContentModelsLoader({ container, options, }) {
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
if (!options?.base_url || !options?.api_key) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Strapi api key and base URL are required");
}
const systemIdKey = options.system_id_key || "systemId";
logger.debug(`Strapi baseURL: ${options.base_url}`);
// Validate that required content types exist with correct structure
await validateContentTypes(options, logger, systemIdKey);
logger.info("Connected to Strapi");
}
async function validateContentTypes(options, logger, systemIdKey) {
const requiredContentTypes = [
{
name: "products",
requiredFields: ["title", systemIdKey, "handle", "productType"],
relations: { variants: { fields: ["title", systemIdKey, "sku"] } },
},
{
name: "product-variants",
requiredFields: ["title", systemIdKey, "sku"],
relations: { product: {} },
},
{
name: "categories",
requiredFields: ["title", systemIdKey, "handle"],
},
{
name: "collections",
requiredFields: ["title", systemIdKey, "handle"],
},
];
for (const contentType of requiredContentTypes) {
await validateContentType(options, logger, contentType, systemIdKey);
}
}
async function validateContentType(options, logger, contentType, systemIdKey) {
logger.debug(`Validating content type: ${contentType.name}`);
const params = qs_1.default.stringify({
fields: contentType.requiredFields,
populate: contentType.relations || {},
pagination: { limit: 1 },
});
const response = await fetch(`${options.base_url}/${contentType.name}?${params}`, {
headers: {
Authorization: `Bearer ${options.api_key}`,
"Content-Type": "application/json",
},
});
if (!response.ok) {
let errorDetails = `HTTP ${response.status} ${response.statusText}`;
let errorMessage = `Content type '${contentType.name}' validation failed: ${errorDetails}`;
try {
const errorResponse = await response.json();
if (errorResponse.error) {
errorDetails += ` - ${JSON.stringify(errorResponse.error)}`;
logger.error(`Strapi content type validation failed for '${contentType.name}':`, errorResponse);
if (response.status === 404) {
errorMessage = `Content type '${contentType.name}' does not exist in Strapi. Please create it using the schema files provided in the 'strapi-schemas' directory.`;
}
}
}
catch (parseError) {
logger.error("Failed to parse error response from Strapi", parseError);
}
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, errorMessage);
}
const responseData = await response.json();
const { error } = responseData;
if (error) {
logger.error(`Strapi returned an error for content type '${contentType.name}':`, error);
logger.error("Full response:", responseData);
let errorMessage = `Content type '${contentType.name}' validation failed: ${error.message || JSON.stringify(error)}`;
// Check if it's a field-related error
if (error.message && error.message.includes("field")) {
errorMessage += `\n\nRequired fields for '${contentType.name}': ${contentType.requiredFields.join(", ")}`;
errorMessage += `\nPlease ensure all required fields exist in your Strapi content type.`;
errorMessage += `\nRefer to the schema files in the 'strapi-schemas' directory for the correct structure.`;
}
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, errorMessage);
}
logger.debug(`Content type '${contentType.name}' validation passed`);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWNvbnRlbnQtbW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvc3RyYXBpL2xvYWRlci9jcmVhdGUtY29udGVudC1tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFjQSwwQ0FxQkM7QUFsQ0QscURBR21DO0FBQ25DLDRDQUFvQjtBQVNMLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxFQUNwRCxTQUFTLEVBQ1QsT0FBTyxHQUNzQjtJQUM3QixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRW5FLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDBDQUEwQyxDQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDO0lBRXhELE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBRXBELG9FQUFvRTtJQUNwRSxNQUFNLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFekQsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCxLQUFLLFVBQVUsb0JBQW9CLENBQ2pDLE9BQXNCLEVBQ3RCLE1BQVcsRUFDWCxXQUFtQjtJQUVuQixNQUFNLG9CQUFvQixHQUFHO1FBQzNCO1lBQ0UsSUFBSSxFQUFFLFVBQVU7WUFDaEIsY0FBYyxFQUFFLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDO1lBQy9ELFNB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