@contember/schema-migrations 1.0.0-rc.13 → 1.0.0-rc.16

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 (40) 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/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts +10 -0
  8. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts.map +1 -0
  9. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js +84 -0
  10. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js.map +1 -0
  11. package/dist/src/modifications/relations/CreateRelationModification.d.ts.map +1 -1
  12. package/dist/src/modifications/relations/CreateRelationModification.js +4 -30
  13. package/dist/src/modifications/relations/CreateRelationModification.js.map +1 -1
  14. package/dist/src/modifications/relations/index.d.ts +1 -0
  15. package/dist/src/modifications/relations/index.d.ts.map +1 -1
  16. package/dist/src/modifications/relations/index.js +1 -0
  17. package/dist/src/modifications/relations/index.js.map +1 -1
  18. package/dist/src/modifications/utils/createJunctionTable.d.ts +4 -0
  19. package/dist/src/modifications/utils/createJunctionTable.d.ts.map +1 -0
  20. package/dist/src/modifications/utils/createJunctionTable.js +33 -0
  21. package/dist/src/modifications/utils/createJunctionTable.js.map +1 -0
  22. package/dist/src/modifications/utils/getPrimaryColumnType.d.ts +3 -0
  23. package/dist/src/modifications/utils/getPrimaryColumnType.d.ts.map +1 -0
  24. package/dist/src/modifications/utils/getPrimaryColumnType.js +9 -0
  25. package/dist/src/modifications/utils/getPrimaryColumnType.js.map +1 -0
  26. package/dist/src/tsconfig.tsbuildinfo +1 -1
  27. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.d.ts +2 -0
  28. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.d.ts.map +1 -0
  29. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js +92 -0
  30. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js.map +1 -0
  31. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +6 -6
  33. package/src/SchemaDiffer.ts +2 -0
  34. package/src/modifications/ModificationHandlerFactory.ts +2 -0
  35. package/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.ts +109 -0
  36. package/src/modifications/relations/CreateRelationModification.ts +4 -34
  37. package/src/modifications/relations/index.ts +1 -0
  38. package/src/modifications/utils/createJunctionTable.ts +40 -0
  39. package/src/modifications/utils/getPrimaryColumnType.ts +6 -0
  40. package/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.ts +81 -0
@@ -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
+ })