@po-ui/ng-sync 14.0.0 → 14.2.1
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/README.md +22 -22
- package/esm2020/lib/index.mjs +15 -15
- package/esm2020/lib/models/index.mjs +6 -6
- package/esm2020/lib/models/po-data-message.model.mjs +57 -57
- package/esm2020/lib/models/po-data-transform.model.mjs +22 -22
- package/esm2020/lib/models/po-entity/po-entity.model.mjs +214 -214
- package/esm2020/lib/models/po-event-sourcing-error-response.model.mjs +17 -17
- package/esm2020/lib/models/po-network-status.model.mjs +44 -44
- package/esm2020/lib/models/po-network-type.enum.mjs +30 -30
- package/esm2020/lib/models/po-query-builder/po-query-builder.model.mjs +238 -238
- package/esm2020/lib/models/po-request-type.enum.mjs +16 -16
- package/esm2020/lib/po-sync.module.mjs +45 -45
- package/esm2020/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs +17 -17
- package/esm2020/lib/services/po-event-sourcing/index.mjs +4 -4
- package/esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs +2 -2
- package/esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs +2 -2
- package/esm2020/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +372 -372
- package/esm2020/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs +11 -11
- package/esm2020/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs +2 -2
- package/esm2020/lib/services/po-http-client/interfaces/po-response-api.interface.mjs +2 -2
- package/esm2020/lib/services/po-http-client/po-http-client.service.mjs +148 -148
- package/esm2020/lib/services/po-http-client/po-http-request-type.enum.mjs +25 -25
- package/esm2020/lib/services/po-network/po-network.service.mjs +58 -58
- package/esm2020/lib/services/po-schema/index.mjs +4 -4
- package/esm2020/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +77 -77
- package/esm2020/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs +124 -124
- package/esm2020/lib/services/po-schema/po-schema.service.mjs +174 -174
- package/esm2020/lib/services/po-sync/interfaces/po-sync-config.interface.mjs +2 -2
- package/esm2020/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs +2 -2
- package/esm2020/lib/services/po-sync/interfaces/po-sync-response.interface.mjs +2 -2
- package/esm2020/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs +2 -2
- package/esm2020/lib/services/po-sync/po-sync.service.mjs +325 -325
- package/esm2020/lib/utils/utils.mjs +63 -63
- package/esm2020/po-ui-ng-sync.mjs +4 -4
- package/esm2020/public-api.mjs +2 -2
- package/fesm2015/po-ui-ng-sync.mjs +2060 -2060
- package/fesm2015/po-ui-ng-sync.mjs.map +1 -1
- package/fesm2020/po-ui-ng-sync.mjs +1965 -1965
- package/fesm2020/po-ui-ng-sync.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/index.d.ts +14 -14
- package/lib/models/index.d.ts +5 -5
- package/lib/models/po-data-message.model.d.ts +46 -46
- package/lib/models/po-data-transform.model.d.ts +52 -52
- package/lib/models/po-entity/po-entity.model.d.ts +122 -122
- package/lib/models/po-event-sourcing-error-response.model.d.ts +20 -20
- package/lib/models/po-network-status.model.d.ts +25 -25
- package/lib/models/po-network-type.enum.d.ts +28 -28
- package/lib/models/po-query-builder/po-query-builder.model.d.ts +126 -126
- package/lib/models/po-request-type.enum.d.ts +14 -14
- package/lib/po-sync.module.d.ts +12 -12
- package/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.d.ts +11 -11
- package/lib/services/po-event-sourcing/index.d.ts +3 -3
- package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.d.ts +26 -26
- package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.d.ts +16 -16
- package/lib/services/po-event-sourcing/po-event-sourcing.service.d.ts +74 -74
- package/lib/services/po-http-client/interfaces/po-http-header-option.interface.d.ts +15 -15
- package/lib/services/po-http-client/interfaces/po-http-request-data.interface.d.ts +24 -24
- package/lib/services/po-http-client/interfaces/po-response-api.interface.d.ts +14 -14
- package/lib/services/po-http-client/po-http-client.service.d.ts +78 -78
- package/lib/services/po-http-client/po-http-request-type.enum.d.ts +23 -23
- package/lib/services/po-network/po-network.service.d.ts +36 -36
- package/lib/services/po-schema/index.d.ts +3 -3
- package/lib/services/po-schema/po-schema-definition/po-schema-definition.service.d.ts +51 -51
- package/lib/services/po-schema/po-schema-util/po-schema-util.model.d.ts +79 -79
- package/lib/services/po-schema/po-schema.service.d.ts +98 -98
- package/lib/services/po-sync/interfaces/po-sync-config.interface.d.ts +24 -24
- package/lib/services/po-sync/interfaces/po-sync-field-options.interface.d.ts +15 -15
- package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +20 -20
- package/lib/services/po-sync/interfaces/po-sync-schema.interface.d.ts +37 -37
- package/lib/services/po-sync/po-sync.service.d.ts +162 -162
- package/lib/utils/utils.d.ts +36 -36
- package/package.json +4 -4
- package/po-ui-ng-sync-14.2.1.tgz +0 -0
- package/public-api.d.ts +1 -1
- package/schematics/README.md +169 -169
- package/schematics/collection.json +15 -15
- package/schematics/migrations.json +35 -35
- package/schematics/ng-add/index.d.ts +7 -7
- package/schematics/ng-add/index.js +33 -33
- package/schematics/ng-add/index.spec.d.ts +1 -1
- package/schematics/ng-add/index.spec.js +62 -62
- package/schematics/ng-add/schema.json +16 -16
- package/schematics/ng-generate/schema/files/__path__/__name@dasherize__/__name@dasherize__.constants.ts.template +13 -13
- package/schematics/ng-generate/schema/index.d.ts +4 -4
- package/schematics/ng-generate/schema/index.js +12 -12
- package/schematics/ng-generate/schema/index.spec.d.ts +1 -1
- package/schematics/ng-generate/schema/index.spec.js +44 -44
- package/schematics/ng-generate/schema/schema.d.ts +3 -3
- package/schematics/ng-generate/schema/schema.js +2 -2
- package/schematics/ng-generate/schema/schema.json +31 -31
- package/schematics/ng-update/v14/changes.d.ts +2 -2
- package/schematics/ng-update/v14/changes.js +13 -13
- package/schematics/ng-update/v14/index.d.ts +1 -1
- package/schematics/ng-update/v14/index.js +15 -15
- package/schematics/ng-update/v2/changes.d.ts +8 -8
- package/schematics/ng-update/v2/changes.js +20 -20
- package/schematics/ng-update/v2/index.d.ts +5 -5
- package/schematics/ng-update/v2/index.js +101 -101
- package/schematics/ng-update/v3/changes.d.ts +2 -2
- package/schematics/ng-update/v3/changes.js +14 -14
- package/schematics/ng-update/v3/index.d.ts +1 -1
- package/schematics/ng-update/v3/index.js +16 -16
- package/schematics/ng-update/v4/changes.d.ts +2 -2
- package/schematics/ng-update/v4/changes.js +14 -14
- package/schematics/ng-update/v4/index.d.ts +1 -1
- package/schematics/ng-update/v4/index.js +15 -15
- package/schematics/ng-update/v5/changes.d.ts +2 -2
- package/schematics/ng-update/v5/changes.js +13 -13
- package/schematics/ng-update/v5/index.d.ts +1 -1
- package/schematics/ng-update/v5/index.js +15 -15
- package/schematics/ng-update/v6/changes.d.ts +2 -2
- package/schematics/ng-update/v6/changes.js +13 -13
- package/schematics/ng-update/v6/index.d.ts +1 -1
- package/schematics/ng-update/v6/index.js +15 -15
- package/po-ui-ng-sync-14.0.0.tgz +0 -0
|
@@ -1,214 +1,214 @@
|
|
|
1
|
-
import { validateParameter } from '../../utils/utils';
|
|
2
|
-
import { PoEventSourcingOperation } from '../../services/po-event-sourcing';
|
|
3
|
-
import { PoQueryBuilder } from './../po-query-builder/po-query-builder.model';
|
|
4
|
-
import { PoSchemaUtil } from '../../services/po-schema';
|
|
5
|
-
/**
|
|
6
|
-
* @description
|
|
7
|
-
*
|
|
8
|
-
* Uma instância `PoEntity` representa um *schema* e ela contém métodos que possibilitam manipular seus registros,
|
|
9
|
-
* como por exemplo: buscar, criar e remover.
|
|
10
|
-
*
|
|
11
|
-
* Esta instância pode ser obtida a partir do retorno do método `PoSyncService.getModel('schema name')`.
|
|
12
|
-
*/
|
|
13
|
-
export class PoEntity {
|
|
14
|
-
constructor(eventSourcing, schema, poSchemaService) {
|
|
15
|
-
this.eventSourcing = eventSourcing;
|
|
16
|
-
this.schema = schema;
|
|
17
|
-
this.poSchemaService = poSchemaService;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Busca os registros do *schema*, podendo filtrar o resultado a partir do filtro passado e retornando apenas
|
|
21
|
-
* os campos definidos.
|
|
22
|
-
*
|
|
23
|
-
* Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.
|
|
24
|
-
* Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).
|
|
25
|
-
*
|
|
26
|
-
* @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.
|
|
27
|
-
* @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de
|
|
28
|
-
* uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.
|
|
29
|
-
* Por exemplo, a definição abaixo:
|
|
30
|
-
*
|
|
31
|
-
* ```
|
|
32
|
-
* PoQueryBuilder.select('name age address');
|
|
33
|
-
* ```
|
|
34
|
-
* Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:
|
|
35
|
-
*
|
|
36
|
-
* ```
|
|
37
|
-
* PoQueryBuilder.select('-name -age');
|
|
38
|
-
* ```
|
|
39
|
-
* @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.
|
|
40
|
-
*/
|
|
41
|
-
find(filter, fields) {
|
|
42
|
-
const query = new PoQueryBuilder(this.poSchemaService, this.schema);
|
|
43
|
-
if (filter) {
|
|
44
|
-
query.filter(filter);
|
|
45
|
-
}
|
|
46
|
-
if (fields) {
|
|
47
|
-
query.select(fields);
|
|
48
|
-
}
|
|
49
|
-
return query;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Busca um registro pelo seu *id*.
|
|
53
|
-
*
|
|
54
|
-
* Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.
|
|
55
|
-
* Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).
|
|
56
|
-
*
|
|
57
|
-
* @param {any} id Identificador do registro.
|
|
58
|
-
* @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de
|
|
59
|
-
* uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.
|
|
60
|
-
* Por exemplo, a definição abaixo:
|
|
61
|
-
*
|
|
62
|
-
* ```
|
|
63
|
-
* PoQueryBuilder.select('name age address');
|
|
64
|
-
* ```
|
|
65
|
-
* Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:
|
|
66
|
-
*
|
|
67
|
-
* ```
|
|
68
|
-
* PoQueryBuilder.select('-name -age');
|
|
69
|
-
* ```
|
|
70
|
-
* @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.
|
|
71
|
-
*/
|
|
72
|
-
findById(id, fields) {
|
|
73
|
-
return this.findOne({ [this.schema.idField]: id }, fields);
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Semelhante ao método `PoEntity.find()`, porém retorna apenas o primeiro registro encontrado na busca.
|
|
77
|
-
*
|
|
78
|
-
* Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.
|
|
79
|
-
* Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).
|
|
80
|
-
*
|
|
81
|
-
* @param {any} filter Objeto que contém os campos e valores a serem filtrados no *schema*.
|
|
82
|
-
* @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de
|
|
83
|
-
* uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.
|
|
84
|
-
* Por exemplo, a definição abaixo:
|
|
85
|
-
*
|
|
86
|
-
* ```
|
|
87
|
-
* PoQueryBuilder.select('name age address');
|
|
88
|
-
* ```
|
|
89
|
-
* Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:
|
|
90
|
-
*
|
|
91
|
-
* ```
|
|
92
|
-
* PoQueryBuilder.select('-name -age');
|
|
93
|
-
* ```
|
|
94
|
-
* @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.
|
|
95
|
-
*/
|
|
96
|
-
findOne(filter, fields) {
|
|
97
|
-
const query = this.find(filter, fields);
|
|
98
|
-
query.limit(1);
|
|
99
|
-
return query;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Remove um registro.
|
|
103
|
-
*
|
|
104
|
-
* @param {object} record Registro que será removido.
|
|
105
|
-
* @param {string} customRequestId Identificador customizado do comando.
|
|
106
|
-
* @returns {Promise} Promessa que é concluída após o registro ser removido.
|
|
107
|
-
*/
|
|
108
|
-
async remove(record, customRequestId) {
|
|
109
|
-
validateParameter({ record });
|
|
110
|
-
const remove = async () => {
|
|
111
|
-
const idField = record[this.schema.idField] ? this.schema.idField : PoSchemaUtil.syncInternalIdFieldName;
|
|
112
|
-
const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, record)['serverRecord'];
|
|
113
|
-
await this.poSchemaService.remove(this.schema.name, record[idField]);
|
|
114
|
-
await this.eventSourcing.remove(this.schema.name, serverRecord, customRequestId);
|
|
115
|
-
};
|
|
116
|
-
return this.poSchemaService.limitedCallWrap(remove);
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Altera ou inclui um registro.
|
|
120
|
-
*
|
|
121
|
-
* > O registro será alterado se ele possuir um *id*, caso contrário um novo registro será criado.
|
|
122
|
-
*
|
|
123
|
-
* @param {object} record Registro que será persistido.
|
|
124
|
-
* @param {string} customRequestId Identificador customizado do comando.
|
|
125
|
-
* @returns {Promise} Promessa que é concluída após o registro ser alterado ou incluído.
|
|
126
|
-
*/
|
|
127
|
-
async save(record, customRequestId) {
|
|
128
|
-
validateParameter({ record });
|
|
129
|
-
return this.poSchemaService.limitedCallWrap(this.selectSaveType.bind(this, record, true, customRequestId));
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Salva uma lista de registros em lote.
|
|
133
|
-
*
|
|
134
|
-
* > Para cada registro da lista, será inserido um novo registro se o mesmo não tiver *id*, caso contrário
|
|
135
|
-
* será contado como uma atualização de um registro existente.
|
|
136
|
-
*
|
|
137
|
-
* @param {Array<object>} records Lista de registros que serão persistidos.
|
|
138
|
-
* @param {Array<string> | string} customRequestIds Identificador customizado do comando.
|
|
139
|
-
*
|
|
140
|
-
* Ao passar uma lista de identificadores, cada índice da lista de identificadores deverá
|
|
141
|
-
* corresponder ao índice do registro na lista de registros.
|
|
142
|
-
* @returns {Promise<any>} Promessa que é concluída após os registros serem alterados ou incluídos.
|
|
143
|
-
*/
|
|
144
|
-
async saveAll(records, customRequestIds) {
|
|
145
|
-
validateParameter({ records });
|
|
146
|
-
const saveAll = async () => {
|
|
147
|
-
const batchEvents = [];
|
|
148
|
-
for (let index = 0; index < records.length; index++) {
|
|
149
|
-
const record = records[index];
|
|
150
|
-
const sendToEventSourcing = false;
|
|
151
|
-
const isNonLocalRecordChanged = await this.isNonLocalRecordChanged(record);
|
|
152
|
-
const updatedRecord = await this.selectSaveType(record, sendToEventSourcing);
|
|
153
|
-
if (isNonLocalRecordChanged) {
|
|
154
|
-
const customRequestId = customRequestIds instanceof Array ? customRequestIds[index] : customRequestIds;
|
|
155
|
-
const eventOperation = this.createEventOperation(record, updatedRecord, customRequestId);
|
|
156
|
-
batchEvents.push(eventOperation);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
await this.eventSourcing.createBatchEvents(this.schema.name, batchEvents);
|
|
160
|
-
};
|
|
161
|
-
return this.poSchemaService.limitedCallWrap(saveAll);
|
|
162
|
-
}
|
|
163
|
-
async create(newRecord, sendToEventSourcing, customRequestId) {
|
|
164
|
-
const time = new Date().getTime();
|
|
165
|
-
const syncProperties = {
|
|
166
|
-
[PoSchemaUtil.syncInternalIdFieldName]: time,
|
|
167
|
-
SyncInsertedDateTime: time,
|
|
168
|
-
SyncUpdatedDateTime: null,
|
|
169
|
-
SyncExclusionDateTime: null,
|
|
170
|
-
SyncDeleted: false,
|
|
171
|
-
SyncStatus: 0
|
|
172
|
-
};
|
|
173
|
-
const recordWithSyncProperties = { ...newRecord, ...syncProperties };
|
|
174
|
-
const recordedData = await this.poSchemaService.create(this.schema, recordWithSyncProperties);
|
|
175
|
-
if (sendToEventSourcing) {
|
|
176
|
-
await this.eventSourcing.create(this.schema.name, recordWithSyncProperties, customRequestId);
|
|
177
|
-
}
|
|
178
|
-
return recordedData;
|
|
179
|
-
}
|
|
180
|
-
createEventOperation(record, updatedRecord, customRequestId) {
|
|
181
|
-
const operation = PoSchemaUtil.getRecordId(record, this.schema)
|
|
182
|
-
? PoEventSourcingOperation.Update
|
|
183
|
-
: PoEventSourcingOperation.Insert;
|
|
184
|
-
const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, updatedRecord)['serverRecord'];
|
|
185
|
-
return {
|
|
186
|
-
record: serverRecord,
|
|
187
|
-
customRequestId: customRequestId,
|
|
188
|
-
operation: operation
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
async isNonLocalRecordChanged(updatedRecord) {
|
|
192
|
-
const nonLocalFieldNames = PoSchemaUtil.getNonLocalFieldNames(this.schema);
|
|
193
|
-
const record = await this.poSchemaService.get(this.schema.name, updatedRecord[this.schema.idField]);
|
|
194
|
-
return !PoSchemaUtil.isModelsEqual(nonLocalFieldNames, record, updatedRecord);
|
|
195
|
-
}
|
|
196
|
-
async selectSaveType(record, sendToEventSourcing, customRequestId) {
|
|
197
|
-
const hasId = PoSchemaUtil.getRecordId(record, this.schema);
|
|
198
|
-
return hasId
|
|
199
|
-
? await this.update(record, sendToEventSourcing, customRequestId)
|
|
200
|
-
: await this.create(record, sendToEventSourcing, customRequestId);
|
|
201
|
-
}
|
|
202
|
-
async update(updatedRecord, sendToEventSourcing, customRequestId) {
|
|
203
|
-
updatedRecord.SyncUpdatedDateTime = new Date().getTime();
|
|
204
|
-
updatedRecord.SyncStatus = 0;
|
|
205
|
-
const isNonLocalRecordChanged = await this.isNonLocalRecordChanged(updatedRecord);
|
|
206
|
-
const recordedData = await this.poSchemaService.update(this.schema, updatedRecord);
|
|
207
|
-
if (isNonLocalRecordChanged && sendToEventSourcing) {
|
|
208
|
-
const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, updatedRecord)['serverRecord'];
|
|
209
|
-
await this.eventSourcing.update(this.schema.name, serverRecord, customRequestId);
|
|
210
|
-
}
|
|
211
|
-
return recordedData;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tZW50aXR5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL21vZGVscy9wby1lbnRpdHkvcG8tZW50aXR5Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRELE9BQU8sRUFDTCx3QkFBd0IsRUFHekIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDOUUsT0FBTyxFQUFtQixZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd6RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkIsWUFDVSxhQUFxQyxFQUNyQyxNQUFvQixFQUNwQixlQUFnQztRQUZoQyxrQkFBYSxHQUFiLGFBQWEsQ0FBd0I7UUFDckMsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7SUFDdkMsQ0FBQztJQUVKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FxQkc7SUFDSCxJQUFJLENBQUMsTUFBZSxFQUFFLE1BQWU7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFcEUsSUFBSSxNQUFNLEVBQUU7WUFDVixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsSUFBSSxNQUFNLEVBQUU7WUFDVixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ0gsUUFBUSxDQUFDLEVBQU8sRUFBRSxNQUFlO1FBQy9CLE9BQU8sSUFBSSxD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QUFDO1lBQ2pFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWtCLEVBQUUsbUJBQTRCLEVBQUUsZUFBd0I7UUFDN0YsYUFBYSxDQUFDLG1CQUFtQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekQsYUFBYSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFN0IsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFbkYsSUFBSSx1QkFBdUIsSUFBSSxtQkFBbUIsRUFBRTtZQUNsRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNuRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztTQUNsRjtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRlUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24sXHJcbiAgUG9FdmVudFNvdXJjaW5nU2VydmljZSxcclxuICBQb0V2ZW50U291cmNpbmdTdW1tYXJ5SXRlbVxyXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BvLWV2ZW50LXNvdXJjaW5nJztcclxuaW1wb3J0IHsgUG9RdWVyeUJ1aWxkZXIgfSBmcm9tICcuLy4uL3BvLXF1ZXJ5LWJ1aWxkZXIvcG8tcXVlcnktYnVpbGRlci5tb2RlbCc7XHJcbmltcG9ydCB7IFBvU2NoZW1hU2VydmljZSwgUG9TY2hlbWFVdGlsIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tc2NoZW1hJztcclxuaW1wb3J0IHsgUG9TeW5jU2NoZW1hIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtc2NoZW1hLmludGVyZmFjZSc7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqXHJcbiAqIFVtYSBpbnN0w6JuY2lhIGBQb0VudGl0eWAgcmVwcmVzZW50YSB1bSAqc2NoZW1hKiBlIGVsYSBjb250w6ltIG3DqXRvZG9zIHF1ZSBwb3NzaWJpbGl0YW0gbWFuaXB1bGFyIHNldXMgcmVnaXN0cm9zLFxyXG4gKiBjb21vIHBvciBleGVtcGxvOiBidXNjYXIsIGNyaWFyIGUgcmVtb3Zlci5cclxuICpcclxuICogRXN0YSBpbnN0w6JuY2lhIHBvZGUgc2VyIG9idGlkYSBhIHBhcnRpciBkbyByZXRvcm5vIGRvIG3DqXRvZG8gYFBvU3luY1NlcnZpY2UuZ2V0TW9kZWwoJ3NjaGVtYSBuYW1lJylgLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBvRW50aXR5IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZXZlbnRTb3VyY2luZzogUG9FdmVudFNvdXJjaW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgc2NoZW1hOiBQb1N5bmNTY2hlbWEsXHJcbiAgICBwcml2YXRlIHBvU2NoZW1hU2VydmljZTogUG9TY2hlbWFTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiBCdXNjYSBvcyByZWdpc3Ryb3MgZG8gKnNjaGVtYSosIHBvZGVuZG8gZmlsdHJhciBvIHJlc3VsdGFkbyBhIHBhcnRpciBkbyBmaWx0cm8gcGFzc2FkbyBlIHJldG9ybmFuZG8gYXBlbmFzXHJcbiAgICogb3MgY2FtcG9zIGRlZmluaWRvcy5cclxuICAgKlxyXG4gICAqIFBhcmEgcXVlIGVzdGEgYnVzY2Egc2VqYSBjb25jbHXDrWRhIMOpIG5lY2Vzc8OhcmlvIHV0aWxpemFyIG8gbcOpdG9kbyBgUG9RdWVyeUJ1aWxkZXIuZXhlYygpYC5cclxuICAgKiBWZWphIG1haXMgZW06IFtQb1F1ZXJ5QnVpbGRlcl0oL2RvY3VtZW50YXRpb24vcG8tcXVlcnktYnVpbGRlcikuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIE9iamV0byBxdWUgY29udMOpbSBvcyBjYW1wb3MgZSB2YWxvcmVzIGEgc2VyZW0gZmlsdHJhZG9zIG5vICpzY2hlbWEqLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZHMgQ2FtcG9zIHF1ZSBzZXLDo28gcmV0b3JuYWRvcyBub3MgcmVnaXN0cm9zLiBFc3RlIGNhbXBvcyBkZXZlbSBlc3RhciBkZW50cm8gZGVcclxuICAgKiB1bWEgKnN0cmluZyogc2VwYXJhZG9zIHBvciBlc3Bhw6dvIHBvZGVuZG8gdXNhciBvIGNhcmFjdGVyZSBgLWAgcGFyYSBleGNsdWlyIGNhbXBvcy5cclxuICAgKiBQb3IgZXhlbXBsbywgYSBkZWZpbmnDp8OjbyBhYmFpeG86XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiBQb1F1ZXJ5QnVpbGRlci5zZWxlY3QoJ25hbWUgYWdlIGFkZHJlc3MnKTtcclxuICAgKiBgYGBcclxuICAgKiBJcsOhIHJldG9ybmFyIGFwZW5hcyBvcyBjYW1wb3MgYG5hbWVgLCBgYWdlYCBlIGBhZGRyZXNzYC4gRSBwYXJhIG7Do28gbW9zdHJhciB1bSBjYW1wbyBvdSBtYWlzIGJhc3RhIGZhemVyOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogUG9RdWVyeUJ1aWxkZXIuc2VsZWN0KCctbmFtZSAtYWdlJyk7XHJcbiAgICogYGBgXHJcbiAgICogQHJldHVybnMge1BvUXVlcnlCdWlsZGVyfSBPYmpldG8gcXVlIHBvc3NpYmlsaXRhIGVuY2FkZWFyIHVtIG3DqXRvZG8gZG8gYFBvUXVlcnlCdWlsZGVyYC5cclxuICAgKi9cclxuICBmaW5kKGZpbHRlcj86IG9iamVjdCwgZmllbGRzPzogc3RyaW5nKTogUG9RdWVyeUJ1aWxkZXIge1xyXG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUG9RdWVyeUJ1aWxkZXIodGhpcy5wb1NjaGVtYVNlcnZpY2UsIHRoaXMuc2NoZW1hKTtcclxuXHJcbiAgICBpZiAoZmlsdGVyKSB7XHJcbiAgICAgIHF1ZXJ5LmZpbHRlcihmaWx0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWVsZHMpIHtcclxuICAgICAgcXVlcnkuc2VsZWN0KGZpZWxkcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHF1ZXJ5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVzY2EgdW0gcmVnaXN0cm8gcGVsbyBzZXUgKmlkKi5cclxuICAgKlxyXG4gICAqIFBhcmEgcXVlIGVzdGEgYnVzY2Egc2VqYSBjb25jbHXDrWRhIMOpIG5lY2Vzc8OhcmlvIHV0aWxpemFyIG8gbcOpdG9kbyBgUG9RdWVyeUJ1aWxkZXIuZXhlYygpYC5cclxuICAgKiBWZWphIG1haXMgZW06IFtQb1F1ZXJ5QnVpbGRlcl0oL2RvY3VtZW50YXRpb24vcG8tcXVlcnktYnVpbGRlcikuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueX0gaWQgSWRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRzIENhbXBvcyBxdWUgc2Vyw6NvIHJldG9ybmFkb3Mgbm9zIHJlZ2lzdHJvcy4gRXN0ZSBjYW1wb3MgZGV2ZW0gZXN0YXIgZGVudHJvIGRlXHJcbiAgICogdW1hICpzdHJpbmcqIHNlcGFyYWRvcyBwb3IgZXNwYcOnbyBwb2RlbmRvIHVzYXIgbyBjYXJhY3RlcmUgYC1gIHBhcmEgZXhjbHVpciBjYW1wb3MuXHJcbiAgICogUG9yIGV4ZW1wbG8sIGEgZGVmaW5pw6fDo28gYWJhaXhvOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogUG9RdWVyeUJ1aWxkZXIuc2VsZWN0KCduYW1lIGFnZSBhZGRyZXNzJyk7XHJcbiAgICogYGBgXHJcbiAgICogSXLDoSByZXRvcm5hciBhcGVuYXMgb3MgY2FtcG9zIGBuYW1lYCwgYGFnZWAgZSBgYWRkcmVzc2AuIEUgcGFyYSBuw6NvIG1vc3RyYXIgdW0gY2FtcG8gb3UgbWFpcyBiYXN0YSBmYXplcjpcclxuICAgKlxyXG4gICAqIGBgYFxyXG4gICAqIFBvUXVlcnlCdWlsZGVyLnNlbGVjdCgnLW5hbWUgLWFnZScpO1xyXG4gICAqIGBgYFxyXG4gICAqIEByZXR1cm5zIHtQb1F1ZXJ5QnVpbGRlcn0gT2JqZXRvIHF1ZSBwb3NzaWJpbGl0YSBlbmNhZGVhciB1bSBtw6l0b2RvIGRvIGBQb1F1ZXJ5QnVpbGRlcmAuXHJcbiAgICovXHJcbiAgZmluZEJ5SWQoaWQ6IGFueSwgZmllbGRzPzogc3RyaW5nKTogUG9RdWVyeUJ1aWxkZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZmluZE9uZSh7IFt0aGlzLnNjaGVtYS5pZEZpZWxkXTogaWQgfSwgZmllbGRzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbWVsaGFudGUgYW8gbcOpdG9kbyBgUG9FbnRpdHkuZmluZCgpYCwgcG9yw6ltIHJldG9ybmEgYXBlbmFzIG8gcHJpbWVpcm8gcmVnaXN0cm8gZW5jb250cmFkbyBuYSBidXNjYS5cclxuICAgKlxyXG4gICAqIFBhcmEgcXVlIGVzdGEgYnVzY2Egc2VqYSBjb25jbHXDrWRhIMOpIG5lY2Vzc8OhcmlvIHV0aWxpemFyIG8gbcOpdG9kbyBgUG9RdWVyeUJ1aWxkZXIuZXhlYygpYC5cclxuICAgKiBWZWphIG1haXMgZW06IFtQb1F1ZXJ5QnVpbGRlcl0oL2RvY3VtZW50YXRpb24vcG8tcXVlcnktYnVpbGRlcikuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueX0gZmlsdGVyIE9iamV0byBxdWUgY29udMOpbSBvcyBjYW1wb3MgZSB2YWxvcmVzIGEgc2VyZW0gZmlsdHJhZG9zIG5vICpzY2hlbWEqLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZHMgQ2FtcG9zIHF1ZSBzZXLDo28gcmV0b3JuYWRvcyBub3MgcmVnaXN0cm9zLiBFc3RlIGNhbXBvcyBkZXZlbSBlc3RhciBkZW50cm8gZGVcclxuICAgKiB1bWEgKnN0cmluZyogc2VwYXJhZG9zIHBvciBlc3Bhw6dvIHBvZGVuZG8gdXNhciBvIGNhcmFjdGVyZSBgLWAgcGFyYSBleGNsdWlyIGNhbXBvcy5cclxuICAgKiBQb3IgZXhlbXBsbywgYSBkZWZpbmnDp8OjbyBhYmFpeG86XHJcbiAgICpcclxuICAgKiBgYGBcclxuICAgKiBQb1F1ZXJ5QnVpbGRlci5zZWxlY3QoJ25hbWUgYWdlIGFkZHJlc3MnKTtcclxuICAgKiBgYGBcclxuICAgKiBJcsOhIHJldG9ybmFyIGFwZW5hcyBvcyBjYW1wb3MgYG5hbWVgLCBgYWdlYCBlIGBhZGRyZXNzYC4gRSBwYXJhIG7Do28gbW9zdHJhciB1bSBjYW1wbyBvdSBtYWlzIGJhc3RhIGZhemVyOlxyXG4gICAqXHJcbiAgICogYGBgXHJcbiAgICogUG9RdWVyeUJ1aWxkZXIuc2VsZWN0KCctbmFtZSAtYWdlJyk7XHJcbiAgICogYGBgXHJcbiAgICogQHJldHVybnMge1BvUXVlcnlCdWlsZGVyfSBPYmpldG8gcXVlIHBvc3NpYmlsaXRhIGVuY2FkZWFyIHVtIG3DqXRvZG8gZG8gYFBvUXVlcnlCdWlsZGVyYC5cclxuICAgKi9cclxuICBmaW5kT25lKGZpbHRlcj86IGFueSwgZmllbGRzPzogc3RyaW5nKTogUG9RdWVyeUJ1aWxkZXIge1xyXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmZpbmQoZmlsdGVyLCBmaWVsZHMpO1xyXG4gICAgcXVlcnkubGltaXQoMSk7XHJcbiAgICByZXR1cm4gcXVlcnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdW0gcmVnaXN0cm8uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge29iamVjdH0gcmVjb3JkIFJlZ2lzdHJvIHF1ZSBzZXLDoSByZW1vdmlkby5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3VzdG9tUmVxdWVzdElkIElkZW50aWZpY2Fkb3IgY3VzdG9taXphZG8gZG8gY29tYW5kby5cclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWVzc2EgcXVlIMOpIGNvbmNsdcOtZGEgYXDDs3MgbyByZWdpc3RybyBzZXIgcmVtb3ZpZG8uXHJcbiAgICovXHJcbiAgYXN5bmMgcmVtb3ZlKHJlY29yZDogb2JqZWN0LCBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdmFsaWRhdGVQYXJhbWV0ZXIoeyByZWNvcmQgfSk7XHJcblxyXG4gICAgY29uc3QgcmVtb3ZlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBpZEZpZWxkID0gcmVjb3JkW3RoaXMuc2NoZW1hLmlkRmllbGRdID8gdGhpcy5zY2hlbWEuaWRGaWVsZCA6IFBvU2NoZW1hVXRpbC5zeW5jSW50ZXJuYWxJZEZpZWxkTmFtZTtcclxuICAgICAgY29uc3Qgc2VydmVyUmVjb3JkID0gUG9TY2hlbWFVdGlsLnNlcGFyYXRlU2NoZW1hRmllbGRzKHRoaXMuc2NoZW1hLCByZWNvcmQpWydzZXJ2ZXJSZWNvcmQnXTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLnJlbW92ZSh0aGlzLnNjaGVtYS5uYW1lLCByZWNvcmRbaWRGaWVsZF0pO1xyXG4gICAgICBhd2FpdCB0aGlzLmV2ZW50U291cmNpbmcucmVtb3ZlKHRoaXMuc2NoZW1hLm5hbWUsIHNlcnZlclJlY29yZCwgY3VzdG9tUmVxdWVzdElkKTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlLmxpbWl0ZWRDYWxsV3JhcChyZW1vdmUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWx0ZXJhIG91IGluY2x1aSB1bSByZWdpc3Ryby5cclxuICAgKlxyXG4gICAqID4gTyByZWdpc3RybyBzZXLDoSBhbHRlcmFkbyBzZSBlbGUgcG9zc3VpciB1bSAqaWQqLCBjYXNvIGNvbnRyw6FyaW8gdW0gbm92byByZWdpc3RybyBzZXLDoSBjcmlhZG8uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge29iamVjdH0gcmVjb3JkIFJlZ2lzdHJvIHF1ZSBzZXLDoSBwZXJzaXN0aWRvLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXN0b21SZXF1ZXN0SWQgSWRlbnRpZmljYWRvciBjdXN0b21pemFkbyBkbyBjb21hbmRvLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9tZXNzYSBxdWUgw6kgY29uY2x1w61kYSBhcMOzcyBvIHJlZ2lzdHJvIHNlciBhbHRlcmFkbyBvdSBpbmNsdcOtZG8uXHJcbiAgICovXHJcbiAgYXN5bmMgc2F2ZShyZWNvcmQ6IG9iamVjdCwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHZhbGlkYXRlUGFyYW1ldGVyKHsgcmVjb3JkIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZS5saW1pdGVkQ2FsbFdyYXAodGhpcy5zZWxlY3RTYXZlVHlwZS5iaW5kKHRoaXMsIHJlY29yZCwgdHJ1ZSwgY3VzdG9tUmVxdWVzdElkKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTYWx2YSB1bWEgbGlzdGEgZGUgcmVnaXN0cm9zIGVtIGxvdGUuXHJcbiAgICpcclxuICAgKiA+IFBhcmEgY2FkYSByZWdpc3RybyBkYSBsaXN0YSwgc2Vyw6EgaW5zZXJpZG8gdW0gbm92byByZWdpc3RybyBzZSBvIG1lc21vIG7Do28gdGl2ZXIgKmlkKiwgY2FzbyBjb250csOhcmlvXHJcbiAgICogc2Vyw6EgY29udGFkbyBjb21vIHVtYSBhdHVhbGl6YcOnw6NvIGRlIHVtIHJlZ2lzdHJvIGV4aXN0ZW50ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gcmVjb3JkcyBMaXN0YSBkZSByZWdpc3Ryb3MgcXVlIHNlcsOjbyBwZXJzaXN0aWRvcy5cclxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz4gfCBzdHJpbmd9IGN1c3RvbVJlcXVlc3RJZHMgSWRlbnRpZmljYWRvciBjdXN0b21pemFkbyBkbyBjb21hbmRvLlxyXG4gICAqXHJcbiAgICogQW8gcGFzc2FyIHVtYSBsaXN0YSBkZSBpZGVudGlmaWNhZG9yZXMsIGNhZGEgw61uZGljZSBkYSBsaXN0YSBkZSBpZGVudGlmaWNhZG9yZXMgZGV2ZXLDoVxyXG4gICAqIGNvcnJlc3BvbmRlciBhbyDDrW5kaWNlIGRvIHJlZ2lzdHJvIG5hIGxpc3RhIGRlIHJlZ2lzdHJvcy5cclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgY29uY2x1w61kYSBhcMOzcyBvcyByZWdpc3Ryb3Mgc2VyZW0gYWx0ZXJhZG9zIG91IGluY2x1w61kb3MuXHJcbiAgICovXHJcbiAgYXN5bmMgc2F2ZUFsbChyZWNvcmRzOiBBcnJheTxvYmplY3Q+LCBjdXN0b21SZXF1ZXN0SWRzPzogQXJyYXk8c3RyaW5nPiB8IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcih7IHJlY29yZHMgfSk7XHJcblxyXG4gICAgY29uc3Qgc2F2ZUFsbCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgYmF0Y2hFdmVudHMgPSBbXTtcclxuXHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByZWNvcmRzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNbaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IHNlbmRUb0V2ZW50U291cmNpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgaXNOb25Mb2NhbFJlY29yZENoYW5nZWQgPSBhd2FpdCB0aGlzLmlzTm9uTG9jYWxSZWNvcmRDaGFuZ2VkKHJlY29yZCk7XHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFJlY29yZCA9IGF3YWl0IHRoaXMuc2VsZWN0U2F2ZVR5cGUocmVjb3JkLCBzZW5kVG9FdmVudFNvdXJjaW5nKTtcclxuXHJcbiAgICAgICAgaWYgKGlzTm9uTG9jYWxSZWNvcmRDaGFuZ2VkKSB7XHJcbiAgICAgICAgICBjb25zdCBjdXN0b21SZXF1ZXN0SWQgPSBjdXN0b21SZXF1ZXN0SWRzIGluc3RhbmNlb2YgQXJyYXkgPyBjdXN0b21SZXF1ZXN0SWRzW2luZGV4XSA6IGN1c3RvbVJlcXVlc3RJZHM7XHJcbiAgICAgICAgICBjb25zdCBldmVudE9wZXJhdGlvbiA9IHRoaXMuY3JlYXRlRXZlbnRPcGVyYXRpb24ocmVjb3JkLCB1cGRhdGVkUmVjb3JkLCBjdXN0b21SZXF1ZXN0SWQpO1xyXG4gICAgICAgICAgYmF0Y2hFdmVudHMucHVzaChldmVudE9wZXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmV2ZW50U291cmNpbmcuY3JlYXRlQmF0Y2hFdmVudHModGhpcy5zY2hlbWEubmFtZSwgYmF0Y2hFdmVudHMpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2UubGltaXRlZENhbGxXcmFwKHNhdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGUobmV3UmVjb3JkOiBhbnksIHNlbmRUb0V2ZW50U291cmNpbmc6IGJvb2xlYW4sIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgY29uc3Qgc3luY1Byb3BlcnRpZXMgPSB7XHJcbiAgICAgIFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdOiB0aW1lLFxyXG4gICAgICBTeW5jSW5zZXJ0ZWREYXRlVGltZTogdGltZSxcclxuICAgICAgU3luY1VwZGF0ZWREYXRlVGltZTogbnVsbCxcclxuICAgICAgU3luY0V4Y2x1c2lvbkRhdGVUaW1lOiBudWxsLFxyXG4gICAgICBTeW5jRGVsZXRlZDogZmFsc2UsXHJcbiAgICAgIFN5bmNTdGF0dXM6IDBcclxuICAgIH07XHJcbiAgICBjb25zdCByZWNvcmRXaXRoU3luY1Byb3BlcnRpZXMgPSB7IC4uLm5ld1JlY29yZCwgLi4uc3luY1Byb3BlcnRpZXMgfTtcclxuXHJcbiAgICBjb25zdCByZWNvcmRlZERhdGEgPSBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5jcmVhdGUodGhpcy5zY2hlbWEsIHJlY29yZFdpdGhTeW5jUHJvcGVydGllcyk7XHJcblxyXG4gICAgaWYgKHNlbmRUb0V2ZW50U291cmNpbmcpIHtcclxuICAgICAgYXdhaXQgdGhpcy5ldmVudFNvdXJjaW5nLmNyZWF0ZSh0aGlzLnNjaGVtYS5uYW1lLCByZWNvcmRXaXRoU3luY1Byb3BlcnRpZXMsIGN1c3RvbVJlcXVlc3RJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlY29yZGVkRGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRXZlbnRPcGVyYXRpb24oXHJcbiAgICByZWNvcmQ6IG9iamVjdCxcclxuICAgIHVwZGF0ZWRSZWNvcmQ6IG9iamVjdCxcclxuICAgIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZ1xyXG4gICk6IFBvRXZlbnRTb3VyY2luZ1N1bW1hcnlJdGVtIHtcclxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IFBvU2NoZW1hVXRpbC5nZXRSZWNvcmRJZChyZWNvcmQsIHRoaXMuc2NoZW1hKVxyXG4gICAgICA/IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5VcGRhdGVcclxuICAgICAgOiBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSW5zZXJ0O1xyXG5cclxuICAgIGNvbnN0IHNlcnZlclJlY29yZCA9IFBvU2NoZW1hVXRpbC5zZXBhcmF0ZVNjaGVtYUZpZWxkcyh0aGlzLnNjaGVtYSwgdXBkYXRlZFJlY29yZClbJ3NlcnZlclJlY29yZCddO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlY29yZDogc2VydmVyUmVjb3JkLFxyXG4gICAgICBjdXN0b21SZXF1ZXN0SWQ6IGN1c3RvbVJlcXVlc3RJZCxcclxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGlzTm9uTG9jYWxSZWNvcmRDaGFuZ2VkKHVwZGF0ZWRSZWNvcmQ6IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3Qgbm9uTG9jYWxGaWVsZE5hbWVzID0gUG9TY2hlbWFVdGlsLmdldE5vbkxvY2FsRmllbGROYW1lcyh0aGlzLnNjaGVtYSk7XHJcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5nZXQodGhpcy5zY2hlbWEubmFtZSwgdXBkYXRlZFJlY29yZFt0aGlzLnNjaGVtYS5pZEZpZWxkXSk7XHJcblxyXG4gICAgcmV0dXJuICFQb1NjaGVtYVV0aWwuaXNNb2RlbHNFcXVhbChub25Mb2NhbEZpZWxkTmFtZXMsIHJlY29yZCwgdXBkYXRlZFJlY29yZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNlbGVjdFNhdmVUeXBlKFxyXG4gICAgcmVjb3JkOiBvYmplY3QsXHJcbiAgICBzZW5kVG9FdmVudFNvdXJjaW5nOiBib29sZWFuLFxyXG4gICAgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxvYmplY3Q+IHtcclxuICAgIGNvbnN0IGhhc0lkID0gUG9TY2hlbWFVdGlsLmdldFJlY29yZElkKHJlY29yZCwgdGhpcy5zY2hlbWEpO1xyXG5cclxuICAgIHJldHVybiBoYXNJZFxyXG4gICAgICA/IGF3YWl0IHRoaXMudXBkYXRlKHJlY29yZCwgc2VuZFRvRXZlbnRTb3VyY2luZywgY3VzdG9tUmVxdWVzdElkKVxyXG4gICAgICA6IGF3YWl0IHRoaXMuY3JlYXRlKHJlY29yZCwgc2VuZFRvRXZlbnRTb3VyY2luZywgY3VzdG9tUmVxdWVzdElkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlKHVwZGF0ZWRSZWNvcmQ6IGFueSwgc2VuZFRvRXZlbnRTb3VyY2luZzogYm9vbGVhbiwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxvYmplY3Q+IHtcclxuICAgIHVwZGF0ZWRSZWNvcmQuU3luY1VwZGF0ZWREYXRlVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgdXBkYXRlZFJlY29yZC5TeW5jU3RhdHVzID0gMDtcclxuXHJcbiAgICBjb25zdCBpc05vbkxvY2FsUmVjb3JkQ2hhbmdlZCA9IGF3YWl0IHRoaXMuaXNOb25Mb2NhbFJlY29yZENoYW5nZWQodXBkYXRlZFJlY29yZCk7XHJcbiAgICBjb25zdCByZWNvcmRlZERhdGEgPSBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS51cGRhdGUodGhpcy5zY2hlbWEsIHVwZGF0ZWRSZWNvcmQpO1xyXG5cclxuICAgIGlmIChpc05vbkxvY2FsUmVjb3JkQ2hhbmdlZCAmJiBzZW5kVG9FdmVudFNvdXJjaW5nKSB7XHJcbiAgICAgIGNvbnN0IHNlcnZlclJlY29yZCA9IFBvU2NoZW1hVXRpbC5zZXBhcmF0ZVNjaGVtYUZpZWxkcyh0aGlzLnNjaGVtYSwgdXBkYXRlZFJlY29yZClbJ3NlcnZlclJlY29yZCddO1xyXG4gICAgICBhd2FpdCB0aGlzLmV2ZW50U291cmNpbmcudXBkYXRlKHRoaXMuc2NoZW1hLm5hbWUsIHNlcnZlclJlY29yZCwgY3VzdG9tUmVxdWVzdElkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVjb3JkZWREYXRhO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1
|
+
import { validateParameter } from '../../utils/utils';
|
|
2
|
+
import { PoEventSourcingOperation } from '../../services/po-event-sourcing';
|
|
3
|
+
import { PoQueryBuilder } from './../po-query-builder/po-query-builder.model';
|
|
4
|
+
import { PoSchemaUtil } from '../../services/po-schema';
|
|
5
|
+
/**
|
|
6
|
+
* @description
|
|
7
|
+
*
|
|
8
|
+
* Uma instância `PoEntity` representa um *schema* e ela contém métodos que possibilitam manipular seus registros,
|
|
9
|
+
* como por exemplo: buscar, criar e remover.
|
|
10
|
+
*
|
|
11
|
+
* Esta instância pode ser obtida a partir do retorno do método `PoSyncService.getModel('schema name')`.
|
|
12
|
+
*/
|
|
13
|
+
export class PoEntity {
|
|
14
|
+
constructor(eventSourcing, schema, poSchemaService) {
|
|
15
|
+
this.eventSourcing = eventSourcing;
|
|
16
|
+
this.schema = schema;
|
|
17
|
+
this.poSchemaService = poSchemaService;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Busca os registros do *schema*, podendo filtrar o resultado a partir do filtro passado e retornando apenas
|
|
21
|
+
* os campos definidos.
|
|
22
|
+
*
|
|
23
|
+
* Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.
|
|
24
|
+
* Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).
|
|
25
|
+
*
|
|
26
|
+
* @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.
|
|
27
|
+
* @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de
|
|
28
|
+
* uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.
|
|
29
|
+
* Por exemplo, a definição abaixo:
|
|
30
|
+
*
|
|
31
|
+
* ```
|
|
32
|
+
* PoQueryBuilder.select('name age address');
|
|
33
|
+
* ```
|
|
34
|
+
* Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:
|
|
35
|
+
*
|
|
36
|
+
* ```
|
|
37
|
+
* PoQueryBuilder.select('-name -age');
|
|
38
|
+
* ```
|
|
39
|
+
* @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.
|
|
40
|
+
*/
|
|
41
|
+
find(filter, fields) {
|
|
42
|
+
const query = new PoQueryBuilder(this.poSchemaService, this.schema);
|
|
43
|
+
if (filter) {
|
|
44
|
+
query.filter(filter);
|
|
45
|
+
}
|
|
46
|
+
if (fields) {
|
|
47
|
+
query.select(fields);
|
|
48
|
+
}
|
|
49
|
+
return query;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Busca um registro pelo seu *id*.
|
|
53
|
+
*
|
|
54
|
+
* Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.
|
|
55
|
+
* Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).
|
|
56
|
+
*
|
|
57
|
+
* @param {any} id Identificador do registro.
|
|
58
|
+
* @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de
|
|
59
|
+
* uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.
|
|
60
|
+
* Por exemplo, a definição abaixo:
|
|
61
|
+
*
|
|
62
|
+
* ```
|
|
63
|
+
* PoQueryBuilder.select('name age address');
|
|
64
|
+
* ```
|
|
65
|
+
* Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:
|
|
66
|
+
*
|
|
67
|
+
* ```
|
|
68
|
+
* PoQueryBuilder.select('-name -age');
|
|
69
|
+
* ```
|
|
70
|
+
* @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.
|
|
71
|
+
*/
|
|
72
|
+
findById(id, fields) {
|
|
73
|
+
return this.findOne({ [this.schema.idField]: id }, fields);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Semelhante ao método `PoEntity.find()`, porém retorna apenas o primeiro registro encontrado na busca.
|
|
77
|
+
*
|
|
78
|
+
* Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.
|
|
79
|
+
* Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).
|
|
80
|
+
*
|
|
81
|
+
* @param {any} filter Objeto que contém os campos e valores a serem filtrados no *schema*.
|
|
82
|
+
* @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de
|
|
83
|
+
* uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.
|
|
84
|
+
* Por exemplo, a definição abaixo:
|
|
85
|
+
*
|
|
86
|
+
* ```
|
|
87
|
+
* PoQueryBuilder.select('name age address');
|
|
88
|
+
* ```
|
|
89
|
+
* Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:
|
|
90
|
+
*
|
|
91
|
+
* ```
|
|
92
|
+
* PoQueryBuilder.select('-name -age');
|
|
93
|
+
* ```
|
|
94
|
+
* @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.
|
|
95
|
+
*/
|
|
96
|
+
findOne(filter, fields) {
|
|
97
|
+
const query = this.find(filter, fields);
|
|
98
|
+
query.limit(1);
|
|
99
|
+
return query;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Remove um registro.
|
|
103
|
+
*
|
|
104
|
+
* @param {object} record Registro que será removido.
|
|
105
|
+
* @param {string} customRequestId Identificador customizado do comando.
|
|
106
|
+
* @returns {Promise} Promessa que é concluída após o registro ser removido.
|
|
107
|
+
*/
|
|
108
|
+
async remove(record, customRequestId) {
|
|
109
|
+
validateParameter({ record });
|
|
110
|
+
const remove = async () => {
|
|
111
|
+
const idField = record[this.schema.idField] ? this.schema.idField : PoSchemaUtil.syncInternalIdFieldName;
|
|
112
|
+
const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, record)['serverRecord'];
|
|
113
|
+
await this.poSchemaService.remove(this.schema.name, record[idField]);
|
|
114
|
+
await this.eventSourcing.remove(this.schema.name, serverRecord, customRequestId);
|
|
115
|
+
};
|
|
116
|
+
return this.poSchemaService.limitedCallWrap(remove);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Altera ou inclui um registro.
|
|
120
|
+
*
|
|
121
|
+
* > O registro será alterado se ele possuir um *id*, caso contrário um novo registro será criado.
|
|
122
|
+
*
|
|
123
|
+
* @param {object} record Registro que será persistido.
|
|
124
|
+
* @param {string} customRequestId Identificador customizado do comando.
|
|
125
|
+
* @returns {Promise} Promessa que é concluída após o registro ser alterado ou incluído.
|
|
126
|
+
*/
|
|
127
|
+
async save(record, customRequestId) {
|
|
128
|
+
validateParameter({ record });
|
|
129
|
+
return this.poSchemaService.limitedCallWrap(this.selectSaveType.bind(this, record, true, customRequestId));
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Salva uma lista de registros em lote.
|
|
133
|
+
*
|
|
134
|
+
* > Para cada registro da lista, será inserido um novo registro se o mesmo não tiver *id*, caso contrário
|
|
135
|
+
* será contado como uma atualização de um registro existente.
|
|
136
|
+
*
|
|
137
|
+
* @param {Array<object>} records Lista de registros que serão persistidos.
|
|
138
|
+
* @param {Array<string> | string} customRequestIds Identificador customizado do comando.
|
|
139
|
+
*
|
|
140
|
+
* Ao passar uma lista de identificadores, cada índice da lista de identificadores deverá
|
|
141
|
+
* corresponder ao índice do registro na lista de registros.
|
|
142
|
+
* @returns {Promise<any>} Promessa que é concluída após os registros serem alterados ou incluídos.
|
|
143
|
+
*/
|
|
144
|
+
async saveAll(records, customRequestIds) {
|
|
145
|
+
validateParameter({ records });
|
|
146
|
+
const saveAll = async () => {
|
|
147
|
+
const batchEvents = [];
|
|
148
|
+
for (let index = 0; index < records.length; index++) {
|
|
149
|
+
const record = records[index];
|
|
150
|
+
const sendToEventSourcing = false;
|
|
151
|
+
const isNonLocalRecordChanged = await this.isNonLocalRecordChanged(record);
|
|
152
|
+
const updatedRecord = await this.selectSaveType(record, sendToEventSourcing);
|
|
153
|
+
if (isNonLocalRecordChanged) {
|
|
154
|
+
const customRequestId = customRequestIds instanceof Array ? customRequestIds[index] : customRequestIds;
|
|
155
|
+
const eventOperation = this.createEventOperation(record, updatedRecord, customRequestId);
|
|
156
|
+
batchEvents.push(eventOperation);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
await this.eventSourcing.createBatchEvents(this.schema.name, batchEvents);
|
|
160
|
+
};
|
|
161
|
+
return this.poSchemaService.limitedCallWrap(saveAll);
|
|
162
|
+
}
|
|
163
|
+
async create(newRecord, sendToEventSourcing, customRequestId) {
|
|
164
|
+
const time = new Date().getTime();
|
|
165
|
+
const syncProperties = {
|
|
166
|
+
[PoSchemaUtil.syncInternalIdFieldName]: time,
|
|
167
|
+
SyncInsertedDateTime: time,
|
|
168
|
+
SyncUpdatedDateTime: null,
|
|
169
|
+
SyncExclusionDateTime: null,
|
|
170
|
+
SyncDeleted: false,
|
|
171
|
+
SyncStatus: 0
|
|
172
|
+
};
|
|
173
|
+
const recordWithSyncProperties = { ...newRecord, ...syncProperties };
|
|
174
|
+
const recordedData = await this.poSchemaService.create(this.schema, recordWithSyncProperties);
|
|
175
|
+
if (sendToEventSourcing) {
|
|
176
|
+
await this.eventSourcing.create(this.schema.name, recordWithSyncProperties, customRequestId);
|
|
177
|
+
}
|
|
178
|
+
return recordedData;
|
|
179
|
+
}
|
|
180
|
+
createEventOperation(record, updatedRecord, customRequestId) {
|
|
181
|
+
const operation = PoSchemaUtil.getRecordId(record, this.schema)
|
|
182
|
+
? PoEventSourcingOperation.Update
|
|
183
|
+
: PoEventSourcingOperation.Insert;
|
|
184
|
+
const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, updatedRecord)['serverRecord'];
|
|
185
|
+
return {
|
|
186
|
+
record: serverRecord,
|
|
187
|
+
customRequestId: customRequestId,
|
|
188
|
+
operation: operation
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
async isNonLocalRecordChanged(updatedRecord) {
|
|
192
|
+
const nonLocalFieldNames = PoSchemaUtil.getNonLocalFieldNames(this.schema);
|
|
193
|
+
const record = await this.poSchemaService.get(this.schema.name, updatedRecord[this.schema.idField]);
|
|
194
|
+
return !PoSchemaUtil.isModelsEqual(nonLocalFieldNames, record, updatedRecord);
|
|
195
|
+
}
|
|
196
|
+
async selectSaveType(record, sendToEventSourcing, customRequestId) {
|
|
197
|
+
const hasId = PoSchemaUtil.getRecordId(record, this.schema);
|
|
198
|
+
return hasId
|
|
199
|
+
? await this.update(record, sendToEventSourcing, customRequestId)
|
|
200
|
+
: await this.create(record, sendToEventSourcing, customRequestId);
|
|
201
|
+
}
|
|
202
|
+
async update(updatedRecord, sendToEventSourcing, customRequestId) {
|
|
203
|
+
updatedRecord.SyncUpdatedDateTime = new Date().getTime();
|
|
204
|
+
updatedRecord.SyncStatus = 0;
|
|
205
|
+
const isNonLocalRecordChanged = await this.isNonLocalRecordChanged(updatedRecord);
|
|
206
|
+
const recordedData = await this.poSchemaService.update(this.schema, updatedRecord);
|
|
207
|
+
if (isNonLocalRecordChanged && sendToEventSourcing) {
|
|
208
|
+
const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, updatedRecord)['serverRecord'];
|
|
209
|
+
await this.eventSourcing.update(this.schema.name, serverRecord, customRequestId);
|
|
210
|
+
}
|
|
211
|
+
return recordedData;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tZW50aXR5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL21vZGVscy9wby1lbnRpdHkvcG8tZW50aXR5Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRELE9BQU8sRUFDTCx3QkFBd0IsRUFHekIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDOUUsT0FBTyxFQUFtQixZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd6RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkIsWUFDVSxhQUFxQyxFQUNyQyxNQUFvQixFQUNwQixlQUFnQztRQUZoQyxrQkFBYSxHQUFiLGFBQWEsQ0FBd0I7UUFDckMsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7SUFDdkMsQ0FBQztJQUVKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FxQkc7SUFDSCxJQUFJLENBQUMsTUFBZSxFQUFFLE1BQWU7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFcEUsSUFBSSxNQUFNLEVBQUU7WUFDVixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsSUFBSSxNQUFNLEVBQUU7WUFDVixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ0gsUUFBUSxDQUFDLEVBQU8sRUFBRSxNQUFlO1FBQy9CLE9BQU8sSUFBSSxD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QUFDO1lBQ2pFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWtCLEVBQUUsbUJBQTRCLEVBQUUsZUFBd0I7UUFDN0YsYUFBYSxDQUFDLG1CQUFtQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekQsYUFBYSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFN0IsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFbkYsSUFBSSx1QkFBdUIsSUFBSSxtQkFBbUIsRUFBRTtZQUNsRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNuRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztTQUNsRjtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRlUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQge1xuICBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24sXG4gIFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UsXG4gIFBvRXZlbnRTb3VyY2luZ1N1bW1hcnlJdGVtXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BvLWV2ZW50LXNvdXJjaW5nJztcbmltcG9ydCB7IFBvUXVlcnlCdWlsZGVyIH0gZnJvbSAnLi8uLi9wby1xdWVyeS1idWlsZGVyL3BvLXF1ZXJ5LWJ1aWxkZXIubW9kZWwnO1xuaW1wb3J0IHsgUG9TY2hlbWFTZXJ2aWNlLCBQb1NjaGVtYVV0aWwgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wby1zY2hlbWEnO1xuaW1wb3J0IHsgUG9TeW5jU2NoZW1hIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtc2NoZW1hLmludGVyZmFjZSc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogVW1hIGluc3TDom5jaWEgYFBvRW50aXR5YCByZXByZXNlbnRhIHVtICpzY2hlbWEqIGUgZWxhIGNvbnTDqW0gbcOpdG9kb3MgcXVlIHBvc3NpYmlsaXRhbSBtYW5pcHVsYXIgc2V1cyByZWdpc3Ryb3MsXG4gKiBjb21vIHBvciBleGVtcGxvOiBidXNjYXIsIGNyaWFyIGUgcmVtb3Zlci5cbiAqXG4gKiBFc3RhIGluc3TDom5jaWEgcG9kZSBzZXIgb2J0aWRhIGEgcGFydGlyIGRvIHJldG9ybm8gZG8gbcOpdG9kbyBgUG9TeW5jU2VydmljZS5nZXRNb2RlbCgnc2NoZW1hIG5hbWUnKWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBQb0VudGl0eSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZXZlbnRTb3VyY2luZzogUG9FdmVudFNvdXJjaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHNjaGVtYTogUG9TeW5jU2NoZW1hLFxuICAgIHByaXZhdGUgcG9TY2hlbWFTZXJ2aWNlOiBQb1NjaGVtYVNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBCdXNjYSBvcyByZWdpc3Ryb3MgZG8gKnNjaGVtYSosIHBvZGVuZG8gZmlsdHJhciBvIHJlc3VsdGFkbyBhIHBhcnRpciBkbyBmaWx0cm8gcGFzc2FkbyBlIHJldG9ybmFuZG8gYXBlbmFzXG4gICAqIG9zIGNhbXBvcyBkZWZpbmlkb3MuXG4gICAqXG4gICAqIFBhcmEgcXVlIGVzdGEgYnVzY2Egc2VqYSBjb25jbHXDrWRhIMOpIG5lY2Vzc8OhcmlvIHV0aWxpemFyIG8gbcOpdG9kbyBgUG9RdWVyeUJ1aWxkZXIuZXhlYygpYC5cbiAgICogVmVqYSBtYWlzIGVtOiBbUG9RdWVyeUJ1aWxkZXJdKC9kb2N1bWVudGF0aW9uL3BvLXF1ZXJ5LWJ1aWxkZXIpLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIE9iamV0byBxdWUgY29udMOpbSBvcyBjYW1wb3MgZSB2YWxvcmVzIGEgc2VyZW0gZmlsdHJhZG9zIG5vICpzY2hlbWEqLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRzIENhbXBvcyBxdWUgc2Vyw6NvIHJldG9ybmFkb3Mgbm9zIHJlZ2lzdHJvcy4gRXN0ZSBjYW1wb3MgZGV2ZW0gZXN0YXIgZGVudHJvIGRlXG4gICAqIHVtYSAqc3RyaW5nKiBzZXBhcmFkb3MgcG9yIGVzcGHDp28gcG9kZW5kbyB1c2FyIG8gY2FyYWN0ZXJlIGAtYCBwYXJhIGV4Y2x1aXIgY2FtcG9zLlxuICAgKiBQb3IgZXhlbXBsbywgYSBkZWZpbmnDp8OjbyBhYmFpeG86XG4gICAqXG4gICAqIGBgYFxuICAgKiBQb1F1ZXJ5QnVpbGRlci5zZWxlY3QoJ25hbWUgYWdlIGFkZHJlc3MnKTtcbiAgICogYGBgXG4gICAqIElyw6EgcmV0b3JuYXIgYXBlbmFzIG9zIGNhbXBvcyBgbmFtZWAsIGBhZ2VgIGUgYGFkZHJlc3NgLiBFIHBhcmEgbsOjbyBtb3N0cmFyIHVtIGNhbXBvIG91IG1haXMgYmFzdGEgZmF6ZXI6XG4gICAqXG4gICAqIGBgYFxuICAgKiBQb1F1ZXJ5QnVpbGRlci5zZWxlY3QoJy1uYW1lIC1hZ2UnKTtcbiAgICogYGBgXG4gICAqIEByZXR1cm5zIHtQb1F1ZXJ5QnVpbGRlcn0gT2JqZXRvIHF1ZSBwb3NzaWJpbGl0YSBlbmNhZGVhciB1bSBtw6l0b2RvIGRvIGBQb1F1ZXJ5QnVpbGRlcmAuXG4gICAqL1xuICBmaW5kKGZpbHRlcj86IG9iamVjdCwgZmllbGRzPzogc3RyaW5nKTogUG9RdWVyeUJ1aWxkZXIge1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBvUXVlcnlCdWlsZGVyKHRoaXMucG9TY2hlbWFTZXJ2aWNlLCB0aGlzLnNjaGVtYSk7XG5cbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBxdWVyeS5maWx0ZXIoZmlsdGVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGRzKSB7XG4gICAgICBxdWVyeS5zZWxlY3QoZmllbGRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQnVzY2EgdW0gcmVnaXN0cm8gcGVsbyBzZXUgKmlkKi5cbiAgICpcbiAgICogUGFyYSBxdWUgZXN0YSBidXNjYSBzZWphIGNvbmNsdcOtZGEgw6kgbmVjZXNzw6FyaW8gdXRpbGl6YXIgbyBtw6l0b2RvIGBQb1F1ZXJ5QnVpbGRlci5leGVjKClgLlxuICAgKiBWZWphIG1haXMgZW06IFtQb1F1ZXJ5QnVpbGRlcl0oL2RvY3VtZW50YXRpb24vcG8tcXVlcnktYnVpbGRlcikuXG4gICAqXG4gICAqIEBwYXJhbSB7YW55fSBpZCBJZGVudGlmaWNhZG9yIGRvIHJlZ2lzdHJvLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRzIENhbXBvcyBxdWUgc2Vyw6NvIHJldG9ybmFkb3Mgbm9zIHJlZ2lzdHJvcy4gRXN0ZSBjYW1wb3MgZGV2ZW0gZXN0YXIgZGVudHJvIGRlXG4gICAqIHVtYSAqc3RyaW5nKiBzZXBhcmFkb3MgcG9yIGVzcGHDp28gcG9kZW5kbyB1c2FyIG8gY2FyYWN0ZXJlIGAtYCBwYXJhIGV4Y2x1aXIgY2FtcG9zLlxuICAgKiBQb3IgZXhlbXBsbywgYSBkZWZpbmnDp8OjbyBhYmFpeG86XG4gICAqXG4gICAqIGBgYFxuICAgKiBQb1F1ZXJ5QnVpbGRlci5zZWxlY3QoJ25hbWUgYWdlIGFkZHJlc3MnKTtcbiAgICogYGBgXG4gICAqIElyw6EgcmV0b3JuYXIgYXBlbmFzIG9zIGNhbXBvcyBgbmFtZWAsIGBhZ2VgIGUgYGFkZHJlc3NgLiBFIHBhcmEgbsOjbyBtb3N0cmFyIHVtIGNhbXBvIG91IG1haXMgYmFzdGEgZmF6ZXI6XG4gICAqXG4gICAqIGBgYFxuICAgKiBQb1F1ZXJ5QnVpbGRlci5zZWxlY3QoJy1uYW1lIC1hZ2UnKTtcbiAgICogYGBgXG4gICAqIEByZXR1cm5zIHtQb1F1ZXJ5QnVpbGRlcn0gT2JqZXRvIHF1ZSBwb3NzaWJpbGl0YSBlbmNhZGVhciB1bSBtw6l0b2RvIGRvIGBQb1F1ZXJ5QnVpbGRlcmAuXG4gICAqL1xuICBmaW5kQnlJZChpZDogYW55LCBmaWVsZHM/OiBzdHJpbmcpOiBQb1F1ZXJ5QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuZmluZE9uZSh7IFt0aGlzLnNjaGVtYS5pZEZpZWxkXTogaWQgfSwgZmllbGRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW1lbGhhbnRlIGFvIG3DqXRvZG8gYFBvRW50aXR5LmZpbmQoKWAsIHBvcsOpbSByZXRvcm5hIGFwZW5hcyBvIHByaW1laXJvIHJlZ2lzdHJvIGVuY29udHJhZG8gbmEgYnVzY2EuXG4gICAqXG4gICAqIFBhcmEgcXVlIGVzdGEgYnVzY2Egc2VqYSBjb25jbHXDrWRhIMOpIG5lY2Vzc8OhcmlvIHV0aWxpemFyIG8gbcOpdG9kbyBgUG9RdWVyeUJ1aWxkZXIuZXhlYygpYC5cbiAgICogVmVqYSBtYWlzIGVtOiBbUG9RdWVyeUJ1aWxkZXJdKC9kb2N1bWVudGF0aW9uL3BvLXF1ZXJ5LWJ1aWxkZXIpLlxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gZmlsdGVyIE9iamV0byBxdWUgY29udMOpbSBvcyBjYW1wb3MgZSB2YWxvcmVzIGEgc2VyZW0gZmlsdHJhZG9zIG5vICpzY2hlbWEqLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRzIENhbXBvcyBxdWUgc2Vyw6NvIHJldG9ybmFkb3Mgbm9zIHJlZ2lzdHJvcy4gRXN0ZSBjYW1wb3MgZGV2ZW0gZXN0YXIgZGVudHJvIGRlXG4gICAqIHVtYSAqc3RyaW5nKiBzZXBhcmFkb3MgcG9yIGVzcGHDp28gcG9kZW5kbyB1c2FyIG8gY2FyYWN0ZXJlIGAtYCBwYXJhIGV4Y2x1aXIgY2FtcG9zLlxuICAgKiBQb3IgZXhlbXBsbywgYSBkZWZpbmnDp8OjbyBhYmFpeG86XG4gICAqXG4gICAqIGBgYFxuICAgKiBQb1F1ZXJ5QnVpbGRlci5zZWxlY3QoJ25hbWUgYWdlIGFkZHJlc3MnKTtcbiAgICogYGBgXG4gICAqIElyw6EgcmV0b3JuYXIgYXBlbmFzIG9zIGNhbXBvcyBgbmFtZWAsIGBhZ2VgIGUgYGFkZHJlc3NgLiBFIHBhcmEgbsOjbyBtb3N0cmFyIHVtIGNhbXBvIG91IG1haXMgYmFzdGEgZmF6ZXI6XG4gICAqXG4gICAqIGBgYFxuICAgKiBQb1F1ZXJ5QnVpbGRlci5zZWxlY3QoJy1uYW1lIC1hZ2UnKTtcbiAgICogYGBgXG4gICAqIEByZXR1cm5zIHtQb1F1ZXJ5QnVpbGRlcn0gT2JqZXRvIHF1ZSBwb3NzaWJpbGl0YSBlbmNhZGVhciB1bSBtw6l0b2RvIGRvIGBQb1F1ZXJ5QnVpbGRlcmAuXG4gICAqL1xuICBmaW5kT25lKGZpbHRlcj86IGFueSwgZmllbGRzPzogc3RyaW5nKTogUG9RdWVyeUJ1aWxkZXIge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5maW5kKGZpbHRlciwgZmllbGRzKTtcbiAgICBxdWVyeS5saW1pdCgxKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHVtIHJlZ2lzdHJvLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcmVjb3JkIFJlZ2lzdHJvIHF1ZSBzZXLDoSByZW1vdmlkby5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbVJlcXVlc3RJZCBJZGVudGlmaWNhZG9yIGN1c3RvbWl6YWRvIGRvIGNvbWFuZG8uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9tZXNzYSBxdWUgw6kgY29uY2x1w61kYSBhcMOzcyBvIHJlZ2lzdHJvIHNlciByZW1vdmlkby5cbiAgICovXG4gIGFzeW5jIHJlbW92ZShyZWNvcmQ6IG9iamVjdCwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcih7IHJlY29yZCB9KTtcblxuICAgIGNvbnN0IHJlbW92ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGlkRmllbGQgPSByZWNvcmRbdGhpcy5zY2hlbWEuaWRGaWVsZF0gPyB0aGlzLnNjaGVtYS5pZEZpZWxkIDogUG9TY2hlbWFVdGlsLnN5bmNJbnRlcm5hbElkRmllbGROYW1lO1xuICAgICAgY29uc3Qgc2VydmVyUmVjb3JkID0gUG9TY2hlbWFVdGlsLnNlcGFyYXRlU2NoZW1hRmllbGRzKHRoaXMuc2NoZW1hLCByZWNvcmQpWydzZXJ2ZXJSZWNvcmQnXTtcblxuICAgICAgYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UucmVtb3ZlKHRoaXMuc2NoZW1hLm5hbWUsIHJlY29yZFtpZEZpZWxkXSk7XG4gICAgICBhd2FpdCB0aGlzLmV2ZW50U291cmNpbmcucmVtb3ZlKHRoaXMuc2NoZW1hLm5hbWUsIHNlcnZlclJlY29yZCwgY3VzdG9tUmVxdWVzdElkKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlLmxpbWl0ZWRDYWxsV3JhcChyZW1vdmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsdGVyYSBvdSBpbmNsdWkgdW0gcmVnaXN0cm8uXG4gICAqXG4gICAqID4gTyByZWdpc3RybyBzZXLDoSBhbHRlcmFkbyBzZSBlbGUgcG9zc3VpciB1bSAqaWQqLCBjYXNvIGNvbnRyw6FyaW8gdW0gbm92byByZWdpc3RybyBzZXLDoSBjcmlhZG8uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZWNvcmQgUmVnaXN0cm8gcXVlIHNlcsOhIHBlcnNpc3RpZG8uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXN0b21SZXF1ZXN0SWQgSWRlbnRpZmljYWRvciBjdXN0b21pemFkbyBkbyBjb21hbmRvLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWVzc2EgcXVlIMOpIGNvbmNsdcOtZGEgYXDDs3MgbyByZWdpc3RybyBzZXIgYWx0ZXJhZG8gb3UgaW5jbHXDrWRvLlxuICAgKi9cbiAgYXN5bmMgc2F2ZShyZWNvcmQ6IG9iamVjdCwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcih7IHJlY29yZCB9KTtcblxuICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZS5saW1pdGVkQ2FsbFdyYXAodGhpcy5zZWxlY3RTYXZlVHlwZS5iaW5kKHRoaXMsIHJlY29yZCwgdHJ1ZSwgY3VzdG9tUmVxdWVzdElkKSk7XG4gIH1cblxuICAvKipcbiAgICogU2FsdmEgdW1hIGxpc3RhIGRlIHJlZ2lzdHJvcyBlbSBsb3RlLlxuICAgKlxuICAgKiA+IFBhcmEgY2FkYSByZWdpc3RybyBkYSBsaXN0YSwgc2Vyw6EgaW5zZXJpZG8gdW0gbm92byByZWdpc3RybyBzZSBvIG1lc21vIG7Do28gdGl2ZXIgKmlkKiwgY2FzbyBjb250csOhcmlvXG4gICAqIHNlcsOhIGNvbnRhZG8gY29tbyB1bWEgYXR1YWxpemHDp8OjbyBkZSB1bSByZWdpc3RybyBleGlzdGVudGUuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gcmVjb3JkcyBMaXN0YSBkZSByZWdpc3Ryb3MgcXVlIHNlcsOjbyBwZXJzaXN0aWRvcy5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+IHwgc3RyaW5nfSBjdXN0b21SZXF1ZXN0SWRzIElkZW50aWZpY2Fkb3IgY3VzdG9taXphZG8gZG8gY29tYW5kby5cbiAgICpcbiAgICogQW8gcGFzc2FyIHVtYSBsaXN0YSBkZSBpZGVudGlmaWNhZG9yZXMsIGNhZGEgw61uZGljZSBkYSBsaXN0YSBkZSBpZGVudGlmaWNhZG9yZXMgZGV2ZXLDoVxuICAgKiBjb3JyZXNwb25kZXIgYW8gw61uZGljZSBkbyByZWdpc3RybyBuYSBsaXN0YSBkZSByZWdpc3Ryb3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSBjb25jbHXDrWRhIGFww7NzIG9zIHJlZ2lzdHJvcyBzZXJlbSBhbHRlcmFkb3Mgb3UgaW5jbHXDrWRvcy5cbiAgICovXG4gIGFzeW5jIHNhdmVBbGwocmVjb3JkczogQXJyYXk8b2JqZWN0PiwgY3VzdG9tUmVxdWVzdElkcz86IEFycmF5PHN0cmluZz4gfCBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyKHsgcmVjb3JkcyB9KTtcblxuICAgIGNvbnN0IHNhdmVBbGwgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBiYXRjaEV2ZW50cyA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVjb3Jkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkc1tpbmRleF07XG4gICAgICAgIGNvbnN0IHNlbmRUb0V2ZW50U291cmNpbmcgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBpc05vbkxvY2FsUmVjb3JkQ2hhbmdlZCA9IGF3YWl0IHRoaXMuaXNOb25Mb2NhbFJlY29yZENoYW5nZWQocmVjb3JkKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZFJlY29yZCA9IGF3YWl0IHRoaXMuc2VsZWN0U2F2ZVR5cGUocmVjb3JkLCBzZW5kVG9FdmVudFNvdXJjaW5nKTtcblxuICAgICAgICBpZiAoaXNOb25Mb2NhbFJlY29yZENoYW5nZWQpIHtcbiAgICAgICAgICBjb25zdCBjdXN0b21SZXF1ZXN0SWQgPSBjdXN0b21SZXF1ZXN0SWRzIGluc3RhbmNlb2YgQXJyYXkgPyBjdXN0b21SZXF1ZXN0SWRzW2luZGV4XSA6IGN1c3RvbVJlcXVlc3RJZHM7XG4gICAgICAgICAgY29uc3QgZXZlbnRPcGVyYXRpb24gPSB0aGlzLmNyZWF0ZUV2ZW50T3BlcmF0aW9uKHJlY29yZCwgdXBkYXRlZFJlY29yZCwgY3VzdG9tUmVxdWVzdElkKTtcbiAgICAgICAgICBiYXRjaEV2ZW50cy5wdXNoKGV2ZW50T3BlcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmV2ZW50U291cmNpbmcuY3JlYXRlQmF0Y2hFdmVudHModGhpcy5zY2hlbWEubmFtZSwgYmF0Y2hFdmVudHMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2UubGltaXRlZENhbGxXcmFwKHNhdmVBbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGUobmV3UmVjb3JkOiBhbnksIHNlbmRUb0V2ZW50U291cmNpbmc6IGJvb2xlYW4sIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG4gICAgY29uc3Qgc3luY1Byb3BlcnRpZXMgPSB7XG4gICAgICBbUG9TY2hlbWFVdGlsLnN5bmNJbnRlcm5hbElkRmllbGROYW1lXTogdGltZSxcbiAgICAgIFN5bmNJbnNlcnRlZERhdGVUaW1lOiB0aW1lLFxuICAgICAgU3luY1VwZGF0ZWREYXRlVGltZTogbnVsbCxcbiAgICAgIFN5bmNFeGNsdXNpb25EYXRlVGltZTogbnVsbCxcbiAgICAgIFN5bmNEZWxldGVkOiBmYWxzZSxcbiAgICAgIFN5bmNTdGF0dXM6IDBcbiAgICB9O1xuICAgIGNvbnN0IHJlY29yZFdpdGhTeW5jUHJvcGVydGllcyA9IHsgLi4ubmV3UmVjb3JkLCAuLi5zeW5jUHJvcGVydGllcyB9O1xuXG4gICAgY29uc3QgcmVjb3JkZWREYXRhID0gYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UuY3JlYXRlKHRoaXMuc2NoZW1hLCByZWNvcmRXaXRoU3luY1Byb3BlcnRpZXMpO1xuXG4gICAgaWYgKHNlbmRUb0V2ZW50U291cmNpbmcpIHtcbiAgICAgIGF3YWl0IHRoaXMuZXZlbnRTb3VyY2luZy5jcmVhdGUodGhpcy5zY2hlbWEubmFtZSwgcmVjb3JkV2l0aFN5bmNQcm9wZXJ0aWVzLCBjdXN0b21SZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmRlZERhdGE7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUV2ZW50T3BlcmF0aW9uKFxuICAgIHJlY29yZDogb2JqZWN0LFxuICAgIHVwZGF0ZWRSZWNvcmQ6IG9iamVjdCxcbiAgICBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmdcbiAgKTogUG9FdmVudFNvdXJjaW5nU3VtbWFyeUl0ZW0ge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IFBvU2NoZW1hVXRpbC5nZXRSZWNvcmRJZChyZWNvcmQsIHRoaXMuc2NoZW1hKVxuICAgICAgPyBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uVXBkYXRlXG4gICAgICA6IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5JbnNlcnQ7XG5cbiAgICBjb25zdCBzZXJ2ZXJSZWNvcmQgPSBQb1NjaGVtYVV0aWwuc2VwYXJhdGVTY2hlbWFGaWVsZHModGhpcy5zY2hlbWEsIHVwZGF0ZWRSZWNvcmQpWydzZXJ2ZXJSZWNvcmQnXTtcblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHNlcnZlclJlY29yZCxcbiAgICAgIGN1c3RvbVJlcXVlc3RJZDogY3VzdG9tUmVxdWVzdElkLFxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpc05vbkxvY2FsUmVjb3JkQ2hhbmdlZCh1cGRhdGVkUmVjb3JkOiBvYmplY3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBub25Mb2NhbEZpZWxkTmFtZXMgPSBQb1NjaGVtYVV0aWwuZ2V0Tm9uTG9jYWxGaWVsZE5hbWVzKHRoaXMuc2NoZW1hKTtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5nZXQodGhpcy5zY2hlbWEubmFtZSwgdXBkYXRlZFJlY29yZFt0aGlzLnNjaGVtYS5pZEZpZWxkXSk7XG5cbiAgICByZXR1cm4gIVBvU2NoZW1hVXRpbC5pc01vZGVsc0VxdWFsKG5vbkxvY2FsRmllbGROYW1lcywgcmVjb3JkLCB1cGRhdGVkUmVjb3JkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VsZWN0U2F2ZVR5cGUoXG4gICAgcmVjb3JkOiBvYmplY3QsXG4gICAgc2VuZFRvRXZlbnRTb3VyY2luZzogYm9vbGVhbixcbiAgICBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCBoYXNJZCA9IFBvU2NoZW1hVXRpbC5nZXRSZWNvcmRJZChyZWNvcmQsIHRoaXMuc2NoZW1hKTtcblxuICAgIHJldHVybiBoYXNJZFxuICAgICAgPyBhd2FpdCB0aGlzLnVwZGF0ZShyZWNvcmQsIHNlbmRUb0V2ZW50U291cmNpbmcsIGN1c3RvbVJlcXVlc3RJZClcbiAgICAgIDogYXdhaXQgdGhpcy5jcmVhdGUocmVjb3JkLCBzZW5kVG9FdmVudFNvdXJjaW5nLCBjdXN0b21SZXF1ZXN0SWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGUodXBkYXRlZFJlY29yZDogYW55LCBzZW5kVG9FdmVudFNvdXJjaW5nOiBib29sZWFuLCBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIHVwZGF0ZWRSZWNvcmQuU3luY1VwZGF0ZWREYXRlVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHVwZGF0ZWRSZWNvcmQuU3luY1N0YXR1cyA9IDA7XG5cbiAgICBjb25zdCBpc05vbkxvY2FsUmVjb3JkQ2hhbmdlZCA9IGF3YWl0IHRoaXMuaXNOb25Mb2NhbFJlY29yZENoYW5nZWQodXBkYXRlZFJlY29yZCk7XG4gICAgY29uc3QgcmVjb3JkZWREYXRhID0gYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UudXBkYXRlKHRoaXMuc2NoZW1hLCB1cGRhdGVkUmVjb3JkKTtcblxuICAgIGlmIChpc05vbkxvY2FsUmVjb3JkQ2hhbmdlZCAmJiBzZW5kVG9FdmVudFNvdXJjaW5nKSB7XG4gICAgICBjb25zdCBzZXJ2ZXJSZWNvcmQgPSBQb1NjaGVtYVV0aWwuc2VwYXJhdGVTY2hlbWFGaWVsZHModGhpcy5zY2hlbWEsIHVwZGF0ZWRSZWNvcmQpWydzZXJ2ZXJSZWNvcmQnXTtcbiAgICAgIGF3YWl0IHRoaXMuZXZlbnRTb3VyY2luZy51cGRhdGUodGhpcy5zY2hlbWEubmFtZSwgc2VydmVyUmVjb3JkLCBjdXN0b21SZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmRlZERhdGE7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description
|
|
3
|
-
*
|
|
4
|
-
* Classe que define a resposta de erro para um item da fila de eventos que não foi enviado ao servidor por
|
|
5
|
-
* alguma inconsistência.
|
|
6
|
-
*
|
|
7
|
-
* > Pode ser utilizada em casos onde um item da fila é enviado ao servidor com inconsistência nos dados, por exemplo
|
|
8
|
-
* uma operação de *delete* ou *update* sem o `id` do objeto.
|
|
9
|
-
*/
|
|
10
|
-
export class PoEventSourcingErrorResponse {
|
|
11
|
-
/* istanbul ignore next */
|
|
12
|
-
constructor({ message, operation }) {
|
|
13
|
-
this.message = message;
|
|
14
|
-
this.operation = operation;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
/**
|
|
2
|
+
* @description
|
|
3
|
+
*
|
|
4
|
+
* Classe que define a resposta de erro para um item da fila de eventos que não foi enviado ao servidor por
|
|
5
|
+
* alguma inconsistência.
|
|
6
|
+
*
|
|
7
|
+
* > Pode ser utilizada em casos onde um item da fila é enviado ao servidor com inconsistência nos dados, por exemplo
|
|
8
|
+
* uma operação de *delete* ou *update* sem o `id` do objeto.
|
|
9
|
+
*/
|
|
10
|
+
export class PoEventSourcingErrorResponse {
|
|
11
|
+
/* istanbul ignore next */
|
|
12
|
+
constructor({ message, operation }) {
|
|
13
|
+
this.message = message;
|
|
14
|
+
this.operation = operation;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tZXZlbnQtc291cmNpbmctZXJyb3ItcmVzcG9uc2UubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeW5jL3NyYy9saWIvbW9kZWxzL3BvLWV2ZW50LXNvdXJjaW5nLWVycm9yLXJlc3BvbnNlLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLDRCQUE0QjtJQU92QywwQkFBMEI7SUFDMUIsWUFBWSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUU7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9wby1ldmVudC1zb3VyY2luZy9lbnVtcy9wby1ldmVudC1zb3VyY2luZy1vcGVyYXRpb24uZW51bSc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogQ2xhc3NlIHF1ZSBkZWZpbmUgYSByZXNwb3N0YSBkZSBlcnJvIHBhcmEgdW0gaXRlbSBkYSBmaWxhIGRlIGV2ZW50b3MgcXVlIG7Do28gZm9pIGVudmlhZG8gYW8gc2Vydmlkb3IgcG9yXG4gKiBhbGd1bWEgaW5jb25zaXN0w6puY2lhLlxuICpcbiAqID4gUG9kZSBzZXIgdXRpbGl6YWRhIGVtIGNhc29zIG9uZGUgdW0gaXRlbSBkYSBmaWxhIMOpIGVudmlhZG8gYW8gc2Vydmlkb3IgY29tIGluY29uc2lzdMOqbmNpYSBub3MgZGFkb3MsIHBvciBleGVtcGxvXG4gKiB1bWEgb3BlcmHDp8OjbyBkZSAqZGVsZXRlKiBvdSAqdXBkYXRlKiBzZW0gbyBgaWRgIGRvIG9iamV0by5cbiAqL1xuZXhwb3J0IGNsYXNzIFBvRXZlbnRTb3VyY2luZ0Vycm9yUmVzcG9uc2Uge1xuICAvKiogTWVuc2FnZW0gZGUgZXJyby4gKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuXG4gIC8qKiBPcGVyYcOnw6NvIHF1ZSBoYXZpYSBzaWRvIHJlcXVpc2l0YWRhLiAqL1xuICBvcGVyYXRpb246IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbjtcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UsIG9wZXJhdGlvbiB9KSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcbiAgfVxufVxuIl19
|