@squiz/db-lib 1.71.2 → 1.72.0
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/CHANGELOG.md +19 -0
- package/lib/AbstractRepository.d.ts +2 -0
- package/lib/AbstractRepository.d.ts.map +1 -0
- package/lib/AbstractRepository.integration.spec.d.ts +1 -0
- package/lib/AbstractRepository.integration.spec.d.ts.map +1 -0
- package/lib/AbstractRepository.integration.spec.js +118 -0
- package/lib/AbstractRepository.integration.spec.js.map +1 -0
- package/lib/AbstractRepository.js +187 -0
- package/lib/AbstractRepository.js.map +1 -0
- package/lib/ConnectionManager.d.ts +1 -0
- package/lib/ConnectionManager.d.ts.map +1 -0
- package/lib/ConnectionManager.js +58 -0
- package/lib/ConnectionManager.js.map +1 -0
- package/lib/Migrator.d.ts +1 -0
- package/lib/Migrator.d.ts.map +1 -0
- package/lib/Migrator.js +160 -0
- package/lib/Migrator.js.map +1 -0
- package/lib/PostgresErrorCodes.d.ts +1 -0
- package/lib/PostgresErrorCodes.d.ts.map +1 -0
- package/lib/PostgresErrorCodes.js +274 -0
- package/lib/PostgresErrorCodes.js.map +1 -0
- package/lib/Repositories.d.ts +1 -0
- package/lib/Repositories.d.ts.map +1 -0
- package/lib/Repositories.js +3 -0
- package/lib/Repositories.js.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.d.ts +50 -9
- package/lib/dynamodb/AbstractDynamoDbRepository.d.ts.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.js +456 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.js.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.d.ts +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.d.ts.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.js +924 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.js.map +1 -0
- package/lib/dynamodb/DynamoDbManager.d.ts +1 -0
- package/lib/dynamodb/DynamoDbManager.d.ts.map +1 -0
- package/lib/dynamodb/DynamoDbManager.js +66 -0
- package/lib/dynamodb/DynamoDbManager.js.map +1 -0
- package/lib/dynamodb/getDynamoDbOptions.d.ts +1 -0
- package/lib/dynamodb/getDynamoDbOptions.d.ts.map +1 -0
- package/lib/dynamodb/getDynamoDbOptions.js +15 -0
- package/lib/dynamodb/getDynamoDbOptions.js.map +1 -0
- package/lib/error/DuplicateItemError.d.ts +1 -0
- package/lib/error/DuplicateItemError.d.ts.map +1 -0
- package/lib/error/DuplicateItemError.js +12 -0
- package/lib/error/DuplicateItemError.js.map +1 -0
- package/lib/error/InvalidDataFormatError.d.ts +1 -0
- package/lib/error/InvalidDataFormatError.d.ts.map +1 -0
- package/lib/error/InvalidDataFormatError.js +12 -0
- package/lib/error/InvalidDataFormatError.js.map +1 -0
- package/lib/error/InvalidDbSchemaError.d.ts +1 -0
- package/lib/error/InvalidDbSchemaError.d.ts.map +1 -0
- package/lib/error/InvalidDbSchemaError.js +12 -0
- package/lib/error/InvalidDbSchemaError.js.map +1 -0
- package/lib/error/MissingKeyValuesError.d.ts +1 -0
- package/lib/error/MissingKeyValuesError.d.ts.map +1 -0
- package/lib/error/MissingKeyValuesError.js +12 -0
- package/lib/error/MissingKeyValuesError.js.map +1 -0
- package/lib/error/TransactionError.d.ts +1 -0
- package/lib/error/TransactionError.d.ts.map +1 -0
- package/lib/error/TransactionError.js +12 -0
- package/lib/error/TransactionError.js.map +1 -0
- package/lib/getConnectionInfo.d.ts +1 -0
- package/lib/getConnectionInfo.d.ts.map +1 -0
- package/lib/getConnectionInfo.js +30 -0
- package/lib/getConnectionInfo.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +33 -70416
- package/lib/index.js.map +1 -7
- package/package.json +5 -5
- package/src/AbstractRepository.ts +26 -20
- package/src/dynamodb/AbstractDynamoDbRepository.spec.ts +289 -37
- package/src/dynamodb/AbstractDynamoDbRepository.ts +140 -31
- package/src/dynamodb/getDynamoDbOptions.ts +1 -1
- package/tsconfig.json +5 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/build.js +0 -31
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 1.72.0
|
4
|
+
|
5
|
+
### Minor Changes
|
6
|
+
|
7
|
+
- 464fd13: add dynamodb support management api
|
8
|
+
|
9
|
+
### Patch Changes
|
10
|
+
|
11
|
+
- Updated dependencies [464fd13]
|
12
|
+
- @squiz/dx-common-lib@1.69.0
|
13
|
+
|
14
|
+
## 1.71.3
|
15
|
+
|
16
|
+
### Patch Changes
|
17
|
+
|
18
|
+
- 1187eec: manual bump of dx-common-lib version
|
19
|
+
- Updated dependencies [1187eec]
|
20
|
+
- @squiz/dx-common-lib@1.68.3
|
21
|
+
|
3
22
|
## 1.71.2
|
4
23
|
|
5
24
|
### 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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"}
|
@@ -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 @@
|
|
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
@@ -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"}
|
package/lib/Migrator.js
ADDED
@@ -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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"}
|