@squiz/db-lib 1.71.2 → 1.71.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/AbstractRepository.d.ts +2 -0
  3. package/lib/AbstractRepository.d.ts.map +1 -0
  4. package/lib/AbstractRepository.integration.spec.d.ts +1 -0
  5. package/lib/AbstractRepository.integration.spec.d.ts.map +1 -0
  6. package/lib/AbstractRepository.integration.spec.js +118 -0
  7. package/lib/AbstractRepository.integration.spec.js.map +1 -0
  8. package/lib/AbstractRepository.js +187 -0
  9. package/lib/AbstractRepository.js.map +1 -0
  10. package/lib/ConnectionManager.d.ts +1 -0
  11. package/lib/ConnectionManager.d.ts.map +1 -0
  12. package/lib/ConnectionManager.js +58 -0
  13. package/lib/ConnectionManager.js.map +1 -0
  14. package/lib/Migrator.d.ts +1 -0
  15. package/lib/Migrator.d.ts.map +1 -0
  16. package/lib/Migrator.js +160 -0
  17. package/lib/Migrator.js.map +1 -0
  18. package/lib/PostgresErrorCodes.d.ts +1 -0
  19. package/lib/PostgresErrorCodes.d.ts.map +1 -0
  20. package/lib/PostgresErrorCodes.js +274 -0
  21. package/lib/PostgresErrorCodes.js.map +1 -0
  22. package/lib/Repositories.d.ts +1 -0
  23. package/lib/Repositories.d.ts.map +1 -0
  24. package/lib/Repositories.js +3 -0
  25. package/lib/Repositories.js.map +1 -0
  26. package/lib/dynamodb/AbstractDynamoDbRepository.d.ts +1 -0
  27. package/lib/dynamodb/AbstractDynamoDbRepository.d.ts.map +1 -0
  28. package/lib/dynamodb/AbstractDynamoDbRepository.js +367 -0
  29. package/lib/dynamodb/AbstractDynamoDbRepository.js.map +1 -0
  30. package/lib/dynamodb/AbstractDynamoDbRepository.spec.d.ts +1 -0
  31. package/lib/dynamodb/AbstractDynamoDbRepository.spec.d.ts.map +1 -0
  32. package/lib/dynamodb/AbstractDynamoDbRepository.spec.js +698 -0
  33. package/lib/dynamodb/AbstractDynamoDbRepository.spec.js.map +1 -0
  34. package/lib/dynamodb/DynamoDbManager.d.ts +1 -0
  35. package/lib/dynamodb/DynamoDbManager.d.ts.map +1 -0
  36. package/lib/dynamodb/DynamoDbManager.js +66 -0
  37. package/lib/dynamodb/DynamoDbManager.js.map +1 -0
  38. package/lib/dynamodb/getDynamoDbOptions.d.ts +1 -0
  39. package/lib/dynamodb/getDynamoDbOptions.d.ts.map +1 -0
  40. package/lib/dynamodb/getDynamoDbOptions.js +15 -0
  41. package/lib/dynamodb/getDynamoDbOptions.js.map +1 -0
  42. package/lib/error/DuplicateItemError.d.ts +1 -0
  43. package/lib/error/DuplicateItemError.d.ts.map +1 -0
  44. package/lib/error/DuplicateItemError.js +12 -0
  45. package/lib/error/DuplicateItemError.js.map +1 -0
  46. package/lib/error/InvalidDataFormatError.d.ts +1 -0
  47. package/lib/error/InvalidDataFormatError.d.ts.map +1 -0
  48. package/lib/error/InvalidDataFormatError.js +12 -0
  49. package/lib/error/InvalidDataFormatError.js.map +1 -0
  50. package/lib/error/InvalidDbSchemaError.d.ts +1 -0
  51. package/lib/error/InvalidDbSchemaError.d.ts.map +1 -0
  52. package/lib/error/InvalidDbSchemaError.js +12 -0
  53. package/lib/error/InvalidDbSchemaError.js.map +1 -0
  54. package/lib/error/MissingKeyValuesError.d.ts +1 -0
  55. package/lib/error/MissingKeyValuesError.d.ts.map +1 -0
  56. package/lib/error/MissingKeyValuesError.js +12 -0
  57. package/lib/error/MissingKeyValuesError.js.map +1 -0
  58. package/lib/error/TransactionError.d.ts +1 -0
  59. package/lib/error/TransactionError.d.ts.map +1 -0
  60. package/lib/error/TransactionError.js +12 -0
  61. package/lib/error/TransactionError.js.map +1 -0
  62. package/lib/getConnectionInfo.d.ts +1 -0
  63. package/lib/getConnectionInfo.d.ts.map +1 -0
  64. package/lib/getConnectionInfo.js +30 -0
  65. package/lib/getConnectionInfo.js.map +1 -0
  66. package/lib/index.d.ts +1 -0
  67. package/lib/index.d.ts.map +1 -0
  68. package/lib/index.js +33 -70416
  69. package/lib/index.js.map +1 -7
  70. package/package.json +5 -5
  71. package/src/AbstractRepository.ts +26 -20
  72. package/src/dynamodb/AbstractDynamoDbRepository.ts +1 -1
  73. package/src/dynamodb/getDynamoDbOptions.ts +1 -1
  74. package/tsconfig.json +5 -2
  75. package/tsconfig.tsbuildinfo +1 -1
  76. package/build.js +0 -31
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Change Log
2
2
 
