-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3_create_task_table.ts
92 lines (83 loc) · 2.54 KB
/
3_create_task_table.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { Knex } from 'knex'
import { addTimestampColumns } from '../timestamps'
import { addPrimaryKey } from '../uuid-oosp/migration'
import { TaskActionKind } from '../../models/TaskAction'
const addTaskEventColumns = ({
knex,
table,
}: {
table: Knex.CreateTableBuilder | Knex.AlterTableBuilder
knex: Knex
}) => {
addPrimaryKey({ knex, table })
table.uuid('taskId').notNullable()
table
.foreign('taskId')
.references('id')
.inTable('task')
.onDelete('CASCADE')
.onUpdate('CASCADE')
table.uuid('userId').notNullable()
table
.foreign('userId')
.references('id')
.inTable('user')
.onDelete('CASCADE')
.onUpdate('CASCADE')
addTimestampColumns({ knex, table })
}
export async function up(knex: Knex) {
await knex.schema.createTable('task', (table) => {
addPrimaryKey({ knex, table })
table.string('title').notNullable()
table.timestamp('dueAt').notNullable()
addTimestampColumns({ knex, table })
})
await knex.schema.createTable('taskAssignee', (table) => {
table.uuid('taskId').notNullable()
table
.foreign('taskId')
.references('id')
.inTable('task')
.onDelete('CASCADE')
.onUpdate('CASCADE')
table.uuid('userId').notNullable()
table
.foreign('userId')
.references('id')
.inTable('user')
.onDelete('CASCADE')
.onUpdate('CASCADE')
table.primary(['taskId', 'userId'])
})
await knex.schema.createTable('taskSeenEvent', (table) => {
addTaskEventColumns({ knex, table })
})
await knex.schema.createTable('taskAction', (table) => {
addTaskEventColumns({ knex, table })
table.enu('kind', Object.values(TaskActionKind), {
useNative: true,
enumName: 'TaskActionKind',
})
})
await knex.schema.createTable('taskComment', (table) => {
addTaskEventColumns({ knex, table })
table.text('note')
})
await knex.schema.createView('taskNotificationEvent', (viewBuilder) => {
viewBuilder.as(
knex('taskAction')
.select(['taskId', 'userId', 'createdAt'])
.unionAll(knex('taskComment').select(['taskId', 'userId', 'createdAt']))
)
})
}
export async function down(knex: Knex) {
await knex.schema.dropViewIfExists('taskNotificationEvent')
await knex.schema.dropTableIfExists('taskComment')
await knex.schema.dropTableIfExists('taskAction')
await knex.schema.raw('DROP TYPE IF EXISTS "TaskActionKind"')
await knex.schema.dropTableIfExists('taskSeenEvent')
await knex.schema.dropTableIfExists('taskAssignee')
await knex.schema.dropTableIfExists('task')
}