medusa-variant-images-updated
Version:
A variant images plugin for Medusa V2.
144 lines • 13.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("@medusajs/framework/utils");
const variant_images_settings_1 = __importDefault(require("./models/variant-images-settings"));
const variant_images_1 = __importDefault(require("./models/variant-images"));
const framework_1 = require("@medusajs/framework");
class VariantImagesSettingsService extends (0, utils_1.MedusaService)({
VariantImagesSettings: variant_images_settings_1.default,
VariantImage: variant_images_1.default
}) {
async create(data) {
// Only include known properties: variant_id, url, position
return this.createVariantImages({
id: undefined, // or id: null,
variant_id: data.variant_id,
url: data.url,
type: data.type,
position: data.position,
});
}
async list(filter = {}, options = {}) {
const knex = framework_1.container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
const { variant_id, product_id, type, order_by, order_direction, offset = 0, limit = 50, ...rest } = filter;
const conditions = { ...rest };
let variantIds = undefined;
if (product_id) {
// Only get non-deleted variants for the product
const variants = await knex('product_variant')
.select('id')
.where('product_id', product_id)
.whereNull('deleted_at');
variantIds = variants.map((v) => v.id);
}
if (variant_id) {
// Only return if the variant is not deleted
const variant = await knex('product_variant')
.select('id')
.where('id', variant_id)
.whereNull('deleted_at')
.first();
if (variant) {
conditions.variant_id = variant_id;
}
else {
// If the variant is deleted, return empty result
return { data: [], pagination: { offset, limit, total: 0 } };
}
}
else if (variantIds && variantIds.length > 0) {
conditions.variant_id = variantIds;
}
if (type)
conditions.type = type;
const order = {};
if (order_by) {
order[order_by] = order_direction?.toUpperCase() === "DESC" ? "DESC" : "ASC";
}
else {
order.position = "ASC";
}
const [results, totalCount] = await this.listAndCountVariantImages(conditions, { ...options, skip: offset, take: limit, order });
return {
data: results,
pagination: { offset, limit, total: totalCount },
};
}
async getById(id) {
return this.retrieveVariantImage(id);
}
async updateById(id, data) {
const updated = await this.updateVariantImages([{ selector: { id }, data }]);
return Array.isArray(updated) ? updated[0] : updated;
}
async deleteById(ids) {
const idArray = Array.isArray(ids) ? ids : [ids];
await this.deleteVariantImages(idArray);
return { message: "Variant image(s) successfully deleted." };
}
async batchUploadByOption({ product_id, option_id, option_value, images }) {
const knex = framework_1.container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
// 1. Find all variant IDs for the product with the matching option value
const matchingVariants = await knex('product_variant as pv')
.join('product_variant_option as pvo', 'pv.id', 'pvo.variant_id')
.join('product_option_value as pov', 'pvo.option_value_id', 'pov.id')
.where('pv.product_id', product_id)
.whereNull('pv.deleted_at')
.where('pov.option_id', option_id)
.where('pov.value', option_value)
.select('pv.id as variant_id');
const variantIds = matchingVariants.map((row) => row.variant_id);
// 2. Fetch all existing images for all relevant variants in one query
const existingImages = await knex('variant_images')
.whereIn('variant_id', variantIds);
// 3. Build lookup maps
const byVariantUrl = new Map();
const byVariantType = new Map();
for (const img of existingImages) {
byVariantUrl.set(`${img.variant_id}|${img.url}`, img);
byVariantType.set(`${img.variant_id}|${img.type}`, img);
}
// 4. Prepare updates/inserts
const updates = [];
const inserts = [];
for (const variant_id of variantIds) {
for (const img of images) {
const urlKey = `${variant_id}|${img.url}`;
const typeKey = `${variant_id}|${img.type}`;
const byUrl = byVariantUrl.get(urlKey);
const byType = byVariantType.get(typeKey);
if (byUrl) {
if (img.type !== byUrl.type || img.position !== byUrl.position) {
updates.push({ id: byUrl.id, type: img.type, position: img.position });
}
continue;
}
if (byType) {
if (img.url !== byType.url || img.position !== byType.position) {
updates.push({ id: byType.id, url: img.url, position: img.position });
}
continue;
}
inserts.push({
variant_id,
url: img.url,
type: img.type,
position: img.position,
});
}
}
// 5. Run updates and inserts in batch
for (const upd of updates) {
await knex('variant_images').where({ id: upd.id }).update(upd);
}
if (inserts.length) {
await knex('variant_images').insert(inserts);
}
return { updated: variantIds.length, inserted: inserts.length, updatedImages: updates.length };
}
}
exports.default = VariantImagesSettingsService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ZhcmlhbnQtaW1hZ2VzLXNldHRpbmdzL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBcUY7QUFDckYsK0ZBQXFFO0FBQ3JFLDZFQUFtRDtBQUVuRCxtREFBZ0Q7QUFVaEQsTUFBTSw0QkFBNkIsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDckQscUJBQXFCLEVBQXJCLGlDQUFxQjtJQUNyQixZQUFZLEVBQVosd0JBQVk7Q0FDZixDQUFDO0lBQ0UsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUEyRTtRQUNwRiwyREFBMkQ7UUFDM0QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDNUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFlO1lBQzlCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDMUIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBNkIsRUFBRSxFQUFFLFVBQStCLEVBQUU7UUFDekUsTUFBTSxJQUFJLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQU8saUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQzVHLE1BQU0sVUFBVSxHQUF3QixFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDcEQsSUFBSSxVQUFVLEdBQXlCLFNBQVMsQ0FBQztRQUVqRCxJ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