3
+ ## 1.71.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 1187eec: manual bump of dx-common-lib version
8
+ - Updated dependencies [1187eec]
9
+ - @squiz/dx-common-lib@1.68.3
10
+
3
11
  ## 1.71.2
4
12
 
5
13
  ### Patch Changes
@@ -38,6 +38,7 @@ export declare abstract class AbstractRepository<SHAPE extends object, DATA_CLAS
38
38
  new (data?: Record<string, unknown>): DATA_CLASS;
39
39
  });
40
40
  protected getConnection(): Promise<PoolClient>;
41
+ private sanitiseValue;
41
42
  create(value: SHAPE, transactionClient?: PoolClient | null): Promise<SHAPE>;
42
43
  update(where: Partial<SHAPE>, newValue: Exclude<Partial<SHAPE>, Record<string, never>>, transactionClient?: PoolClient | null): Promise<SHAPE[]>;
43
44
  delete(where: Partial<SHAPE>, transactionClient?: PoolClient | null): Promise<number>;
@@ -53,3 +54,4 @@ export declare abstract class AbstractRepository<SHAPE extends object, DATA_CLAS
53
54
  getCountRaw(whereClause?: string, values?: any[], tableRef?: string): Promise<number>;
54
55
  getPageRaw(pageNumber: number, sortBy?: (keyof SHAPE)[], direction?: SortDirection, whereClause?: string, tableRef?: string, values?: any[], pageSize?: number | null, searchFields?: Partial<SHAPE> | null): Promise<PageResult<SHAPE>>;
55
56
  }
