Files
klz-cables.com/.pnpm-store/v10/files/f9/22fa9c11a42e4ec76bcf1316f88352b8bcddab741f44f529cac2af4a2609851b131855d0489788de725347a4671e41532b51dafc7af3c2136d9665809cd753
Marc Mintel 5397309103
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
fix(products): fix breadcrumbs and product filtering (backport from main)
2026-02-24 16:04:21 +01:00

275 lines
9.1 KiB
Plaintext

import { sql } from 'drizzle-orm';
import fs from 'fs';
import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload';
import toSnakeCase from 'to-snake-case';
import { getTransaction } from '../../../utilities/getTransaction.js';
import { groupUpSQLStatements } from './groupUpSQLStatements.js';
import { migrateRelationships } from './migrateRelationships.js';
import { traverseFields } from './traverseFields.js';
const runStatementGroup = async ({ adapter, db, debug, statements })=>{
const addColumnsStatement = statements.join('\n');
if (debug) {
adapter.payload.logger.info(debug);
adapter.payload.logger.info(addColumnsStatement);
}
await db.execute(sql.raw(addColumnsStatement));
};
/**
* Moves upload and relationship columns from the join table and into the tables while moving data
* This is done in the following order:
* ADD COLUMNs
* -- manipulate data to move relationships to new columns
* ADD CONSTRAINTs
* NOT NULLs
* DROP TABLEs
* DROP CONSTRAINTs
* DROP COLUMNs
* @param debug
* @param payload
* @param req
*/ export const migratePostgresV2toV3 = async ({ debug, payload, req })=>{
const adapter = payload.db;
const dir = payload.db.migrationDir;
// get the drizzle migrateUpSQL from drizzle using the last schema
const { generateDrizzleJson, generateMigration, upSnapshot } = adapter.requireDrizzleKit();
const drizzleJsonAfter = generateDrizzleJson(adapter.schema);
// Get the previous migration snapshot
const previousSnapshot = fs.readdirSync(dir).filter((file)=>file.endsWith('.json') && !file.endsWith('relationships_v2_v3.json')).sort().reverse()?.[0];
if (!previousSnapshot) {
throw new Error(`No previous migration schema file found! A prior migration from v2 is required to migrate to v3.`);
}
let drizzleJsonBefore = JSON.parse(fs.readFileSync(`${dir}/${previousSnapshot}`, 'utf8'));
if (upSnapshot && drizzleJsonBefore.version < drizzleJsonAfter.version) {
drizzleJsonBefore = upSnapshot(drizzleJsonBefore);
}
const generatedSQL = await generateMigration(drizzleJsonBefore, drizzleJsonAfter);
if (!generatedSQL.length) {
payload.logger.info(`No schema changes needed.`);
process.exit(0);
}
const sqlUpStatements = groupUpSQLStatements(generatedSQL);
const db = await getTransaction(adapter, req);
await runStatementGroup({
adapter,
db,
debug: debug ? 'CREATING TYPES' : null,
statements: sqlUpStatements.createType
});
await runStatementGroup({
adapter,
db,
debug: debug ? 'ALTERING TYPES' : null,
statements: sqlUpStatements.alterType
});
await runStatementGroup({
adapter,
db,
debug: debug ? 'CREATING TABLES' : null,
statements: sqlUpStatements.createTable
});
await runStatementGroup({
adapter,
db,
debug: debug ? 'RENAMING COLUMNS' : null,
statements: sqlUpStatements.renameColumn
});
await runStatementGroup({
adapter,
db,
debug: debug ? 'CREATING NEW RELATIONSHIP COLUMNS' : null,
statements: sqlUpStatements.addColumn
});
// SET DEFAULTS
await runStatementGroup({
adapter,
db,
debug: debug ? 'SETTING DEFAULTS' : null,
statements: sqlUpStatements.setDefault
});
await runStatementGroup({
adapter,
db,
debug: debug ? 'CREATING INDEXES' : null,
statements: sqlUpStatements.createIndex
});
for (const collection of payload.config.collections){
if (collection.slug === 'payload-locked-documents') {
continue;
}
const tableName = adapter.tableNameMap.get(toSnakeCase(collection.slug));
const pathsToQuery = new Set();
traverseFields({
adapter,
collectionSlug: collection.slug,
columnPrefix: '',
db,
disableNotNull: false,
fields: collection.flattenedFields,
isVersions: false,
newTableName: tableName,
parentTableName: tableName,
path: '',
pathsToQuery,
payload,
rootTableName: tableName
});
await migrateRelationships({
adapter,
collectionSlug: collection.slug,
db,
debug,
fields: collection.flattenedFields,
isVersions: false,
pathsToQuery,
payload,
req,
tableName
});
if (collection.versions) {
const versionsTableName = adapter.tableNameMap.get(`_${toSnakeCase(collection.slug)}${adapter.versionsSuffix}`);
const versionFields = buildVersionCollectionFields(payload.config, collection, true);
const versionPathsToQuery = new Set();
traverseFields({
adapter,
collectionSlug: collection.slug,
columnPrefix: '',
db,
disableNotNull: true,
fields: versionFields,
isVersions: true,
newTableName: versionsTableName,
parentTableName: versionsTableName,
path: '',
pathsToQuery: versionPathsToQuery,
payload,
rootTableName: versionsTableName
});
await migrateRelationships({
adapter,
collectionSlug: collection.slug,
db,
debug,
fields: versionFields,
isVersions: true,
pathsToQuery: versionPathsToQuery,
payload,
req,
tableName: versionsTableName
});
}
}
for (const global of payload.config.globals){
const tableName = adapter.tableNameMap.get(toSnakeCase(global.slug));
const pathsToQuery = new Set();
traverseFields({
adapter,
columnPrefix: '',
db,
disableNotNull: false,
fields: global.flattenedFields,
globalSlug: global.slug,
isVersions: false,
newTableName: tableName,
parentTableName: tableName,
path: '',
pathsToQuery,
payload,
rootTableName: tableName
});
await migrateRelationships({
adapter,
db,
debug,
fields: global.flattenedFields,
globalSlug: global.slug,
isVersions: false,
pathsToQuery,
payload,
req,
tableName
});
if (global.versions) {
const versionsTableName = adapter.tableNameMap.get(`_${toSnakeCase(global.slug)}${adapter.versionsSuffix}`);
const versionFields = buildVersionGlobalFields(payload.config, global, true);
const versionPathsToQuery = new Set();
traverseFields({
adapter,
columnPrefix: '',
db,
disableNotNull: true,
fields: versionFields,
globalSlug: global.slug,
isVersions: true,
newTableName: versionsTableName,
parentTableName: versionsTableName,
path: '',
pathsToQuery: versionPathsToQuery,
payload,
rootTableName: versionsTableName
});
await migrateRelationships({
adapter,
db,
debug,
fields: versionFields,
globalSlug: global.slug,
isVersions: true,
pathsToQuery: versionPathsToQuery,
payload,
req,
tableName: versionsTableName
});
}
}
// ADD CONSTRAINT
await runStatementGroup({
adapter,
db,
debug: debug ? 'ADDING CONSTRAINTS' : null,
statements: sqlUpStatements.addConstraint
});
// NOT NULL
await runStatementGroup({
adapter,
db,
debug: debug ? 'NOT NULL CONSTRAINTS' : null,
statements: sqlUpStatements.notNull
});
// DROP TABLE
await runStatementGroup({
adapter,
db,
debug: debug ? 'DROPPING TABLES' : null,
statements: sqlUpStatements.dropTable
});
// DROP INDEX
await runStatementGroup({
adapter,
db,
debug: debug ? 'DROPPING INDEXES' : null,
statements: sqlUpStatements.dropIndex
});
// DROP CONSTRAINT
await runStatementGroup({
adapter,
db,
debug: debug ? 'DROPPING CONSTRAINTS' : null,
statements: sqlUpStatements.dropConstraint
});
// DROP COLUMN
await runStatementGroup({
adapter,
db,
debug: debug ? 'DROPPING COLUMNS' : null,
statements: sqlUpStatements.dropColumn
});
// DROP TYPES
await runStatementGroup({
adapter,
db,
debug: debug ? 'DROPPING TYPES' : null,
statements: sqlUpStatements.dropType
});
};
//# sourceMappingURL=index.js.map