@loomcore/api 0.1.73 → 0.1.75
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__/common-test.utils.js +4 -1
- package/dist/__tests__/postgres-test-migrations/postgres-test-schema.js +239 -239
- package/dist/__tests__/postgres.test-database.js +8 -8
- package/dist/controllers/auth.controller.d.ts +1 -2
- package/dist/controllers/auth.controller.js +2 -2
- package/dist/databases/migrations/migration-runner.d.ts +1 -3
- package/dist/databases/migrations/migration-runner.js +24 -26
- package/dist/databases/mongo-db/migrations/mongo-initial-schema.d.ts +1 -2
- package/dist/databases/mongo-db/migrations/mongo-initial-schema.js +4 -4
- 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/__tests__/test-migration-helper.js +1 -2
- package/dist/databases/postgres/migrations/postgres-initial-schema.d.ts +1 -2
- package/dist/databases/postgres/migrations/postgres-initial-schema.js +201 -201
- package/dist/databases/postgres/postgres.database.js +17 -17
- package/dist/databases/postgres/utils/build-join-clauses.js +22 -22
- package/dist/databases/postgres/utils/build-select-clause.js +6 -6
- package/dist/databases/postgres/utils/does-table-exist.util.js +4 -4
- package/dist/models/base-api-config.interface.d.ts +4 -0
- package/dist/services/auth.service.d.ts +1 -2
- package/dist/services/auth.service.js +2 -2
- package/dist/services/email.service.d.ts +1 -2
- package/dist/services/email.service.js +7 -2
- package/dist/services/generic-query-service/generic-query-service.interface.d.ts +1 -1
- package/dist/services/generic-query-service/generic-query.service.d.ts +2 -1
- package/dist/services/generic-query-service/generic-query.service.js +8 -4
- 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 }) => {
|
|
@@ -149,22 +149,22 @@ export const getPostgresTestSchema = (config) => {
|
|
|
149
149
|
name: '00000000000105_6_schema-clients',
|
|
150
150
|
up: async ({ context: pool }) => {
|
|
151
151
|
const orgColumnDef = isMultiTenant ? '"_orgId" INTEGER,' : '';
|
|
152
|
-
await pool.query(`
|
|
153
|
-
CREATE TABLE IF NOT EXISTS "clients" (
|
|
154
|
-
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
155
|
-
${orgColumnDef}
|
|
156
|
-
"external_id" VARCHAR UNIQUE,
|
|
157
|
-
"person_id" INTEGER NOT NULL UNIQUE,
|
|
158
|
-
"agent_id" INTEGER,
|
|
159
|
-
"_created" TIMESTAMPTZ NOT NULL,
|
|
160
|
-
"_createdBy" INTEGER NOT NULL,
|
|
161
|
-
"_updated" TIMESTAMPTZ NOT NULL,
|
|
162
|
-
"_updatedBy" INTEGER NOT NULL,
|
|
163
|
-
"_deleted" TIMESTAMPTZ,
|
|
164
|
-
"_deletedBy" INTEGER,
|
|
165
|
-
CONSTRAINT fk_clients_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE,
|
|
166
|
-
CONSTRAINT fk_clients_agent_id FOREIGN KEY ("agent_id") REFERENCES agents("_id") ON DELETE SET NULL
|
|
167
|
-
)
|
|
152
|
+
await pool.query(`
|
|
153
|
+
CREATE TABLE IF NOT EXISTS "clients" (
|
|
154
|
+
"_id" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
155
|
+
${orgColumnDef}
|
|
156
|
+
"external_id" VARCHAR UNIQUE,
|
|
157
|
+
"person_id" INTEGER NOT NULL UNIQUE,
|
|
158
|
+
"agent_id" INTEGER,
|
|
159
|
+
"_created" TIMESTAMPTZ NOT NULL,
|
|
160
|
+
"_createdBy" INTEGER NOT NULL,
|
|
161
|
+
"_updated" TIMESTAMPTZ NOT NULL,
|
|
162
|
+
"_updatedBy" INTEGER NOT NULL,
|
|
163
|
+
"_deleted" TIMESTAMPTZ,
|
|
164
|
+
"_deletedBy" INTEGER,
|
|
165
|
+
CONSTRAINT fk_clients_person_id FOREIGN KEY ("person_id") REFERENCES persons("_id") ON DELETE CASCADE,
|
|
166
|
+
CONSTRAINT fk_clients_agent_id FOREIGN KEY ("agent_id") REFERENCES agents("_id") ON DELETE SET NULL
|
|
167
|
+
)
|
|
168
168
|
`);
|
|
169
169
|
},
|
|
170
170
|
down: async ({ context: pool }) => {
|
|
@@ -175,23 +175,23 @@ export const getPostgresTestSchema = (config) => {
|
|
|
175
175
|
name: '00000000000106_schema-email-addresses',
|
|
176
176
|
up: async ({ context: pool }) => {
|
|
177
177
|
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
|
-
)
|
|
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
|
+
)
|
|
195
195
|
`);
|
|
196
196
|
},
|
|
197
197
|
down: async ({ context: pool }) => {
|
|
@@ -202,21 +202,21 @@ export const getPostgresTestSchema = (config) => {
|
|
|
202
202
|
name: '00000000000107_schema-phone-numbers',
|
|
203
203
|
up: async ({ context: pool }) => {
|
|
204
204
|
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
|
-
)
|
|
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
|
+
)
|
|
220
220
|
`);
|
|
221
221
|
},
|
|
222
222
|
down: async ({ context: pool }) => {
|
|
@@ -227,25 +227,25 @@ export const getPostgresTestSchema = (config) => {
|
|
|
227
227
|
name: '00000000000108_schema-addresses',
|
|
228
228
|
up: async ({ context: pool }) => {
|
|
229
229
|
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
|
-
)
|
|
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
|
+
)
|
|
249
249
|
`);
|
|
250
250
|
},
|
|
251
251
|
down: async ({ context: pool }) => {
|
|
@@ -256,22 +256,22 @@ export const getPostgresTestSchema = (config) => {
|
|
|
256
256
|
name: '00000000000109_schema-person-addresses',
|
|
257
257
|
up: async ({ context: pool }) => {
|
|
258
258
|
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
|
-
)
|
|
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
|
+
)
|
|
275
275
|
`);
|
|
276
276
|
},
|
|
277
277
|
down: async ({ context: pool }) => {
|
|
@@ -282,22 +282,22 @@ export const getPostgresTestSchema = (config) => {
|
|
|
282
282
|
name: '00000000000110_schema-person-phone-numbers',
|
|
283
283
|
up: async ({ context: pool }) => {
|
|
284
284
|
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
|
-
)
|
|
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
|
+
)
|
|
301
301
|
`);
|
|
302
302
|
},
|
|
303
303
|
down: async ({ context: pool }) => {
|
|
@@ -308,18 +308,18 @@ export const getPostgresTestSchema = (config) => {
|
|
|
308
308
|
name: '00000000000111_schema-states',
|
|
309
309
|
up: async ({ context: pool }) => {
|
|
310
310
|
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
|
-
)
|
|
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
|
+
)
|
|
323
323
|
`);
|
|
324
324
|
},
|
|
325
325
|
down: async ({ context: pool }) => {
|
|
@@ -330,20 +330,20 @@ export const getPostgresTestSchema = (config) => {
|
|
|
330
330
|
name: '00000000000112_schema-districts',
|
|
331
331
|
up: async ({ context: pool }) => {
|
|
332
332
|
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
|
-
)
|
|
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
|
+
)
|
|
347
347
|
`);
|
|
348
348
|
},
|
|
349
349
|
down: async ({ context: pool }) => {
|
|
@@ -354,20 +354,20 @@ export const getPostgresTestSchema = (config) => {
|
|
|
354
354
|
name: '00000000000113_schema-schools',
|
|
355
355
|
up: async ({ context: pool }) => {
|
|
356
356
|
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
|
-
)
|
|
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
|
+
)
|
|
371
371
|
`);
|
|
372
372
|
},
|
|
373
373
|
down: async ({ context: pool }) => {
|
|
@@ -378,22 +378,22 @@ export const getPostgresTestSchema = (config) => {
|
|
|
378
378
|
name: '00000000000114_schema-person-schools',
|
|
379
379
|
up: async ({ context: pool }) => {
|
|
380
380
|
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
|
-
)
|
|
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
|
+
)
|
|
397
397
|
`);
|
|
398
398
|
},
|
|
399
399
|
down: async ({ context: pool }) => {
|
|
@@ -78,9 +78,9 @@ export class TestPostgresDatabase {
|
|
|
78
78
|
}
|
|
79
79
|
async createIndexes(client) {
|
|
80
80
|
try {
|
|
81
|
-
await client.query(`
|
|
82
|
-
CREATE INDEX IF NOT EXISTS email_index ON users (LOWER(email));
|
|
83
|
-
CREATE UNIQUE INDEX IF NOT EXISTS email_unique_index ON users (LOWER(email));
|
|
81
|
+
await client.query(`
|
|
82
|
+
CREATE INDEX IF NOT EXISTS email_index ON users (LOWER(email));
|
|
83
|
+
CREATE UNIQUE INDEX IF NOT EXISTS email_unique_index ON users (LOWER(email));
|
|
84
84
|
`);
|
|
85
85
|
}
|
|
86
86
|
catch (error) {
|
|
@@ -91,11 +91,11 @@ export class TestPostgresDatabase {
|
|
|
91
91
|
if (!this.postgresClient) {
|
|
92
92
|
throw new Error('Database not initialized');
|
|
93
93
|
}
|
|
94
|
-
const result = await this.postgresClient.query(`
|
|
95
|
-
SELECT "table_name"
|
|
96
|
-
FROM information_schema.tables
|
|
97
|
-
WHERE "table_schema" = 'public'
|
|
98
|
-
AND "table_type" = 'BASE TABLE'
|
|
94
|
+
const result = await this.postgresClient.query(`
|
|
95
|
+
SELECT "table_name"
|
|
96
|
+
FROM information_schema.tables
|
|
97
|
+
WHERE "table_schema" = 'public'
|
|
98
|
+
AND "table_type" = 'BASE TABLE'
|
|
99
99
|
`);
|
|
100
100
|
result.rows.forEach(async (row) => {
|
|
101
101
|
await this.postgresClient?.query(`TRUNCATE TABLE "${row.table_name}" RESTART IDENTITY CASCADE`);
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { Application, Request, Response, NextFunction } from 'express';
|
|
2
2
|
import { AuthService } from '../services/index.js';
|
|
3
3
|
import { IDatabase } from '../databases/models/index.js';
|
|
4
|
-
import { IEmailClient } from '../models/email-client.interface.js';
|
|
5
4
|
export declare class AuthController {
|
|
6
5
|
authService: AuthService;
|
|
7
|
-
constructor(app: Application, database: IDatabase
|
|
6
|
+
constructor(app: Application, database: IDatabase);
|
|
8
7
|
mapRoutes(app: Application): void;
|
|
9
8
|
login(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
10
9
|
registerUser(req: Request, res: Response): Promise<void>;
|
|
@@ -6,8 +6,8 @@ import { AuthService } from '../services/index.js';
|
|
|
6
6
|
import { isAuthorized } from '../middleware/index.js';
|
|
7
7
|
export class AuthController {
|
|
8
8
|
authService;
|
|
9
|
-
constructor(app, database
|
|
10
|
-
this.authService = new AuthService(database
|
|
9
|
+
constructor(app, database) {
|
|
10
|
+
this.authService = new AuthService(database);
|
|
11
11
|
this.mapRoutes(app);
|
|
12
12
|
}
|
|
13
13
|
mapRoutes(app) {
|