57
+ //# sourceMappingURL=AbstractRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractRepository.d.ts","sourceRoot":"","sources":["../src/AbstractRepository.ts"],"names":[],"mappings":"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"}
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=AbstractRepository.integration.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractRepository.integration.spec.d.ts","sourceRoot":"","sources":["../src/AbstractRepository.integration.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const AbstractRepository_1 = require("./AbstractRepository");
4
+ const ConnectionManager_1 = require("./ConnectionManager");
5
+ class RepoTest {
6
+ constructor(data = {}) {
7
+ var _a, _b, _c, _d, _e, _f;
8
+ this.lowercase = (_a = data.lowercase) !== null && _a !== void 0 ? _a : 'some lowercase';
9
+ this.camelCase = (_b = data.camelCase) !== null && _b !== void 0 ? _b : 'some camelCase';
10
+ this.PascalCase = (_c = data.PascalCase) !== null && _c !== void 0 ? _c : 'some PascalCase';
11
+ this.snake_case = (_d = data.snake_case) !== null && _d !== void 0 ? _d : 'some snake_case';
12
+ this['kebab-case'] = (_e = data['kebab-case']) !== null && _e !== void 0 ? _e : 'some kebab-case';
13
+ this.UPPERCASE = (_f = data.UPPERCASE) !== null && _f !== void 0 ? _f : 'some UPPERCASE';
14
+ }
15
+ }
16
+ function defaultMapping() {
17
+ return {
18
+ lowercase: 'lowercase',
19
+ camelCase: 'camel_case',
20
+ PascalCase: 'pascal_case',
21
+ snake_case: 'snake_case',
22
+ 'kebab-case': 'kebab_case',
23
+ UPPERCASE: 'uppercase',
24
+ };
25
+ }
26
+ const allProperties = Object.keys(defaultMapping());
27
+ class AbstractRepositoryIntegrationTest extends AbstractRepository_1.AbstractRepository {
28
+ }
29
+ describe('AbstractRepository', () => {
30
+ let db;
31
+ beforeAll(async () => {
32
+ db = new ConnectionManager_1.ConnectionManager('AbstractRepositoryIntegrationTest', process.env.COMPONENT_DB_CONNECTION_STRING, '', [], (db) => ({
33
+ test: new AbstractRepositoryIntegrationTest(db.repositories, db.pool, 'abstract_repository_db_test', defaultMapping(), RepoTest),
34
+ }));
35
+ await db.pool.query(`
36
+ CREATE TABLE IF NOT EXISTS abstract_repository_db_test (
37
+ lowercase text,
38
+ camel_case text,
39
+ pascal_case text,
40
+ snake_case text,
41
+ kebab_case text,
42
+ uppercase text
43
+ );
44
+ `);
45
+ });
46
+ afterAll(async () => {
47
+ await db.pool.query('DROP TABLE IF EXISTS abstract_repository_db_test;');
48
+ await db.close();
49
+ });
50
+ describe('properties are always mapped to columns', () => {
51
+ beforeEach(async () => {
52
+ await db.pool.query('DELETE FROM abstract_repository_db_test;');
53
+ });
54
+ it('create', async () => {
55
+ const repo = db.repositories.test;
56
+ const data = new RepoTest();
57
+ const result = await repo.create(data);
58
+ expect(result).toEqual(data);
59
+ });
60
+ it.each(allProperties)('update %s', async (property) => {
61
+ const repo = db.repositories.test;
62
+ const data = await repo.create(new RepoTest());
63
+ const result = await repo.update({ [property]: data[property] }, { [property]: `new ${data[property]}` });
64
+ expect(result).toEqual([{ ...data, [property]: `new ${data[property]}` }]);
65
+ });
66
+ it.each(allProperties)('delete %s', async (property) => {
67
+ const repo = db.repositories.test;
68
+ const data = await repo.create(new RepoTest());
69
+ const result = await repo.delete({ [property]: data[property] });
70
+ expect(result).toEqual(1);
71
+ });
72
+ it.each(allProperties)('findOne %s', async (property) => {
73
+ const repo = db.repositories.test;
74
+ const findData = await repo.create(new RepoTest({ [property]: 'some value' }));
75
+ const _differentData = await repo.create(new RepoTest({ [property]: 'some other value' }));
76
+ const result = await repo.findOne({ [property]: findData[property] });
77
+ expect(result).toEqual(findData);
78
+ });
79
+ it.each(allProperties)('find %s', async (property) => {
80
+ const repo = db.repositories.test;
81
+ const findData = await repo.create(new RepoTest({ [property]: 'some value' }));
82
+ const _differentData = await repo.create(new RepoTest({ [property]: 'some other value' }));
83
+ const result = await repo.find({ [property]: findData[property] });
84
+ expect(result).toEqual([findData]);
85
+ });
86
+ it.each(allProperties)('findAll %s', async (property) => {
87
+ const repo = db.repositories.test;
88
+ const findData = await repo.create(new RepoTest({ [property]: 'some value' }));
89
+ const differentData = await repo.create(new RepoTest({ [property]: 'some other value' }));
90
+ const result = await repo.findAll();
91
+ expect(result).toEqual([findData, differentData]);
92
+ });
93
+ it.each(allProperties)('getPage %s', async (property) => {
94
+ const repo = db.repositories.test;
95
+ const firstData = await repo.create(new RepoTest({ [property]: 'aaaaa' }));
96
+ const secondData = await repo.create(new RepoTest({ [property]: 'bbbb' }));
97
+ const ascResult = await repo.getPage(1, [property], 'asc');
98
+ expect(ascResult).toMatchObject({ items: [firstData, secondData], totalCount: 2 });
99
+ const descResult = await repo.getPage(1, [property], 'desc');
100
+ expect(descResult).toMatchObject({ items: [secondData, firstData], totalCount: 2 });
101
+ });
102
+ it.each(allProperties)('getPageRaw %s', async (property) => {
103
+ const repo = db.repositories.test;
104
+ const firstData = await repo.create(new RepoTest({ [property]: 'aaaaa' }));
105
+ const secondData = await repo.create(new RepoTest({ [property]: 'bbbb' }));
106
+ const ascResult = await repo.getPageRaw(1, [property], 'asc');
107
+ expect(ascResult).toMatchObject({ items: [firstData, secondData], totalCount: 2 });
108
+ const descResult = await repo.getPageRaw(1, [property], 'desc');
109
+ expect(descResult).toMatchObject({ items: [secondData, firstData], totalCount: 2 });
110
+ });
111
+ it.each(allProperties)('update Fails when new value is empty object - %s', async (property) => {
112
+ const repo = db.repositories.test;
113
+ const data = await repo.create(new RepoTest());
114
+ await expect(repo.update({ [property]: data[property] }, {})).rejects.toThrowErrorMatchingInlineSnapshot('"Failed updating the repository, update values cannot be empty"');
115
+ });
116
+ });
117
+ });
118
+ //# sourceMappingURL=AbstractRepository.integration.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractRepository.integration.spec.js","sourceRoot":"","sources":["../src/AbstractRepository.integration.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractRepository = exports.DEFAULT_PAGE_SIZE = void 0;
4
+ const pg_1 = require("pg");
5
+ const dx_common_lib_1 = require("@squiz/dx-common-lib");
6
+ exports.DEFAULT_PAGE_SIZE = 20;
7
+ class AbstractRepository {
8
+ constructor(repositories, pool, tableName, mapping, classRef) {
9
+ this.repositories = repositories;
10
+ this.pool = pool;
11
+ this.classRef = classRef;
12
+ this.tableName = `"${tableName}"`;
13
+ this.modelPropertyToSqlColumn = mapping;
14
+ this.sqlColumnToModelProperty = Object.entries(mapping).reduce((prev, curr) => {
15
+ const [modelProp, columnName] = curr;
16
+ prev[columnName] = modelProp;
17
+ return prev;
18
+ }, {});
19
+ }
20
+ async getConnection() {
21
+ return await this.pool.connect();
22
+ }
23
+ sanitiseValue(value) {
24
+ const sanitisedValue = Object.entries(value)
25
+ .map(([key, value]) => [this.modelPropertyToSqlColumn[key], value])
26
+ .filter(([column, _v]) => !!column);
27
+ const columns = sanitisedValue.map(([column]) => (0, pg_1.escapeIdentifier)(column));
28
+ const bindingParams = sanitisedValue.map((_, index) => `$${index + 1}`);
29
+ const values = sanitisedValue.map(([_column, value]) => value);
30
+ return {
31
+ columns,
32
+ bindingParams,
33
+ values,
34
+ };
35
+ }
36
+ async create(value, transactionClient = null) {
37
+ const valueAsClass = new this.classRef(value);
38
+ const { columns, bindingParams, values } = this.sanitiseValue(valueAsClass);
39
+ const result = await this.executeQuery(`INSERT INTO ${this.tableName} (${columns.join(', ')}) VALUES (${bindingParams.join(', ')}) RETURNING *`, values, transactionClient);
40
+ return result[0];
41
+ }
42
+ async update(where, newValue, transactionClient = null) {
43
+ if (Object.keys(newValue).length === 0) {
44
+ throw new dx_common_lib_1.InvalidUpdateValueError('Failed updating the repository, update values cannot be empty');
45
+ }
46
+ const whereValues = Object.values(where);
47
+ const newValues = this.sanitiseValue(newValue);
48
+ const setValues = newValues.columns.map((c, i) => `${c} = ${newValues.bindingParams[i]}`);
49
+ const whereString = this.createWhereStringFromPartialModel(where, setValues.length);
50
+ const result = await this.executeQuery(`UPDATE ${this.tableName}
51
+ SET ${setValues.join(', ')}
52
+ WHERE ${whereString}
53
+ RETURNING *`, [...newValues.values, ...whereValues], transactionClient);
54
+ return result;
55
+ }
56
+ async delete(where, transactionClient = null) {
57
+ var _a;
58
+ const client = transactionClient !== null && transactionClient !== void 0 ? transactionClient : (await this.getConnection());
59
+ try {
60
+ const whereString = this.createWhereStringFromPartialModel(where);
61
+ const result = await client.query(`DELETE FROM ${this.tableName} WHERE ${whereString}`, Object.values(where));
62
+ return (_a = result.rowCount) !== null && _a !== void 0 ? _a : 0;
63
+ }
64
+ finally {
65
+ if (client && !transactionClient) {
66
+ client.release();
67
+ }
68
+ }
69
+ }
70
+ createWhereStringFromPartialModel(values, initialIndex = 0) {
71
+ const keys = Object.keys(values);
72
+ if (keys.length == 0) {
73
+ throw new Error(`Values cannot be an empty object. It must have at least one property`);
74
+ }
75
+ const sql = keys.reduce((acc, key, index) => {
76
+ const condition = `"${this.modelPropertyToSqlColumn[key]}" = $${1 + index + initialIndex}`;
77
+ return acc === '' ? `${acc} ${condition}` : `${acc} AND ${condition}`;
78
+ }, '');
79
+ return sql;
80
+ }
81
+ async executeQueryRaw(query, values, transactionClient = null) {
82
+ const client = transactionClient !== null && transactionClient !== void 0 ? transactionClient : (await this.getConnection());
83
+ try {
84
+ const result = await client.query(query, values);
85
+ return result.rows;
86
+ }
87
+ finally {
88
+ if (client && !transactionClient) {
89
+ client.release();
90
+ }
91
+ }
92
+ }
93
+ async executeQuery(query, values, transactionClient = null) {
94
+ const rows = await this.executeQueryRaw(query, values, transactionClient);
95
+ return rows.map((a) => this.createAndHydrateModel(a));
96
+ }
97
+ createAndHydrateModel(row) {
98
+ const inputData = {};
99
+ for (const key of Object.keys(row)) {
100
+ const translatedKey = this.sqlColumnToModelProperty[key];
101
+ inputData[translatedKey] = row[key];
102
+ }
103
+ return new this.classRef(inputData);
104
+ }
105
+ async findOne(item, transactionClient) {
106
+ const result = await this.executeQuery(`SELECT *
107
+ FROM ${this.tableName}
108
+ WHERE ${this.createWhereStringFromPartialModel(item)}
109
+ LIMIT 1`, Object.values(item), transactionClient);
110
+ return result[0];
111
+ }
112
+ async find(item) {
113
+ const result = await this.executeQuery(`SELECT *
114
+ FROM ${this.tableName}
115
+ WHERE ${this.createWhereStringFromPartialModel(item)}`, Object.values(item));
116
+ return result;
117
+ }
118
+ async findAll() {
119
+ const result = await this.executeQuery(`SELECT *
120
+ FROM ${this.tableName}`, []);
121
+ return result;
122
+ }
123
+ async getCount(item = null) {
124
+ let whereClause = '';
125
+ if (item) {
126
+ whereClause = `WHERE ${this.createWhereStringFromPartialModel(item)}`;
127
+ }
128
+ return this.getCountRaw(whereClause, item ? Object.values(item) : []);
129
+ }
130
+ async getPage(pageNumber, sortBy = [], direction = 'asc', pageSize = null, item = null) {
131
+ let whereClause = '';
132
+ if (item) {
133
+ whereClause = `WHERE ${this.createWhereStringFromPartialModel(item)}`;
134
+ }
135
+ return this.getPageRaw(pageNumber, sortBy, direction, whereClause, this.tableName, Object.values(item !== null && item !== void 0 ? item : {}), pageSize);
136
+ }
137
+ async getCountRaw(whereClause = '', values = [], tableRef = '') {
138
+ const result = await this.executeQueryRaw(`SELECT COUNT(*) FROM ${this.tableName} ${tableRef} ${whereClause}`, values);
139
+ return parseInt(result[0].count);
140
+ }
141
+ async getPageRaw(pageNumber, sortBy = [], direction = 'asc', whereClause = '', tableRef = '', values = [], pageSize = null, searchFields = null) {
142
+ if (pageSize === null) {
143
+ pageSize = exports.DEFAULT_PAGE_SIZE;
144
+ }
145
+ if (pageNumber <= 0) {
146
+ throw new Error(`Page number value cannot be less than 1`);
147
+ }
148
+ if (pageSize <= 0) {
149
+ throw new Error(`Page size value cannot be less than 1`);
150
+ }
151
+ let orderByClause = '';
152
+ if (sortBy.length) {
153
+ orderByClause = `ORDER BY ${sortBy
154
+ .map((a) => this.modelPropertyToSqlColumn[a])
155
+ .join(',')} ${direction}`;
156
+ }
157
+ const offset = (pageNumber - 1) * pageSize;
158
+ if (searchFields !== null) {
159
+ const searchFieldsWhere = [];
160
+ for (const [key, value] of Object.entries(searchFields)) {
161
+ if (typeof value !== 'string') {
162
+ throw new Error(`Search field ${key} needs to be of type string`);
163
+ }
164
+ searchFieldsWhere.push(`${this.modelPropertyToSqlColumn[key]} LIKE $${values.length + 1}`);
165
+ values.push(`%${value}%`);
166
+ }
167
+ if (whereClause.length) {
168
+ whereClause = `${whereClause} AND`;
169
+ }
170
+ whereClause = `${whereClause} (${searchFieldsWhere.join(' OR ')})`;
171
+ }
172
+ const query = `
173
+ SELECT *
174
+ FROM ${this.tableName} ${tableRef} ${whereClause} ${orderByClause}
175
+ OFFSET ${offset}
176
+ LIMIT ${pageSize}
177
+ `;
178
+ const items = await this.executeQuery(query, values);
179
+ return {
180
+ items,
181
+ totalCount: await this.getCountRaw(whereClause, values, tableRef),
182
+ pageSize,
183
+ };
184
+ }
185
+ }
186
+ exports.AbstractRepository = AbstractRepository;
187
+ //# sourceMappingURL=AbstractRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractRepository.js","sourceRoot":"","sources":["../src/AbstractRepository.ts"],"names":[],"mappings":"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"}
@@ -23,3 +23,4 @@ export declare class ConnectionManager<T extends Repositories> {
23
23
  close(): Promise<void>;
24
24
  executeInTransaction<T>(func: (client: TransactionClient) => Promise<T>): Promise<T>;
25
25
  }
