@contember/schema-migrations 1.0.0-rc.9 → 1.0.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.
Files changed (47) hide show
  1. package/dist/src/SchemaDiffer.d.ts.map +1 -1
  2. package/dist/src/SchemaDiffer.js +1 -0
  3. package/dist/src/SchemaDiffer.js.map +1 -1
  4. package/dist/src/modifications/ModificationHandlerFactory.d.ts.map +1 -1
  5. package/dist/src/modifications/ModificationHandlerFactory.js +1 -0
  6. package/dist/src/modifications/ModificationHandlerFactory.js.map +1 -1
  7. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts.map +1 -1
  8. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js +8 -5
  9. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  10. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts +10 -0
  11. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts.map +1 -0
  12. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js +84 -0
  13. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js.map +1 -0
  14. package/dist/src/modifications/relations/CreateRelationModification.d.ts.map +1 -1
  15. package/dist/src/modifications/relations/CreateRelationModification.js +4 -30
  16. package/dist/src/modifications/relations/CreateRelationModification.js.map +1 -1
  17. package/dist/src/modifications/relations/index.d.ts +1 -0
  18. package/dist/src/modifications/relations/index.d.ts.map +1 -1
  19. package/dist/src/modifications/relations/index.js +1 -0
  20. package/dist/src/modifications/relations/index.js.map +1 -1
  21. package/dist/src/modifications/utils/createJunctionTable.d.ts +4 -0
  22. package/dist/src/modifications/utils/createJunctionTable.d.ts.map +1 -0
  23. package/dist/src/modifications/utils/createJunctionTable.js +33 -0
  24. package/dist/src/modifications/utils/createJunctionTable.js.map +1 -0
  25. package/dist/src/modifications/utils/getPrimaryColumnType.d.ts +3 -0
  26. package/dist/src/modifications/utils/getPrimaryColumnType.d.ts.map +1 -0
  27. package/dist/src/modifications/utils/getPrimaryColumnType.js +9 -0
  28. package/dist/src/modifications/utils/getPrimaryColumnType.js.map +1 -0
  29. package/dist/src/tsconfig.tsbuildinfo +1 -1
  30. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.d.ts +2 -0
  31. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.d.ts.map +1 -0
  32. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js +92 -0
  33. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js.map +1 -0
  34. package/dist/tests/cases/integration/updateColumnDefinition.test.js +1 -1
  35. package/dist/tests/cases/integration/updateColumnDefinition.test.js.map +1 -1
  36. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +6 -6
  38. package/src/SchemaDiffer.ts +2 -0
  39. package/src/modifications/ModificationHandlerFactory.ts +2 -0
  40. package/src/modifications/columns/UpdateColumnDefinitionModification.ts +8 -6
  41. package/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.ts +109 -0
  42. package/src/modifications/relations/CreateRelationModification.ts +4 -34
  43. package/src/modifications/relations/index.ts +1 -0
  44. package/src/modifications/utils/createJunctionTable.ts +40 -0
  45. package/src/modifications/utils/getPrimaryColumnType.ts +6 -0
  46. package/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.ts +81 -0
  47. package/tests/cases/integration/updateColumnDefinition.test.ts +1 -1
