@vendure/core
Version:
A modern, headless ecommerce framework
86 lines • 4.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.migrateProductOptionGroupData = migrateProductOptionGroupData;
/**
* @description
* Populates the new join tables for shared, channel-aware ProductOptionGroups
* using data from the existing `productId` FK column on `product_option_group`.
*
* Call this from your migration's `up()` method **after** the new join tables
* have been created and **before** the `productId` column is dropped.
*
* ```ts
* import { MigrationInterface, QueryRunner } from 'typeorm';
* import { migrateProductOptionGroupData } from '\@vendure/core';
*
* export class SharedOptionGroups1234567890 implements MigrationInterface {
* public async up(queryRunner: QueryRunner): Promise<any> {
* // --- Auto-generated DDL starts here ---
* // (Create new join tables and FK constraints)
* // ...
*
* // --- Populate new tables with existing data ---
* await migrateProductOptionGroupData(queryRunner);
*
* // --- Auto-generated DDL continues ---
* // (Drop old productId FK and column)
* // ...
* }
*
* public async down(queryRunner: QueryRunner): Promise<any> {
* // Auto-generated reverse DDL
* }
* }
* ```
*
* @since 3.6.0
* @docsCategory migration
*/
async function migrateProductOptionGroupData(queryRunner) {
const hasProductId = await queryRunner.hasColumn('product_option_group', 'productId');
if (!hasProductId) {
console.log('The productId column on product_option_group does not exist. ' +
'Skipping data migration (already completed?).');
return;
}
const esc = (name) => queryRunner.connection.driver.escape(name);
// 1. Populate Product <-> ProductOptionGroup join table from existing FK
await queryRunner.query(`INSERT INTO ${esc('product_option_groups_product_option_group')} (${esc('productId')}, ${esc('productOptionGroupId')})
SELECT ${esc('productId')}, ${esc('id')} FROM ${esc('product_option_group')} pog
WHERE pog.${esc('productId')} IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM ${esc('product_option_groups_product_option_group')} j
WHERE j.${esc('productId')} = pog.${esc('productId')} AND j.${esc('productOptionGroupId')} = pog.${esc('id')}
)`);
// 2. Populate ProductOptionGroup channel assignments (inherit from parent product's channels)
await queryRunner.query(`INSERT INTO ${esc('product_option_group_channels_channel')} (${esc('productOptionGroupId')}, ${esc('channelId')})
SELECT DISTINCT pog.${esc('id')}, pc.${esc('channelId')}
FROM ${esc('product_option_group')} pog
INNER JOIN ${esc('product_channels_channel')} pc ON pc.${esc('productId')} = pog.${esc('productId')}
WHERE pog.${esc('productId')} IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM ${esc('product_option_group_channels_channel')} j
WHERE j.${esc('productOptionGroupId')} = pog.${esc('id')} AND j.${esc('channelId')} = pc.${esc('channelId')}
)`);
// 3. Populate ProductOption channel assignments (inherit from parent group's channels)
await queryRunner.query(`INSERT INTO ${esc('product_option_channels_channel')} (${esc('productOptionId')}, ${esc('channelId')})
SELECT DISTINCT po.${esc('id')}, pogc.${esc('channelId')}
FROM ${esc('product_option')} po
INNER JOIN ${esc('product_option_group_channels_channel')} pogc ON pogc.${esc('productOptionGroupId')} = po.${esc('groupId')}
WHERE NOT EXISTS (
SELECT 1 FROM ${esc('product_option_channels_channel')} j
WHERE j.${esc('productOptionId')} = po.${esc('id')} AND j.${esc('channelId')} = pogc.${esc('channelId')}
)`);
// 4. Handle orphaned option groups (NULL productId) — assign to default channel
await queryRunner.query(`INSERT INTO ${esc('product_option_group_channels_channel')} (${esc('productOptionGroupId')}, ${esc('channelId')})
SELECT pog.${esc('id')}, (SELECT ${esc('id')} FROM ${esc('channel')} WHERE ${esc('code')} = '__default_channel__')
FROM ${esc('product_option_group')} pog
WHERE pog.${esc('id')} NOT IN (SELECT ${esc('productOptionGroupId')} FROM ${esc('product_option_group_channels_channel')})`);
// 5. Handle orphaned options — assign to default channel
await queryRunner.query(`INSERT INTO ${esc('product_option_channels_channel')} (${esc('productOptionId')}, ${esc('channelId')})
SELECT po.${esc('id')}, (SELECT ${esc('id')} FROM ${esc('channel')} WHERE ${esc('code')} = '__default_channel__')
FROM ${esc('product_option')} po
WHERE po.${esc('id')} NOT IN (SELECT ${esc('productOptionId')} FROM ${esc('product_option_channels_channel')})`);
console.log('Successfully migrated ProductOptionGroup data to new join tables.');
}
//# sourceMappingURL=v3_6_shared_option_groups.js.map