26
+ //# sourceMappingURL=ConnectionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionManager.d.ts","sourceRoot":"","sources":["../src/ConnectionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAK1B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAE3C,qBAAa,iBAAiB,CAAC,CAAC,SAAS,YAAY;IAKjD,SAAS,CAAC,eAAe,EAAE,MAAM;IAEjC,SAAS,CAAC,kBAAkB,EAAE,MAAM;IACpC,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE;IAPnC,SAAgB,IAAI,EAAE,IAAI,CAAC;IAC3B,SAAgB,YAAY,EAAE,CAAC,CAAC;gBAGpB,eAAe,EAAE,MAAM,EACjC,UAAU,EAAE,MAAM,GAAG,YAAY,EACvB,kBAAkB,EAAE,MAAM,EAC1B,aAAa,EAAE,MAAM,EAAE,EACjC,iBAAiB,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC;IAyB9C,eAAe;IAOf,KAAK;IAKL,oBAAoB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAiBlG"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConnectionManager = void 0;
4
+ const pg_1 = require("pg");
5
+ // import os from 'os';
6
+ const Migrator_1 = require("./Migrator");
7
+ class ConnectionManager {
8
+ constructor(applicationName, connection, migrationDirectory, migrationList, repositoryCreator) {
9
+ this.applicationName = applicationName;
10
+ this.migrationDirectory = migrationDirectory;
11
+ this.migrationList = migrationList;
12
+ let connectionInfo;
13
+ if (typeof connection === 'string') {
14
+ connectionInfo = { connectionString: connection };
15
+ }
16
+ else {
17
+ connectionInfo = connection;
18
+ }
19
+ this.pool = new pg_1.Pool({
20
+ ...connectionInfo,
21
+ application_name: applicationName,
22
+ query_timeout: 5000, // TODO consider
23
+ // idleTimeoutMillis: 0, // TODO consider
24
+ // connectionTimeoutMillis: 2000,
25
+ // max: os.cpus().length * 2,
26
+ });
27
+ this.repositories = repositoryCreator(this);
28
+ }
29
+ async applyMigrations() {
30
+ const connection = await this.pool.connect();
31
+ const migrator = new Migrator_1.Migrator(this.migrationDirectory, this.migrationList, connection);
32
+ await migrator.migrate();
33
+ }
34
+ async close() {
35
+ await this.pool.end();
36
+ this.pool.removeAllListeners();
37
+ }
38
+ async executeInTransaction(func) {
39
+ const client = await this.pool.connect();
40
+ try {
41
+ await client.query('BEGIN');
42
+ const value = await func(client);
43
+ await client.query('COMMIT');
44
+ return value;
45
+ }
46
+ catch (e) {
47
+ await client.query('ROLLBACK');
48
+ throw e;
49
+ }
50
+ finally {
51
+ if (client) {
52
+ client.release();
53
+ }
54
+ }
55
+ }
56
+ }
57
+ exports.ConnectionManager = ConnectionManager;
58
+ //# sourceMappingURL=ConnectionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionManager.js","sourceRoot":"","sources":["../src/ConnectionManager.ts"],"names":[],"mappings":";;;AAAA,2BAA0B;AAE1B,uBAAuB;AACvB,yCAAsC;AAmBtC,MAAa,iBAAiB;IAI5B,YACY,eAAuB,EACjC,UAAiC,EACvB,kBAA0B,EAC1B,aAAuB,EACjC,iBAAyD;QAJ/C,oBAAe,GAAf,eAAe,CAAQ;QAEvB,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC1B,kBAAa,GAAb,aAAa,CAAU;QAGjC,IAAI,cAAkD,CAAC;QAEvD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAClC,cAAc,GAAG,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC;SACnD;aAAM;YACL,cAAc,GAAG,UAAU,CAAC;SAC7B;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,SAAI,CAAC;YACnB,GAAG,cAAc;YAEjB,gBAAgB,EAAE,eAAe;YAEjC,aAAa,EAAE,IAAI,EAAE,gBAAgB;YACrC,yCAAyC;YACzC,iCAAiC;YAEjC,6BAA6B;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,eAAe;QAC1B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAE7C,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACvF,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAAI,IAA+C;QAClF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAEzC,IAAI;YACF,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC;SACT;gBAAS;YACR,IAAI,MAAM,EAAE;gBACV,MAAM,CAAC,OAAO,EAAE,CAAC;aAClB;SACF;IACH,CAAC;CACF;AA/DD,8CA+DC"}
package/lib/Migrator.d.ts CHANGED
@@ -22,3 +22,4 @@ export declare class Migrator {
22
22
  protected doMigrationWork(migration: string): Promise<void>;
23
23
  protected dispose(): void;
24
24
  }
