@squiz/db-lib 1.71.1 → 1.71.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/lib/AbstractRepository.d.ts +57 -0
  3. package/lib/AbstractRepository.d.ts.map +1 -0
  4. package/lib/AbstractRepository.integration.spec.d.ts +2 -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 +26 -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 +25 -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 +269 -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 +3 -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 +162 -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 +27 -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 +19 -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 +13 -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 +6 -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 +6 -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 +6 -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 +6 -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 +6 -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 +6 -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 +15 -0
  67. package/lib/index.d.ts.map +1 -0
  68. package/lib/index.js +34 -0
  69. package/lib/index.js.map +1 -0
  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,19 @@
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
+
11
+ ## 1.71.2
12
+
13
+ ### Patch Changes
14
+
15
+ - d9a8506: fix up publish compilation
16
+
3
17
  ## 1.71.1
4
18
 
5
19
  ### Patch Changes
@@ -0,0 +1,57 @@
1
+ import { PoolClient, Pool } from 'pg';
2
+ import { Repositories } from './Repositories';
3
+ export interface Reader<T> {
4
+ find(item: Partial<T>): Promise<T[]>;
5
+ findOne(id: string | Partial<T>): Promise<T | undefined>;
6
+ }
7
+ export interface Writer<T> {
8
+ create(value: Partial<T>): Promise<T>;
9
+ update(where: Partial<T>, newValue: Partial<T>): Promise<T[]>;
10
+ delete(where: Partial<T>): Promise<number>;
11
+ }
12
+ export type Repository<T> = Reader<T> & Writer<T>;
13
+ export type PageResult<T> = {
14
+ items: T[];
15
+ totalCount: number;
16
+ pageSize: number;
17
+ };
18
+ export type SortDirection = 'desc' | 'asc';
19
+ export declare const DEFAULT_PAGE_SIZE = 20;
20
+ export declare abstract class AbstractRepository<SHAPE extends object, DATA_CLASS extends SHAPE> implements Reader<SHAPE>, Writer<SHAPE> {
21
+ protected repositories: Repositories;
22
+ protected pool: Pool;
23
+ protected classRef: {
24
+ new (data?: Record<string, unknown>): DATA_CLASS;
25
+ };
26
+ protected tableName: string;
27
+ /** object where the key is the model property name amd the value is sql column name */
28
+ protected modelPropertyToSqlColumn: {
29
+ [key in keyof SHAPE]: string;
30
+ };
31
+ /** object where the key is the sql column name and the value is the model property name */
32
+ protected sqlColumnToModelProperty: {
33
+ [key: string]: string;
34
+ };
35
+ constructor(repositories: Repositories, pool: Pool, tableName: string, mapping: {
36
+ [key in keyof SHAPE]: string;
37
+ }, classRef: {
38
+ new (data?: Record<string, unknown>): DATA_CLASS;
39
+ });
40
+ protected getConnection(): Promise<PoolClient>;
41
+ private sanitiseValue;
42
+ create(value: SHAPE, transactionClient?: PoolClient | null): Promise<SHAPE>;
43
+ update(where: Partial<SHAPE>, newValue: Exclude<Partial<SHAPE>, Record<string, never>>, transactionClient?: PoolClient | null): Promise<SHAPE[]>;
44
+ delete(where: Partial<SHAPE>, transactionClient?: PoolClient | null): Promise<number>;
45
+ protected createWhereStringFromPartialModel(values: Partial<SHAPE>, initialIndex?: number): string;
46
+ protected executeQueryRaw(query: string, values: any[], transactionClient?: PoolClient | null): Promise<any[]>;
47
+ executeQuery(query: string, values: any[], transactionClient?: PoolClient | null): Promise<SHAPE[]>;
48
+ protected createAndHydrateModel(row: any): SHAPE;
49
+ findOne(item: Partial<SHAPE>, transactionClient?: PoolClient): Promise<SHAPE | undefined>;
50
+ find(item: Partial<SHAPE>): Promise<SHAPE[]>;
51
+ findAll(): Promise<SHAPE[]>;
52
+ getCount(item?: Partial<SHAPE> | null): Promise<number>;
53
+ getPage(pageNumber: number, sortBy?: (keyof SHAPE)[], direction?: SortDirection, pageSize?: number | null, item?: Partial<SHAPE> | null): Promise<PageResult<SHAPE>>;
54
+ getCountRaw(whereClause?: string, values?: any[], tableRef?: string): Promise<number>;
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>>;
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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"}
@@ -0,0 +1,2 @@
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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"}
@@ -0,0 +1,26 @@
1
+ import { Pool } from 'pg';
2
+ import { PoolClient } from 'pg';
3
+ import { Repositories } from './Repositories';
4
+ export interface DbConnection {
5
+ user: string;
6
+ password: string;
7
+ host: string;
8
+ port: number;
9
+ database: string;
10
+ }
11
+ export interface ConnectionStringObj {
12
+ connectionString: string;
13
+ }
14
+ export type TransactionClient = PoolClient;
15
+ export declare class ConnectionManager<T extends Repositories> {
16
+ protected applicationName: string;
17
+ protected migrationDirectory: string;
18
+ protected migrationList: string[];
19
+ readonly pool: Pool;
20
+ readonly repositories: T;
21
+ constructor(applicationName: string, connection: string | DbConnection, migrationDirectory: string, migrationList: string[], repositoryCreator: (dbManager: ConnectionManager<T>) => T);
22
+ applyMigrations(): Promise<void>;
23
+ close(): Promise<void>;
24
+ executeInTransaction<T>(func: (client: TransactionClient) => Promise<T>): Promise<T>;
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"}
@@ -0,0 +1,25 @@
1
+ import { PoolClient } from 'pg';
2
+ import { Logger } from '@squiz/dx-logger-lib';
3
+ export type Migration = {
4
+ (db: PoolClient, logger: Logger): Promise<void>;
5
+ };
6
+ export declare class Migrator {
7
+ protected migrationDir: string;
8
+ protected migrationList: string[];
9
+ protected pool: PoolClient;
10
+ constructor(migrationDir: string, migrationList: string[], pool: PoolClient);
11
+ protected ensureMigrationTableExists(): Promise<import("pg").QueryResult<any>>;
12
+ protected getAppliedMigrations(): Promise<any[]>;
13
+ protected doSqlMigration(migration: string, sql: string): Promise<void>;
14
+ protected getPending(migrationsList: string[], appliedMigrations: string[]): Promise<string[]>;
15
+ protected getSql(migration: string): Promise<string>;
16
+ protected tryToObtainLock(): Promise<boolean>;
17
+ protected releaseLock(): Promise<void>;
18
+ migrate(): Promise<any>;
19
+ protected runMigrations(): Promise<void>;
20
+ protected doScriptMigration(migration: string): Promise<void>;
21
+ protected runMigration(migration: string): Promise<void>;
22
+ protected doMigrationWork(migration: string): Promise<void>;
23
+ protected dispose(): void;
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"}