@@ -9,14 +9,11 @@ import {
9
9
  import { MigrationBuilder } from '@contember/database-migrations'
10
10
  import { addField, SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'
11
11
  import { ModificationHandlerStatic } from '../ModificationHandler'
12
- import { createEventTrigger, createEventTrxTrigger } from '../utils/sqlUpdateUtils'
13
12
  import { isIt } from '../../utils/isIt'
14
13
  import { createFields } from '../utils/diffUtils'
14
+ import { getPrimaryColumnType } from '../utils/getPrimaryColumnType'
15
+ import { createJunctionTableSql } from '../utils/createJunctionTable'
15
16
 
16
- const getPrimaryType = (entity: Model.Entity): string => {
17
- const column = entity.fields[entity.primary] as Model.AnyColumn
18
- return column.columnType
19
- }
20
17
 
21
18
  export const CreateRelationModification: ModificationHandlerStatic<CreateRelationModificationData> = class {
22
19
  static id = 'createRelation'
@@ -32,7 +29,7 @@ export const CreateRelationModification: ModificationHandlerStatic<CreateRelatio
32
29
  const createOwningSide = (relation: Model.OneHasOneOwningRelation | Model.ManyHasOneRelation) => {
33
30
  builder.addColumn(entity.tableName, {
34
31
  [relation.joiningColumn.columnName]: {
35
- type: getPrimaryType(targetEntity),
32
+ type: getPrimaryColumnType(targetEntity),
36
33
  notNull: !relation.nullable,
37
34
  },
38
35
  })
@@ -65,34 +62,7 @@ export const CreateRelationModification: ModificationHandlerStatic<CreateRelatio
65
62
  },
66
63
  visitOneHasOneInverse: () => {},
67
64
  visitManyHasManyOwning: ({}, relation, {}, _) => {
68
- const primaryColumns = [
69
- relation.joiningTable.joiningColumn.columnName,
70
- relation.joiningTable.inverseJoiningColumn.columnName,
71
- ]
72
- builder.createTable(
73
- relation.joiningTable.tableName,
74
- {
75
- [relation.joiningTable.joiningColumn.columnName]: {
76
- type: getPrimaryType(entity),
77
- notNull: true,
78
- references: `"${entity.tableName}"("${entity.primaryColumn}")`,
79
- onDelete: 'CASCADE',
80
- },
81
- [relation.joiningTable.inverseJoiningColumn.columnName]: {
82
- type: getPrimaryType(targetEntity),
83
- notNull: true,
84
- references: `"${targetEntity.tableName}"("${targetEntity.primaryColumn}")`,
85
- onDelete: 'CASCADE',
86
- },
87
- },
88
- {
89
- constraints: {
90
- primaryKey: primaryColumns,
91
- },
92
- },
93
- )
94
- createEventTrigger(builder, relation.joiningTable.tableName, primaryColumns)
95
- createEventTrxTrigger(builder, relation.joiningTable.tableName)
65
+ createJunctionTableSql(builder, entity, targetEntity, relation)
96
66
  },
97
67
  visitManyHasManyInverse: () => {},
98
68
  })
@@ -1,3 +1,4 @@
1
+ export * from './ConvertOneHasManyToManyHasManyRelationModification'
1
2
  export * from './ConvertOneToManyRelationModification'
2
3
  export * from './CreateRelationInverseSideModification'
3
4
  export * from './CreateRelationModification'
@@ -0,0 +1,40 @@
1
+ import { createEventTrigger, createEventTrxTrigger } from './sqlUpdateUtils'
2
+ import { MigrationBuilder } from '@contember/database-migrations'
3
+ import { Model } from '@contember/schema'
4
+ import { getPrimaryColumnType } from './getPrimaryColumnType'
5
+
6
+ export const createJunctionTableSql = (
7
+ builder: MigrationBuilder,
8
+ entity: Model.Entity,
9
+ targetEntity: Model.Entity,
10
+ relation: Model.ManyHasManyOwningRelation,
11
+ ) => {
12
+ const primaryColumns = [
13
+ relation.joiningTable.joiningColumn.columnName,
14
+ relation.joiningTable.inverseJoiningColumn.columnName,
15
+ ]
16
+ builder.createTable(
17
+ relation.joiningTable.tableName,
18
+ {
19
+ [relation.joiningTable.joiningColumn.columnName]: {
20
+ type: getPrimaryColumnType(entity),
21
+ notNull: true,
22
+ references: `"${entity.tableName}"("${entity.primaryColumn}")`,
23
+ onDelete: 'CASCADE',
24
+ },
25
+ [relation.joiningTable.inverseJoiningColumn.columnName]: {
26
+ type: getPrimaryColumnType(targetEntity),
27
+ notNull: true,
28
+ references: `"${targetEntity.tableName}"("${targetEntity.primaryColumn}")`,
29
+ onDelete: 'CASCADE',
30
+ },
31
+ },
32
+ {
33
+ constraints: {
34
+ primaryKey: primaryColumns,
35
+ },
36
+ },
37
+ )
38
+ createEventTrigger(builder, relation.joiningTable.tableName, primaryColumns)
39
+ createEventTrxTrigger(builder, relation.joiningTable.tableName)
40
+ }
@@ -0,0 +1,6 @@
1
+ import { Model } from '@contember/schema'
2
+
3
+ export const getPrimaryColumnType = (entity: Model.Entity): string => {
4
+ const column = entity.fields[entity.primary] as Model.AnyColumn
5
+ return column.columnType
6
+ }
@@ -0,0 +1,81 @@
1
+ import { testMigrations } from '../../src/tests'
2
+ import { SQL } from '../../src/tags'
3
+ import { SchemaDefinition as def } from '@contember/schema-definition'
4
+
5
+ namespace ConvertOHMToMHMSchemaOrig {
6
+ export class Article {
7
+ title = def.stringColumn()
8
+ category = def.manyHasOne(Category, 'articles')
9
+ }
10
+
11
+ export class Category {
12
+ articles = def.oneHasMany(Article, 'category')
13
+ }
14
+ }
15
+
16
+ namespace ConvertOHMToMHMSchemaOrigUpdated {
17
+ export class Article {
18
+ title = def.stringColumn()
19
+ categories = def.manyHasMany(Category, 'articles')
20
+ }
21
+
22
+ export class Category {
23
+ articles = def.manyHasManyInverse(Article, 'categories')
24
+ }
25
+ }
26
+
27
+
28
+ testMigrations('convert one has many to many has many', {
29
+ originalSchema: def.createModel(ConvertOHMToMHMSchemaOrig),
30
+ updatedSchema: def.createModel(ConvertOHMToMHMSchemaOrigUpdated),
31
+ diff: [
32
+ {
33
+ modification: 'convertOneHasManyToManyHasManyRelation',
34
+ entityName: 'Article',
35
+ fieldName: 'category',
36
+ owningSide: {
37
+ type: 'ManyHasMany',
38
+ name: 'categories',
39
+ inversedBy: 'articles',
40
+ target: 'Category',
41
+ joiningTable: {
42
+ tableName: 'article_categories',
43
+ joiningColumn: {
44
+ columnName: 'article_id',
45
+ onDelete: 'cascade',
46
+ },
47
+ inverseJoiningColumn: {
48
+ columnName: 'category_id',
49
+ onDelete: 'cascade',
50
+ },
51
+ },
52
+ },
53
+ inverseSide: {
54
+ name: 'articles',
55
+ ownedBy: 'categories',
56
+ target: 'Article',
57
+ type: 'ManyHasMany',
58
+ },
59
+ },
60
+ ],
61
+ sql: SQL`
62
+ CREATE TABLE "article_categories" (
63
+ "article_id" uuid NOT NULL REFERENCES "article"("id") ON DELETE CASCADE,
64
+ "category_id" uuid NOT NULL REFERENCES "category"("id") ON DELETE CASCADE, CONSTRAINT
65
+ "article_categories_pkey" PRIMARY KEY ("article_id", "category_id")
66
+ );
67
+
68
+ CREATE TRIGGER "log_event" AFTER INSERT OR UPDATE OR DELETE
69
+ ON "article_categories" FOR EACH ROW
70
+ EXECUTE PROCEDURE "system"."trigger_event"($pga$article_id$pga$, $pga$category_id$pga$);
71
+
72
+ CREATE CONSTRAINT TRIGGER "log_event_trx" AFTER INSERT OR UPDATE OR DELETE
73
+ ON "article_categories" DEFERRABLE INITIALLY DEFERRED FOR EACH ROW
74
+ EXECUTE PROCEDURE "system"."trigger_event_commit"();
75
+
76
+ INSERT INTO "article_categories" ( "article_id", "category_id" )
77
+ SELECT "id", "category_id" FROM "article" WHERE "category_id" IS NOT NULL;
78
+
79
+ ALTER TABLE "article" DROP "category_id";
80
+ `,
81
+ })
@@ -29,5 +29,5 @@ testMigrations('update column definition', {
29
29
  },
30
30
  ],
31
31
  sql: SQL`ALTER TABLE "author"
32
- ALTER "registered_at" SET DATA TYPE timestamptz;`,
32
+ ALTER "registered_at" SET DATA TYPE timestamptz USING "registered_at"::timestamptz;`,
33
33
  })