25
+ //# sourceMappingURL=Migrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migrator.d.ts","sourceRoot":"","sources":["../src/Migrator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAGhC,OAAO,EAAE,MAAM,EAAa,MAAM,sBAAsB,CAAC;AAQzD,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD,CAAC;AAEF,qBAAa,QAAQ;IACP,SAAS,CAAC,YAAY,EAAE,MAAM;IAAE,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE;IAAE,SAAS,CAAC,IAAI,EAAE,UAAU;gBAAnF,YAAY,EAAE,MAAM,EAAY,aAAa,EAAE,MAAM,EAAE,EAAY,IAAI,EAAE,UAAU;cAEzF,0BAA0B;cAI1B,oBAAoB;cASpB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;cAc7C,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE;cAiChE,MAAM,CAAC,SAAS,EAAE,MAAM;cAMxB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;cAMnC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC;cAsBpB,aAAa;cAgBb,iBAAiB,CAAC,SAAS,EAAE,MAAM;cAkBnC,YAAY,CAAC,SAAS,EAAE,MAAM;cAe9B,eAAe,CAAC,SAAS,EAAE,MAAM;IAWjD,SAAS,CAAC,OAAO;CAGlB"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Migrator = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const dx_logger_lib_1 = require("@squiz/dx-logger-lib");
11
+ // Be carful about changing this value. This needs to be consistent across deployments
12
+ // this ID is used to signal other running instances that a migration is executing.
13
+ const MIGRATION_ADVISORY_LOCK = 4569465;
14
+ const logger = (0, dx_logger_lib_1.getLogger)({ name: 'db-migrator', meta: { pid: process.pid, hostname: os_1.default.hostname() } });
15
+ class Migrator {
16
+ constructor(migrationDir, migrationList, pool) {
17
+ this.migrationDir = migrationDir;
18
+ this.migrationList = migrationList;
19
+ this.pool = pool;
20
+ }
21
+ async ensureMigrationTableExists() {
22
+ return this.pool.query('create table if not exists "__migrations__" (id varchar(128) NOT NULL)');
23
+ }
24
+ async getAppliedMigrations() {
25
+ await this.ensureMigrationTableExists();
26
+ const result = await this.pool.query('select * from __migrations__');
27
+ return result.rows.map(function (row) {
28
+ return row.id;
29
+ });
30
+ }
31
+ async doSqlMigration(migration, sql) {
32
+ try {
33
+ const result = await this.pool.query(sql);
34
+ logger.info('Applying ' + migration);
35
+ if (result.rowCount !== undefined) {
36
+ logger.info('affected rows', result.rowCount);
37
+ }
38
+ }
39
+ catch (e) {
40
+ logger.info('error occurred running migration', migration, e);
41
+ throw e;
42
+ }
43
+ }
44
+ async getPending(migrationsList, appliedMigrations) {
45
+ const pending = [];
46
+ // get all migrations
47
+ for (let i = 0; i < migrationsList.length; i++) {
48
+ if (migrationsList[i] !== appliedMigrations[i]) {
49
+ pending.push(migrationsList[i]);
50
+ }
51
+ }
52
+ // validate order
53
+ for (let i = 0; i < pending.length; i++) {
54
+ if (appliedMigrations.includes(pending[i])) {
55
+ throw new Error(`${pending[i]} has already run. Are you sure your migrations are in the correct order.`);
56
+ }
57
+ }
58
+ // check the migration list is the right one (based on applied migrations on the db)
59
+ for (let i = 0; i < migrationsList.length; i++) {
60
+ if (migrationsList[i] !== appliedMigrations[i] && appliedMigrations[i] !== undefined) {
61
+ throw new Error(`Migration #${i + 1} ${migrationsList[i]} on the migration list does not match with the applied migration ${appliedMigrations[i]}. Are you sure your migrations are running in the correct DB? Migration list: [${migrationsList.join(', ')}], Applied migrations: [${appliedMigrations.join(', ')}]`);
62
+ }
63
+ }
64
+ return pending;
65
+ }
66
+ async getSql(migration) {
67
+ const sql = await promises_1.default.readFile(path_1.default.join(this.migrationDir, migration), { encoding: 'utf-8' });
68
+ return sql;
69
+ }
70
+ async tryToObtainLock() {
71
+ const result = await this.pool.query(`SELECT pg_try_advisory_lock(${MIGRATION_ADVISORY_LOCK}) as lockobtained`);
72
+ return result.rows[0].lockobtained;
73
+ }
74
+ async releaseLock() {
75
+ await this.pool.query(`SELECT pg_advisory_unlock(${MIGRATION_ADVISORY_LOCK}) lockreleased`);
76
+ }
77
+ async migrate() {
78
+ try {
79
+ const lockObtained = await this.tryToObtainLock();
80
+ if (lockObtained === false) {
81
+ logger.info('migration already running');
82
+ await sleep(500);
83
+ return await this.migrate();
84
+ }
85
+ await this.runMigrations();
86
+ logger.info('completed migration');
87
+ await this.releaseLock();
88
+ this.dispose();
89
+ }
90
+ catch (e) {
91
+ logger.info('migration failed releasing lock');
92
+ await this.releaseLock();
93
+ throw e;
94
+ }
95
+ }
96
+ async runMigrations() {
97
+ const appliedMigrations = await this.getAppliedMigrations();
98
+ const pending = await this.getPending(this.migrationList, appliedMigrations);
99
+ if (pending.length === 0) {
100
+ logger.info('No pending migrations');
101
+ return;
102
+ }
103
+ logger.info('Pending migrations:\n\t' + pending.join('\n\t'));
104
+ for (const migration of pending) {
105
+ await this.runMigration(migration);
106
+ }
107
+ }
108
+ async doScriptMigration(migration) {
109
+ const migrationScript = path_1.default.join(this.migrationDir, migration);
110
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
111
+ const migrationFunc = require(migrationScript);
112
+ // eslint-disable-next-line @typescript-eslint/ban-types
113
+ let callable;
114
+ if (migrationFunc instanceof Function) {
115
+ callable = migrationFunc;
116
+ }
117
+ else if (migrationFunc.default instanceof Function) {
118
+ callable = migrationFunc.default;
119
+ }
120
+ else {
121
+ throw new Error(`${migrationScript} isn't callable`);
122
+ }
123
+ await callable(this.pool, logger);
124
+ }
125
+ async runMigration(migration) {
126
+ try {
127
+ await this.pool.query('BEGIN');
128
+ await this.doMigrationWork(migration);
129
+ await this.pool.query('insert into __migrations__ (id) values ($1)', [migration]);
130
+ await this.pool.query('COMMIT');
131
+ }
132
+ catch (e) {
133
+ logger.error('migration failed', migration, e);
134
+ await this.pool.query('ROLLBACK');
135
+ throw e;
136
+ }
137
+ }
138
+ async doMigrationWork(migration) {
139
+ if (migration.endsWith('.sql')) {
140
+ const sql = await this.getSql(migration);
141
+ await this.doSqlMigration(migration, sql);
142
+ }
143
+ else if (migration.endsWith('.js')) {
144
+ await this.doScriptMigration(migration);
145
+ }
146
+ else {
147
+ throw new Error(`${migration} as an invalid migration extension`);
148
+ }
149
+ }
150
+ dispose() {
151
+ return this.pool.release();
152
+ }
153
+ }
154
+ exports.Migrator = Migrator;
155
+ async function sleep(timeMs) {
156
+ return new Promise((resolve) => {
157
+ setTimeout(resolve, timeMs);
158
+ });
159
+ }
160
+ //# sourceMappingURL=Migrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migrator.js","sourceRoot":"","sources":["../src/Migrator.ts"],"names":[],"mappings":"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"}
@@ -266,3 +266,4 @@ export declare enum PostgresErrorCode {
266
266
  DATA_CORRUPTED = "XX001",
267
267
  INDEX_CORRUPTED = "XX002"
268
268
  }
269
+ //# sourceMappingURL=PostgresErrorCodes.d.ts.map