@loomcore/api 0.1.75 → 0.1.76
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/LICENSE +201 -201
- package/README.md +77 -77
- package/dist/__tests__/postgres-test-migrations/postgres-test-schema.js +315 -240
- package/dist/__tests__/postgres.test-database.js +8 -8
- package/dist/databases/migrations/migration-runner.js +21 -21
- package/dist/databases/operations/__tests__/models/client-report.model.d.ts +24 -0
- package/dist/databases/operations/__tests__/models/client-report.model.js +3 -1
- package/dist/databases/operations/__tests__/models/policy.model.d.ts +30 -0
- package/dist/databases/operations/__tests__/models/policy.model.js +9 -0
- package/dist/databases/postgres/commands/postgres-batch-update.command.js +7 -7
- package/dist/databases/postgres/commands/postgres-create-many.command.js +4 -4
- package/dist/databases/postgres/commands/postgres-create.command.js +4 -4
- package/dist/databases/postgres/commands/postgres-full-update-by-id.command.js +13 -13
- package/dist/databases/postgres/commands/postgres-partial-update-by-id.command.js +7 -7
- package/dist/databases/postgres/commands/postgres-update.command.js +7 -7
- package/dist/databases/postgres/migrations/postgres-initial-schema.js +197 -197
- package/dist/databases/postgres/postgres.database.js +17 -17
- package/dist/databases/postgres/utils/build-join-clauses.js +199 -24
- package/dist/databases/postgres/utils/build-select-clause.js +27 -7
- package/dist/databases/postgres/utils/does-table-exist.util.js +4 -4
- package/dist/databases/postgres/utils/transform-join-results.js +38 -6
- package/package.json +92 -92
|
@@ -5,22 +5,22 @@ export const getPostgresTestSchema = (config) => {
|
|
|
5
5
|
name: '00000000000100_schema-test-entities',
|
|
6
6
|
up: async ({ context: pool }) => {
|
|
7
7
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
8
|
-
await pool.query(`
|
|
9
|
-
CREATE TABLE IF NOT EXISTS "testEntities" (
|
|
10
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
11
|
-
${orgColumnDef}
|
|
12
|
-
"name" VARCHAR(255) NOT NULL,
|
|
13
|
-
"description" TEXT,
|
|
14
|
-
"isActive" BOOLEAN,
|
|
15
|
-
"tags" TEXT[],
|
|
16
|
-
"count" INTEGER,
|
|
17
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
18
|
-
"_createdBy" INTEGER NOT NULL,
|
|
19
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
20
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
21
|
-
"_deleted" TIMESTAMPTZ,
|
|
22
|
-
"_deletedBy" INTEGER
|
|
23
|
-
)
|
|
8
|
+
await pool.query(`
|
|
9
|
+
CREATE TABLE IF NOT EXISTS "testEntities" (
|
|
10
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
11
|
+
${orgColumnDef}
|
|
12
|
+
"name" VARCHAR(255) NOT NULL,
|
|
13
|
+
"description" TEXT,
|
|
14
|
+
"isActive" BOOLEAN,
|
|
15
|
+
"tags" TEXT[],
|
|
16
|
+
"count" INTEGER,
|
|
17
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
18
|
+
"_createdBy" INTEGER NOT NULL,
|
|
19
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
20
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
21
|
+
"_deleted" TIMESTAMPTZ,
|
|
22
|
+
"_deletedBy" INTEGER
|
|
23
|
+
)
|
|
24
24
|
`);
|
|
25
25
|
},
|
|
26
26
|
down: async ({ context: pool }) => {
|
|
@@ -31,12 +31,12 @@ export const getPostgresTestSchema = (config) => {
|
|
|
31
31
|
name: '00000000000101_schema-categories',
|
|
32
32
|
up: async ({ context: pool }) => {
|
|
33
33
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
34
|
-
await pool.query(`
|
|
35
|
-
CREATE TABLE IF NOT EXISTS "categories" (
|
|
36
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
37
|
-
${orgColumnDef}
|
|
38
|
-
"name" VARCHAR(255) NOT NULL
|
|
39
|
-
)
|
|
34
|
+
await pool.query(`
|
|
35
|
+
CREATE TABLE IF NOT EXISTS "categories" (
|
|
36
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
37
|
+
${orgColumnDef}
|
|
38
|
+
"name" VARCHAR(255) NOT NULL
|
|
39
|
+
)
|
|
40
40
|
`);
|
|
41
41
|
},
|
|
42
42
|
down: async ({ context: pool }) => {
|
|
@@ -47,22 +47,22 @@ export const getPostgresTestSchema = (config) => {
|
|
|
47
47
|
name: '00000000000102_schema-products',
|
|
48
48
|
up: async ({ context: pool }) => {
|
|
49
49
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
50
|
-
await pool.query(`
|
|
51
|
-
CREATE TABLE IF NOT EXISTS "products" (
|
|
52
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
53
|
-
${orgColumnDef}
|
|
54
|
-
"name" VARCHAR(255) NOT NULL,
|
|
55
|
-
"description" TEXT,
|
|
56
|
-
"internalNumber" VARCHAR(255),
|
|
57
|
-
"categoryId" INTEGER NOT NULL,
|
|
58
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
59
|
-
"_createdBy" INTEGER NOT NULL,
|
|
60
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
61
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
62
|
-
"_deleted" TIMESTAMPTZ,
|
|
63
|
-
"_deletedBy" INTEGER,
|
|
64
|
-
CONSTRAINT "fk_products_category" FOREIGN KEY ("categoryId") REFERENCES "categories"("_id") ON DELETE CASCADE
|
|
65
|
-
)
|
|
50
|
+
await pool.query(`
|
|
51
|
+
CREATE TABLE IF NOT EXISTS "products" (
|
|
52
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
53
|
+
${orgColumnDef}
|
|
54
|
+
"name" VARCHAR(255) NOT NULL,
|
|
55
|
+
"description" TEXT,
|
|
56
|
+
"internalNumber" VARCHAR(255),
|
|
57
|
+
"categoryId" INTEGER NOT NULL,
|
|
58
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
59
|
+
"_createdBy" INTEGER NOT NULL,
|
|
60
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
61
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
62
|
+
"_deleted" TIMESTAMPTZ,
|
|
63
|
+
"_deletedBy" INTEGER,
|
|
64
|
+
CONSTRAINT "fk_products_category" FOREIGN KEY ("categoryId") REFERENCES "categories"("_id") ON DELETE CASCADE
|
|
65
|
+
)
|
|
66
66
|
`);
|
|
67
67
|
},
|
|
68
68
|
down: async ({ context: pool }) => {
|
|
@@ -73,20 +73,20 @@ export const getPostgresTestSchema = (config) => {
|
|
|
73
73
|
name: '00000000000103_schema-test-items',
|
|
74
74
|
up: async ({ context: pool }) => {
|
|
75
75
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
76
|
-
await pool.query(`
|
|
77
|
-
CREATE TABLE IF NOT EXISTS "testItems" (
|
|
78
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
79
|
-
${orgColumnDef}
|
|
80
|
-
"name" VARCHAR(255) NOT NULL,
|
|
81
|
-
"value" INTEGER,
|
|
82
|
-
"eventDate" TIMESTAMPTZ,
|
|
83
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
84
|
-
"_createdBy" INTEGER NOT NULL,
|
|
85
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
86
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
87
|
-
"_deleted" TIMESTAMPTZ,
|
|
88
|
-
"_deletedBy" INTEGER
|
|
89
|
-
)
|
|
76
|
+
await pool.query(`
|
|
77
|
+
CREATE TABLE IF NOT EXISTS "testItems" (
|
|
78
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
79
|
+
${orgColumnDef}
|
|
80
|
+
"name" VARCHAR(255) NOT NULL,
|
|
81
|
+
"value" INTEGER,
|
|
82
|
+
"eventDate" TIMESTAMPTZ,
|
|
83
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
84
|
+
"_createdBy" INTEGER NOT NULL,
|
|
85
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
86
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
87
|
+
"_deleted" TIMESTAMPTZ,
|
|
88
|
+
"_deletedBy" INTEGER
|
|
89
|
+
)
|
|
90
90
|
`);
|
|
91
91
|
},
|
|
92
92
|
down: async ({ context: pool }) => {
|
|
@@ -97,25 +97,25 @@ export const getPostgresTestSchema = (config) => {
|
|
|
97
97
|
name: '00000000000105_schema-persons',
|
|
98
98
|
up: async ({ context: pool }) => {
|
|
99
99
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
100
|
-
await pool.query(`
|
|
101
|
-
CREATE TABLE IF NOT EXISTS "persons" (
|
|
102
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
103
|
-
${orgColumnDef}
|
|
104
|
-
"external_id" VARCHAR UNIQUE,
|
|
105
|
-
"is_agent" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
106
|
-
"is_client" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
107
|
-
"is_employee" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
108
|
-
"first_name" VARCHAR NOT NULL,
|
|
109
|
-
"middle_name" VARCHAR,
|
|
110
|
-
"date_of_birth" DATE,
|
|
111
|
-
"last_name" VARCHAR NOT NULL,
|
|
112
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
113
|
-
"_createdBy" INTEGER NOT NULL,
|
|
114
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
115
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
116
|
-
"_deleted" TIMESTAMPTZ,
|
|
117
|
-
"_deletedBy" INTEGER
|
|
118
|
-
)
|
|
100
|
+
await pool.query(`
|
|
101
|
+
CREATE TABLE IF NOT EXISTS "persons" (
|
|
102
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
103
|
+
${orgColumnDef}
|
|
104
|
+
"external_id" VARCHAR UNIQUE,
|
|
105
|
+
"is_agent" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
106
|
+
"is_client" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
107
|
+
"is_employee" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
108
|
+
"first_name" VARCHAR NOT NULL,
|
|
109
|
+
"middle_name" VARCHAR,
|
|
110
|
+
"date_of_birth" DATE,
|
|
111
|
+
"last_name" VARCHAR NOT NULL,
|
|
112
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
113
|
+
"_createdBy" INTEGER NOT NULL,
|
|
114
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
115
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
116
|
+
"_deleted" TIMESTAMPTZ,
|
|
117
|
+
"_deletedBy" INTEGER
|
|
118
|
+
)
|
|
119
119
|
`);
|
|
120
120
|
},
|
|
121
121
|
down: async ({ context: pool }) => {
|
|
@@ -126,19 +126,19 @@ export const getPostgresTestSchema = (config) => {
|
|
|
126
126
|
name: '00000000000105_5_schema-agents',
|
|
127
127
|
up: async ({ context: pool }) => {
|
|
128
128
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
129
|
-
await pool.query(`
|
|
130
|
-
CREATE TABLE IF NOT EXISTS "agents" (
|
|
131
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
132
|
-
${orgColumnDef}
|
|
133
|
-
"person_id" INTEGER NOT NULL UNIQUE,
|
|
134
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
135
|
-
"_createdBy" INTEGER NOT NULL,
|
|
136
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
137
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
138
|
-
"_deleted" TIMESTAMPTZ,
|
|
139
|
-
"_deletedBy" INTEGER,
|
|
140
|
-
CONSTRAINT fk_agents_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE
|
|
141
|
-
)
|
|
129
|
+
await pool.query(`
|
|
130
|
+
CREATE TABLE IF NOT EXISTS "agents" (
|
|
131
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
132
|
+
${orgColumnDef}
|
|
133
|
+
"person_id" INTEGER NOT NULL UNIQUE,
|
|
134
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
135
|
+
"_createdBy" INTEGER NOT NULL,
|
|
136
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
137
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
138
|
+
"_deleted" TIMESTAMPTZ,
|
|
139
|
+
"_deletedBy" INTEGER,
|
|
140
|
+
CONSTRAINT fk_agents_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE
|
|
141
|
+
)
|
|
142
142
|
`);
|
|
143
143
|
},
|
|
144
144
|
down: async ({ context: pool }) => {
|
|
@@ -146,52 +146,127 @@ export const getPostgresTestSchema = (config) => {
|
|
|
146
146
|
}
|
|
147
147
|
});
|
|
148
148
|
migrations.push({
|
|
149
|
-
name: '00000000000105_6_schema-
|
|
149
|
+
name: '00000000000105_6_schema-policies',
|
|
150
150
|
up: async ({ context: pool }) => {
|
|
151
151
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
152
|
-
await pool.query(`
|
|
153
|
-
CREATE TABLE IF NOT EXISTS "
|
|
154
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
155
|
-
${orgColumnDef}
|
|
156
|
-
"
|
|
157
|
-
"
|
|
158
|
-
"
|
|
159
|
-
"
|
|
160
|
-
"
|
|
161
|
-
"
|
|
162
|
-
"
|
|
163
|
-
"
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
)
|
|
152
|
+
await pool.query(`
|
|
153
|
+
CREATE TABLE IF NOT EXISTS "policies" (
|
|
154
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
155
|
+
${orgColumnDef}
|
|
156
|
+
"amount" NUMERIC NOT NULL,
|
|
157
|
+
"frequency" VARCHAR NOT NULL,
|
|
158
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
159
|
+
"_createdBy" INTEGER NOT NULL,
|
|
160
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
161
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
162
|
+
"_deleted" TIMESTAMPTZ,
|
|
163
|
+
"_deletedBy" INTEGER
|
|
164
|
+
)
|
|
165
|
+
`);
|
|
166
|
+
},
|
|
167
|
+
down: async ({ context: pool }) => {
|
|
168
|
+
await pool.query('DROP TABLE IF EXISTS "policies"');
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
migrations.push({
|
|
172
|
+
name: '00000000000105_7_schema-clients',
|
|
173
|
+
up: async ({ context: pool }) => {
|
|
174
|
+
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
175
|
+
await pool.query(`
|
|
176
|
+
CREATE TABLE IF NOT EXISTS "clients" (
|
|
177
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
178
|
+
${orgColumnDef}
|
|
179
|
+
"external_id" VARCHAR UNIQUE,
|
|
180
|
+
"person_id" INTEGER NOT NULL UNIQUE,
|
|
181
|
+
"agent_id" INTEGER,
|
|
182
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
183
|
+
"_createdBy" INTEGER NOT NULL,
|
|
184
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
185
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
186
|
+
"_deleted" TIMESTAMPTZ,
|
|
187
|
+
"_deletedBy" INTEGER,
|
|
188
|
+
CONSTRAINT fk_clients_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE,
|
|
189
|
+
CONSTRAINT fk_clients_agent_id FOREIGN KEY ("agent_id") REFERENCES agents("_id") ON DELETE SET NULL
|
|
190
|
+
)
|
|
168
191
|
`);
|
|
169
192
|
},
|
|
170
193
|
down: async ({ context: pool }) => {
|
|
171
194
|
await pool.query('DROP TABLE IF EXISTS "clients"');
|
|
172
195
|
}
|
|
173
196
|
});
|
|
197
|
+
migrations.push({
|
|
198
|
+
name: '00000000000105_8_schema-clients-policies',
|
|
199
|
+
up: async ({ context: pool }) => {
|
|
200
|
+
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
201
|
+
await pool.query(`
|
|
202
|
+
CREATE TABLE IF NOT EXISTS clients_policies (
|
|
203
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
204
|
+
${orgColumnDef}
|
|
205
|
+
"client_id" INTEGER NOT NULL,
|
|
206
|
+
"policy_id" INTEGER NOT NULL,
|
|
207
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
208
|
+
"_createdBy" INTEGER NOT NULL,
|
|
209
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
210
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
211
|
+
"_deleted" TIMESTAMPTZ,
|
|
212
|
+
"_deletedBy" INTEGER,
|
|
213
|
+
CONSTRAINT fk_clients_policies_client_id FOREIGN KEY ("client_id") REFERENCES clients("_id") ON DELETE CASCADE,
|
|
214
|
+
CONSTRAINT fk_clients_policies_policy_id FOREIGN KEY ("policy_id") REFERENCES policies("_id") ON DELETE CASCADE,
|
|
215
|
+
CONSTRAINT uk_clients_policies_client_policy UNIQUE ("client_id", "policy_id")
|
|
216
|
+
)
|
|
217
|
+
`);
|
|
218
|
+
},
|
|
219
|
+
down: async ({ context: pool }) => {
|
|
220
|
+
await pool.query('DROP TABLE IF EXISTS "clients_policies"');
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
migrations.push({
|
|
224
|
+
name: '00000000000105_8_schema-agents-policies',
|
|
225
|
+
up: async ({ context: pool }) => {
|
|
226
|
+
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
227
|
+
await pool.query(`
|
|
228
|
+
CREATE TABLE IF NOT EXISTS agents_policies (
|
|
229
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
230
|
+
${orgColumnDef}
|
|
231
|
+
"policy_id" INTEGER NOT NULL,
|
|
232
|
+
"agent_id" INTEGER NOT NULL,
|
|
233
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
234
|
+
"_createdBy" INTEGER NOT NULL,
|
|
235
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
236
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
237
|
+
"_deleted" TIMESTAMPTZ,
|
|
238
|
+
"_deletedBy" INTEGER,
|
|
239
|
+
CONSTRAINT fk_agents_policies_policy_id FOREIGN KEY ("policy_id") REFERENCES policies("_id") ON DELETE CASCADE,
|
|
240
|
+
CONSTRAINT fk_agents_policies_agent_id FOREIGN KEY ("agent_id") REFERENCES agents("_id") ON DELETE CASCADE,
|
|
241
|
+
CONSTRAINT uk_agents_policies_policy_agent UNIQUE ("policy_id", "agent_id")
|
|
242
|
+
)
|
|
243
|
+
`);
|
|
244
|
+
},
|
|
245
|
+
down: async ({ context: pool }) => {
|
|
246
|
+
await pool.query('DROP TABLE IF EXISTS "agents_policies"');
|
|
247
|
+
}
|
|
248
|
+
});
|
|
174
249
|
migrations.push({
|
|
175
250
|
name: '00000000000106_schema-email-addresses',
|
|
176
251
|
up: async ({ context: pool }) => {
|
|
177
252
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
178
|
-
await pool.query(`
|
|
179
|
-
CREATE TABLE IF NOT EXISTS email_addresses (
|
|
180
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
181
|
-
${orgColumnDef}
|
|
182
|
-
"person_id" INTEGER NOT NULL,
|
|
183
|
-
"external_id" VARCHAR UNIQUE,
|
|
184
|
-
"email_address" VARCHAR NOT NULL UNIQUE,
|
|
185
|
-
"email_address_type" VARCHAR,
|
|
186
|
-
"is_default" BOOLEAN NOT NULL,
|
|
187
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
188
|
-
"_createdBy" INTEGER NOT NULL,
|
|
189
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
190
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
191
|
-
"_deleted" TIMESTAMPTZ,
|
|
192
|
-
"_deletedBy" INTEGER,
|
|
193
|
-
CONSTRAINT fk_email_addresses_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE
|
|
194
|
-
)
|
|
253
|
+
await pool.query(`
|
|
254
|
+
CREATE TABLE IF NOT EXISTS email_addresses (
|
|
255
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
256
|
+
${orgColumnDef}
|
|
257
|
+
"person_id" INTEGER NOT NULL,
|
|
258
|
+
"external_id" VARCHAR UNIQUE,
|
|
259
|
+
"email_address" VARCHAR NOT NULL UNIQUE,
|
|
260
|
+
"email_address_type" VARCHAR,
|
|
261
|
+
"is_default" BOOLEAN NOT NULL,
|
|
262
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
263
|
+
"_createdBy" INTEGER NOT NULL,
|
|
264
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
265
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
266
|
+
"_deleted" TIMESTAMPTZ,
|
|
267
|
+
"_deletedBy" INTEGER,
|
|
268
|
+
CONSTRAINT fk_email_addresses_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE
|
|
269
|
+
)
|
|
195
270
|
`);
|
|
196
271
|
},
|
|
197
272
|
down: async ({ context: pool }) => {
|
|
@@ -202,21 +277,21 @@ export const getPostgresTestSchema = (config) => {
|
|
|
202
277
|
name: '00000000000107_schema-phone-numbers',
|
|
203
278
|
up: async ({ context: pool }) => {
|
|
204
279
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
205
|
-
await pool.query(`
|
|
206
|
-
CREATE TABLE IF NOT EXISTS phone_numbers (
|
|
207
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
208
|
-
"_orgId" INTEGER,
|
|
209
|
-
"external_id" VARCHAR UNIQUE,
|
|
210
|
-
"phone_number" VARCHAR NOT NULL UNIQUE,
|
|
211
|
-
"phone_number_type" VARCHAR,
|
|
212
|
-
"is_default" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
213
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
214
|
-
"_createdBy" INTEGER NOT NULL,
|
|
215
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
216
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
217
|
-
"_deleted" TIMESTAMPTZ,
|
|
218
|
-
"_deletedBy" INTEGER
|
|
219
|
-
)
|
|
280
|
+
await pool.query(`
|
|
281
|
+
CREATE TABLE IF NOT EXISTS phone_numbers (
|
|
282
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
283
|
+
"_orgId" INTEGER,
|
|
284
|
+
"external_id" VARCHAR UNIQUE,
|
|
285
|
+
"phone_number" VARCHAR NOT NULL UNIQUE,
|
|
286
|
+
"phone_number_type" VARCHAR,
|
|
287
|
+
"is_default" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
288
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
289
|
+
"_createdBy" INTEGER NOT NULL,
|
|
290
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
291
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
292
|
+
"_deleted" TIMESTAMPTZ,
|
|
293
|
+
"_deletedBy" INTEGER
|
|
294
|
+
)
|
|
220
295
|
`);
|
|
221
296
|
},
|
|
222
297
|
down: async ({ context: pool }) => {
|
|
@@ -227,25 +302,25 @@ export const getPostgresTestSchema = (config) => {
|
|
|
227
302
|
name: '00000000000108_schema-addresses',
|
|
228
303
|
up: async ({ context: pool }) => {
|
|
229
304
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
230
|
-
await pool.query(`
|
|
231
|
-
CREATE TABLE IF NOT EXISTS addresses (
|
|
232
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
233
|
-
${orgColumnDef}
|
|
234
|
-
"external_id" VARCHAR UNIQUE,
|
|
235
|
-
"address_type" VARCHAR NOT NULL,
|
|
236
|
-
"address_line_1" VARCHAR NOT NULL,
|
|
237
|
-
"address_line_2" VARCHAR,
|
|
238
|
-
"city" VARCHAR NOT NULL,
|
|
239
|
-
"state" VARCHAR NOT NULL,
|
|
240
|
-
"zip_code" VARCHAR NOT NULL,
|
|
241
|
-
"country" VARCHAR NOT NULL,
|
|
242
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
243
|
-
"_createdBy" INTEGER NOT NULL,
|
|
244
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
245
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
246
|
-
"_deleted" TIMESTAMPTZ,
|
|
247
|
-
"_deletedBy" INTEGER
|
|
248
|
-
)
|
|
305
|
+
await pool.query(`
|
|
306
|
+
CREATE TABLE IF NOT EXISTS addresses (
|
|
307
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
308
|
+
${orgColumnDef}
|
|
309
|
+
"external_id" VARCHAR UNIQUE,
|
|
310
|
+
"address_type" VARCHAR NOT NULL,
|
|
311
|
+
"address_line_1" VARCHAR NOT NULL,
|
|
312
|
+
"address_line_2" VARCHAR,
|
|
313
|
+
"city" VARCHAR NOT NULL,
|
|
314
|
+
"state" VARCHAR NOT NULL,
|
|
315
|
+
"zip_code" VARCHAR NOT NULL,
|
|
316
|
+
"country" VARCHAR NOT NULL,
|
|
317
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
318
|
+
"_createdBy" INTEGER NOT NULL,
|
|
319
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
320
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
321
|
+
"_deleted" TIMESTAMPTZ,
|
|
322
|
+
"_deletedBy" INTEGER
|
|
323
|
+
)
|
|
249
324
|
`);
|
|
250
325
|
},
|
|
251
326
|
down: async ({ context: pool }) => {
|
|
@@ -256,22 +331,22 @@ export const getPostgresTestSchema = (config) => {
|
|
|
256
331
|
name: '00000000000109_schema-person-addresses',
|
|
257
332
|
up: async ({ context: pool }) => {
|
|
258
333
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
259
|
-
await pool.query(`
|
|
260
|
-
CREATE TABLE IF NOT EXISTS persons_addresses (
|
|
261
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
262
|
-
${orgColumnDef}
|
|
263
|
-
"address_id" INTEGER NOT NULL,
|
|
264
|
-
"person_id" INTEGER NOT NULL,
|
|
265
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
266
|
-
"_createdBy" INTEGER NOT NULL,
|
|
267
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
268
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
269
|
-
"_deleted" TIMESTAMPTZ,
|
|
270
|
-
"_deletedBy" INTEGER,
|
|
271
|
-
CONSTRAINT fk_persons_addresses_address_id FOREIGN KEY ("address_id") REFERENCES addresses("_id") ON DELETE CASCADE,
|
|
272
|
-
CONSTRAINT fk_persons_addresses_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE,
|
|
273
|
-
CONSTRAINT uk_persons_addresses_address_person UNIQUE ("address_id", "person_id")
|
|
274
|
-
)
|
|
334
|
+
await pool.query(`
|
|
335
|
+
CREATE TABLE IF NOT EXISTS persons_addresses (
|
|
336
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
337
|
+
${orgColumnDef}
|
|
338
|
+
"address_id" INTEGER NOT NULL,
|
|
339
|
+
"person_id" INTEGER NOT NULL,
|
|
340
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
341
|
+
"_createdBy" INTEGER NOT NULL,
|
|
342
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
343
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
344
|
+
"_deleted" TIMESTAMPTZ,
|
|
345
|
+
"_deletedBy" INTEGER,
|
|
346
|
+
CONSTRAINT fk_persons_addresses_address_id FOREIGN KEY ("address_id") REFERENCES addresses("_id") ON DELETE CASCADE,
|
|
347
|
+
CONSTRAINT fk_persons_addresses_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE,
|
|
348
|
+
CONSTRAINT uk_persons_addresses_address_person UNIQUE ("address_id", "person_id")
|
|
349
|
+
)
|
|
275
350
|
`);
|
|
276
351
|
},
|
|
277
352
|
down: async ({ context: pool }) => {
|
|
@@ -282,22 +357,22 @@ export const getPostgresTestSchema = (config) => {
|
|
|
282
357
|
name: '00000000000110_schema-person-phone-numbers',
|
|
283
358
|
up: async ({ context: pool }) => {
|
|
284
359
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
285
|
-
await pool.query(`
|
|
286
|
-
CREATE TABLE IF NOT EXISTS persons_phone_numbers (
|
|
287
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
288
|
-
${orgColumnDef}
|
|
289
|
-
"phone_number_id" INTEGER NOT NULL,
|
|
290
|
-
"person_id" INTEGER NOT NULL,
|
|
291
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
292
|
-
"_createdBy" INTEGER NOT NULL,
|
|
293
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
294
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
295
|
-
"_deleted" TIMESTAMPTZ,
|
|
296
|
-
"_deletedBy" INTEGER,
|
|
297
|
-
CONSTRAINT fk_persons_phone_numbers_phone_number_id FOREIGN KEY ("phone_number_id") REFERENCES phone_numbers("_id") ON DELETE CASCADE,
|
|
298
|
-
CONSTRAINT fk_persons_phone_numbers_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE,
|
|
299
|
-
CONSTRAINT uk_persons_phone_numbers_phone_number_person UNIQUE ("phone_number_id", "person_id")
|
|
300
|
-
)
|
|
360
|
+
await pool.query(`
|
|
361
|
+
CREATE TABLE IF NOT EXISTS persons_phone_numbers (
|
|
362
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
363
|
+
${orgColumnDef}
|
|
364
|
+
"phone_number_id" INTEGER NOT NULL,
|
|
365
|
+
"person_id" INTEGER NOT NULL,
|
|
366
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
367
|
+
"_createdBy" INTEGER NOT NULL,
|
|
368
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
369
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
370
|
+
"_deleted" TIMESTAMPTZ,
|
|
371
|
+
"_deletedBy" INTEGER,
|
|
372
|
+
CONSTRAINT fk_persons_phone_numbers_phone_number_id FOREIGN KEY ("phone_number_id") REFERENCES phone_numbers("_id") ON DELETE CASCADE,
|
|
373
|
+
CONSTRAINT fk_persons_phone_numbers_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE,
|
|
374
|
+
CONSTRAINT uk_persons_phone_numbers_phone_number_person UNIQUE ("phone_number_id", "person_id")
|
|
375
|
+
)
|
|
301
376
|
`);
|
|
302
377
|
},
|
|
303
378
|
down: async ({ context: pool }) => {
|
|
@@ -308,18 +383,18 @@ export const getPostgresTestSchema = (config) => {
|
|
|
308
383
|
name: '00000000000111_schema-states',
|
|
309
384
|
up: async ({ context: pool }) => {
|
|
310
385
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
311
|
-
await pool.query(`
|
|
312
|
-
CREATE TABLE IF NOT EXISTS states (
|
|
313
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
314
|
-
${orgColumnDef}
|
|
315
|
-
"name" VARCHAR NOT NULL,
|
|
316
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
317
|
-
"_createdBy" INTEGER NOT NULL,
|
|
318
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
319
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
320
|
-
"_deleted" TIMESTAMPTZ,
|
|
321
|
-
"_deletedBy" INTEGER
|
|
322
|
-
)
|
|
386
|
+
await pool.query(`
|
|
387
|
+
CREATE TABLE IF NOT EXISTS states (
|
|
388
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
389
|
+
${orgColumnDef}
|
|
390
|
+
"name" VARCHAR NOT NULL,
|
|
391
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
392
|
+
"_createdBy" INTEGER NOT NULL,
|
|
393
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
394
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
395
|
+
"_deleted" TIMESTAMPTZ,
|
|
396
|
+
"_deletedBy" INTEGER
|
|
397
|
+
)
|
|
323
398
|
`);
|
|
324
399
|
},
|
|
325
400
|
down: async ({ context: pool }) => {
|
|
@@ -330,20 +405,20 @@ export const getPostgresTestSchema = (config) => {
|
|
|
330
405
|
name: '00000000000112_schema-districts',
|
|
331
406
|
up: async ({ context: pool }) => {
|
|
332
407
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
333
|
-
await pool.query(`
|
|
334
|
-
CREATE TABLE IF NOT EXISTS districts (
|
|
335
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
336
|
-
${orgColumnDef}
|
|
337
|
-
"name" VARCHAR NOT NULL,
|
|
338
|
-
"state_id" INTEGER NOT NULL,
|
|
339
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
340
|
-
"_createdBy" INTEGER NOT NULL,
|
|
341
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
342
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
343
|
-
"_deleted" TIMESTAMPTZ,
|
|
344
|
-
"_deletedBy" INTEGER,
|
|
345
|
-
CONSTRAINT fk_districts_state_id FOREIGN KEY ("state_id") REFERENCES states("_id") ON DELETE CASCADE
|
|
346
|
-
)
|
|
408
|
+
await pool.query(`
|
|
409
|
+
CREATE TABLE IF NOT EXISTS districts (
|
|
410
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
411
|
+
${orgColumnDef}
|
|
412
|
+
"name" VARCHAR NOT NULL,
|
|
413
|
+
"state_id" INTEGER NOT NULL,
|
|
414
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
415
|
+
"_createdBy" INTEGER NOT NULL,
|
|
416
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
417
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
418
|
+
"_deleted" TIMESTAMPTZ,
|
|
419
|
+
"_deletedBy" INTEGER,
|
|
420
|
+
CONSTRAINT fk_districts_state_id FOREIGN KEY ("state_id") REFERENCES states("_id") ON DELETE CASCADE
|
|
421
|
+
)
|
|
347
422
|
`);
|
|
348
423
|
},
|
|
349
424
|
down: async ({ context: pool }) => {
|
|
@@ -354,20 +429,20 @@ export const getPostgresTestSchema = (config) => {
|
|
|
354
429
|
name: '00000000000113_schema-schools',
|
|
355
430
|
up: async ({ context: pool }) => {
|
|
356
431
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
357
|
-
await pool.query(`
|
|
358
|
-
CREATE TABLE IF NOT EXISTS schools (
|
|
359
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
360
|
-
${orgColumnDef}
|
|
361
|
-
"name" VARCHAR NOT NULL,
|
|
362
|
-
"district_id" INTEGER NOT NULL,
|
|
363
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
364
|
-
"_createdBy" INTEGER NOT NULL,
|
|
365
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
366
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
367
|
-
"_deleted" TIMESTAMPTZ,
|
|
368
|
-
"_deletedBy" INTEGER,
|
|
369
|
-
CONSTRAINT fk_schools_district_id FOREIGN KEY ("district_id") REFERENCES districts("_id") ON DELETE CASCADE
|
|
370
|
-
)
|
|
432
|
+
await pool.query(`
|
|
433
|
+
CREATE TABLE IF NOT EXISTS schools (
|
|
434
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
435
|
+
${orgColumnDef}
|
|
436
|
+
"name" VARCHAR NOT NULL,
|
|
437
|
+
"district_id" INTEGER NOT NULL,
|
|
438
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
439
|
+
"_createdBy" INTEGER NOT NULL,
|
|
440
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
441
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
442
|
+
"_deleted" TIMESTAMPTZ,
|
|
443
|
+
"_deletedBy" INTEGER,
|
|
444
|
+
CONSTRAINT fk_schools_district_id FOREIGN KEY ("district_id") REFERENCES districts("_id") ON DELETE CASCADE
|
|
445
|
+
)
|
|
371
446
|
`);
|
|
372
447
|
},
|
|
373
448
|
down: async ({ context: pool }) => {
|
|
@@ -378,22 +453,22 @@ export const getPostgresTestSchema = (config) => {
|
|
|
378
453
|
name: '00000000000114_schema-person-schools',
|
|
379
454
|
up: async ({ context: pool }) => {
|
|
380
455
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
381
|
-
await pool.query(`
|
|
382
|
-
CREATE TABLE IF NOT EXISTS persons_schools (
|
|
383
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
384
|
-
${orgColumnDef}
|
|
385
|
-
"person_id" INTEGER NOT NULL,
|
|
386
|
-
"school_id" INTEGER NOT NULL,
|
|
387
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
388
|
-
"_createdBy" INTEGER NOT NULL,
|
|
389
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
390
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
391
|
-
"_deleted" TIMESTAMPTZ,
|
|
392
|
-
"_deletedBy" INTEGER,
|
|
393
|
-
CONSTRAINT fk_persons_schools_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE,
|
|
394
|
-
CONSTRAINT fk_persons_schools_school_id FOREIGN KEY ("school_id") REFERENCES schools("_id") ON DELETE CASCADE,
|
|
395
|
-
CONSTRAINT uk_persons_schools_person_school UNIQUE ("person_id", "school_id")
|
|
396
|
-
)
|
|
456
|
+
await pool.query(`
|
|
457
|
+
CREATE TABLE IF NOT EXISTS persons_schools (
|
|
458
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
459
|
+
${orgColumnDef}
|
|
460
|
+
"person_id" INTEGER NOT NULL,
|
|
461
|
+
"school_id" INTEGER NOT NULL,
|
|
462
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
463
|
+
"_createdBy" INTEGER NOT NULL,
|
|
464
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
465
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
466
|
+
"_deleted" TIMESTAMPTZ,
|
|
467
|
+
"_deletedBy" INTEGER,
|
|
468
|
+
CONSTRAINT fk_persons_schools_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE,
|
|
469
|
+
CONSTRAINT fk_persons_schools_school_id FOREIGN KEY ("school_id") REFERENCES schools("_id") ON DELETE CASCADE,
|
|
470
|
+
CONSTRAINT uk_persons_schools_person_school UNIQUE ("person_id", "school_id")
|
|
471
|
+
)
|
|
397
472
|
`);
|
|
398
473
|
},
|
|
399
474
|
down: async ({ context: pool }) => {
|