@proteinjs/db 1.2.0 → 1.3.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.
@@ -0,0 +1,167 @@
1
+ import { Logger } from '@proteinjs/util';
2
+ import { TableWatcherMap, getTableWatcherMap } from './TableWatcher';
3
+ import { Record } from './Record';
4
+ import { Table } from './Table';
5
+ import { QueryBuilder } from '@proteinjs/db-query';
6
+
7
+ export class TableWatcherRunner<R extends Record = Record> {
8
+ private static tableWatcherMap: TableWatcherMap;
9
+ private logger = new Logger(this.constructor.name);
10
+
11
+ constructor() {
12
+ if (!TableWatcherRunner.tableWatcherMap) {
13
+ TableWatcherRunner.tableWatcherMap = getTableWatcherMap();
14
+ }
15
+ }
16
+
17
+ async runBeforeInsertTableWatchers<T extends R>(
18
+ table: Table<T>,
19
+ record: Omit<T, keyof R>
20
+ ): Promise<Omit<T, keyof R>> {
21
+ const tableWatcherMap = TableWatcherRunner.tableWatcherMap[table.name];
22
+ if (!tableWatcherMap) {
23
+ return record;
24
+ }
25
+
26
+ const tableWatchers = tableWatcherMap.beforeInsert;
27
+ if (tableWatchers.length === 0) {
28
+ return record;
29
+ }
30
+
31
+ this.logger.info(`(${table.name}) Running before-insert table watchers`);
32
+ let updatedRecord: any = record;
33
+ for (const tableWatcher of tableWatchers) {
34
+ this.logger.info(`(${table.name}) Running ${tableWatcher.name()}.beforeInsert`);
35
+ updatedRecord = await tableWatcher.beforeInsert(updatedRecord);
36
+ this.logger.info(`(${table.name}) Finished running ${tableWatcher.name()}.beforeInsert`);
37
+ }
38
+ this.logger.info(`(${table.name}) Finished running before-insert table watchers`);
39
+
40
+ return updatedRecord;
41
+ }
42
+
43
+ async runAfterInsertTableWatchers<T extends R>(table: Table<T>, record: T): Promise<void> {
44
+ const tableWatcherMap = TableWatcherRunner.tableWatcherMap[table.name];
45
+ if (!tableWatcherMap) {
46
+ return;
47
+ }
48
+
49
+ const tableWatchers = tableWatcherMap.afterInsert;
50
+ if (tableWatchers.length === 0) {
51
+ return;
52
+ }
53
+
54
+ this.logger.info(`(${table.name}) Running after-insert table watchers`);
55
+ for (const tableWatcher of tableWatchers) {
56
+ this.logger.info(`(${table.name}) Running ${tableWatcher.name()}.afterInsert`);
57
+ await tableWatcher.afterInsert(record);
58
+ this.logger.info(`(${table.name}) Finished running ${tableWatcher.name()}.afterInsert`);
59
+ }
60
+ this.logger.info(`(${table.name}) Finished running after-insert table watchers`);
61
+ }
62
+
63
+ async runBeforeUpdateTableWatchers<T extends R>(
64
+ table: Table<T>,
65
+ record: Partial<T>,
66
+ qb: QueryBuilder<T>
67
+ ): Promise<Partial<T>> {
68
+ const tableWatcherMap = TableWatcherRunner.tableWatcherMap[table.name];
69
+ if (!tableWatcherMap) {
70
+ return record;
71
+ }
72
+
73
+ const tableWatchers = tableWatcherMap.beforeUpdate;
74
+ if (tableWatchers.length === 0) {
75
+ return record;
76
+ }
77
+
78
+ this.logger.info(`(${table.name}) Running before-update table watchers`);
79
+ const qbCopy = QueryBuilder.fromQueryBuilder(qb, table.name);
80
+ let updatedRecord: any = record;
81
+ for (const tableWatcher of tableWatchers) {
82
+ this.logger.info(`(${table.name}) Running ${tableWatcher.name()}.beforeUpdate`);
83
+ updatedRecord = await tableWatcher.beforeUpdate(updatedRecord, qbCopy);
84
+ this.logger.info(`(${table.name}) Finished running ${tableWatcher.name()}.beforeUpdate`);
85
+ }
86
+ this.logger.info(`(${table.name}) Finished running before-update table watchers`);
87
+
88
+ return updatedRecord;
89
+ }
90
+
91
+ async runAfterUpdateTableWatchers<T extends R>(
92
+ table: Table<T>,
93
+ recordUpdateCount: number,
94
+ record: Partial<T>,
95
+ qb: QueryBuilder<T>
96
+ ): Promise<void> {
97
+ const tableWatcherMap = TableWatcherRunner.tableWatcherMap[table.name];
98
+ if (!tableWatcherMap) {
99
+ return;
100
+ }
101
+
102
+ const tableWatchers = tableWatcherMap.afterUpdate;
103
+ if (tableWatchers.length === 0) {
104
+ return;
105
+ }
106
+
107
+ this.logger.info(`(${table.name}) Running after-update table watchers`);
108
+ const qbCopy = QueryBuilder.fromQueryBuilder(qb, table.name);
109
+ for (const tableWatcher of tableWatchers) {
110
+ this.logger.info(`(${table.name}) Running ${tableWatcher.name()}.afterUpdate`);
111
+ await tableWatcher.afterUpdate(recordUpdateCount, record, qbCopy);
112
+ this.logger.info(`(${table.name}) Finished running ${tableWatcher.name()}.afterUpdate`);
113
+ }
114
+ this.logger.info(`(${table.name}) Finished running after-update table watchers`);
115
+ }
116
+
117
+ async runBeforeDeleteTableWatchers<T extends R>(
118
+ table: Table<T>,
119
+ recordsToDelete: T[],
120
+ qb: QueryBuilder<T>
121
+ ): Promise<void> {
122
+ const tableWatcherMap = TableWatcherRunner.tableWatcherMap[table.name];
123
+ if (!tableWatcherMap) {
124
+ return;
125
+ }
126
+
127
+ const tableWatchers = tableWatcherMap.beforeDelete;
128
+ if (tableWatchers.length === 0) {
129
+ return;
130
+ }
131
+
132
+ this.logger.info(`(${table.name}) Running before-delete table watchers`);
133
+ const qbCopy = QueryBuilder.fromQueryBuilder(qb, table.name);
134
+ for (const tableWatcher of tableWatchers) {
135
+ this.logger.info(`(${table.name}) Running ${tableWatcher.name()}.beforeDelete`);
136
+ await tableWatcher.beforeDelete(recordsToDelete, qbCopy);
137
+ this.logger.info(`(${table.name}) Finished running ${tableWatcher.name()}.beforeDelete`);
138
+ }
139
+ this.logger.info(`(${table.name}) Finished running before-delete table watchers`);
140
+ }
141
+
142
+ async runAfterDeleteTableWatchers<T extends R>(
143
+ table: Table<T>,
144
+ recordDeleteCount: number,
145
+ deletedRecords: T[],
146
+ qb: QueryBuilder<T>
147
+ ): Promise<void> {
148
+ const tableWatcherMap = TableWatcherRunner.tableWatcherMap[table.name];
149
+ if (!tableWatcherMap) {
150
+ return;
151
+ }
152
+
153
+ const tableWatchers = tableWatcherMap.afterDelete;
154
+ if (tableWatchers.length === 0) {
155
+ return;
156
+ }
157
+
158
+ this.logger.info(`(${table.name}) Running after-delete table watchers`);
159
+ const qbCopy = QueryBuilder.fromQueryBuilder(qb, table.name);
160
+ for (const tableWatcher of tableWatchers) {
161
+ this.logger.info(`(${table.name}) Running ${tableWatcher.name()}.afterDelete`);
162
+ await tableWatcher.afterDelete(recordDeleteCount, deletedRecords, qbCopy);
163
+ this.logger.info(`(${table.name}) Finished running ${tableWatcher.name()}.afterDelete`);
164
+ }
165
+ this.logger.info(`(${table.name}) Finished running after-delete table watchers`);
166
+ }
167
+ }