@strapi/database 5.43.0 → 5.44.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/dist/migrations/internal-migrations/5.0.0-02-document-id.d.ts.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +19 -7
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +19 -7
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"5.0.0-02-document-id.d.ts","sourceRoot":"","sources":["../../../src/migrations/internal-migrations/5.0.0-02-document-id.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"5.0.0-02-document-id.d.ts","sourceRoot":"","sources":["../../../src/migrations/internal-migrations/5.0.0-02-document-id.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AA0J3C,eAAO,MAAM,iBAAiB,EAAE,SA6B/B,CAAC"}
|
|
@@ -83,10 +83,24 @@ const migrationDocumentIds = async (db, knex, meta)=>{
|
|
|
83
83
|
}).whereIn('id', knex(meta.tableName).select('id').from(knex(meta.tableName).select('id').whereNull('document_id').limit(1).as('sub_query')));
|
|
84
84
|
}while (updatedRows > 0)
|
|
85
85
|
};
|
|
86
|
+
const isDuplicateColumnError = (error)=>{
|
|
87
|
+
if (!error || typeof error !== 'object') return false;
|
|
88
|
+
const e = error;
|
|
89
|
+
if (e.code === '42701') return true;
|
|
90
|
+
if (e.errno === 1060) return true;
|
|
91
|
+
if (typeof e.message === 'string' && /duplicate column/i.test(e.message)) return true;
|
|
92
|
+
return false;
|
|
93
|
+
};
|
|
86
94
|
const createDocumentIdColumn = async (knex, tableName)=>{
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
95
|
+
try {
|
|
96
|
+
await knex.schema.alterTable(tableName, (table)=>{
|
|
97
|
+
table.string('document_id');
|
|
98
|
+
});
|
|
99
|
+
} catch (error) {
|
|
100
|
+
if (!isDuplicateColumnError(error)) {
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
90
104
|
};
|
|
91
105
|
const hasLocalizationsJoinTable = async (knex, tableName)=>{
|
|
92
106
|
const joinTableName = _.snakeCase(`${tableName}_localizations_links`);
|
|
@@ -102,12 +116,10 @@ const createdDocumentId = {
|
|
|
102
116
|
continue;
|
|
103
117
|
}
|
|
104
118
|
if ('documentId' in meta.attributes) {
|
|
105
|
-
// add column if doesn't exist
|
|
106
119
|
const hasDocumentIdColumn = await knex.schema.hasColumn(meta.tableName, 'document_id');
|
|
107
|
-
if (hasDocumentIdColumn) {
|
|
108
|
-
|
|
120
|
+
if (!hasDocumentIdColumn) {
|
|
121
|
+
await createDocumentIdColumn(knex, meta.tableName);
|
|
109
122
|
}
|
|
110
|
-
await createDocumentIdColumn(knex, meta.tableName);
|
|
111
123
|
if (await hasLocalizationsJoinTable(knex, meta.tableName)) {
|
|
112
124
|
await migrateDocumentIdsWithLocalizations(db, knex, meta);
|
|
113
125
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"5.0.0-02-document-id.js","sources":["../../../src/migrations/internal-migrations/5.0.0-02-document-id.ts"],"sourcesContent":["/**\n * NOTE: This migration avoids using the `identifiers` utility.\n * As the `5.0.0-01-convert-identifiers-long-than-max-length`\n * migration does not convert the `localizations` join tables, as they are not\n * tables that exist anymore in v5 and are not in the db metadata.\n *\n * This migration therefore relies on the fact that those tables still exist, and\n * references them directly.\n *\n * Database join table name: `categories_localizations_links`\n * Actual `identifiers` returned join table name: `categories_localizations_lnk`\n *\n */\nimport { createId } from '@paralleldrive/cuid2';\nimport { snakeCase } from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport type { Migration } from '../common';\nimport type { Database } from '../..';\nimport type { Meta } from '../../metadata';\n\ninterface Params {\n joinColumn: string;\n inverseJoinColumn: string;\n tableName: string;\n joinTableName: string;\n}\n\nconst QUERIES = {\n async postgres(knex: Knex, params: Params) {\n const res = await knex.raw(\n `\n SELECT :tableName:.id as id, string_agg(DISTINCT :inverseJoinColumn:::character varying, ',') as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :tableName:.id, :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n\n return res.rows;\n },\n async mysql(knex: Knex, params: Params) {\n const [res] = await knex.raw(\n `\n SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :tableName:.id, :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n\n return res;\n },\n async sqlite(knex: Knex, params: Params) {\n return knex.raw(\n `\n SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n },\n};\n\nconst getNextIdsToCreateDocumentId = async (\n db: Database,\n knex: Knex,\n {\n joinColumn,\n inverseJoinColumn,\n tableName,\n joinTableName,\n }: {\n joinColumn: string;\n inverseJoinColumn: string;\n tableName: string;\n joinTableName: string;\n }\n): Promise<number[]> => {\n const res = await QUERIES[db.dialect.client as keyof typeof QUERIES](knex, {\n joinColumn,\n inverseJoinColumn,\n tableName,\n joinTableName,\n });\n\n if (res.length > 0) {\n const row = res[0];\n const otherIds = row.other_ids\n ? row.other_ids.split(',').map((v: string) => parseInt(v, 10))\n : [];\n\n return [row.id, ...otherIds];\n }\n\n return [];\n};\n\n// Migrate document ids for tables that have localizations\nconst migrateDocumentIdsWithLocalizations = async (db: Database, knex: Knex, meta: Meta) => {\n const singularName = meta.singularName.toLowerCase();\n const joinColumn = snakeCase(`${singularName}_id`);\n const inverseJoinColumn = snakeCase(`inv_${singularName}_id`);\n let ids: number[];\n\n do {\n ids = await getNextIdsToCreateDocumentId(db, knex, {\n joinColumn,\n inverseJoinColumn,\n tableName: meta.tableName,\n joinTableName: snakeCase(`${meta.tableName}_localizations_links`),\n });\n\n if (ids.length > 0) {\n await knex(meta.tableName).update({ document_id: createId() }).whereIn('id', ids);\n }\n } while (ids.length > 0);\n};\n\n// Migrate document ids for tables that don't have localizations\nconst migrationDocumentIds = async (db: Database, knex: Knex, meta: Meta) => {\n let updatedRows: number;\n\n do {\n updatedRows = await knex(meta.tableName)\n .update({ document_id: createId() })\n .whereIn(\n 'id',\n knex(meta.tableName)\n .select('id')\n .from(knex(meta.tableName).select('id').whereNull('document_id').limit(1).as('sub_query'))\n );\n } while (updatedRows > 0);\n};\n\nconst createDocumentIdColumn = async (knex: Knex, tableName: string) => {\n await knex.schema.alterTable(tableName, (table) => {\n table.string('document_id');\n });\n};\n\nconst hasLocalizationsJoinTable = async (knex: Knex, tableName: string) => {\n const joinTableName = snakeCase(`${tableName}_localizations_links`);\n return knex.schema.hasTable(joinTableName);\n};\n\nexport const createdDocumentId: Migration = {\n name: '5.0.0-02-created-document-id',\n async up(knex, db) {\n // do sth\n for (const meta of db.metadata.values()) {\n const hasTable = await knex.schema.hasTable(meta.tableName);\n\n if (!hasTable) {\n continue;\n }\n\n if ('documentId' in meta.attributes) {\n // add column if doesn't exist\n const hasDocumentIdColumn = await knex.schema.hasColumn(meta.tableName, 'document_id');\n\n if (hasDocumentIdColumn) {\n continue;\n }\n\n await createDocumentIdColumn(knex, meta.tableName);\n\n if (await hasLocalizationsJoinTable(knex, meta.tableName)) {\n await migrateDocumentIdsWithLocalizations(db, knex, meta);\n } else {\n await migrationDocumentIds(db, knex, meta);\n }\n }\n }\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["QUERIES","postgres","knex","params","res","raw","rows","mysql","sqlite","getNextIdsToCreateDocumentId","db","joinColumn","inverseJoinColumn","tableName","joinTableName","dialect","client","length","row","otherIds","other_ids","split","map","v","parseInt","id","migrateDocumentIdsWithLocalizations","meta","singularName","toLowerCase","snakeCase","ids","update","document_id","createId","whereIn","migrationDocumentIds","updatedRows","select","from","whereNull","limit","as","createDocumentIdColumn","schema","alterTable","table","string","hasLocalizationsJoinTable","hasTable","createdDocumentId","name","up","metadata","values","attributes","hasDocumentIdColumn","hasColumn","down","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"5.0.0-02-document-id.js","sources":["../../../src/migrations/internal-migrations/5.0.0-02-document-id.ts"],"sourcesContent":["/**\n * NOTE: This migration avoids using the `identifiers` utility.\n * As the `5.0.0-01-convert-identifiers-long-than-max-length`\n * migration does not convert the `localizations` join tables, as they are not\n * tables that exist anymore in v5 and are not in the db metadata.\n *\n * This migration therefore relies on the fact that those tables still exist, and\n * references them directly.\n *\n * Database join table name: `categories_localizations_links`\n * Actual `identifiers` returned join table name: `categories_localizations_lnk`\n *\n */\nimport { createId } from '@paralleldrive/cuid2';\nimport { snakeCase } from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport type { Migration } from '../common';\nimport type { Database } from '../..';\nimport type { Meta } from '../../metadata';\n\ninterface Params {\n joinColumn: string;\n inverseJoinColumn: string;\n tableName: string;\n joinTableName: string;\n}\n\nconst QUERIES = {\n async postgres(knex: Knex, params: Params) {\n const res = await knex.raw(\n `\n SELECT :tableName:.id as id, string_agg(DISTINCT :inverseJoinColumn:::character varying, ',') as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :tableName:.id, :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n\n return res.rows;\n },\n async mysql(knex: Knex, params: Params) {\n const [res] = await knex.raw(\n `\n SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :tableName:.id, :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n\n return res;\n },\n async sqlite(knex: Knex, params: Params) {\n return knex.raw(\n `\n SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n },\n};\n\nconst getNextIdsToCreateDocumentId = async (\n db: Database,\n knex: Knex,\n {\n joinColumn,\n inverseJoinColumn,\n tableName,\n joinTableName,\n }: {\n joinColumn: string;\n inverseJoinColumn: string;\n tableName: string;\n joinTableName: string;\n }\n): Promise<number[]> => {\n const res = await QUERIES[db.dialect.client as keyof typeof QUERIES](knex, {\n joinColumn,\n inverseJoinColumn,\n tableName,\n joinTableName,\n });\n\n if (res.length > 0) {\n const row = res[0];\n const otherIds = row.other_ids\n ? row.other_ids.split(',').map((v: string) => parseInt(v, 10))\n : [];\n\n return [row.id, ...otherIds];\n }\n\n return [];\n};\n\n// Migrate document ids for tables that have localizations\nconst migrateDocumentIdsWithLocalizations = async (db: Database, knex: Knex, meta: Meta) => {\n const singularName = meta.singularName.toLowerCase();\n const joinColumn = snakeCase(`${singularName}_id`);\n const inverseJoinColumn = snakeCase(`inv_${singularName}_id`);\n let ids: number[];\n\n do {\n ids = await getNextIdsToCreateDocumentId(db, knex, {\n joinColumn,\n inverseJoinColumn,\n tableName: meta.tableName,\n joinTableName: snakeCase(`${meta.tableName}_localizations_links`),\n });\n\n if (ids.length > 0) {\n await knex(meta.tableName).update({ document_id: createId() }).whereIn('id', ids);\n }\n } while (ids.length > 0);\n};\n\n// Migrate document ids for tables that don't have localizations\nconst migrationDocumentIds = async (db: Database, knex: Knex, meta: Meta) => {\n let updatedRows: number;\n\n do {\n updatedRows = await knex(meta.tableName)\n .update({ document_id: createId() })\n .whereIn(\n 'id',\n knex(meta.tableName)\n .select('id')\n .from(knex(meta.tableName).select('id').whereNull('document_id').limit(1).as('sub_query'))\n );\n } while (updatedRows > 0);\n};\n\nconst isDuplicateColumnError = (error: unknown): boolean => {\n if (!error || typeof error !== 'object') return false;\n const e = error as { code?: string; errno?: number; message?: string };\n if (e.code === '42701') return true;\n if (e.errno === 1060) return true;\n if (typeof e.message === 'string' && /duplicate column/i.test(e.message)) return true;\n return false;\n};\n\nconst createDocumentIdColumn = async (knex: Knex, tableName: string) => {\n try {\n await knex.schema.alterTable(tableName, (table) => {\n table.string('document_id');\n });\n } catch (error) {\n if (!isDuplicateColumnError(error)) {\n throw error;\n }\n }\n};\n\nconst hasLocalizationsJoinTable = async (knex: Knex, tableName: string) => {\n const joinTableName = snakeCase(`${tableName}_localizations_links`);\n return knex.schema.hasTable(joinTableName);\n};\n\nexport const createdDocumentId: Migration = {\n name: '5.0.0-02-created-document-id',\n async up(knex, db) {\n // do sth\n for (const meta of db.metadata.values()) {\n const hasTable = await knex.schema.hasTable(meta.tableName);\n\n if (!hasTable) {\n continue;\n }\n\n if ('documentId' in meta.attributes) {\n const hasDocumentIdColumn = await knex.schema.hasColumn(meta.tableName, 'document_id');\n\n if (!hasDocumentIdColumn) {\n await createDocumentIdColumn(knex, meta.tableName);\n }\n\n if (await hasLocalizationsJoinTable(knex, meta.tableName)) {\n await migrateDocumentIdsWithLocalizations(db, knex, meta);\n } else {\n await migrationDocumentIds(db, knex, meta);\n }\n }\n }\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["QUERIES","postgres","knex","params","res","raw","rows","mysql","sqlite","getNextIdsToCreateDocumentId","db","joinColumn","inverseJoinColumn","tableName","joinTableName","dialect","client","length","row","otherIds","other_ids","split","map","v","parseInt","id","migrateDocumentIdsWithLocalizations","meta","singularName","toLowerCase","snakeCase","ids","update","document_id","createId","whereIn","migrationDocumentIds","updatedRows","select","from","whereNull","limit","as","isDuplicateColumnError","error","e","code","errno","message","test","createDocumentIdColumn","schema","alterTable","table","string","hasLocalizationsJoinTable","hasTable","createdDocumentId","name","up","metadata","values","attributes","hasDocumentIdColumn","hasColumn","down","Error"],"mappings":";;;;;AA4BA,MAAMA,OAAAA,GAAU;IACd,MAAMC,QAAAA,CAAAA,CAASC,IAAU,EAAEC,MAAc,EAAA;AACvC,QAAA,MAAMC,GAAAA,GAAM,MAAMF,IAAAA,CAAKG,GAAG,CACxB;;;;;;;AAOJ,EAAA,CAAC,EACGF,MAAAA,CAAAA;AAGF,QAAA,OAAOC,IAAIE,IAAI;AACjB,IAAA,CAAA;IACA,MAAMC,KAAAA,CAAAA,CAAML,IAAU,EAAEC,MAAc,EAAA;AACpC,QAAA,MAAM,CAACC,GAAAA,CAAI,GAAG,MAAMF,IAAAA,CAAKG,GAAG,CAC1B;;;;;;;AAOJ,EAAA,CAAC,EACGF,MAAAA,CAAAA;QAGF,OAAOC,GAAAA;AACT,IAAA,CAAA;IACA,MAAMI,MAAAA,CAAAA,CAAON,IAAU,EAAEC,MAAc,EAAA;QACrC,OAAOD,IAAAA,CAAKG,GAAG,CACb;;;;;;;AAOF,IAAA,CAAC,EACCF,MAAAA,CAAAA;AAEJ,IAAA;AACF,CAAA;AAEA,MAAMM,4BAAAA,GAA+B,OACnCC,EAAAA,EACAR,IAAAA,EACA,EACES,UAAU,EACVC,iBAAiB,EACjBC,SAAS,EACTC,aAAa,EAMd,GAAA;IAED,MAAMV,GAAAA,GAAM,MAAMJ,OAAO,CAACU,EAAAA,CAAGK,OAAO,CAACC,MAAM,CAAyB,CAACd,IAAAA,EAAM;AACzES,QAAAA,UAAAA;AACAC,QAAAA,iBAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IAEA,IAAIV,GAAAA,CAAIa,MAAM,GAAG,CAAA,EAAG;QAClB,MAAMC,GAAAA,GAAMd,GAAG,CAAC,CAAA,CAAE;AAClB,QAAA,MAAMe,WAAWD,GAAAA,CAAIE,SAAS,GAC1BF,GAAAA,CAAIE,SAAS,CAACC,KAAK,CAAC,GAAA,CAAA,CAAKC,GAAG,CAAC,CAACC,IAAcC,QAAAA,CAASD,CAAAA,EAAG,OACxD,EAAE;QAEN,OAAO;AAACL,YAAAA,GAAAA,CAAIO,EAAE;AAAKN,YAAAA,GAAAA;AAAS,SAAA;AAC9B,IAAA;AAEA,IAAA,OAAO,EAAE;AACX,CAAA;AAEA;AACA,MAAMO,mCAAAA,GAAsC,OAAOhB,EAAAA,EAAcR,IAAAA,EAAYyB,IAAAA,GAAAA;AAC3E,IAAA,MAAMC,YAAAA,GAAeD,IAAAA,CAAKC,YAAY,CAACC,WAAW,EAAA;AAClD,IAAA,MAAMlB,UAAAA,GAAamB,WAAAA,CAAU,CAAA,EAAGF,YAAAA,CAAa,GAAG,CAAC,CAAA;AACjD,IAAA,MAAMhB,oBAAoBkB,WAAAA,CAAU,CAAC,IAAI,EAAEF,YAAAA,CAAa,GAAG,CAAC,CAAA;IAC5D,IAAIG,GAAAA;IAEJ,GAAG;QACDA,GAAAA,GAAM,MAAMtB,4BAAAA,CAA6BC,EAAAA,EAAIR,IAAAA,EAAM;AACjDS,YAAAA,UAAAA;AACAC,YAAAA,iBAAAA;AACAC,YAAAA,SAAAA,EAAWc,KAAKd,SAAS;AACzBC,YAAAA,aAAAA,EAAegB,YAAU,CAAA,EAAGH,IAAAA,CAAKd,SAAS,CAAC,oBAAoB,CAAC;AAClE,SAAA,CAAA;QAEA,IAAIkB,GAAAA,CAAId,MAAM,GAAG,CAAA,EAAG;AAClB,YAAA,MAAMf,IAAAA,CAAKyB,IAAAA,CAAKd,SAAS,CAAA,CAAEmB,MAAM,CAAC;gBAAEC,WAAAA,EAAaC,cAAAA;aAAW,CAAA,CAAGC,OAAO,CAAC,IAAA,EAAMJ,GAAAA,CAAAA;AAC/E,QAAA;IACF,CAAA,OAASA,GAAAA,CAAId,MAAM,GAAG,CAAA;AACxB,CAAA;AAEA;AACA,MAAMmB,oBAAAA,GAAuB,OAAO1B,EAAAA,EAAcR,IAAAA,EAAYyB,IAAAA,GAAAA;IAC5D,IAAIU,WAAAA;IAEJ,GAAG;AACDA,QAAAA,WAAAA,GAAc,MAAMnC,IAAAA,CAAKyB,IAAAA,CAAKd,SAAS,CAAA,CACpCmB,MAAM,CAAC;YAAEC,WAAAA,EAAaC,cAAAA;SAAW,CAAA,CACjCC,OAAO,CACN,IAAA,EACAjC,IAAAA,CAAKyB,IAAAA,CAAKd,SAAS,CAAA,CAChByB,MAAM,CAAC,IAAA,CAAA,CACPC,IAAI,CAACrC,IAAAA,CAAKyB,KAAKd,SAAS,CAAA,CAAEyB,MAAM,CAAC,IAAA,CAAA,CAAME,SAAS,CAAC,aAAA,CAAA,CAAeC,KAAK,CAAC,CAAA,CAAA,CAAGC,EAAE,CAAC,WAAA,CAAA,CAAA,CAAA;AAErF,IAAA,CAAA,OAASL,cAAc,CAAA;AACzB,CAAA;AAEA,MAAMM,yBAAyB,CAACC,KAAAA,GAAAA;AAC9B,IAAA,IAAI,CAACA,KAAAA,IAAS,OAAOA,KAAAA,KAAU,UAAU,OAAO,KAAA;AAChD,IAAA,MAAMC,CAAAA,GAAID,KAAAA;AACV,IAAA,IAAIC,CAAAA,CAAEC,IAAI,KAAK,OAAA,EAAS,OAAO,IAAA;AAC/B,IAAA,IAAID,CAAAA,CAAEE,KAAK,KAAK,IAAA,EAAM,OAAO,IAAA;IAC7B,IAAI,OAAOF,CAAAA,CAAEG,OAAO,KAAK,QAAA,IAAY,mBAAA,CAAoBC,IAAI,CAACJ,CAAAA,CAAEG,OAAO,CAAA,EAAG,OAAO,IAAA;IACjF,OAAO,KAAA;AACT,CAAA;AAEA,MAAME,sBAAAA,GAAyB,OAAOhD,IAAAA,EAAYW,SAAAA,GAAAA;IAChD,IAAI;AACF,QAAA,MAAMX,KAAKiD,MAAM,CAACC,UAAU,CAACvC,WAAW,CAACwC,KAAAA,GAAAA;AACvCA,YAAAA,KAAAA,CAAMC,MAAM,CAAC,aAAA,CAAA;AACf,QAAA,CAAA,CAAA;AACF,IAAA,CAAA,CAAE,OAAOV,KAAAA,EAAO;QACd,IAAI,CAACD,uBAAuBC,KAAAA,CAAAA,EAAQ;YAClC,MAAMA,KAAAA;AACR,QAAA;AACF,IAAA;AACF,CAAA;AAEA,MAAMW,yBAAAA,GAA4B,OAAOrD,IAAAA,EAAYW,SAAAA,GAAAA;AACnD,IAAA,MAAMC,aAAAA,GAAgBgB,WAAAA,CAAU,CAAA,EAAGjB,SAAAA,CAAU,oBAAoB,CAAC,CAAA;AAClE,IAAA,OAAOX,IAAAA,CAAKiD,MAAM,CAACK,QAAQ,CAAC1C,aAAAA,CAAAA;AAC9B,CAAA;MAEa2C,iBAAAA,GAA+B;IAC1CC,IAAAA,EAAM,8BAAA;IACN,MAAMC,EAAAA,CAAAA,CAAGzD,IAAI,EAAEQ,EAAE,EAAA;;AAEf,QAAA,KAAK,MAAMiB,IAAAA,IAAQjB,EAAAA,CAAGkD,QAAQ,CAACC,MAAM,EAAA,CAAI;YACvC,MAAML,QAAAA,GAAW,MAAMtD,IAAAA,CAAKiD,MAAM,CAACK,QAAQ,CAAC7B,KAAKd,SAAS,CAAA;AAE1D,YAAA,IAAI,CAAC2C,QAAAA,EAAU;AACb,gBAAA;AACF,YAAA;YAEA,IAAI,YAAA,IAAgB7B,IAAAA,CAAKmC,UAAU,EAAE;gBACnC,MAAMC,mBAAAA,GAAsB,MAAM7D,IAAAA,CAAKiD,MAAM,CAACa,SAAS,CAACrC,IAAAA,CAAKd,SAAS,EAAE,aAAA,CAAA;AAExE,gBAAA,IAAI,CAACkD,mBAAAA,EAAqB;oBACxB,MAAMb,sBAAAA,CAAuBhD,IAAAA,EAAMyB,IAAAA,CAAKd,SAAS,CAAA;AACnD,gBAAA;AAEA,gBAAA,IAAI,MAAM0C,yBAAAA,CAA0BrD,IAAAA,EAAMyB,IAAAA,CAAKd,SAAS,CAAA,EAAG;oBACzD,MAAMa,mCAAAA,CAAoChB,IAAIR,IAAAA,EAAMyB,IAAAA,CAAAA;gBACtD,CAAA,MAAO;oBACL,MAAMS,oBAAAA,CAAqB1B,IAAIR,IAAAA,EAAMyB,IAAAA,CAAAA;AACvC,gBAAA;AACF,YAAA;AACF,QAAA;AACF,IAAA,CAAA;IACA,MAAMsC,IAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAM,IAAIC,KAAAA,CAAM,iBAAA,CAAA;AAClB,IAAA;AACF;;;;"}
|
|
@@ -81,10 +81,24 @@ const migrationDocumentIds = async (db, knex, meta)=>{
|
|
|
81
81
|
}).whereIn('id', knex(meta.tableName).select('id').from(knex(meta.tableName).select('id').whereNull('document_id').limit(1).as('sub_query')));
|
|
82
82
|
}while (updatedRows > 0)
|
|
83
83
|
};
|
|
84
|
+
const isDuplicateColumnError = (error)=>{
|
|
85
|
+
if (!error || typeof error !== 'object') return false;
|
|
86
|
+
const e = error;
|
|
87
|
+
if (e.code === '42701') return true;
|
|
88
|
+
if (e.errno === 1060) return true;
|
|
89
|
+
if (typeof e.message === 'string' && /duplicate column/i.test(e.message)) return true;
|
|
90
|
+
return false;
|
|
91
|
+
};
|
|
84
92
|
const createDocumentIdColumn = async (knex, tableName)=>{
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
93
|
+
try {
|
|
94
|
+
await knex.schema.alterTable(tableName, (table)=>{
|
|
95
|
+
table.string('document_id');
|
|
96
|
+
});
|
|
97
|
+
} catch (error) {
|
|
98
|
+
if (!isDuplicateColumnError(error)) {
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
88
102
|
};
|
|
89
103
|
const hasLocalizationsJoinTable = async (knex, tableName)=>{
|
|
90
104
|
const joinTableName = snakeCase(`${tableName}_localizations_links`);
|
|
@@ -100,12 +114,10 @@ const createdDocumentId = {
|
|
|
100
114
|
continue;
|
|
101
115
|
}
|
|
102
116
|
if ('documentId' in meta.attributes) {
|
|
103
|
-
// add column if doesn't exist
|
|
104
117
|
const hasDocumentIdColumn = await knex.schema.hasColumn(meta.tableName, 'document_id');
|
|
105
|
-
if (hasDocumentIdColumn) {
|
|
106
|
-
|
|
118
|
+
if (!hasDocumentIdColumn) {
|
|
119
|
+
await createDocumentIdColumn(knex, meta.tableName);
|
|
107
120
|
}
|
|
108
|
-
await createDocumentIdColumn(knex, meta.tableName);
|
|
109
121
|
if (await hasLocalizationsJoinTable(knex, meta.tableName)) {
|
|
110
122
|
await migrateDocumentIdsWithLocalizations(db, knex, meta);
|
|
111
123
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"5.0.0-02-document-id.mjs","sources":["../../../src/migrations/internal-migrations/5.0.0-02-document-id.ts"],"sourcesContent":["/**\n * NOTE: This migration avoids using the `identifiers` utility.\n * As the `5.0.0-01-convert-identifiers-long-than-max-length`\n * migration does not convert the `localizations` join tables, as they are not\n * tables that exist anymore in v5 and are not in the db metadata.\n *\n * This migration therefore relies on the fact that those tables still exist, and\n * references them directly.\n *\n * Database join table name: `categories_localizations_links`\n * Actual `identifiers` returned join table name: `categories_localizations_lnk`\n *\n */\nimport { createId } from '@paralleldrive/cuid2';\nimport { snakeCase } from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport type { Migration } from '../common';\nimport type { Database } from '../..';\nimport type { Meta } from '../../metadata';\n\ninterface Params {\n joinColumn: string;\n inverseJoinColumn: string;\n tableName: string;\n joinTableName: string;\n}\n\nconst QUERIES = {\n async postgres(knex: Knex, params: Params) {\n const res = await knex.raw(\n `\n SELECT :tableName:.id as id, string_agg(DISTINCT :inverseJoinColumn:::character varying, ',') as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :tableName:.id, :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n\n return res.rows;\n },\n async mysql(knex: Knex, params: Params) {\n const [res] = await knex.raw(\n `\n SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :tableName:.id, :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n\n return res;\n },\n async sqlite(knex: Knex, params: Params) {\n return knex.raw(\n `\n SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n },\n};\n\nconst getNextIdsToCreateDocumentId = async (\n db: Database,\n knex: Knex,\n {\n joinColumn,\n inverseJoinColumn,\n tableName,\n joinTableName,\n }: {\n joinColumn: string;\n inverseJoinColumn: string;\n tableName: string;\n joinTableName: string;\n }\n): Promise<number[]> => {\n const res = await QUERIES[db.dialect.client as keyof typeof QUERIES](knex, {\n joinColumn,\n inverseJoinColumn,\n tableName,\n joinTableName,\n });\n\n if (res.length > 0) {\n const row = res[0];\n const otherIds = row.other_ids\n ? row.other_ids.split(',').map((v: string) => parseInt(v, 10))\n : [];\n\n return [row.id, ...otherIds];\n }\n\n return [];\n};\n\n// Migrate document ids for tables that have localizations\nconst migrateDocumentIdsWithLocalizations = async (db: Database, knex: Knex, meta: Meta) => {\n const singularName = meta.singularName.toLowerCase();\n const joinColumn = snakeCase(`${singularName}_id`);\n const inverseJoinColumn = snakeCase(`inv_${singularName}_id`);\n let ids: number[];\n\n do {\n ids = await getNextIdsToCreateDocumentId(db, knex, {\n joinColumn,\n inverseJoinColumn,\n tableName: meta.tableName,\n joinTableName: snakeCase(`${meta.tableName}_localizations_links`),\n });\n\n if (ids.length > 0) {\n await knex(meta.tableName).update({ document_id: createId() }).whereIn('id', ids);\n }\n } while (ids.length > 0);\n};\n\n// Migrate document ids for tables that don't have localizations\nconst migrationDocumentIds = async (db: Database, knex: Knex, meta: Meta) => {\n let updatedRows: number;\n\n do {\n updatedRows = await knex(meta.tableName)\n .update({ document_id: createId() })\n .whereIn(\n 'id',\n knex(meta.tableName)\n .select('id')\n .from(knex(meta.tableName).select('id').whereNull('document_id').limit(1).as('sub_query'))\n );\n } while (updatedRows > 0);\n};\n\nconst createDocumentIdColumn = async (knex: Knex, tableName: string) => {\n await knex.schema.alterTable(tableName, (table) => {\n table.string('document_id');\n });\n};\n\nconst hasLocalizationsJoinTable = async (knex: Knex, tableName: string) => {\n const joinTableName = snakeCase(`${tableName}_localizations_links`);\n return knex.schema.hasTable(joinTableName);\n};\n\nexport const createdDocumentId: Migration = {\n name: '5.0.0-02-created-document-id',\n async up(knex, db) {\n // do sth\n for (const meta of db.metadata.values()) {\n const hasTable = await knex.schema.hasTable(meta.tableName);\n\n if (!hasTable) {\n continue;\n }\n\n if ('documentId' in meta.attributes) {\n // add column if doesn't exist\n const hasDocumentIdColumn = await knex.schema.hasColumn(meta.tableName, 'document_id');\n\n if (hasDocumentIdColumn) {\n continue;\n }\n\n await createDocumentIdColumn(knex, meta.tableName);\n\n if (await hasLocalizationsJoinTable(knex, meta.tableName)) {\n await migrateDocumentIdsWithLocalizations(db, knex, meta);\n } else {\n await migrationDocumentIds(db, knex, meta);\n }\n }\n }\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["QUERIES","postgres","knex","params","res","raw","rows","mysql","sqlite","getNextIdsToCreateDocumentId","db","joinColumn","inverseJoinColumn","tableName","joinTableName","dialect","client","length","row","otherIds","other_ids","split","map","v","parseInt","id","migrateDocumentIdsWithLocalizations","meta","singularName","toLowerCase","snakeCase","ids","update","document_id","createId","whereIn","migrationDocumentIds","updatedRows","select","from","whereNull","limit","as","createDocumentIdColumn","schema","alterTable","table","string","hasLocalizationsJoinTable","hasTable","createdDocumentId","name","up","metadata","values","attributes","hasDocumentIdColumn","hasColumn","down","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"5.0.0-02-document-id.mjs","sources":["../../../src/migrations/internal-migrations/5.0.0-02-document-id.ts"],"sourcesContent":["/**\n * NOTE: This migration avoids using the `identifiers` utility.\n * As the `5.0.0-01-convert-identifiers-long-than-max-length`\n * migration does not convert the `localizations` join tables, as they are not\n * tables that exist anymore in v5 and are not in the db metadata.\n *\n * This migration therefore relies on the fact that those tables still exist, and\n * references them directly.\n *\n * Database join table name: `categories_localizations_links`\n * Actual `identifiers` returned join table name: `categories_localizations_lnk`\n *\n */\nimport { createId } from '@paralleldrive/cuid2';\nimport { snakeCase } from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport type { Migration } from '../common';\nimport type { Database } from '../..';\nimport type { Meta } from '../../metadata';\n\ninterface Params {\n joinColumn: string;\n inverseJoinColumn: string;\n tableName: string;\n joinTableName: string;\n}\n\nconst QUERIES = {\n async postgres(knex: Knex, params: Params) {\n const res = await knex.raw(\n `\n SELECT :tableName:.id as id, string_agg(DISTINCT :inverseJoinColumn:::character varying, ',') as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :tableName:.id, :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n\n return res.rows;\n },\n async mysql(knex: Knex, params: Params) {\n const [res] = await knex.raw(\n `\n SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :tableName:.id, :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n\n return res;\n },\n async sqlite(knex: Knex, params: Params) {\n return knex.raw(\n `\n SELECT :tableName:.id as id, group_concat(DISTINCT :inverseJoinColumn:) as other_ids\n FROM :tableName:\n LEFT JOIN :joinTableName: ON :tableName:.id = :joinTableName:.:joinColumn:\n WHERE :tableName:.document_id IS NULL\n GROUP BY :joinTableName:.:joinColumn:\n LIMIT 1;\n `,\n params\n );\n },\n};\n\nconst getNextIdsToCreateDocumentId = async (\n db: Database,\n knex: Knex,\n {\n joinColumn,\n inverseJoinColumn,\n tableName,\n joinTableName,\n }: {\n joinColumn: string;\n inverseJoinColumn: string;\n tableName: string;\n joinTableName: string;\n }\n): Promise<number[]> => {\n const res = await QUERIES[db.dialect.client as keyof typeof QUERIES](knex, {\n joinColumn,\n inverseJoinColumn,\n tableName,\n joinTableName,\n });\n\n if (res.length > 0) {\n const row = res[0];\n const otherIds = row.other_ids\n ? row.other_ids.split(',').map((v: string) => parseInt(v, 10))\n : [];\n\n return [row.id, ...otherIds];\n }\n\n return [];\n};\n\n// Migrate document ids for tables that have localizations\nconst migrateDocumentIdsWithLocalizations = async (db: Database, knex: Knex, meta: Meta) => {\n const singularName = meta.singularName.toLowerCase();\n const joinColumn = snakeCase(`${singularName}_id`);\n const inverseJoinColumn = snakeCase(`inv_${singularName}_id`);\n let ids: number[];\n\n do {\n ids = await getNextIdsToCreateDocumentId(db, knex, {\n joinColumn,\n inverseJoinColumn,\n tableName: meta.tableName,\n joinTableName: snakeCase(`${meta.tableName}_localizations_links`),\n });\n\n if (ids.length > 0) {\n await knex(meta.tableName).update({ document_id: createId() }).whereIn('id', ids);\n }\n } while (ids.length > 0);\n};\n\n// Migrate document ids for tables that don't have localizations\nconst migrationDocumentIds = async (db: Database, knex: Knex, meta: Meta) => {\n let updatedRows: number;\n\n do {\n updatedRows = await knex(meta.tableName)\n .update({ document_id: createId() })\n .whereIn(\n 'id',\n knex(meta.tableName)\n .select('id')\n .from(knex(meta.tableName).select('id').whereNull('document_id').limit(1).as('sub_query'))\n );\n } while (updatedRows > 0);\n};\n\nconst isDuplicateColumnError = (error: unknown): boolean => {\n if (!error || typeof error !== 'object') return false;\n const e = error as { code?: string; errno?: number; message?: string };\n if (e.code === '42701') return true;\n if (e.errno === 1060) return true;\n if (typeof e.message === 'string' && /duplicate column/i.test(e.message)) return true;\n return false;\n};\n\nconst createDocumentIdColumn = async (knex: Knex, tableName: string) => {\n try {\n await knex.schema.alterTable(tableName, (table) => {\n table.string('document_id');\n });\n } catch (error) {\n if (!isDuplicateColumnError(error)) {\n throw error;\n }\n }\n};\n\nconst hasLocalizationsJoinTable = async (knex: Knex, tableName: string) => {\n const joinTableName = snakeCase(`${tableName}_localizations_links`);\n return knex.schema.hasTable(joinTableName);\n};\n\nexport const createdDocumentId: Migration = {\n name: '5.0.0-02-created-document-id',\n async up(knex, db) {\n // do sth\n for (const meta of db.metadata.values()) {\n const hasTable = await knex.schema.hasTable(meta.tableName);\n\n if (!hasTable) {\n continue;\n }\n\n if ('documentId' in meta.attributes) {\n const hasDocumentIdColumn = await knex.schema.hasColumn(meta.tableName, 'document_id');\n\n if (!hasDocumentIdColumn) {\n await createDocumentIdColumn(knex, meta.tableName);\n }\n\n if (await hasLocalizationsJoinTable(knex, meta.tableName)) {\n await migrateDocumentIdsWithLocalizations(db, knex, meta);\n } else {\n await migrationDocumentIds(db, knex, meta);\n }\n }\n }\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["QUERIES","postgres","knex","params","res","raw","rows","mysql","sqlite","getNextIdsToCreateDocumentId","db","joinColumn","inverseJoinColumn","tableName","joinTableName","dialect","client","length","row","otherIds","other_ids","split","map","v","parseInt","id","migrateDocumentIdsWithLocalizations","meta","singularName","toLowerCase","snakeCase","ids","update","document_id","createId","whereIn","migrationDocumentIds","updatedRows","select","from","whereNull","limit","as","isDuplicateColumnError","error","e","code","errno","message","test","createDocumentIdColumn","schema","alterTable","table","string","hasLocalizationsJoinTable","hasTable","createdDocumentId","name","up","metadata","values","attributes","hasDocumentIdColumn","hasColumn","down","Error"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/database",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.44.0",
|
|
4
4
|
"description": "Strapi's database layer",
|
|
5
5
|
"homepage": "https://strapi.io",
|
|
6
6
|
"bugs": {
|
|
@@ -43,20 +43,20 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@paralleldrive/cuid2": "2.2.2",
|
|
46
|
-
"@strapi/utils": "5.
|
|
46
|
+
"@strapi/utils": "5.44.0",
|
|
47
47
|
"ajv": "8.18.0",
|
|
48
48
|
"date-fns": "2.30.0",
|
|
49
49
|
"debug": "4.3.4",
|
|
50
|
-
"fs-extra": "11.
|
|
50
|
+
"fs-extra": "11.3.4",
|
|
51
51
|
"knex": "3.0.1",
|
|
52
52
|
"lodash": "4.18.1",
|
|
53
|
-
"semver": "7.
|
|
53
|
+
"semver": "7.7.4",
|
|
54
54
|
"umzug": "3.8.1"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@types/fs-extra": "11.0.4",
|
|
58
|
-
"eslint-config-custom": "5.
|
|
59
|
-
"tsconfig": "5.
|
|
58
|
+
"eslint-config-custom": "5.44.0",
|
|
59
|
+
"tsconfig": "5.44.0"
|
|
60
60
|
},
|
|
61
61
|
"engines": {
|
|
62
62
|
"node": ">=20.0.0 <=24.x.x",
|