@po-ui/ng-sync 21.0.0-next.0 → 21.0.0-rc.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.
@@ -64,8 +64,8 @@ const validateParameter = (parameter) => {
64
64
  * @param value Objeto contento o nome da propriedade que está sendo validada e o seu valor.
65
65
  */
66
66
  const validateArray = (value) => {
67
- validateParameter(value);
68
- const [paramName, paramValue] = getObjectEntries(value);
67
+ PoUtils.validateParameter(value);
68
+ const [paramName, paramValue] = PoUtils.getObjectEntries(value);
69
69
  if (!(paramValue instanceof Array)) {
70
70
  throw new Error(`${paramName} is not an Array instance`);
71
71
  }
@@ -93,6 +93,13 @@ const toBase64 = (file) => new Promise((resolve, reject) => {
93
93
  const toFile = (url, fileName, mimeType) => fetch(url)
94
94
  .then(result => result.arrayBuffer())
95
95
  .then(buffer => new File([buffer], fileName, { type: mimeType }));
96
+ const PoUtils = {
97
+ getObjectEntries,
98
+ toBase64,
99
+ toFile,
100
+ validateArray,
101
+ validateParameter
102
+ };
96
103
 
97
104
  /**
98
105
  * @description
@@ -364,10 +371,10 @@ class PoSchemaDefinitionService {
364
371
  schemas = schemas.map(replaceUpdatedSchema);
365
372
  return this.saveAll(schemas);
366
373
  }
367
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSchemaDefinitionService, deps: [{ token: i1.PoStorageService }], target: i0.ɵɵFactoryTarget.Injectable });
368
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSchemaDefinitionService, providedIn: 'root' });
374
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSchemaDefinitionService, deps: [{ token: i1.PoStorageService }], target: i0.ɵɵFactoryTarget.Injectable });
375
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSchemaDefinitionService, providedIn: 'root' });
369
376
  }
370
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSchemaDefinitionService, decorators: [{
377
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSchemaDefinitionService, decorators: [{
371
378
  type: Injectable,
372
379
  args: [{
373
380
  providedIn: 'root'
@@ -538,10 +545,10 @@ class PoSchemaService {
538
545
  await this.remove(schemaName, recordId);
539
546
  return Object.assign(record, localRecord);
540
547
  }
541
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSchemaService, deps: [{ token: PoSchemaDefinitionService }, { token: i1.PoStorageService }], target: i0.ɵɵFactoryTarget.Injectable });
542
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSchemaService, providedIn: 'root' });
548
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSchemaService, deps: [{ token: PoSchemaDefinitionService }, { token: i1.PoStorageService }], target: i0.ɵɵFactoryTarget.Injectable });
549
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSchemaService, providedIn: 'root' });
543
550
  }
544
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSchemaService, decorators: [{
551
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSchemaService, decorators: [{
545
552
  type: Injectable,
546
553
  args: [{
547
554
  providedIn: 'root'
@@ -685,10 +692,10 @@ class PoHttpClientService {
685
692
  }
686
693
  return httpHeaders;
687
694
  }
688
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoHttpClientService, deps: [{ token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
689
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoHttpClientService, providedIn: 'root' });
695
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoHttpClientService, deps: [{ token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
696
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoHttpClientService, providedIn: 'root' });
690
697
  }
691
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoHttpClientService, decorators: [{
698
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoHttpClientService, decorators: [{
692
699
  type: Injectable,
693
700
  args: [{
694
701
  providedIn: 'root'
@@ -808,7 +815,7 @@ class PoEventSourcingService {
808
815
  bodyType = 'File';
809
816
  mimeType = body.type;
810
817
  fileName = body.name;
811
- body = await toBase64(body);
818
+ body = await PoUtils.toBase64(body);
812
819
  }
813
820
  return { ...requestData, body, mimeType, bodyType, fileName };
814
821
  }
@@ -985,7 +992,7 @@ class PoEventSourcingService {
985
992
  return { url, method, body, headers };
986
993
  }
987
994
  async createFormData(body, fileName, mimeType, formField = 'file') {
988
- const file = await toFile(body, fileName, mimeType);
995
+ const file = await PoUtils.toFile(body, fileName, mimeType);
989
996
  const formData = new FormData();
990
997
  formData.append(formField, file, fileName);
991
998
  return formData;
@@ -1052,10 +1059,10 @@ class PoEventSourcingService {
1052
1059
  updateStorageSchemas(schemas) {
1053
1060
  return schemas.map((schema) => this.updateStorageBySchema(schema));
1054
1061
  }
1055
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoEventSourcingService, deps: [{ token: PoSchemaDefinitionService }, { token: PoSchemaService }, { token: i1.PoStorageService }, { token: PoHttpClientService }], target: i0.ɵɵFactoryTarget.Injectable });
1056
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoEventSourcingService, providedIn: 'root' });
1062
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoEventSourcingService, deps: [{ token: PoSchemaDefinitionService }, { token: PoSchemaService }, { token: i1.PoStorageService }, { token: PoHttpClientService }], target: i0.ɵɵFactoryTarget.Injectable });
1063
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoEventSourcingService, providedIn: 'root' });
1057
1064
  }
1058
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoEventSourcingService, decorators: [{
1065
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoEventSourcingService, decorators: [{
1059
1066
  type: Injectable,
1060
1067
  args: [{
1061
1068
  providedIn: 'root'
@@ -1172,7 +1179,7 @@ class PoQueryBuilder {
1172
1179
  * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
1173
1180
  */
1174
1181
  page(page) {
1175
- validateParameter({ page });
1182
+ PoUtils.validateParameter({ page });
1176
1183
  this._page = page;
1177
1184
  return this;
1178
1185
  }
@@ -1183,7 +1190,7 @@ class PoQueryBuilder {
1183
1190
  * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
1184
1191
  */
1185
1192
  pageSize(pageSize) {
1186
- validateParameter({ pageSize });
1193
+ PoUtils.validateParameter({ pageSize });
1187
1194
  this._pageSize = pageSize;
1188
1195
  return this;
1189
1196
  }
@@ -1206,7 +1213,7 @@ class PoQueryBuilder {
1206
1213
  * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
1207
1214
  */
1208
1215
  select(fields) {
1209
- validateParameter({ fields });
1216
+ PoUtils.validateParameter({ fields });
1210
1217
  this.fields = fields;
1211
1218
  return this;
1212
1219
  }
@@ -1222,7 +1229,7 @@ class PoQueryBuilder {
1222
1229
  * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.
1223
1230
  */
1224
1231
  sort(field) {
1225
- validateParameter({ field });
1232
+ PoUtils.validateParameter({ field });
1226
1233
  this._sort = field;
1227
1234
  return this;
1228
1235
  }
@@ -1414,7 +1421,7 @@ class PoEntity {
1414
1421
  * @returns {Promise} Promessa que é concluída após o registro ser removido.
1415
1422
  */
1416
1423
  async remove(record, customRequestId) {
1417
- validateParameter({ record });
1424
+ PoUtils.validateParameter({ record });
1418
1425
  const remove = async () => {
1419
1426
  const idField = record[this.schema.idField] ? this.schema.idField : PoSchemaUtil.syncInternalIdFieldName;
1420
1427
  const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, record)['serverRecord'];
@@ -1433,7 +1440,7 @@ class PoEntity {
1433
1440
  * @returns {Promise} Promessa que é concluída após o registro ser alterado ou incluído.
1434
1441
  */
1435
1442
  async save(record, customRequestId) {
1436
- validateParameter({ record });
1443
+ PoUtils.validateParameter({ record });
1437
1444
  return this.poSchemaService.limitedCallWrap(this.selectSaveType.bind(this, record, true, customRequestId));
1438
1445
  }
1439
1446
  /**
@@ -1450,7 +1457,7 @@ class PoEntity {
1450
1457
  * @returns {Promise<any>} Promessa que é concluída após os registros serem alterados ou incluídos.
1451
1458
  */
1452
1459
  async saveAll(records, customRequestIds) {
1453
- validateParameter({ records });
1460
+ PoUtils.validateParameter({ records });
1454
1461
  const saveAll = async () => {
1455
1462
  const batchEvents = [];
1456
1463
  for (let index = 0; index < records.length; index++) {
@@ -1697,10 +1704,10 @@ class PoNetworkService {
1697
1704
  this.networkTypeNow.next({ status: status.connected, type: this.networkType });
1698
1705
  });
1699
1706
  }
1700
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoNetworkService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1701
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoNetworkService, providedIn: 'root' });
1707
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoNetworkService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1708
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoNetworkService, providedIn: 'root' });
1702
1709
  }
1703
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoNetworkService, decorators: [{
1710
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoNetworkService, decorators: [{
1704
1711
  type: Injectable,
1705
1712
  args: [{
1706
1713
  providedIn: 'root'
@@ -1815,7 +1822,7 @@ class PoSyncService {
1815
1822
  * @returns {Promise<number>} Promessa com o identificador da requisição HTTP criada.
1816
1823
  */
1817
1824
  insertHttpCommand(requestData, customRequestId) {
1818
- validateParameter({ requestData });
1825
+ PoUtils.validateParameter({ requestData });
1819
1826
  return this.poEventSourcingService.httpCommand(requestData, customRequestId);
1820
1827
  }
1821
1828
  /**
@@ -1857,7 +1864,7 @@ class PoSyncService {
1857
1864
  * @returns {Promise<any>} Promessa que é resolvida quando a aplicação estiver preparada para a utilização do `po-sync`.
1858
1865
  */
1859
1866
  prepare(schemas, config) {
1860
- validateArray({ schemas });
1867
+ PoUtils.validateArray({ schemas });
1861
1868
  const defaultSyncConfig = {
1862
1869
  type: this.poNetworkService.getConnectionStatus().type,
1863
1870
  period: 60,
@@ -2023,10 +2030,10 @@ class PoSyncService {
2023
2030
  syncError() {
2024
2031
  this.finishSync();
2025
2032
  }
2026
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSyncService, deps: [{ token: PoEventSourcingService }, { token: PoHttpClientService }, { token: PoNetworkService }, { token: PoSchemaDefinitionService }, { token: PoSchemaService }], target: i0.ɵɵFactoryTarget.Injectable });
2027
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSyncService, providedIn: 'root' });
2033
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSyncService, deps: [{ token: PoEventSourcingService }, { token: PoHttpClientService }, { token: PoNetworkService }, { token: PoSchemaDefinitionService }, { token: PoSchemaService }], target: i0.ɵɵFactoryTarget.Injectable });
2034
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSyncService, providedIn: 'root' });
2028
2035
  }
2029
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSyncService, decorators: [{
2036
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSyncService, decorators: [{
2030
2037
  type: Injectable,
2031
2038
  args: [{
2032
2039
  providedIn: 'root'
@@ -2039,9 +2046,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
2039
2046
  * Módulo do componente PoSync responsável pela sincronia de dados com backends
2040
2047
  */
2041
2048
  class PoSyncModule {
2042
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSyncModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2043
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.0.8", ngImport: i0, type: PoSyncModule });
2044
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSyncModule, providers: [
2049
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSyncModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2050
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.0.9", ngImport: i0, type: PoSyncModule });
2051
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSyncModule, providers: [
2045
2052
  PoEventSourcingService,
2046
2053
  PoNetworkService,
2047
2054
  PoSchemaDefinitionService,
@@ -2050,7 +2057,7 @@ class PoSyncModule {
2050
2057
  PoHttpClientService
2051
2058
  ] });
2052
2059
  }
2053
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: PoSyncModule, decorators: [{
2060
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PoSyncModule, decorators: [{
2054
2061
  type: NgModule,
2055
2062
  args: [{
2056
2063
  providers: [
@@ -1 +1 @@
1
- {"version":3,"file":"po-ui-ng-sync.mjs","sources":["../../../projects/sync/src/lib/models/po-data-transform.model.ts","../../../projects/sync/src/lib/utils/utils.ts","../../../projects/sync/src/lib/models/po-event-sourcing-error-response.model.ts","../../../projects/sync/src/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.ts","../../../projects/sync/src/lib/services/po-http-client/po-http-request-type.enum.ts","../../../projects/sync/src/lib/models/po-request-type.enum.ts","../../../projects/sync/src/lib/services/po-schema/po-schema-util/po-schema-util.model.ts","../../../projects/sync/src/lib/services/po-schema/po-schema-definition/po-schema-definition.service.ts","../../../projects/sync/src/lib/services/po-schema/po-schema.service.ts","../../../projects/sync/src/lib/services/po-http-client/po-http-client.service.ts","../../../projects/sync/src/lib/services/po-event-sourcing/po-event-sourcing.service.ts","../../../projects/sync/src/lib/models/po-query-builder/po-query-builder.model.ts","../../../projects/sync/src/lib/models/po-entity/po-entity.model.ts","../../../projects/sync/src/lib/models/po-network-type.enum.ts","../../../projects/sync/src/lib/models/po-data-message.model.ts","../../../projects/sync/src/lib/models/po-network-status.model.ts","../../../projects/sync/src/lib/services/po-network/po-network.service.ts","../../../projects/sync/src/lib/services/po-sync/po-sync.service.ts","../../../projects/sync/src/lib/po-sync.module.ts","../../../projects/sync/src/po-ui-ng-sync.ts"],"sourcesContent":["/**\n * @description\n *\n * Classe responsável por adaptar dados de APIs que não seguem\n * o padrão de [API do PO UI](https://po-ui.io/guides/api).\n *\n * Essa classe deve ser estendida por uma classe que implemente cada um de seus métodos, adaptando os parâmetros de\n * acordo com a API do *backend* existente que se deseja comunicar.\n */\n\nexport abstract class PoDataTransform {\n protected data: any;\n\n /**\n * @docsPrivate\n *\n * Método responsável por receber e armazenar os dados retornados pela API para manipulação na classe `PoDataTransform`.\n *\n * @param {any} data Dados retornados pela API.\n */\n transform(data: any): void {\n this.data = data;\n }\n\n /**\n * Retorna o nome da propriedade responsável por informar a data da última sincronização.\n *\n * @returns {string} Nome do campo que contém a data da última sincronização.\n */\n abstract getDateFieldName(): string;\n\n /**\n * Retorna o nome da propriedade responsável por informar a lista de registros vindos da API.\n *\n * @returns {string} Nome da propriedade que contém a lista de registros.\n */\n abstract getItemsFieldName(): string;\n\n /**\n * Retorna o nome da propriedade responsável por informar o número da página de registros que a API\n * recebe como parâmetro.\n *\n * @returns {string} Nome da propriedade responsável por informar o número da página de registros.\n */\n abstract getPageParamName(): string;\n\n /**\n * Retorna o nome da propriedade responsável pela quantidade de registros que serão exibidos por página\n * que a API recebe como parâmetro.\n *\n * @returns {string} Nome da propriedade responsável pela quantidade de registros por página.\n */\n abstract getPageSizeParamName(): string;\n\n /**\n * Retorna um valor `boolean`, responsável por informar se há uma nova página de registros disponível.\n *\n * @returns {boolean} Informa se existe próxima página de registros.\n */\n abstract hasNext(): boolean;\n}\n","/**\n * Retorna um *array* contendo os pares `[chave, valor]` do objeto.\n *\n * Semelhante ao método `Object.entries()` nativo do javascript.\n *\n * > Veja mais em: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n *\n * @param object Objeto que será extraído os pares [chave, valor].\n */\nexport const getObjectEntries = (object: object) => {\n const objectName = Object.keys(object)[0];\n const objectValue = object[objectName];\n\n return [objectName, objectValue];\n};\n\n/**\n * Recebe um objeto e valida se o seu valor é diferente de *undefined* ou *null*.\n *\n * @param {object} parameter Objeto contento o nome do parâmetro que está sendo validado\n * e o seu valor.\n */\nexport const validateParameter = (parameter: object) => {\n const [paramName, paramValue] = getObjectEntries(parameter);\n\n if (paramValue === undefined || paramValue === null) {\n throw new Error(`The ${paramName} parameter cannot be undefined or null`);\n }\n};\n\n/**\n * Recebe um objeto e valida se o seu valor é uma instância de *Array* e se não\n * está vazio.\n *\n * @param value Objeto contento o nome da propriedade que está sendo validada e o seu valor.\n */\nexport const validateArray = (value: object) => {\n validateParameter(value);\n\n const [paramName, paramValue] = getObjectEntries(value);\n\n if (!(paramValue instanceof Array)) {\n throw new Error(`${paramName} is not an Array instance`);\n }\n\n if (!paramValue.length) {\n throw new Error(`${paramName} cannot be empty array`);\n }\n};\n\n/**\n * Recebe um arquivo e converte para uma string base64\n *\n * @param Objeto do tipo file.\n */\nexport const toBase64 = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => resolve(reader.result as string);\n /* istanbul ignore next */\n reader.onerror = error => reject(error);\n });\n\n/**\n * Recebe uma string base64 e converte para um arquivo\n *\n * @param string base64.\n */\nexport const toFile = (url: string, fileName: string, mimeType: string) =>\n fetch(url)\n .then(result => result.arrayBuffer())\n .then(buffer => new File([buffer], fileName, { type: mimeType }));\n","import { PoEventSourcingOperation } from './../services/po-event-sourcing/enums/po-event-sourcing-operation.enum';\n\n/**\n * @description\n *\n * Classe que define a resposta de erro para um item da fila de eventos que não foi enviado ao servidor por\n * alguma inconsistência.\n *\n * > Pode ser utilizada em casos onde um item da fila é enviado ao servidor com inconsistência nos dados, por exemplo\n * uma operação de *delete* ou *update* sem o `id` do objeto.\n */\nexport class PoEventSourcingErrorResponse {\n /** Mensagem de erro. */\n message: string;\n\n /** Operação que havia sido requisitada. */\n operation: PoEventSourcingOperation;\n\n /* istanbul ignore next */\n constructor({ message, operation }) {\n this.message = message;\n this.operation = operation;\n }\n}\n","/**\n * @docsPrivate\n *\n * Define as operações realizadas no sync.\n */\n\nexport enum PoEventSourcingOperation {\n // Operação de exclusão.\n Delete = 'DELETE',\n\n // Operação de requisição HTTP.\n Http = 'HTTP',\n\n // Operação de inserção.\n Insert = 'INSERT',\n\n // Operação de alteração.\n Update = 'UPDATE'\n}\n","/**\n * @usedBy PoHttpClientService, PoHttpCommandResponse, PoSyncService\n *\n * @description\n *\n * Define o método de requisição HTTP.\n */\nexport enum PoHttpRequestType {\n /** Método `delete` do protocolo HTTP. */\n DELETE = 'DELETE',\n\n /** Método `get` do protocolo HTTP. */\n GET = 'GET',\n\n /** Método `head` do protocolo HTTP. */\n HEAD = 'HEAD',\n\n /** Método `options` do protocolo HTTP. */\n OPTIONS = 'OPTIONS',\n\n /** Método `patch` do protocolo HTTP. */\n PATCH = 'PATCH',\n\n /** Método `post` do protocolo HTTP. */\n POST = 'POST',\n\n /** Método `put` do protocolo HTTP. */\n PUT = 'PUT'\n}\n","/**\n * @docsPrivate\n *\n * @description\n *\n * Método de requisição HTTP.\n */\n\nexport enum PoRequestType {\n GET = 'get',\n\n DELETE = 'delete',\n\n DIFF = 'diff',\n\n PATCH = 'patch',\n\n POST = 'post'\n}\n","import { PoRequestType } from '../../../models/po-request-type.enum';\nimport { PoSyncFieldOptions } from '../../po-sync/interfaces/po-sync-field-options.interface';\nimport { PoSyncSchema } from '../../po-sync/interfaces/po-sync-schema.interface';\n\n/**\n * @docsPrivate\n *\n * @description\n *\n * Serviço utilitário para operações no PoSyncSchema.\n */\nexport class PoSchemaUtil {\n /** Valor `default` para o campo `lastSync`. */\n public static readonly defaultLastSync: string = new Date(-8640000000000000).toISOString();\n\n /** Nome da chave do identificador interno do sync. */\n public static readonly syncInternalIdFieldName: string = 'SyncInternalId';\n\n /** Nome da chave no `storage` para os Schemas. */\n public static readonly syncSchemasName: string = 'SyncSchemas';\n\n /**\n * Verica se existem campos locais no *schema* informado.\n *\n * @param {PoSyncSchema} schema **Schema* a ser processado.\n *\n * @returns {boolean} Valor do tipo *boolean* que indica se existem campos locais no *schema* informado.\n */\n public static containsLocalFields(schema: PoSyncSchema): boolean {\n if (schema.fields) {\n return !!schema.fields.find(field => typeof field === 'object' && field.local);\n }\n }\n\n /**\n * Retorna o valor atual do `lastSync` para determinado *schema*.\n *\n * @param {Array<PoSyncSchema>} storageSchemas Lista de *schemas* a serem pesquisados.\n * @param {string} schemaName Nome do *schema* que se deseja ler o lastSync.\n *\n * @returns {string} Retorna uma *string* com o valor da última sincronização.\n */\n public static getLastSync(storageSchemas: Array<PoSyncSchema>, schemaName: string): string {\n if (storageSchemas) {\n const schemaFound = storageSchemas.find(schema => schema.name === schemaName);\n return schemaFound && schemaFound.lastSync ? schemaFound.lastSync : PoSchemaUtil.defaultLastSync;\n }\n return PoSchemaUtil.defaultLastSync;\n }\n\n /**\n * Retorna a lista de campos locais definidos no *schema*.\n *\n * @param {PoSyncSchema} schema **Schema* a ser processado.\n */\n public static getLocalFieldNames(schema: PoSyncSchema): Array<string> {\n if (schema.fields) {\n return schema.fields.reduce((fieldsAccumulator: Array<string>, currentField: string | PoSyncFieldOptions) => {\n if (typeof currentField === 'object' && currentField.local) {\n fieldsAccumulator.push(currentField.name);\n }\n return fieldsAccumulator;\n }, []);\n }\n }\n\n /**\n * Retorna a lista de campos não locais definidos no *schema*.\n *\n * @param {PoSyncSchema} schema **Schema* a ser processado.\n */\n public static getNonLocalFieldNames(schema: PoSyncSchema): Array<string> {\n if (schema.fields) {\n return schema.fields.reduce((fieldsAccumulator: Array<string>, currentField: string | PoSyncFieldOptions) => {\n if (typeof currentField === 'string' || !currentField.local) {\n fieldsAccumulator.push(typeof currentField === 'string' ? currentField : currentField.name);\n }\n return fieldsAccumulator;\n }, []);\n }\n }\n\n /**\n * Retorna o `id` referente ao registro do *schema* informado.\n *\n * @param {object} record Registro que será buscado o id.\n * @param {PoSyncSchema} schema **Schema* a ser processado.\n */\n public static getRecordId(record: object, schema: PoSyncSchema) {\n return record[schema.idField] || record[PoSchemaUtil.syncInternalIdFieldName];\n }\n\n /**\n * Retorna a url correspondente do `PoSyncSchema` dependendo do tipo da requisição `PoRequestType`.\n *\n * @param {PoSyncSchema} schema **Schema* a ser processado.\n * @param {PoRequestType} requestType Tipo da requisição.\n */\n public static getUrl(schema: PoSyncSchema, requestType: PoRequestType): string {\n return schema[`${requestType}UrlApi`];\n }\n\n /**\n * Compara se dois objetos são iguais baseado na lista de campos.\n *\n * @param {Array<string>} fields Lista de campos a serem considerados na comparação.\n * @param {any} model1 Objeto 1 a ser comparado.\n * @param {any} model2 Objeto 2 a ser comparado.\n */\n public static isModelsEqual(fields: Array<string>, model1: any, model2: any): boolean {\n if (fields) {\n return fields.every(field => JSON.stringify(model1[field]) === JSON.stringify(model2[field]));\n }\n }\n\n /**\n * Retorna uma lista com dois objetos referentes ao registro informado.\n * O primeiro é o registro com os campos que vão para o servidor e o segundo é com os campos locais.\n *\n * @param {PoSyncSchema} schema **Schema* do registro.\n * @param {object} record Registro que será realizada a separação dos campos locais e do servidor.\n */\n public static separateSchemaFields(\n schema: PoSyncSchema,\n record: object\n ): { serverRecord: object; localRecord: object } {\n const localFields = PoSchemaUtil.getLocalFieldNames(schema);\n const localRecord = {};\n const serverRecord = {};\n\n Object.keys(record).forEach(field => {\n if (localFields.includes(field)) {\n localRecord[field] = record[field];\n } else {\n serverRecord[field] = record[field];\n }\n });\n\n return { serverRecord, localRecord };\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { PoStorageService } from '@po-ui/ng-storage';\n\nimport { PoSchemaUtil } from './../po-schema-util/po-schema-util.model';\nimport { PoSyncSchema } from './../../po-sync/interfaces/po-sync-schema.interface';\n\n/**\n * @docsPrivate\n *\n * @description\n *\n * Serviço que disponibiliza métodos que permite operar sobre as definições dos *schemas*.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PoSchemaDefinitionService {\n constructor(private poStorage: PoStorageService) {}\n\n /**\n * Destrói a chave do *storage* que contém as definições dos *schemas*.\n *\n * > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,\n * recomenda-se utilizar o método `prepare()` em seguida.\n *\n * @returns {Promise<void>} Promessa que é resolvida quando a chave referente as definições dos *schemas* for destruída.\n */\n destroy(): Promise<void> {\n return this.poStorage.remove(PoSchemaUtil.syncSchemasName);\n }\n\n /**\n * Busca um *schema* a partir do nome informado.\n *\n * @param {string} schemaName Nome do *schema*.\n * @returns {Promise<PoSyncSchema>} Promessa que é resolvida quando o *schema* for retornado.\n */\n get(schemaName: string): Promise<PoSyncSchema> {\n return this.poStorage.getItemByField(PoSchemaUtil.syncSchemasName, 'name', schemaName);\n }\n\n /**\n * Retorna uma promessa com a lista dos *schemas* definidos.\n *\n * @returns {Promise<Array<PoSyncSchema>>} Promessa que é resolvida quando a lista dos *schemas* definidos for retornada.\n */\n getAll(): Promise<Array<PoSyncSchema>> {\n return this.poStorage.get(PoSchemaUtil.syncSchemasName);\n }\n\n /**\n * Salva uma lista de *schemas*.\n *\n * @param {Array<PoSyncSchema>} schemas Lista de schemas que serão salvos.\n * @returns {Promise<Array<PoSyncSchema>>} Promessa que é resolvida quando a lista de *schemas* for salva.\n */\n saveAll(schemas: Array<PoSyncSchema>): Promise<Array<PoSyncSchema>> {\n return this.poStorage.set(PoSchemaUtil.syncSchemasName, schemas);\n }\n\n /**\n * Atualiza um *schema* a partir do *schema name*.\n *\n * @param {PoSyncSchema} updatedSchema **Schema* que será atualizado.\n */\n async update(updatedSchema: PoSyncSchema) {\n let schemas = await this.getAll();\n\n const replaceUpdatedSchema = schema => {\n if (schema.name === updatedSchema.name) {\n return updatedSchema;\n } else {\n return schema;\n }\n };\n\n schemas = schemas.map(replaceUpdatedSchema);\n return this.saveAll(schemas);\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { PoStorageService } from '@po-ui/ng-storage';\n\nimport { PoSchemaDefinitionService } from './po-schema-definition/po-schema-definition.service';\nimport { PoSchemaUtil } from './po-schema-util/po-schema-util.model';\nimport { PoSyncSchema } from '../po-sync/interfaces/po-sync-schema.interface';\n\n/**\n * @docsPrivate\n *\n * @description\n *\n * Serviço que realiza as operações nos `schemas`.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PoSchemaService {\n constructor(\n private poSchemaDefinitionService: PoSchemaDefinitionService,\n private poStorage: PoStorageService\n ) {}\n\n /**\n * Retorna o id a partir de uma chave de um *schema*.\n *\n * @param {string} schemaKey Chave do *schema* em que será realizada a busca do id.\n */\n private static getIdByRecordKey(schemaKey: string): string {\n return schemaKey.split(':')[1];\n }\n\n /**\n * Retorna a chave do *schema* informado.\n *\n * @param {string} schemaName Nome do *schema*.\n * @param {any} recordId Id do registro.\n * @param {boolean} isLocalKey Indica se é uma chave local.\n */\n private static getRecordKey(schemaName: string, recordId: any, isLocalKey: boolean = false): string {\n return isLocalKey ? `${schemaName}_local:${recordId}` : `${schemaName}:${recordId}`;\n }\n\n /**\n * Verifica se o dado informado é uma chave de um *schema*.\n *\n * @param {string} data Dado que será verificado se é uma chave de um *schema*.\n * @param {string} schemaName Nome do *schema*.\n */\n private static isSchemaKey(data: string, schemaName: string): boolean {\n return data ? data.startsWith(`${schemaName}:`) : false;\n }\n\n /**\n * Cria um novo registro para o *schema* informado.\n *\n * @param {PoSyncSchema} schema **Schema* em que será criado o registro.\n * @param {object} newRecord Registro que será criado.\n */\n async create(schema: PoSyncSchema, newRecord: object): Promise<object> {\n const id = PoSchemaUtil.getRecordId(newRecord, schema);\n return this.save(schema, newRecord, id);\n }\n\n /**\n * Destrói as chaves do *storage* que contém os registros dos *schemas*.\n *\n * @returns {Promise<void>} Promessa que é resolvida quando as chaves referentes aos *schemas* forem destruídas.\n */\n async destroySchemasRecords(): Promise<void> {\n const schemas = await this.poSchemaDefinitionService.getAll();\n const storageKeys = await this.poStorage.keys();\n\n for (const key of storageKeys) {\n const schemaKey = schemas.find(schema => PoSchemaService.isSchemaKey(key, schema.name));\n\n if (schemaKey) {\n const id = PoSchemaService.getIdByRecordKey(key);\n await this.remove(schemaKey.name, id);\n }\n }\n }\n\n /**\n * Retorna o registro referente ao *schema* informado.\n *\n * @param {string} schemaName Nome do *schema*.\n * @param {any} recordId Id do registro.\n */\n async get(schemaName: string, recordId: any): Promise<object> {\n const isLocalRecord = true;\n const localRecord = await this.getRecord(schemaName, recordId, isLocalRecord);\n const record = await this.getRecord(schemaName, recordId);\n\n return Object.assign(record, localRecord);\n }\n\n /**\n * Retorna todos os registros referente ao *schema* informado.\n *\n * @param {string} schemaName Nome do *schema*.\n */\n async getAll(schemaName: string): Promise<Array<object>> {\n const storageKeys = await this.poStorage.keys();\n const schemaRecords = [];\n\n for (const key of storageKeys) {\n if (PoSchemaService.isSchemaKey(key, schemaName)) {\n const id = PoSchemaService.getIdByRecordKey(key);\n schemaRecords.push(await this.get(schemaName, id));\n }\n }\n\n return schemaRecords;\n }\n\n /**\n * Aguarda a liberação do recurso limitado, posteriormente o envolve em um comportamento\n * de bloqueio e desbloqueio.\n *\n * @param {Function} limitedResource Função que será envolvida no comportamento de bloqueio e desbloqueio.\n */\n limitedCallWrap(limitedResource: Function): Promise<any> {\n return this.poStorage.limitedCallWrap(limitedResource);\n }\n\n /**\n * Remove um registro de um *schema* informado.\n *\n * @param {string} schemaName Nome do *schema*.\n * @param {any} recordId Id do registro.\n */\n async remove(schemaName: string, recordId: any): Promise<any> {\n const recordKey = PoSchemaService.getRecordKey(schemaName, recordId);\n const localRecordKey = PoSchemaService.getRecordKey(schemaName, recordId, true);\n\n await this.poStorage.remove(recordKey);\n await this.poStorage.remove(localRecordKey);\n }\n\n /**\n * Atualiza um registro de um *schema* informado.\n *\n * @param {PoSyncSchema} schema **Schema* referente ao registro que será alterado.\n * @param {object} record Registro que será atualizado.\n * @param {any} recordId Id do registro que deseja ser alterado. Deve ser utilizado em casos em que o id foi alterado.\n */\n async update(schema: PoSyncSchema, record: object, recordId?: any): Promise<object> {\n const id = PoSchemaUtil.getRecordId(record, schema);\n\n if (recordId) {\n record = await this.updateRecordId(schema.name, record, recordId);\n }\n\n return this.save(schema, record, id);\n }\n\n /**\n * Atualiza todos os registros de um *schema*.\n *\n * @param {PoSyncSchema} schema **Schema* referente aos registros que serão alterados.\n * @param {Array<object>} records Lista de registros que serão alterados.\n */\n async updateAll(schema: PoSyncSchema, records: Array<object>): Promise<void> {\n for (const record of records) {\n await this.update(schema, record);\n }\n }\n\n private async getRecord(schemaName, recordId, isLocalRecord = false): Promise<object> {\n return (await this.poStorage.get(PoSchemaService.getRecordKey(schemaName, recordId, isLocalRecord))) || {};\n }\n\n private async save(schema: PoSyncSchema, record: object, recordId: any) {\n const { serverRecord, localRecord } = PoSchemaUtil.separateSchemaFields(schema, record);\n const recordKey = PoSchemaService.getRecordKey(schema.name, recordId);\n\n await this.poStorage.set(recordKey, serverRecord);\n await this.saveLocalFields(schema.name, localRecord, recordId);\n\n return record;\n }\n\n private async saveLocalFields(schemaName: string, localFields: object, recordId): Promise<void> {\n const containsLocalFields = Object.keys(localFields).length;\n\n if (containsLocalFields) {\n const localRecordKey = PoSchemaService.getRecordKey(schemaName, recordId, true);\n await this.poStorage.set(localRecordKey, localFields);\n }\n }\n\n private async updateRecordId(schemaName, record, recordId) {\n const isLocalRecord = true;\n\n const localRecord = await this.getRecord(schemaName, recordId, isLocalRecord);\n await this.remove(schemaName, recordId);\n\n return Object.assign(record, localRecord);\n }\n}\n","import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\n\nimport { Observable } from 'rxjs';\n\nimport { PoHttpHeaderOption } from './interfaces/po-http-header-option.interface';\nimport { PoHttpRequestData } from './interfaces/po-http-request-data.interface';\nimport { PoHttpRequestType } from './po-http-request-type.enum';\n\n/**\n * @docsPrivate\n *\n * @description\n *\n * Serviço para execução de requisições HTTP.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PoHttpClientService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Constrói uma requisição HTTP personalizada.\n *\n * @param {PoHttpRequestData} poHttpOperationData Parâmetros para a construção\n * da requisição.\n */\n createRequest(poHttpOperationData: PoHttpRequestData): Observable<HttpResponse<object>> {\n const httpHeaders = this.createHttpHeaders(poHttpOperationData.headers);\n\n return this.httpClient.request(poHttpOperationData.method, poHttpOperationData.url, {\n observe: 'response',\n headers: httpHeaders,\n body: poHttpOperationData.body\n });\n }\n\n /**\n * Constrói uma requisição com o método `delete`.\n *\n * @param {string} url URL da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n delete(url: string, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.DELETE,\n headers: httpHeaders\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `get`.\n *\n * @param {string} url URL da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n get(url: string, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.GET,\n headers: httpHeaders\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `head`.\n *\n * @param {string} url URL da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n head(url: string, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.HEAD,\n headers: httpHeaders\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `options`.\n *\n * @param {string} url URL da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n options(url: string, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.OPTIONS,\n headers: httpHeaders\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `patch`.\n *\n * @param {string} url URL da requisição.\n * @param {any} body Corpo da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n patch(url: string, body?: any, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.PATCH,\n headers: httpHeaders,\n body: body\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `post`.\n *\n * @param {string} url URL da requisição.\n * @param {any} body Corpo da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n post(url: string, body?: any, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.POST,\n headers: httpHeaders,\n body: body\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `put`.\n *\n * @param {string} url URL da requisição.\n * @param {any} body Corpo da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n put(url: string, body?: any, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.PUT,\n headers: httpHeaders,\n body: body\n };\n\n return this.createRequest(requestData);\n }\n\n private createHttpHeaders(poHttpOperationHeaders) {\n let httpHeaders = new HttpHeaders();\n\n if (poHttpOperationHeaders && poHttpOperationHeaders.length > 0) {\n poHttpOperationHeaders.forEach(\n poHttpHeader => (httpHeaders = httpHeaders.append(poHttpHeader.name, poHttpHeader.value))\n );\n }\n\n return httpHeaders;\n }\n}\n","import { HttpResponse, HttpErrorResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\n\nimport { StatusCodes } from 'http-status-codes';\nimport { Observable, of, Subject } from 'rxjs';\nimport { expand, map, reduce } from 'rxjs/operators';\n\nimport { PoStorageService } from '@po-ui/ng-storage';\n\nimport { toBase64, toFile } from '../../utils/utils';\n\nimport { PoEventSourcingErrorResponse } from '../../models/po-event-sourcing-error-response.model';\nimport { PoEventSourcingItem } from './interfaces/po-event-sourcing-item.interface';\nimport { PoEventSourcingOperation } from './enums/po-event-sourcing-operation.enum';\nimport { PoEventSourcingSummaryItem } from './interfaces/po-event-sourcing-summary-item.interface';\nimport { PoHttpHeaderOption } from './../po-http-client/interfaces/po-http-header-option.interface';\nimport { PoHttpClientService } from './../po-http-client/po-http-client.service';\nimport { PoHttpRequestData } from '../po-http-client/interfaces/po-http-request-data.interface';\nimport { PoHttpRequestType } from '../po-http-client/po-http-request-type.enum';\nimport { PoRequestType } from '../../models/po-request-type.enum';\nimport { PoSchemaDefinitionService } from './../po-schema/po-schema-definition/po-schema-definition.service';\nimport { PoSchemaService } from './../po-schema/po-schema.service';\nimport { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';\nimport { PoSyncConfig } from '../po-sync/interfaces/po-sync-config.interface';\nimport { PoSyncResponse } from '../po-sync/interfaces/po-sync-response.interface';\nimport { PoSyncSchema } from './../po-sync/interfaces/po-sync-schema.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PoEventSourcingService {\n static readonly event_sourcing_name: string = 'EventSourcing';\n\n private static readonly VALID_HTTP_STATUS_CODES = [\n StatusCodes.OK, // 200\n StatusCodes.CREATED, // 201\n StatusCodes.ACCEPTED, // 202\n StatusCodes.NON_AUTHORITATIVE_INFORMATION, // 203\n StatusCodes.NO_CONTENT, // 204\n StatusCodes.RESET_CONTENT, // 205\n StatusCodes.PARTIAL_CONTENT, // 206\n StatusCodes.MULTI_STATUS // 207\n ];\n\n config: PoSyncConfig;\n stoppedQueueEventSourcing: boolean = false;\n\n private emitter: any;\n private eventSub: Observable<null>;\n private responseSubject = new Subject<PoSyncResponse>();\n\n private schemasSyncConfig = {};\n\n constructor(\n private poSchemaDefinition: PoSchemaDefinitionService,\n private poSchemaService: PoSchemaService,\n private poStorage: PoStorageService,\n private poHttpClient: PoHttpClientService\n ) {}\n\n private static getUrl(eventSourcingItem, schema, requestType): string {\n const schemaUrl = PoSchemaUtil.getUrl(schema, requestType);\n const schemaId = eventSourcingItem.record[schema.idField];\n\n if (requestType === PoRequestType.GET) {\n return schemaUrl;\n }\n\n if ([PoRequestType.DELETE, PoRequestType.PATCH].includes(requestType)) {\n return schemaUrl ? `${schemaUrl}/${schemaId}` : `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}/${schemaId}`;\n }\n\n if (requestType === PoRequestType.POST) {\n return schemaUrl ? schemaUrl : PoSchemaUtil.getUrl(schema, PoRequestType.GET);\n }\n }\n\n create(schemaName: string, newItem: any, customRequestId?: string): Promise<any> {\n const eventSourcingItem = this.createEventSourcingItem(\n PoEventSourcingOperation.Insert,\n newItem,\n schemaName,\n customRequestId\n );\n return this.insertEventSourcingQueue(eventSourcingItem);\n }\n\n async createBatchEvents(schemaName: string, eventList: Array<PoEventSourcingSummaryItem>) {\n const eventSourcingList = this.createEventSourcingList(schemaName, eventList);\n\n await this.poStorage.appendArrayToArray(PoEventSourcingService.event_sourcing_name, eventSourcingList);\n\n this.notifyEventCreation();\n }\n\n /**\n * Destrói a chave do *storage* que contém a fila de dados que estão esperando para serem enviados ao\n * servidor *(EventSourcing)*.\n *\n * @returns {Promise<void>} Promessa que é resolvida quando a chave referente a fila de *EventSourcing* for destruída.\n */\n destroyEventSourcingQueue(): Promise<void> {\n return this.poStorage.remove(PoEventSourcingService.event_sourcing_name);\n }\n\n async httpCommand(httpOperationData: PoHttpRequestData, customRequestId?: string): Promise<number> {\n httpOperationData = await this.serializeBody(httpOperationData);\n\n const eventSourcingItem = this.createEventSourcingItem(\n PoEventSourcingOperation.Http,\n httpOperationData,\n undefined,\n customRequestId\n );\n\n await this.insertEventSourcingQueue(eventSourcingItem);\n return eventSourcingItem.id;\n }\n\n responsesSubject(): Observable<PoSyncResponse> {\n return this.responseSubject.asObservable();\n }\n\n onSaveData(): Observable<null> {\n if (!this.eventSub) {\n this.eventSub = Observable.create(subscriber => (this.emitter = subscriber));\n }\n return this.eventSub;\n }\n\n remove(schemaName: string, itemToDelete: any, customRequestId?: string): Promise<any> {\n const eventSourcingItem = this.createEventSourcingItem(\n PoEventSourcingOperation.Delete,\n itemToDelete,\n schemaName,\n customRequestId\n );\n return this.insertEventSourcingQueue(eventSourcingItem);\n }\n\n removeEventSourcingItem(idEventSourcingItem) {\n return this.poStorage.removeItemFromArray(PoEventSourcingService.event_sourcing_name, 'id', idEventSourcingItem);\n }\n\n syncGet(): Promise<any> {\n const syncGetFunction = async () =>\n this.poSchemaDefinition.getAll().then(schemas => {\n const schemaPromises = this.updateStorageSchemas(schemas);\n\n return Promise.all(schemaPromises);\n });\n\n return this.poSchemaService.limitedCallWrap(syncGetFunction);\n }\n\n async syncSend(): Promise<any> {\n const syncSendFunction = async (): Promise<any> => {\n const itemOfQueue = await this.poStorage.getFirstItem(PoEventSourcingService.event_sourcing_name);\n\n if (itemOfQueue) {\n await this.selectOperation(itemOfQueue);\n }\n\n if (this.stoppedQueueEventSourcing || !itemOfQueue) {\n this.stoppedQueueEventSourcing = false;\n return Promise.resolve();\n }\n\n return syncSendFunction();\n };\n\n return this.poSchemaService.limitedCallWrap(syncSendFunction);\n }\n\n update(schemaName: string, itemUpdated: any, customRequestId?: string): Promise<any> {\n const eventSourcingItem = this.createEventSourcingItem(\n PoEventSourcingOperation.Update,\n itemUpdated,\n schemaName,\n customRequestId\n );\n return this.insertEventSourcingQueue(eventSourcingItem);\n }\n\n /* Avalia se o body é do tipo File e se for converte para base64 */\n private async serializeBody(requestData: PoHttpRequestData): Promise<PoHttpRequestData> {\n let { body, mimeType, bodyType, fileName } = requestData;\n\n if (body instanceof File) {\n bodyType = 'File';\n mimeType = body.type;\n fileName = body.name;\n body = await toBase64(body);\n }\n\n return { ...requestData, body, mimeType, bodyType, fileName };\n }\n\n private buildUrlParams(schema: PoSyncSchema, baseUrl: string, pageNumber: number): string {\n const params = [];\n params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);\n params.push(`${this.config.dataTransform.getPageParamName()}=${pageNumber}`);\n return `${baseUrl}?${params.join('&')}`;\n }\n\n private checkRecordIdExists(recordId, operation) {\n if (!recordId) {\n const error = {\n message: 'Identifier not defined',\n operation: operation\n };\n\n throw new PoEventSourcingErrorResponse(error);\n }\n }\n\n private concatPageItems(pageAcumulator, requestBody): { entity: string; data: Array<any> } {\n if (requestBody[this.config.dataTransform.getItemsFieldName()]) {\n pageAcumulator.data = [...pageAcumulator.data, ...requestBody[this.config.dataTransform.getItemsFieldName()]];\n }\n return pageAcumulator;\n }\n\n private createEventSourcingItem(\n operation: PoEventSourcingOperation,\n newItem: any | PoHttpRequestData,\n schemaName?: string,\n customRequestId?: string,\n id?: number\n ): PoEventSourcingItem {\n if (!schemaName && operation !== PoEventSourcingOperation.Http) {\n throw new Error('PoSyncSchema is not defined.');\n }\n\n return {\n id: id ? id : new Date().getTime(),\n dateTime: new Date().getTime(),\n schema: schemaName,\n operation: operation,\n record: newItem,\n customRequestId: customRequestId\n };\n }\n\n private createEventSourcingList(\n schemaName: string,\n eventList: Array<PoEventSourcingSummaryItem>\n ): Array<PoEventSourcingItem> {\n return eventList.map((eventItem, index) => {\n const id = new Date().getTime() + index;\n\n return this.createEventSourcingItem(\n eventItem.operation,\n eventItem.record,\n schemaName,\n eventItem.customRequestId,\n id\n );\n });\n }\n\n private createSchemaSyncConfig(schemaName) {\n this.schemasSyncConfig[schemaName] = {\n page: undefined,\n currentUrlDiff: undefined,\n responseDate: undefined\n };\n }\n\n private async deleteOperation(eventSourcingItem: PoEventSourcingItem): Promise<any> {\n try {\n const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);\n\n const recordId = eventSourcingItem.record[schema.idField];\n this.checkRecordIdExists(recordId, PoEventSourcingOperation.Delete);\n\n const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.DELETE);\n const response = await this.sendServerItem(url, PoHttpRequestType.DELETE);\n\n await this.removeEventSourcingValidItem(response.status, eventSourcingItem);\n\n return await this.sendResponseSubject(eventSourcingItem, response);\n } catch (errorResponse) {\n return this.sendResponseSubject(eventSourcingItem, errorResponse, true);\n }\n }\n\n private diffServerItems(currentUrlDiff): Observable<HttpResponse<object>> {\n return this.poHttpClient.get(currentUrlDiff);\n }\n\n private getBodyAndDate(schemaName, response): any {\n const getDateFieldName = this.config.dataTransform.getDateFieldName();\n\n const responseSyncDate = response.body[getDateFieldName];\n\n this.schemasSyncConfig[schemaName]['responseDate'] = responseSyncDate;\n return response.body;\n }\n\n private async getServerDiffRecords(schema: PoSyncSchema, baseUrl: string): Promise<any> {\n const initialAcumulatorPage = { entity: schema.name, data: [] };\n const diffUrl = this.schemasSyncConfig[schema.name]['currentUrlDiff'];\n\n const serverResponse = await this.diffServerItems(diffUrl)\n .pipe(\n map(response => this.getBodyAndDate(schema.name, response)),\n expand(data => this.paginateSchemaData(data, schema, baseUrl)),\n reduce(\n (pageAcumulator, requestBody) => this.concatPageItems(pageAcumulator, requestBody),\n initialAcumulatorPage\n )\n )\n .toPromise();\n\n return serverResponse.data;\n }\n\n private async httpOperation(eventSourcingItem: PoEventSourcingItem): Promise<Array<PoEventSourcingItem> | number> {\n try {\n const requestData: PoHttpRequestData = await this.createPoHttpRequestData(\n eventSourcingItem.record.url,\n eventSourcingItem.record.method,\n eventSourcingItem.record,\n eventSourcingItem.record.headers\n );\n const response = await this.poHttpClient.createRequest(requestData).toPromise();\n const poHttpCommandResponse: PoSyncResponse = {\n id: eventSourcingItem.id,\n customRequestId: eventSourcingItem.customRequestId,\n request: eventSourcingItem.record,\n response: response\n };\n\n this.responseSubject.next(poHttpCommandResponse);\n\n return this.removeEventSourcingValidItem(response.status, eventSourcingItem);\n } catch (errorHttpClient) {\n return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);\n }\n }\n\n private async insertEventSourcingQueue(eventSourcingItem): Promise<Array<PoEventSourcingItem>> {\n const eventSourcingUpdatedQueue = await this.poStorage.appendItemToArray(\n PoEventSourcingService.event_sourcing_name,\n eventSourcingItem\n );\n\n this.notifyEventCreation();\n\n return Promise.resolve(eventSourcingUpdatedQueue);\n }\n\n private async insertOperation(currentEventSourcingItem: PoEventSourcingItem): Promise<any> {\n const schema = await this.poSchemaDefinition.get(currentEventSourcingItem.schema);\n const url = PoEventSourcingService.getUrl(currentEventSourcingItem, schema, PoRequestType.POST);\n\n try {\n const response = await this.sendServerItem(url, PoHttpRequestType.POST, currentEventSourcingItem.record);\n const recordUpdatedByServer = response.body;\n\n await this.removeEventSourcingValidItem(response.status, currentEventSourcingItem);\n\n const id = currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];\n await this.poSchemaService.update(schema, recordUpdatedByServer, id);\n\n const eventSourcingItems: Array<PoEventSourcingItem> = await this.poStorage.get(\n PoEventSourcingService.event_sourcing_name\n );\n await this.updatePendingEventSourcing(\n currentEventSourcingItem,\n schema.idField,\n recordUpdatedByServer,\n eventSourcingItems\n );\n\n return this.sendResponseSubject(currentEventSourcingItem, response);\n } catch (errorHttpClient) {\n return this.sendResponseSubject(currentEventSourcingItem, errorHttpClient, true);\n }\n }\n\n private isValidStatus(status: number): boolean {\n return PoEventSourcingService.VALID_HTTP_STATUS_CODES.includes(status);\n }\n\n private notifyEventCreation(): void {\n if (this.emitter) {\n this.emitter.next();\n }\n }\n\n private paginateSchemaData(data, schema, baseUrl): Observable<null> {\n this.config.dataTransform.transform(data);\n\n if (this.config.dataTransform.hasNext()) {\n this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(\n schema,\n baseUrl,\n ++this.schemasSyncConfig[schema.name]['page']\n );\n\n return this.diffServerItems(this.schemasSyncConfig[schema.name]['currentUrlDiff']).pipe(\n map(response => this.getBodyAndDate(schema.name, response))\n );\n }\n\n return of();\n }\n\n private removeEventSourcingValidItem(\n status,\n eventSourcingItem: PoEventSourcingItem\n ): Promise<Array<PoEventSourcingItem>> {\n if (this.isValidStatus(status) || eventSourcingItem.operation === PoEventSourcingOperation.Http) {\n return this.removeEventSourcingItem(eventSourcingItem.id);\n }\n }\n\n private selectOperation(eventSourcingItem: PoEventSourcingItem): Promise<any> {\n switch (eventSourcingItem.operation) {\n case PoEventSourcingOperation.Insert:\n return this.insertOperation(eventSourcingItem);\n\n case PoEventSourcingOperation.Update:\n return this.updateOperation(eventSourcingItem);\n\n case PoEventSourcingOperation.Delete:\n return this.deleteOperation(eventSourcingItem);\n\n case PoEventSourcingOperation.Http:\n return this.httpOperation(eventSourcingItem);\n }\n }\n\n private sendResponseSubject(\n eventSourcingItem: PoEventSourcingItem,\n response: HttpResponse<object> | HttpErrorResponse | PoEventSourcingErrorResponse,\n isSubjectError: boolean = false\n ): Promise<any> {\n const poSyncResponse: PoSyncResponse = {\n id: eventSourcingItem.id,\n customRequestId: eventSourcingItem.customRequestId,\n request: eventSourcingItem.record,\n response: response\n };\n\n this.stoppedQueueEventSourcing = isSubjectError;\n this.responseSubject.next(poSyncResponse);\n\n return Promise.resolve();\n }\n\n private async sendServerItem(url: string, method: PoHttpRequestType, body?: PoEventSourcingItem['record']) {\n const requestData: PoHttpRequestData = await this.createPoHttpRequestData(url, method, body);\n\n return this.poHttpClient.createRequest(requestData).toPromise();\n }\n\n private async createPoHttpRequestData(\n url: string,\n method: PoHttpRequestType,\n record?: PoEventSourcingItem['record'],\n headers?: Array<PoHttpHeaderOption>\n ): Promise<PoHttpRequestData> {\n let body = record?.body ?? record ?? {};\n\n if (record?.bodyType === 'File') {\n body = await this.createFormData(body, record.fileName, record.mimeType, record.formField);\n }\n\n return { url, method, body, headers };\n }\n\n private async createFormData(\n body: string,\n fileName: string,\n mimeType: string,\n formField: string = 'file'\n ): Promise<FormData> {\n const file = await toFile(body, fileName, mimeType);\n const formData: FormData = new FormData();\n\n formData.append(formField, file, fileName);\n return formData;\n }\n\n private async updateOperation(eventSourcingItem: PoEventSourcingItem): Promise<Array<any> | number> {\n const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);\n const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.PATCH);\n\n try {\n const recordId = eventSourcingItem.record[schema.idField];\n this.checkRecordIdExists(recordId, PoEventSourcingOperation.Update);\n\n const response = await this.sendServerItem(url, PoHttpRequestType.PUT, eventSourcingItem.record);\n await this.removeEventSourcingValidItem(response.status, eventSourcingItem);\n\n return await this.sendResponseSubject(eventSourcingItem, response);\n } catch (errorHttpClient) {\n return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);\n }\n }\n\n private updatePendingEventSourcing(\n currentEventSourcingItem: PoEventSourcingItem,\n idFieldSchema: string,\n inserted: object,\n eventSourcingItems: Array<PoEventSourcingItem>\n ) {\n if (currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName]) {\n eventSourcingItems.forEach((eventSourcingItem, position) => {\n const isCurrentEventSourcingItem =\n !eventSourcingItem.record[idFieldSchema] &&\n eventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName] ===\n currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];\n\n if (isCurrentEventSourcingItem) {\n eventSourcingItems[position].record[idFieldSchema] = inserted[idFieldSchema];\n }\n });\n\n return this.poStorage.set(PoEventSourcingService.event_sourcing_name, eventSourcingItems);\n } else {\n return Promise.resolve();\n }\n }\n\n private async updateRecords(serverRecords: Array<any>, schema: PoSyncSchema) {\n for (const serverRecord of serverRecords) {\n await this.updateRecordByServerRecord(serverRecord, schema);\n }\n }\n\n private async updateRecordByServerRecord(serverRecord, schema) {\n const recordId = serverRecord[schema.idField];\n const storageRecord = await this.poSchemaService.get(schema.name, recordId);\n const existsStorageRecord = !!Object.keys(storageRecord).length;\n\n if (existsStorageRecord && serverRecord[schema.deletedField]) {\n return await this.poSchemaService.remove(schema.name, serverRecord[schema.idField]);\n }\n\n if (existsStorageRecord && !serverRecord[schema.deletedField]) {\n return await this.poSchemaService.update(schema, serverRecord);\n }\n\n if (!existsStorageRecord && !serverRecord[schema.deletedField]) {\n return await this.poSchemaService.create(schema, serverRecord);\n }\n }\n\n private async updateStorageBySchema(schema: PoSyncSchema): Promise<any> {\n this.createSchemaSyncConfig(schema.name);\n\n this.schemasSyncConfig[schema.name]['page'] = 1;\n const baseUrl = `${PoSchemaUtil.getUrl(schema, PoRequestType.DIFF)}/${schema.lastSync}`;\n this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(\n schema,\n baseUrl,\n this.schemasSyncConfig[schema.name]['page']\n );\n\n const serverRecords = await this.getServerDiffRecords(schema, baseUrl);\n\n await this.updateRecords(serverRecords, schema);\n\n schema.lastSync = this.schemasSyncConfig[schema.name]['responseDate'];\n await this.poSchemaDefinition.update(schema);\n }\n\n private updateStorageSchemas(schemas): Array<Promise<Array<any>>> {\n return schemas.map((schema: PoSyncSchema) => this.updateStorageBySchema(schema));\n }\n}\n","import { validateParameter } from '../../utils/utils';\n\nimport { PoResponseApi } from './../../services/po-http-client/interfaces/po-response-api.interface';\nimport { PoSchemaService } from './../../services/po-schema';\nimport { PoSyncSchema } from '../../services/po-sync/interfaces/po-sync-schema.interface';\n\n/**\n * @description\n *\n * Classe utilitária para construir consultas sobre os registros de um *schema*.\n *\n * A utilização dos métodos desta classe é feita a partir do retorno do método `PoEntity.find()`. Por exemplo,\n * para utilizar o método `PoQueryBuilder.page()`, é necessário:\n *\n * ``` typescript\n * PoSyncService.getModel('schema name').find().page(2).exec();\n * ```\n *\n * O `PoQueryBuilder` foi projetado para que os seus métodos sejam\n * chamados em cascata e ao final desse encadeamento invocar o método\n * `PoQueryBuilder.exec()` para que a busca seja concluída. Por exemplo:\n *\n * ``` typescript\n * PoSyncService\n * .getModel('schema name')\n * .find()\n * .page(2)\n * .pageSize(5)\n * .sort()\n * .exec();\n * ```\n */\nexport class PoQueryBuilder {\n private fields: string;\n private filters: any;\n\n private _limit: number;\n private _page: number;\n private _pageSize: number;\n private _sort: string;\n\n constructor(\n private poSchemaService: PoSchemaService,\n private schema: PoSyncSchema\n ) {\n this._page = 1;\n this.filters = {};\n }\n\n /**\n * Ao final da chamada dos métodos do `PoQueryBuilder` utilizados, este método deve ser chamado para que a busca seja concluída.\n *\n * @return {Promise<PoResponseApi | object>} Registros do *schema* na qual foi aplicado a consulta.\n */\n async exec(): Promise<PoResponseApi | object> {\n let storageData = await this.poSchemaService.getAll(this.schema.name);\n\n if (storageData && storageData.length) {\n if (Object.keys(this.filters).length) {\n storageData = this.applyFilters(storageData);\n }\n if (this.fields) {\n storageData = this.applyFields(this.schema.fields, storageData);\n }\n if (this._sort) {\n storageData = this.order(storageData, this._sort);\n }\n\n if (this._limit) {\n return storageData[0];\n } else {\n return this.paginate(storageData);\n }\n } else {\n return {\n hasNext: false,\n items: []\n };\n }\n }\n\n /**\n * Aplica filtros sobre os registros, baseados nos campos e valores definidos como filtro. Por exemplo:\n *\n * ```\n * PoQueryBuilder.filter({ name: 'Marie', age: 24 });\n * ```\n * Retorna todos os registros que contenham a propriedade `name` igual a Marie e `age` igual a 24.\n *\n * @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.\n *\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n filter(filter?: object): PoQueryBuilder {\n if (filter && typeof filter === 'object') {\n this.filters = { ...this.filters, ...filter };\n } else {\n throw new Error('Filter must be an object');\n }\n\n return this;\n }\n\n /**\n * Limita o número de registros que serão retornados.\n *\n * @param {number} limit Número de registros retornados.\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n limit(limit: number): PoQueryBuilder {\n this._limit = limit;\n return this;\n }\n\n /**\n * Especifica a página de registros que se deseja retornar.\n *\n * @param {number} page Número da página.\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n page(page: number): PoQueryBuilder {\n validateParameter({ page });\n\n this._page = page;\n return this;\n }\n\n /**\n * Define quantos elementos serão retornados por página.\n *\n * @param {number} pageSize Número de registros por página.\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n pageSize(pageSize: number): PoQueryBuilder {\n validateParameter({ pageSize });\n\n this._pageSize = pageSize;\n return this;\n }\n\n /**\n * Utilizado para definir quais campos do *schema* serão retornados na consulta.\n *\n * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de\n * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.\n * Por exemplo, a definição abaixo:\n *\n * ```\n * PoQueryBuilder.select('name age address');\n * ```\n * Irá retornar apenas os campos `name`, `age` e `address`. Para não retornar um campo ou mais basta fazer:\n *\n * ```\n * PoQueryBuilder.select('-name -age');\n * ```\n *\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n select(fields: string): PoQueryBuilder {\n validateParameter({ fields });\n\n this.fields = fields;\n return this;\n }\n\n /**\n * Ordena os registros por um campo.\n *\n * @param {string} field Campo a ser ordenado. Para ordenar de forma decrescente basta colocar o caractere `-`\n * na frente do campo. Por exemplo:\n * ```\n * PoQueryBuilder.sort('-name');\n * ```\n *\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n sort(field: string): PoQueryBuilder {\n validateParameter({ field });\n\n this._sort = field;\n return this;\n }\n\n /**\n * Essa função serve como alias para o `PoQueryBuilder.filter()`. É utilizada somente para dar maior legibilidade ao código.\n *\n * @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n where(filter: object): PoQueryBuilder {\n return this.filter(filter);\n }\n\n private applyFields(schemaFields: Array<any>, data: Array<object>): Array<object> {\n const receivedFields = this.fields.split(' ');\n let restrictedFields = [];\n let selectedFields = [];\n\n [selectedFields, restrictedFields] = this.groupFields(receivedFields);\n\n if (!selectedFields.length && restrictedFields.length) {\n selectedFields = [...schemaFields];\n }\n\n if (restrictedFields.length) {\n selectedFields = this.removeRestrictedFields(restrictedFields, selectedFields);\n }\n\n selectedFields = this.removeDuplicate(selectedFields);\n\n return this.removeFieldsData(data, selectedFields);\n }\n\n private applyFilters(data: Array<object>): Array<object> {\n Object.keys(this.filters).forEach(filterKey => {\n data = data.filter(item => item[filterKey] === this.filters[filterKey]);\n });\n\n return data;\n }\n\n private groupFields(receivedFields: Array<string>): Array<Array<string>> {\n const restrictedFields = [];\n const selectedFields = [];\n\n receivedFields.forEach(fields => {\n if (fields.startsWith('-')) {\n restrictedFields.push(fields.substring(1));\n } else {\n selectedFields.push(fields);\n }\n });\n return [selectedFields, restrictedFields];\n }\n\n private paginate(data: Array<any>): { hasNext: boolean; items: Array<any> } {\n const dataLength = data.length;\n const pageSize = this._pageSize || dataLength;\n\n const pages = Math.ceil(dataLength / pageSize);\n const begin = this._page * pageSize - pageSize;\n const end = begin + pageSize;\n\n return { hasNext: this._page < pages, items: data.slice(begin, end) };\n }\n\n private order(data: Array<any>, sortingField: string): Array<any> {\n const descendingOrder = sortingField.startsWith('-');\n sortingField = descendingOrder ? sortingField.substr(1) : sortingField;\n\n return data.sort((optionA, optionB) => {\n if (optionA[sortingField] > optionB[sortingField]) {\n return !descendingOrder ? 1 : -1;\n }\n\n if (optionA[sortingField] < optionB[sortingField]) {\n return !descendingOrder ? -1 : 1;\n }\n\n return 0;\n });\n }\n\n private removeDuplicate(fields): Array<any> {\n return fields.filter((item, position) => fields.indexOf(item) === position);\n }\n\n private removeFieldsData(data: Array<object>, chosenFields: Array<string>): Array<object> {\n data.forEach(item => {\n Object.keys(item).forEach(keyItem => {\n if (!chosenFields.includes(keyItem)) {\n delete item[keyItem];\n }\n });\n });\n return data;\n }\n\n private removeRestrictedFields(restrictedFields: Array<any>, fields: Array<any>) {\n return fields.filter(field => !restrictedFields.includes(field));\n }\n}\n","import { validateParameter } from '../../utils/utils';\n\nimport {\n PoEventSourcingOperation,\n PoEventSourcingService,\n PoEventSourcingSummaryItem\n} from '../../services/po-event-sourcing';\nimport { PoQueryBuilder } from './../po-query-builder/po-query-builder.model';\nimport { PoSchemaService, PoSchemaUtil } from '../../services/po-schema';\nimport { PoSyncSchema } from '../../services/po-sync/interfaces/po-sync-schema.interface';\n\n/**\n * @description\n *\n * Uma instância `PoEntity` representa um *schema* e ela contém métodos que possibilitam manipular seus registros,\n * como por exemplo: buscar, criar e remover.\n *\n * Esta instância pode ser obtida a partir do retorno do método `PoSyncService.getModel('schema name')`.\n */\nexport class PoEntity {\n constructor(\n private eventSourcing: PoEventSourcingService,\n private schema: PoSyncSchema,\n private poSchemaService: PoSchemaService\n ) {}\n\n /**\n * Busca os registros do *schema*, podendo filtrar o resultado a partir do filtro passado e retornando apenas\n * os campos definidos.\n *\n * Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.\n * Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).\n *\n * @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.\n * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de\n * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.\n * Por exemplo, a definição abaixo:\n *\n * ```\n * PoQueryBuilder.select('name age address');\n * ```\n * Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:\n *\n * ```\n * PoQueryBuilder.select('-name -age');\n * ```\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.\n */\n find(filter?: object, fields?: string): PoQueryBuilder {\n const query = new PoQueryBuilder(this.poSchemaService, this.schema);\n\n if (filter) {\n query.filter(filter);\n }\n\n if (fields) {\n query.select(fields);\n }\n\n return query;\n }\n\n /**\n * Busca um registro pelo seu *id*.\n *\n * Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.\n * Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).\n *\n * @param {any} id Identificador do registro.\n * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de\n * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.\n * Por exemplo, a definição abaixo:\n *\n * ```\n * PoQueryBuilder.select('name age address');\n * ```\n * Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:\n *\n * ```\n * PoQueryBuilder.select('-name -age');\n * ```\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.\n */\n findById(id: any, fields?: string): PoQueryBuilder {\n return this.findOne({ [this.schema.idField]: id }, fields);\n }\n\n /**\n * Semelhante ao método `PoEntity.find()`, porém retorna apenas o primeiro registro encontrado na busca.\n *\n * Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.\n * Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).\n *\n * @param {any} filter Objeto que contém os campos e valores a serem filtrados no *schema*.\n * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de\n * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.\n * Por exemplo, a definição abaixo:\n *\n * ```\n * PoQueryBuilder.select('name age address');\n * ```\n * Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:\n *\n * ```\n * PoQueryBuilder.select('-name -age');\n * ```\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.\n */\n findOne(filter?: any, fields?: string): PoQueryBuilder {\n const query = this.find(filter, fields);\n query.limit(1);\n return query;\n }\n\n /**\n * Remove um registro.\n *\n * @param {object} record Registro que será removido.\n * @param {string} customRequestId Identificador customizado do comando.\n * @returns {Promise} Promessa que é concluída após o registro ser removido.\n */\n async remove(record: object, customRequestId?: string): Promise<any> {\n validateParameter({ record });\n\n const remove = async () => {\n const idField = record[this.schema.idField] ? this.schema.idField : PoSchemaUtil.syncInternalIdFieldName;\n const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, record)['serverRecord'];\n\n await this.poSchemaService.remove(this.schema.name, record[idField]);\n await this.eventSourcing.remove(this.schema.name, serverRecord, customRequestId);\n };\n\n return this.poSchemaService.limitedCallWrap(remove);\n }\n\n /**\n * Altera ou inclui um registro.\n *\n * > O registro será alterado se ele possuir um *id*, caso contrário um novo registro será criado.\n *\n * @param {object} record Registro que será persistido.\n * @param {string} customRequestId Identificador customizado do comando.\n * @returns {Promise} Promessa que é concluída após o registro ser alterado ou incluído.\n */\n async save(record: object, customRequestId?: string): Promise<any> {\n validateParameter({ record });\n\n return this.poSchemaService.limitedCallWrap(this.selectSaveType.bind(this, record, true, customRequestId));\n }\n\n /**\n * Salva uma lista de registros em lote.\n *\n * > Para cada registro da lista, será inserido um novo registro se o mesmo não tiver *id*, caso contrário\n * será contado como uma atualização de um registro existente.\n *\n * @param {Array<object>} records Lista de registros que serão persistidos.\n * @param {Array<string> | string} customRequestIds Identificador customizado do comando.\n *\n * Ao passar uma lista de identificadores, cada índice da lista de identificadores deverá\n * corresponder ao índice do registro na lista de registros.\n * @returns {Promise<any>} Promessa que é concluída após os registros serem alterados ou incluídos.\n */\n async saveAll(records: Array<object>, customRequestIds?: Array<string> | string): Promise<any> {\n validateParameter({ records });\n\n const saveAll = async () => {\n const batchEvents = [];\n\n for (let index = 0; index < records.length; index++) {\n const record = records[index];\n const sendToEventSourcing = false;\n\n const isNonLocalRecordChanged = await this.isNonLocalRecordChanged(record);\n const updatedRecord = await this.selectSaveType(record, sendToEventSourcing);\n\n if (isNonLocalRecordChanged) {\n const customRequestId = customRequestIds instanceof Array ? customRequestIds[index] : customRequestIds;\n const eventOperation = this.createEventOperation(record, updatedRecord, customRequestId);\n batchEvents.push(eventOperation);\n }\n }\n\n await this.eventSourcing.createBatchEvents(this.schema.name, batchEvents);\n };\n\n return this.poSchemaService.limitedCallWrap(saveAll);\n }\n\n private async create(newRecord: any, sendToEventSourcing: boolean, customRequestId?: string): Promise<any> {\n const time = new Date().getTime();\n\n const syncProperties = {\n [PoSchemaUtil.syncInternalIdFieldName]: time,\n SyncInsertedDateTime: time,\n SyncUpdatedDateTime: null,\n SyncExclusionDateTime: null,\n SyncDeleted: false,\n SyncStatus: 0\n };\n const recordWithSyncProperties = { ...newRecord, ...syncProperties };\n\n const recordedData = await this.poSchemaService.create(this.schema, recordWithSyncProperties);\n\n if (sendToEventSourcing) {\n await this.eventSourcing.create(this.schema.name, recordWithSyncProperties, customRequestId);\n }\n\n return recordedData;\n }\n\n private createEventOperation(\n record: object,\n updatedRecord: object,\n customRequestId?: string\n ): PoEventSourcingSummaryItem {\n const operation = PoSchemaUtil.getRecordId(record, this.schema)\n ? PoEventSourcingOperation.Update\n : PoEventSourcingOperation.Insert;\n\n const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, updatedRecord)['serverRecord'];\n\n return {\n record: serverRecord,\n customRequestId: customRequestId,\n operation: operation\n };\n }\n\n private async isNonLocalRecordChanged(updatedRecord: object): Promise<boolean> {\n const nonLocalFieldNames = PoSchemaUtil.getNonLocalFieldNames(this.schema);\n const record = await this.poSchemaService.get(this.schema.name, updatedRecord[this.schema.idField]);\n\n return !PoSchemaUtil.isModelsEqual(nonLocalFieldNames, record, updatedRecord);\n }\n\n private async selectSaveType(\n record: object,\n sendToEventSourcing: boolean,\n customRequestId?: string\n ): Promise<object> {\n const hasId = PoSchemaUtil.getRecordId(record, this.schema);\n\n return hasId\n ? await this.update(record, sendToEventSourcing, customRequestId)\n : await this.create(record, sendToEventSourcing, customRequestId);\n }\n\n private async update(updatedRecord: any, sendToEventSourcing: boolean, customRequestId?: string): Promise<object> {\n updatedRecord.SyncUpdatedDateTime = new Date().getTime();\n updatedRecord.SyncStatus = 0;\n\n const isNonLocalRecordChanged = await this.isNonLocalRecordChanged(updatedRecord);\n const recordedData = await this.poSchemaService.update(this.schema, updatedRecord);\n\n if (isNonLocalRecordChanged && sendToEventSourcing) {\n const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, updatedRecord)['serverRecord'];\n await this.eventSourcing.update(this.schema.name, serverRecord, customRequestId);\n }\n\n return recordedData;\n }\n}\n","/**\n * @usedBy PoSyncConfig, PoNetworkStatus\n *\n * @description\n *\n * Tipos de rede existentes no dispositivo.\n */\n\nexport enum PoNetworkType {\n /** Define o tipo de rede como desconhecido (`unknown`). */\n unknown,\n\n /** Define o tipo de rede como `Ethernet`. */\n ethernet,\n\n /** Define o tipo de rede como `WiFi`. */\n wifi,\n\n /** Define o tipo de rede como `2G`. */\n _2g,\n\n /** Define o tipo de rede como `3G`. */\n _3g,\n\n /** Define o tipo de rede como `4G`. */\n _4g,\n\n /**\n * Define o tipo de rede como `cellular`. Isso acontece na utilização dos navegadores\n * dentro do dispositvo móvel, com exceção do *web view*.\n */\n cellular,\n\n /** Define o tipo de rede como `none`. */\n none\n}\n","import { PoDataTransform } from './po-data-transform.model';\n\n/**\n * @docsPrivate\n *\n * @description\n *\n * Classe responsável por implementar a classe `PoDataTransform` com os campos referentes ao padrão de\n * [API do PO UI](https://po-ui.io/guides/api).\n */\nexport class PoDataMessage extends PoDataTransform {\n /**\n * Retorna a propriedade `po_sync_date`, responsável por informar a data da última sincronização no guia de\n * [API do PO UI](https://po-ui.io/guides/api).\n *\n * @returns {string} Nome do campo que contém a data da última sincronização.\n */\n getDateFieldName(): string {\n return 'po_sync_date';\n }\n\n /**\n * Retorna a propriedade `items`, responsável por informar a lista de registros vindos da API no guia de\n * [API do PO UI](https://po-ui.io/guides/api).\n *\n * @returns {string} Nome da propriedade que contém a lista de registros.\n */\n getItemsFieldName(): string {\n return 'items';\n }\n\n /**\n * Retorna a propriedade `page`, responsável por informar o número da página de registros que a API retorna no guia de\n * [API do PO UI](https://po-ui.io/guides/api).\n *\n * @returns {string} Nome da propriedade responsável por informar o número da página de registros.\n */\n getPageParamName(): string {\n return 'page';\n }\n\n /**\n * Retorna a propriedade `pageSize`, responsável pela quantidade de registros que serão exibidos por página no guia de\n * [API do PO UI](https://po-ui.io/guides/api).\n *\n * @returns {string} Nome do parâmetro responsável pela quantidade de registros por página.\n */\n getPageSizeParamName(): string {\n return 'pageSize';\n }\n\n /**\n * Retorna um valor `boolean`, de acordo com a propriedade `hasNext` que é responsável por informar se há uma nova\n * página de registros disponível no guia de [API do PO UI](https://po-ui.io/guides/api).\n *\n * @returns {boolean} Informa se tem próxima página de registros.\n */\n hasNext(): boolean {\n return this.data.hasNext;\n }\n}\n","import { PoNetworkType } from './po-network-type.enum';\n\n/**\n * @description\n *\n * Classe responsável por identificar a conexão de rede disponível no dispositivo.\n */\nexport class PoNetworkStatus {\n private _type: PoNetworkType;\n\n constructor(networtkType) {\n this.setNetworkConnection(networtkType);\n }\n\n /**\n * Retorna se o dispositivo está conectado na rede.\n *\n * @returns {boolean} Status da conexão com a rede.\n */\n get status(): boolean {\n return this.type !== PoNetworkType.none;\n }\n\n /**\n * Retorna o tipo de conexão do dispositivo.\n *\n * @returns {PoNetworkType} Tipo da conexão com a rede.\n */\n get type(): PoNetworkType {\n return this._type;\n }\n\n set type(type: PoNetworkType) {\n this._type = type;\n }\n\n /* istanbul ignore next */\n private setDefaultTypeNavigation() {\n return navigator.onLine ? PoNetworkType['ethernet'] : PoNetworkType.none;\n }\n\n private setNetworkConnection(networtkType): void {\n if (!networtkType) {\n this.type = this.setDefaultTypeNavigation();\n } else {\n const isGenerationMobile = ['2g', '3g', '4g'].includes(networtkType);\n\n this.type = isGenerationMobile ? PoNetworkType['_' + networtkType] : PoNetworkType[String(networtkType)];\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { fromEvent, merge, Observable, Subject } from 'rxjs';\nimport { mapTo } from 'rxjs/operators';\n\nimport { Network } from '@capacitor/network';\n\nimport { PoNetworkStatus } from './../../models';\n\n/**\n * @description\n *\n * O `PoNetworkService` é utilizado para verificar o status e o tipo da conexão de rede do dispositivo.\n */\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PoNetworkService {\n private networkType: string;\n private networkTypeNow: Subject<{ status: boolean; type: string }>;\n private poNetworkStatus: PoNetworkStatus;\n\n constructor() {\n this.initNetwork();\n }\n\n /**\n * Retorna as propriedades tipo e status da conexão do dispositivo no momento da chamada.\n *\n * @returns {PoNetworkStatus} Instância de [PoNetworkStatus](/documentation/po-network-status) com as\n * propriedades da conexão.\n */\n getConnectionStatus(): PoNetworkStatus {\n this.poNetworkStatus = new PoNetworkStatus(this.networkType);\n return this.poNetworkStatus;\n }\n\n /**\n * Notifica as mudanças no tipo de conexão de rede do dispositivo.\n *\n * @returns {Observable<{ status: boolean, type: string }>} Observable com as propriedades da conexão.\n */\n onChange(): Observable<{ status: boolean; type: string }> {\n return this.networkTypeNow.asObservable();\n }\n\n private initNetwork() {\n this.networkTypeNow = new Subject();\n this.initSubscriber();\n }\n\n private async getStatus() {\n return await Network.getStatus();\n }\n\n private async initSubscriber() {\n const networkStatus = await this.getStatus();\n this.networkType = networkStatus.connected ? networkStatus.connectionType : 'none';\n this.networkTypeNow.next({ status: networkStatus.connected, type: this.networkType });\n\n /* istanbul ignore next */\n Network.addListener('networkStatusChange', status => {\n this.networkType = status.connected ? status.connectionType : 'none';\n this.networkTypeNow.next({ status: status.connected, type: this.networkType });\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { forkJoin, Observable, of, Subject, Subscription, timer } from 'rxjs';\nimport { expand, map, mergeMap, reduce } from 'rxjs/operators';\nimport { validateParameter, validateArray } from '../../utils/utils';\n\nimport { PoDataMessage, PoEntity } from '../../models';\nimport { PoEventSourcingService } from '../po-event-sourcing/po-event-sourcing.service';\nimport { PoHttpClientService } from '../po-http-client/po-http-client.service';\nimport { PoHttpRequestData } from '../po-http-client/interfaces/po-http-request-data.interface';\nimport { PoNetworkService } from '../po-network/po-network.service';\nimport { PoRequestType } from '../../models/po-request-type.enum';\nimport { PoSchemaDefinitionService } from './../po-schema/po-schema-definition/po-schema-definition.service';\nimport { PoSchemaService } from './../po-schema/po-schema.service';\nimport { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';\nimport { PoSyncConfig } from './interfaces/po-sync-config.interface';\nimport { PoSyncResponse } from '../po-sync/interfaces/po-sync-response.interface';\nimport { PoSyncSchema } from './interfaces/po-sync-schema.interface';\n\n/**\n * @description\n *\n * O `PoSyncService` é utilizado para configurar toda a base de dados que receberá as informações que serão\n * armazenadas *offline* vindas do servidor. Nele ocorre toda a preparação dos modelos de dados retornados por\n * cada consulta.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PoSyncService {\n models: Array<PoEntity> = [];\n\n private config: PoSyncConfig;\n private emitter: any;\n private eventSub: Observable<any>;\n private finishSyncSubject: Subject<null> = new Subject<null>();\n private isSyncEnabled: boolean = true;\n private schemas: Array<PoSyncSchema>;\n private subscription: Subscription;\n private syncing: boolean = false;\n private timer: Observable<number>;\n\n constructor(\n private poEventSourcingService: PoEventSourcingService,\n private poHttpClient: PoHttpClientService,\n private poNetworkService: PoNetworkService,\n private poSchemaDefinitionService: PoSchemaDefinitionService,\n private poSchemaService: PoSchemaService\n ) {}\n\n /**\n * Destrói todas as chaves do *storage* referentes ao `po-sync`, ou seja,\n * as definições dos *schemas*, os registros de cada *schema* e a fila\n * de eventos que estão para ser enviados ao servidor *(EventSourcing)*.\n *\n * > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,\n * recomenda-se utilizar o método `prepare()` em seguida.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Alterando as definições dos schemas](/guides/sync-fundamentals).\n *\n * @returns {Promise<any>} Promessa que é resolvida quando as chaves referentes ao `po-sync` forem destruídas.\n */\n async destroy(): Promise<any> {\n const destroyFunction = async () => {\n await this.poSchemaService.destroySchemasRecords();\n await this.poSchemaDefinitionService.destroy();\n await this.poEventSourcingService.destroyEventSourcingQueue();\n };\n\n return this.poSchemaService.limitedCallWrap(destroyFunction);\n }\n\n /**\n * Desabilita todos os tipos de sincronização de dados (periódica, reativa e manual).\n *\n * > Para habilitar novamente a sincronização utilize o método [`PoSyncService.enableSync()`](documentation/po-sync#enable-sync).\n */\n disableSync() {\n this.isSyncEnabled = false;\n\n if (this.timer && this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n /**\n * <a id=\"enable-sync\"></a>\n * Habilita todos os tipos de sincronização de dados (periódica, reativa e manual).\n *\n * Por padrão, sempre que se inicializa uma aplicação com PO Sync as sincronizações já estão habilitadas.\n */\n enableSync() {\n this.isSyncEnabled = true;\n this.createSubscribe();\n }\n\n /**\n * Método que disponibiliza a partir de sua inscrição o evento de retorno das operações da fila de eventos que\n * foram enviadas ao servidor. A cada operação enviada para o servidor, será disparado um evento para a inscrição\n * deste método.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).\n *\n * @returns {Observable<PoSyncResponse>} Observable com um objeto do tipo `PoSyncResponse`.\n */\n getResponses(): Observable<PoSyncResponse> {\n return this.poEventSourcingService.responsesSubject();\n }\n\n /**\n * Retorna uma instância de `PoEntity` para um determinado *schema*.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Manipulando os registros de um schema](/guides/sync-fundamentals).\n *\n * @param {string} schemaName Nome do *schema*.\n * @returns {PoEntity} Objeto para efetuar consultas e alterações nos dados.\n */\n getModel(schemaName: string): PoEntity {\n const model = this.models[schemaName];\n if (!model) {\n throw new Error('Model not found: ' + schemaName);\n }\n return model;\n }\n\n /**\n * Insere uma requisição HTTP na fila de eventos do `po-sync`.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Inserindo requisições HTTP na fila de eventos](/guides/sync-fundamentals).\n *\n * @param {PoHttpRequestData} poHttpRequestData Dados da requisição HTTP.\n * @param {string} customRequestId Identificador customizado da requisição HTTP.\n * @returns {Promise<number>} Promessa com o identificador da requisição HTTP criada.\n */\n insertHttpCommand(requestData: PoHttpRequestData, customRequestId?: string): Promise<number> {\n validateParameter({ requestData });\n\n return this.poEventSourcingService.httpCommand(requestData, customRequestId);\n }\n\n /**\n * Efetua uma chamada na API do servidor para realizar a carga inicial dos dados. Deve ser chamado apenas uma vez\n * na aplicação, após a preparação dos *schemas* realizada através do método `PoSyncService.prepare()`.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Carga inicial dos dados](/guides/sync-fundamentals).\n *\n * @returns {Observable<Array<{ entity: string, data: Array<any> }>>} Observable que notificará quando a\n * carga inicial for concluída.\n */\n loadData(): Observable<Array<{ entity: string; data: Array<any> }>> {\n const loads: Array<Observable<{ entity: string; data: Array<any> }>> = [];\n this.schemas.forEach(el => loads.push(this.loadEntityData(el)));\n return forkJoin(loads);\n }\n\n /**\n * Responsável por notificar sempre que houver sincronismo.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Notificação pós-sincronização](/guides/sync-fundamentals).\n *\n * @returns {Observable<any>} Observable que é disparado a cada sincronismo realizado.\n */\n onSync(): Observable<any> {\n if (!this.eventSub) {\n this.eventSub = Observable.create(e => {\n this.emitter = e;\n });\n }\n return this.eventSub;\n }\n\n /**\n * Prepara a aplicação criando os schemas e aplica as configurações.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Preparando a aplicação](/guides/sync-fundamentals).\n *\n * @param {Array<PoSyncSchema>} schemas Lista de *schemas* a serem preparados.\n * @param {PoSyncConfig} config Configurações adicionais.\n * @returns {Promise<any>} Promessa que é resolvida quando a aplicação estiver preparada para a utilização do `po-sync`.\n */\n prepare(schemas: Array<PoSyncSchema>, config?: PoSyncConfig): Promise<any> {\n validateArray({ schemas });\n\n const defaultSyncConfig: PoSyncConfig = {\n type: this.poNetworkService.getConnectionStatus().type,\n period: 60,\n dataTransform: new PoDataMessage()\n };\n\n this.schemas = schemas;\n this.config = config || defaultSyncConfig;\n this.config.dataTransform = this.config.dataTransform || new PoDataMessage();\n this.poEventSourcingService.config = this.config;\n this.startTimer(this.config.period);\n this.reactiveSync();\n this.poEventSourcingService.onSaveData().subscribe(() => this.sync());\n\n return this.saveSchemas().then(() => {\n this.schemas.forEach(schema => {\n this.models[schema.name] = new PoEntity(this.poEventSourcingService, schema, this.poSchemaService);\n });\n return Promise.resolve();\n });\n }\n\n /**\n * Remove um item da fila de eventos que espera a sincronização.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).\n *\n * @param {any} idEventSourcing Identificador do item da fila de eventos.\n * @returns {Promise<any>} Promessa que é resolvida quando o item da fila de eventos é removido.\n */\n removeItemOfSync(idEventSourcing: any): Promise<any> {\n return this.poEventSourcingService.removeEventSourcingItem(idEventSourcing);\n }\n\n /**\n * Reenvia os comandos pendentes na fila (inclusão, alteração e exclusão) e busca novos dados do servidor.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).\n *\n * @returns {Promise<any>} Promessa que resolve o sincronismo disparado.\n */\n resumeSync(): Promise<any> {\n if (!this.canSync()) {\n const finishSyncSubscription = this.finishSyncSubject.asObservable().subscribe(() => {\n finishSyncSubscription.unsubscribe();\n return this.sync();\n });\n return Promise.resolve();\n }\n\n return this.sync();\n }\n\n /**\n * Dispara o sincronismo enviando os eventos pendentes (inclusão, alteração e exclusão) e buscando novos dados do servidor.\n *\n * O sincronismo somente será executado depois que o acesso a base de dados local do dispositivo for liberada.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Sincronização manual](/guides/sync-fundamentals).\n *\n * @returns {Promise<any>} Promessa que é resolvida quando o sincronismo for finalizado.\n */\n async sync(): Promise<any> {\n if (this.canSync()) {\n this.startSync();\n\n try {\n await this.poEventSourcingService.syncSend();\n await this.poEventSourcingService.syncGet();\n\n if (this.emitter) {\n this.emitter.next();\n }\n\n this.finishSync();\n } catch (error) {\n this.syncError();\n }\n }\n }\n\n private canSync(): boolean {\n if (this.syncing || !this.isSyncEnabled) {\n return false;\n } else {\n const currentConnection = this.poNetworkService.getConnectionStatus();\n const isConfiguredConnection = this.config && currentConnection.type === this.config.type;\n const isConfigIncludesType =\n this.config && this.config.type instanceof Array && this.config.type.includes(currentConnection.type);\n\n return currentConnection.status && (!this.config || isConfiguredConnection || isConfigIncludesType);\n }\n }\n\n private createSubscribe(): void {\n if (this.timer) {\n this.subscription = this.timer.subscribe(() => {\n this.sync().then(() => {\n this.subscription.unsubscribe();\n this.subscription = null;\n this.timer = null;\n this.startTimer(this.config.period);\n });\n });\n }\n }\n\n private finishSync(): void {\n this.syncing = false;\n this.finishSyncSubject.next(null);\n }\n\n private getOnePage(schema: PoSyncSchema, page: number = 1): Observable<any> {\n const params = [];\n params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);\n params.push(`${this.config.dataTransform.getPageParamName()}=${page}`);\n\n const url = `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}?${params.join('&')}`;\n\n return this.poHttpClient.get(url).pipe(\n map(response => response.body),\n mergeMap(responseBody => {\n const now = new Date().getTime();\n responseBody[this.config.dataTransform.getItemsFieldName()].map(item => {\n item.SyncInsertedDateTime = now;\n item.SyncUpdatedDateTime = null;\n item.SyncExclusionDateTime = null;\n item.SyncDeleted = false;\n item.SyncStatus = 2;\n });\n return this.poSchemaService\n .updateAll(schema, responseBody[this.config.dataTransform.getItemsFieldName()])\n .then(() => responseBody);\n })\n );\n }\n\n private loadEntityData(schema: PoSyncSchema): Observable<{ entity: string; data: Array<any> }> {\n let page = 1;\n return this.getOnePage(schema, page).pipe(\n expand(data => {\n this.config.dataTransform.transform(data);\n const hasNext = this.config.dataTransform.hasNext();\n if (hasNext) {\n return this.getOnePage(schema, ++page);\n } else {\n return of();\n }\n }),\n reduce(\n (acc, obj) => {\n acc.data = acc.data.concat(obj[this.config.dataTransform.getItemsFieldName()]);\n return acc;\n },\n {\n entity: schema.name,\n data: []\n }\n )\n );\n }\n\n private reactiveSync(): void {\n this.poNetworkService.onChange().subscribe(networkStatus => {\n if (networkStatus.status) {\n this.startTimer(this.config.period);\n return this.sync();\n }\n\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n });\n }\n\n private async saveSchemas(): Promise<any> {\n const storageSchemas: Array<PoSyncSchema> = await this.poSchemaDefinitionService.getAll();\n this.schemas.forEach(schema => (schema.lastSync = PoSchemaUtil.getLastSync(storageSchemas, schema.name)));\n return this.poSchemaDefinitionService.saveAll(this.schemas);\n }\n\n private startSync(): void {\n this.syncing = true;\n }\n\n private startTimer(period): void {\n if (period && this.isSyncEnabled) {\n this.timer = timer(period * 1000);\n this.createSubscribe();\n }\n }\n\n private syncError(): void {\n this.finishSync();\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { PoEventSourcingService } from './services/po-event-sourcing/po-event-sourcing.service';\nimport { PoHttpClientService } from './services/po-http-client/po-http-client.service';\nimport { PoNetworkService } from './services/po-network/po-network.service';\nimport { PoSchemaDefinitionService } from './services/po-schema/po-schema-definition/po-schema-definition.service';\nimport { PoSchemaService } from './services/po-schema/po-schema.service';\nimport { PoSyncService } from './services/po-sync/po-sync.service';\n\n/**\n * @description\n *\n * Módulo do componente PoSync responsável pela sincronia de dados com backends\n */\n@NgModule({\n providers: [\n PoEventSourcingService,\n PoNetworkService,\n PoSchemaDefinitionService,\n PoSchemaService,\n PoSyncService,\n PoHttpClientService\n ],\n imports: []\n})\nexport class PoSyncModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.PoSchemaDefinitionService","i2","i1","i2.PoSchemaService","i3","i4.PoHttpClientService","i1.PoEventSourcingService","i2.PoHttpClientService","i3.PoNetworkService","i4.PoSchemaDefinitionService","i5.PoSchemaService"],"mappings":"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"}
1
+ {"version":3,"file":"po-ui-ng-sync.mjs","sources":["../../../projects/sync/src/lib/models/po-data-transform.model.ts","../../../projects/sync/src/lib/utils/utils.ts","../../../projects/sync/src/lib/models/po-event-sourcing-error-response.model.ts","../../../projects/sync/src/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.ts","../../../projects/sync/src/lib/services/po-http-client/po-http-request-type.enum.ts","../../../projects/sync/src/lib/models/po-request-type.enum.ts","../../../projects/sync/src/lib/services/po-schema/po-schema-util/po-schema-util.model.ts","../../../projects/sync/src/lib/services/po-schema/po-schema-definition/po-schema-definition.service.ts","../../../projects/sync/src/lib/services/po-schema/po-schema.service.ts","../../../projects/sync/src/lib/services/po-http-client/po-http-client.service.ts","../../../projects/sync/src/lib/services/po-event-sourcing/po-event-sourcing.service.ts","../../../projects/sync/src/lib/models/po-query-builder/po-query-builder.model.ts","../../../projects/sync/src/lib/models/po-entity/po-entity.model.ts","../../../projects/sync/src/lib/models/po-network-type.enum.ts","../../../projects/sync/src/lib/models/po-data-message.model.ts","../../../projects/sync/src/lib/models/po-network-status.model.ts","../../../projects/sync/src/lib/services/po-network/po-network.service.ts","../../../projects/sync/src/lib/services/po-sync/po-sync.service.ts","../../../projects/sync/src/lib/po-sync.module.ts","../../../projects/sync/src/po-ui-ng-sync.ts"],"sourcesContent":["/**\n * @description\n *\n * Classe responsável por adaptar dados de APIs que não seguem\n * o padrão de [API do PO UI](https://po-ui.io/guides/api).\n *\n * Essa classe deve ser estendida por uma classe que implemente cada um de seus métodos, adaptando os parâmetros de\n * acordo com a API do *backend* existente que se deseja comunicar.\n */\n\nexport abstract class PoDataTransform {\n protected data: any;\n\n /**\n * @docsPrivate\n *\n * Método responsável por receber e armazenar os dados retornados pela API para manipulação na classe `PoDataTransform`.\n *\n * @param {any} data Dados retornados pela API.\n */\n transform(data: any): void {\n this.data = data;\n }\n\n /**\n * Retorna o nome da propriedade responsável por informar a data da última sincronização.\n *\n * @returns {string} Nome do campo que contém a data da última sincronização.\n */\n abstract getDateFieldName(): string;\n\n /**\n * Retorna o nome da propriedade responsável por informar a lista de registros vindos da API.\n *\n * @returns {string} Nome da propriedade que contém a lista de registros.\n */\n abstract getItemsFieldName(): string;\n\n /**\n * Retorna o nome da propriedade responsável por informar o número da página de registros que a API\n * recebe como parâmetro.\n *\n * @returns {string} Nome da propriedade responsável por informar o número da página de registros.\n */\n abstract getPageParamName(): string;\n\n /**\n * Retorna o nome da propriedade responsável pela quantidade de registros que serão exibidos por página\n * que a API recebe como parâmetro.\n *\n * @returns {string} Nome da propriedade responsável pela quantidade de registros por página.\n */\n abstract getPageSizeParamName(): string;\n\n /**\n * Retorna um valor `boolean`, responsável por informar se há uma nova página de registros disponível.\n *\n * @returns {boolean} Informa se existe próxima página de registros.\n */\n abstract hasNext(): boolean;\n}\n","/**\n * Retorna um *array* contendo os pares `[chave, valor]` do objeto.\n *\n * Semelhante ao método `Object.entries()` nativo do javascript.\n *\n * > Veja mais em: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n *\n * @param object Objeto que será extraído os pares [chave, valor].\n */\nexport const getObjectEntries = (object: object) => {\n const objectName = Object.keys(object)[0];\n const objectValue = object[objectName];\n\n return [objectName, objectValue];\n};\n\n/**\n * Recebe um objeto e valida se o seu valor é diferente de *undefined* ou *null*.\n *\n * @param {object} parameter Objeto contento o nome do parâmetro que está sendo validado\n * e o seu valor.\n */\nexport const validateParameter = (parameter: object) => {\n const [paramName, paramValue] = getObjectEntries(parameter);\n\n if (paramValue === undefined || paramValue === null) {\n throw new Error(`The ${paramName} parameter cannot be undefined or null`);\n }\n};\n\n/**\n * Recebe um objeto e valida se o seu valor é uma instância de *Array* e se não\n * está vazio.\n *\n * @param value Objeto contento o nome da propriedade que está sendo validada e o seu valor.\n */\nexport const validateArray = (value: object) => {\n PoUtils.validateParameter(value);\n\n const [paramName, paramValue] = PoUtils.getObjectEntries(value);\n\n if (!(paramValue instanceof Array)) {\n throw new Error(`${paramName} is not an Array instance`);\n }\n\n if (!paramValue.length) {\n throw new Error(`${paramName} cannot be empty array`);\n }\n};\n\n/**\n * Recebe um arquivo e converte para uma string base64\n *\n * @param Objeto do tipo file.\n */\nexport const toBase64 = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => resolve(reader.result as string);\n /* istanbul ignore next */\n reader.onerror = error => reject(error);\n });\n\n/**\n * Recebe uma string base64 e converte para um arquivo\n *\n * @param string base64.\n */\nexport const toFile = (url: string, fileName: string, mimeType: string) =>\n fetch(url)\n .then(result => result.arrayBuffer())\n .then(buffer => new File([buffer], fileName, { type: mimeType }));\n\nexport const PoUtils = {\n getObjectEntries,\n toBase64,\n toFile,\n validateArray,\n validateParameter\n};\n","import { PoEventSourcingOperation } from './../services/po-event-sourcing/enums/po-event-sourcing-operation.enum';\n\n/**\n * @description\n *\n * Classe que define a resposta de erro para um item da fila de eventos que não foi enviado ao servidor por\n * alguma inconsistência.\n *\n * > Pode ser utilizada em casos onde um item da fila é enviado ao servidor com inconsistência nos dados, por exemplo\n * uma operação de *delete* ou *update* sem o `id` do objeto.\n */\nexport class PoEventSourcingErrorResponse {\n /** Mensagem de erro. */\n message: string;\n\n /** Operação que havia sido requisitada. */\n operation: PoEventSourcingOperation;\n\n /* istanbul ignore next */\n constructor({ message, operation }) {\n this.message = message;\n this.operation = operation;\n }\n}\n","/**\n * @docsPrivate\n *\n * Define as operações realizadas no sync.\n */\n\nexport enum PoEventSourcingOperation {\n // Operação de exclusão.\n Delete = 'DELETE',\n\n // Operação de requisição HTTP.\n Http = 'HTTP',\n\n // Operação de inserção.\n Insert = 'INSERT',\n\n // Operação de alteração.\n Update = 'UPDATE'\n}\n","/**\n * @usedBy PoHttpClientService, PoHttpCommandResponse, PoSyncService\n *\n * @description\n *\n * Define o método de requisição HTTP.\n */\nexport enum PoHttpRequestType {\n /** Método `delete` do protocolo HTTP. */\n DELETE = 'DELETE',\n\n /** Método `get` do protocolo HTTP. */\n GET = 'GET',\n\n /** Método `head` do protocolo HTTP. */\n HEAD = 'HEAD',\n\n /** Método `options` do protocolo HTTP. */\n OPTIONS = 'OPTIONS',\n\n /** Método `patch` do protocolo HTTP. */\n PATCH = 'PATCH',\n\n /** Método `post` do protocolo HTTP. */\n POST = 'POST',\n\n /** Método `put` do protocolo HTTP. */\n PUT = 'PUT'\n}\n","/**\n * @docsPrivate\n *\n * @description\n *\n * Método de requisição HTTP.\n */\n\nexport enum PoRequestType {\n GET = 'get',\n\n DELETE = 'delete',\n\n DIFF = 'diff',\n\n PATCH = 'patch',\n\n POST = 'post'\n}\n","import { PoRequestType } from '../../../models/po-request-type.enum';\nimport { PoSyncFieldOptions } from '../../po-sync/interfaces/po-sync-field-options.interface';\nimport { PoSyncSchema } from '../../po-sync/interfaces/po-sync-schema.interface';\n\n/**\n * @docsPrivate\n *\n * @description\n *\n * Serviço utilitário para operações no PoSyncSchema.\n */\nexport class PoSchemaUtil {\n /** Valor `default` para o campo `lastSync`. */\n public static readonly defaultLastSync: string = new Date(-8640000000000000).toISOString();\n\n /** Nome da chave do identificador interno do sync. */\n public static readonly syncInternalIdFieldName: string = 'SyncInternalId';\n\n /** Nome da chave no `storage` para os Schemas. */\n public static readonly syncSchemasName: string = 'SyncSchemas';\n\n /**\n * Verica se existem campos locais no *schema* informado.\n *\n * @param {PoSyncSchema} schema **Schema* a ser processado.\n *\n * @returns {boolean} Valor do tipo *boolean* que indica se existem campos locais no *schema* informado.\n */\n public static containsLocalFields(schema: PoSyncSchema): boolean {\n if (schema.fields) {\n return !!schema.fields.find(field => typeof field === 'object' && field.local);\n }\n }\n\n /**\n * Retorna o valor atual do `lastSync` para determinado *schema*.\n *\n * @param {Array<PoSyncSchema>} storageSchemas Lista de *schemas* a serem pesquisados.\n * @param {string} schemaName Nome do *schema* que se deseja ler o lastSync.\n *\n * @returns {string} Retorna uma *string* com o valor da última sincronização.\n */\n public static getLastSync(storageSchemas: Array<PoSyncSchema>, schemaName: string): string {\n if (storageSchemas) {\n const schemaFound = storageSchemas.find(schema => schema.name === schemaName);\n return schemaFound && schemaFound.lastSync ? schemaFound.lastSync : PoSchemaUtil.defaultLastSync;\n }\n return PoSchemaUtil.defaultLastSync;\n }\n\n /**\n * Retorna a lista de campos locais definidos no *schema*.\n *\n * @param {PoSyncSchema} schema **Schema* a ser processado.\n */\n public static getLocalFieldNames(schema: PoSyncSchema): Array<string> {\n if (schema.fields) {\n return schema.fields.reduce((fieldsAccumulator: Array<string>, currentField: string | PoSyncFieldOptions) => {\n if (typeof currentField === 'object' && currentField.local) {\n fieldsAccumulator.push(currentField.name);\n }\n return fieldsAccumulator;\n }, []);\n }\n }\n\n /**\n * Retorna a lista de campos não locais definidos no *schema*.\n *\n * @param {PoSyncSchema} schema **Schema* a ser processado.\n */\n public static getNonLocalFieldNames(schema: PoSyncSchema): Array<string> {\n if (schema.fields) {\n return schema.fields.reduce((fieldsAccumulator: Array<string>, currentField: string | PoSyncFieldOptions) => {\n if (typeof currentField === 'string' || !currentField.local) {\n fieldsAccumulator.push(typeof currentField === 'string' ? currentField : currentField.name);\n }\n return fieldsAccumulator;\n }, []);\n }\n }\n\n /**\n * Retorna o `id` referente ao registro do *schema* informado.\n *\n * @param {object} record Registro que será buscado o id.\n * @param {PoSyncSchema} schema **Schema* a ser processado.\n */\n public static getRecordId(record: object, schema: PoSyncSchema) {\n return record[schema.idField] || record[PoSchemaUtil.syncInternalIdFieldName];\n }\n\n /**\n * Retorna a url correspondente do `PoSyncSchema` dependendo do tipo da requisição `PoRequestType`.\n *\n * @param {PoSyncSchema} schema **Schema* a ser processado.\n * @param {PoRequestType} requestType Tipo da requisição.\n */\n public static getUrl(schema: PoSyncSchema, requestType: PoRequestType): string {\n return schema[`${requestType}UrlApi`];\n }\n\n /**\n * Compara se dois objetos são iguais baseado na lista de campos.\n *\n * @param {Array<string>} fields Lista de campos a serem considerados na comparação.\n * @param {any} model1 Objeto 1 a ser comparado.\n * @param {any} model2 Objeto 2 a ser comparado.\n */\n public static isModelsEqual(fields: Array<string>, model1: any, model2: any): boolean {\n if (fields) {\n return fields.every(field => JSON.stringify(model1[field]) === JSON.stringify(model2[field]));\n }\n }\n\n /**\n * Retorna uma lista com dois objetos referentes ao registro informado.\n * O primeiro é o registro com os campos que vão para o servidor e o segundo é com os campos locais.\n *\n * @param {PoSyncSchema} schema **Schema* do registro.\n * @param {object} record Registro que será realizada a separação dos campos locais e do servidor.\n */\n public static separateSchemaFields(\n schema: PoSyncSchema,\n record: object\n ): { serverRecord: object; localRecord: object } {\n const localFields = PoSchemaUtil.getLocalFieldNames(schema);\n const localRecord = {};\n const serverRecord = {};\n\n Object.keys(record).forEach(field => {\n if (localFields.includes(field)) {\n localRecord[field] = record[field];\n } else {\n serverRecord[field] = record[field];\n }\n });\n\n return { serverRecord, localRecord };\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { PoStorageService } from '@po-ui/ng-storage';\n\nimport { PoSchemaUtil } from './../po-schema-util/po-schema-util.model';\nimport { PoSyncSchema } from './../../po-sync/interfaces/po-sync-schema.interface';\n\n/**\n * @docsPrivate\n *\n * @description\n *\n * Serviço que disponibiliza métodos que permite operar sobre as definições dos *schemas*.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PoSchemaDefinitionService {\n constructor(private poStorage: PoStorageService) {}\n\n /**\n * Destrói a chave do *storage* que contém as definições dos *schemas*.\n *\n * > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,\n * recomenda-se utilizar o método `prepare()` em seguida.\n *\n * @returns {Promise<void>} Promessa que é resolvida quando a chave referente as definições dos *schemas* for destruída.\n */\n destroy(): Promise<void> {\n return this.poStorage.remove(PoSchemaUtil.syncSchemasName);\n }\n\n /**\n * Busca um *schema* a partir do nome informado.\n *\n * @param {string} schemaName Nome do *schema*.\n * @returns {Promise<PoSyncSchema>} Promessa que é resolvida quando o *schema* for retornado.\n */\n get(schemaName: string): Promise<PoSyncSchema> {\n return this.poStorage.getItemByField(PoSchemaUtil.syncSchemasName, 'name', schemaName);\n }\n\n /**\n * Retorna uma promessa com a lista dos *schemas* definidos.\n *\n * @returns {Promise<Array<PoSyncSchema>>} Promessa que é resolvida quando a lista dos *schemas* definidos for retornada.\n */\n getAll(): Promise<Array<PoSyncSchema>> {\n return this.poStorage.get(PoSchemaUtil.syncSchemasName);\n }\n\n /**\n * Salva uma lista de *schemas*.\n *\n * @param {Array<PoSyncSchema>} schemas Lista de schemas que serão salvos.\n * @returns {Promise<Array<PoSyncSchema>>} Promessa que é resolvida quando a lista de *schemas* for salva.\n */\n saveAll(schemas: Array<PoSyncSchema>): Promise<Array<PoSyncSchema>> {\n return this.poStorage.set(PoSchemaUtil.syncSchemasName, schemas);\n }\n\n /**\n * Atualiza um *schema* a partir do *schema name*.\n *\n * @param {PoSyncSchema} updatedSchema **Schema* que será atualizado.\n */\n async update(updatedSchema: PoSyncSchema) {\n let schemas = await this.getAll();\n\n const replaceUpdatedSchema = schema => {\n if (schema.name === updatedSchema.name) {\n return updatedSchema;\n } else {\n return schema;\n }\n };\n\n schemas = schemas.map(replaceUpdatedSchema);\n return this.saveAll(schemas);\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { PoStorageService } from '@po-ui/ng-storage';\n\nimport { PoSchemaDefinitionService } from './po-schema-definition/po-schema-definition.service';\nimport { PoSchemaUtil } from './po-schema-util/po-schema-util.model';\nimport { PoSyncSchema } from '../po-sync/interfaces/po-sync-schema.interface';\n\n/**\n * @docsPrivate\n *\n * @description\n *\n * Serviço que realiza as operações nos `schemas`.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PoSchemaService {\n constructor(\n private poSchemaDefinitionService: PoSchemaDefinitionService,\n private poStorage: PoStorageService\n ) {}\n\n /**\n * Retorna o id a partir de uma chave de um *schema*.\n *\n * @param {string} schemaKey Chave do *schema* em que será realizada a busca do id.\n */\n private static getIdByRecordKey(schemaKey: string): string {\n return schemaKey.split(':')[1];\n }\n\n /**\n * Retorna a chave do *schema* informado.\n *\n * @param {string} schemaName Nome do *schema*.\n * @param {any} recordId Id do registro.\n * @param {boolean} isLocalKey Indica se é uma chave local.\n */\n private static getRecordKey(schemaName: string, recordId: any, isLocalKey: boolean = false): string {\n return isLocalKey ? `${schemaName}_local:${recordId}` : `${schemaName}:${recordId}`;\n }\n\n /**\n * Verifica se o dado informado é uma chave de um *schema*.\n *\n * @param {string} data Dado que será verificado se é uma chave de um *schema*.\n * @param {string} schemaName Nome do *schema*.\n */\n private static isSchemaKey(data: string, schemaName: string): boolean {\n return data ? data.startsWith(`${schemaName}:`) : false;\n }\n\n /**\n * Cria um novo registro para o *schema* informado.\n *\n * @param {PoSyncSchema} schema **Schema* em que será criado o registro.\n * @param {object} newRecord Registro que será criado.\n */\n async create(schema: PoSyncSchema, newRecord: object): Promise<object> {\n const id = PoSchemaUtil.getRecordId(newRecord, schema);\n return this.save(schema, newRecord, id);\n }\n\n /**\n * Destrói as chaves do *storage* que contém os registros dos *schemas*.\n *\n * @returns {Promise<void>} Promessa que é resolvida quando as chaves referentes aos *schemas* forem destruídas.\n */\n async destroySchemasRecords(): Promise<void> {\n const schemas = await this.poSchemaDefinitionService.getAll();\n const storageKeys = await this.poStorage.keys();\n\n for (const key of storageKeys) {\n const schemaKey = schemas.find(schema => PoSchemaService.isSchemaKey(key, schema.name));\n\n if (schemaKey) {\n const id = PoSchemaService.getIdByRecordKey(key);\n await this.remove(schemaKey.name, id);\n }\n }\n }\n\n /**\n * Retorna o registro referente ao *schema* informado.\n *\n * @param {string} schemaName Nome do *schema*.\n * @param {any} recordId Id do registro.\n */\n async get(schemaName: string, recordId: any): Promise<object> {\n const isLocalRecord = true;\n const localRecord = await this.getRecord(schemaName, recordId, isLocalRecord);\n const record = await this.getRecord(schemaName, recordId);\n\n return Object.assign(record, localRecord);\n }\n\n /**\n * Retorna todos os registros referente ao *schema* informado.\n *\n * @param {string} schemaName Nome do *schema*.\n */\n async getAll(schemaName: string): Promise<Array<object>> {\n const storageKeys = await this.poStorage.keys();\n const schemaRecords = [];\n\n for (const key of storageKeys) {\n if (PoSchemaService.isSchemaKey(key, schemaName)) {\n const id = PoSchemaService.getIdByRecordKey(key);\n schemaRecords.push(await this.get(schemaName, id));\n }\n }\n\n return schemaRecords;\n }\n\n /**\n * Aguarda a liberação do recurso limitado, posteriormente o envolve em um comportamento\n * de bloqueio e desbloqueio.\n *\n * @param {Function} limitedResource Função que será envolvida no comportamento de bloqueio e desbloqueio.\n */\n limitedCallWrap(limitedResource: Function): Promise<any> {\n return this.poStorage.limitedCallWrap(limitedResource);\n }\n\n /**\n * Remove um registro de um *schema* informado.\n *\n * @param {string} schemaName Nome do *schema*.\n * @param {any} recordId Id do registro.\n */\n async remove(schemaName: string, recordId: any): Promise<any> {\n const recordKey = PoSchemaService.getRecordKey(schemaName, recordId);\n const localRecordKey = PoSchemaService.getRecordKey(schemaName, recordId, true);\n\n await this.poStorage.remove(recordKey);\n await this.poStorage.remove(localRecordKey);\n }\n\n /**\n * Atualiza um registro de um *schema* informado.\n *\n * @param {PoSyncSchema} schema **Schema* referente ao registro que será alterado.\n * @param {object} record Registro que será atualizado.\n * @param {any} recordId Id do registro que deseja ser alterado. Deve ser utilizado em casos em que o id foi alterado.\n */\n async update(schema: PoSyncSchema, record: object, recordId?: any): Promise<object> {\n const id = PoSchemaUtil.getRecordId(record, schema);\n\n if (recordId) {\n record = await this.updateRecordId(schema.name, record, recordId);\n }\n\n return this.save(schema, record, id);\n }\n\n /**\n * Atualiza todos os registros de um *schema*.\n *\n * @param {PoSyncSchema} schema **Schema* referente aos registros que serão alterados.\n * @param {Array<object>} records Lista de registros que serão alterados.\n */\n async updateAll(schema: PoSyncSchema, records: Array<object>): Promise<void> {\n for (const record of records) {\n await this.update(schema, record);\n }\n }\n\n private async getRecord(schemaName, recordId, isLocalRecord = false): Promise<object> {\n return (await this.poStorage.get(PoSchemaService.getRecordKey(schemaName, recordId, isLocalRecord))) || {};\n }\n\n private async save(schema: PoSyncSchema, record: object, recordId: any) {\n const { serverRecord, localRecord } = PoSchemaUtil.separateSchemaFields(schema, record);\n const recordKey = PoSchemaService.getRecordKey(schema.name, recordId);\n\n await this.poStorage.set(recordKey, serverRecord);\n await this.saveLocalFields(schema.name, localRecord, recordId);\n\n return record;\n }\n\n private async saveLocalFields(schemaName: string, localFields: object, recordId): Promise<void> {\n const containsLocalFields = Object.keys(localFields).length;\n\n if (containsLocalFields) {\n const localRecordKey = PoSchemaService.getRecordKey(schemaName, recordId, true);\n await this.poStorage.set(localRecordKey, localFields);\n }\n }\n\n private async updateRecordId(schemaName, record, recordId) {\n const isLocalRecord = true;\n\n const localRecord = await this.getRecord(schemaName, recordId, isLocalRecord);\n await this.remove(schemaName, recordId);\n\n return Object.assign(record, localRecord);\n }\n}\n","import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\n\nimport { Observable } from 'rxjs';\n\nimport { PoHttpHeaderOption } from './interfaces/po-http-header-option.interface';\nimport { PoHttpRequestData } from './interfaces/po-http-request-data.interface';\nimport { PoHttpRequestType } from './po-http-request-type.enum';\n\n/**\n * @docsPrivate\n *\n * @description\n *\n * Serviço para execução de requisições HTTP.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PoHttpClientService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Constrói uma requisição HTTP personalizada.\n *\n * @param {PoHttpRequestData} poHttpOperationData Parâmetros para a construção\n * da requisição.\n */\n createRequest(poHttpOperationData: PoHttpRequestData): Observable<HttpResponse<object>> {\n const httpHeaders = this.createHttpHeaders(poHttpOperationData.headers);\n\n return this.httpClient.request(poHttpOperationData.method, poHttpOperationData.url, {\n observe: 'response',\n headers: httpHeaders,\n body: poHttpOperationData.body\n });\n }\n\n /**\n * Constrói uma requisição com o método `delete`.\n *\n * @param {string} url URL da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n delete(url: string, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.DELETE,\n headers: httpHeaders\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `get`.\n *\n * @param {string} url URL da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n get(url: string, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.GET,\n headers: httpHeaders\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `head`.\n *\n * @param {string} url URL da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n head(url: string, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.HEAD,\n headers: httpHeaders\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `options`.\n *\n * @param {string} url URL da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n options(url: string, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.OPTIONS,\n headers: httpHeaders\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `patch`.\n *\n * @param {string} url URL da requisição.\n * @param {any} body Corpo da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n patch(url: string, body?: any, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.PATCH,\n headers: httpHeaders,\n body: body\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `post`.\n *\n * @param {string} url URL da requisição.\n * @param {any} body Corpo da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n post(url: string, body?: any, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.POST,\n headers: httpHeaders,\n body: body\n };\n return this.createRequest(requestData);\n }\n\n /**\n * Constrói uma requisição com o método `put`.\n *\n * @param {string} url URL da requisição.\n * @param {any} body Corpo da requisição.\n * @param {Array<PoHeaderOption>} httpHeaders Cabeçalhos da requisição.\n */\n put(url: string, body?: any, httpHeaders?: Array<PoHttpHeaderOption>) {\n const requestData: PoHttpRequestData = {\n url: url,\n method: PoHttpRequestType.PUT,\n headers: httpHeaders,\n body: body\n };\n\n return this.createRequest(requestData);\n }\n\n private createHttpHeaders(poHttpOperationHeaders) {\n let httpHeaders = new HttpHeaders();\n\n if (poHttpOperationHeaders && poHttpOperationHeaders.length > 0) {\n poHttpOperationHeaders.forEach(\n poHttpHeader => (httpHeaders = httpHeaders.append(poHttpHeader.name, poHttpHeader.value))\n );\n }\n\n return httpHeaders;\n }\n}\n","import { HttpResponse, HttpErrorResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\n\nimport { StatusCodes } from 'http-status-codes';\nimport { Observable, of, Subject } from 'rxjs';\nimport { expand, map, reduce } from 'rxjs/operators';\n\nimport { PoStorageService } from '@po-ui/ng-storage';\n\nimport { PoUtils } from '../../utils/utils';\n\nimport { PoEventSourcingErrorResponse } from '../../models/po-event-sourcing-error-response.model';\nimport { PoEventSourcingItem } from './interfaces/po-event-sourcing-item.interface';\nimport { PoEventSourcingOperation } from './enums/po-event-sourcing-operation.enum';\nimport { PoEventSourcingSummaryItem } from './interfaces/po-event-sourcing-summary-item.interface';\nimport { PoHttpHeaderOption } from './../po-http-client/interfaces/po-http-header-option.interface';\nimport { PoHttpClientService } from './../po-http-client/po-http-client.service';\nimport { PoHttpRequestData } from '../po-http-client/interfaces/po-http-request-data.interface';\nimport { PoHttpRequestType } from '../po-http-client/po-http-request-type.enum';\nimport { PoRequestType } from '../../models/po-request-type.enum';\nimport { PoSchemaDefinitionService } from './../po-schema/po-schema-definition/po-schema-definition.service';\nimport { PoSchemaService } from './../po-schema/po-schema.service';\nimport { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';\nimport { PoSyncConfig } from '../po-sync/interfaces/po-sync-config.interface';\nimport { PoSyncResponse } from '../po-sync/interfaces/po-sync-response.interface';\nimport { PoSyncSchema } from './../po-sync/interfaces/po-sync-schema.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PoEventSourcingService {\n static readonly event_sourcing_name: string = 'EventSourcing';\n\n private static readonly VALID_HTTP_STATUS_CODES = [\n StatusCodes.OK, // 200\n StatusCodes.CREATED, // 201\n StatusCodes.ACCEPTED, // 202\n StatusCodes.NON_AUTHORITATIVE_INFORMATION, // 203\n StatusCodes.NO_CONTENT, // 204\n StatusCodes.RESET_CONTENT, // 205\n StatusCodes.PARTIAL_CONTENT, // 206\n StatusCodes.MULTI_STATUS // 207\n ];\n\n config: PoSyncConfig;\n stoppedQueueEventSourcing: boolean = false;\n\n private emitter: any;\n private eventSub: Observable<null>;\n private responseSubject = new Subject<PoSyncResponse>();\n\n private schemasSyncConfig = {};\n\n constructor(\n private poSchemaDefinition: PoSchemaDefinitionService,\n private poSchemaService: PoSchemaService,\n private poStorage: PoStorageService,\n private poHttpClient: PoHttpClientService\n ) {}\n\n private static getUrl(eventSourcingItem, schema, requestType): string {\n const schemaUrl = PoSchemaUtil.getUrl(schema, requestType);\n const schemaId = eventSourcingItem.record[schema.idField];\n\n if (requestType === PoRequestType.GET) {\n return schemaUrl;\n }\n\n if ([PoRequestType.DELETE, PoRequestType.PATCH].includes(requestType)) {\n return schemaUrl ? `${schemaUrl}/${schemaId}` : `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}/${schemaId}`;\n }\n\n if (requestType === PoRequestType.POST) {\n return schemaUrl ? schemaUrl : PoSchemaUtil.getUrl(schema, PoRequestType.GET);\n }\n }\n\n create(schemaName: string, newItem: any, customRequestId?: string): Promise<any> {\n const eventSourcingItem = this.createEventSourcingItem(\n PoEventSourcingOperation.Insert,\n newItem,\n schemaName,\n customRequestId\n );\n return this.insertEventSourcingQueue(eventSourcingItem);\n }\n\n async createBatchEvents(schemaName: string, eventList: Array<PoEventSourcingSummaryItem>) {\n const eventSourcingList = this.createEventSourcingList(schemaName, eventList);\n\n await this.poStorage.appendArrayToArray(PoEventSourcingService.event_sourcing_name, eventSourcingList);\n\n this.notifyEventCreation();\n }\n\n /**\n * Destrói a chave do *storage* que contém a fila de dados que estão esperando para serem enviados ao\n * servidor *(EventSourcing)*.\n *\n * @returns {Promise<void>} Promessa que é resolvida quando a chave referente a fila de *EventSourcing* for destruída.\n */\n destroyEventSourcingQueue(): Promise<void> {\n return this.poStorage.remove(PoEventSourcingService.event_sourcing_name);\n }\n\n async httpCommand(httpOperationData: PoHttpRequestData, customRequestId?: string): Promise<number> {\n httpOperationData = await this.serializeBody(httpOperationData);\n\n const eventSourcingItem = this.createEventSourcingItem(\n PoEventSourcingOperation.Http,\n httpOperationData,\n undefined,\n customRequestId\n );\n\n await this.insertEventSourcingQueue(eventSourcingItem);\n return eventSourcingItem.id;\n }\n\n responsesSubject(): Observable<PoSyncResponse> {\n return this.responseSubject.asObservable();\n }\n\n onSaveData(): Observable<null> {\n if (!this.eventSub) {\n this.eventSub = Observable.create(subscriber => (this.emitter = subscriber));\n }\n return this.eventSub;\n }\n\n remove(schemaName: string, itemToDelete: any, customRequestId?: string): Promise<any> {\n const eventSourcingItem = this.createEventSourcingItem(\n PoEventSourcingOperation.Delete,\n itemToDelete,\n schemaName,\n customRequestId\n );\n return this.insertEventSourcingQueue(eventSourcingItem);\n }\n\n removeEventSourcingItem(idEventSourcingItem) {\n return this.poStorage.removeItemFromArray(PoEventSourcingService.event_sourcing_name, 'id', idEventSourcingItem);\n }\n\n syncGet(): Promise<any> {\n const syncGetFunction = async () =>\n this.poSchemaDefinition.getAll().then(schemas => {\n const schemaPromises = this.updateStorageSchemas(schemas);\n\n return Promise.all(schemaPromises);\n });\n\n return this.poSchemaService.limitedCallWrap(syncGetFunction);\n }\n\n async syncSend(): Promise<any> {\n const syncSendFunction = async (): Promise<any> => {\n const itemOfQueue = await this.poStorage.getFirstItem(PoEventSourcingService.event_sourcing_name);\n\n if (itemOfQueue) {\n await this.selectOperation(itemOfQueue);\n }\n\n if (this.stoppedQueueEventSourcing || !itemOfQueue) {\n this.stoppedQueueEventSourcing = false;\n return Promise.resolve();\n }\n\n return syncSendFunction();\n };\n\n return this.poSchemaService.limitedCallWrap(syncSendFunction);\n }\n\n update(schemaName: string, itemUpdated: any, customRequestId?: string): Promise<any> {\n const eventSourcingItem = this.createEventSourcingItem(\n PoEventSourcingOperation.Update,\n itemUpdated,\n schemaName,\n customRequestId\n );\n return this.insertEventSourcingQueue(eventSourcingItem);\n }\n\n /* Avalia se o body é do tipo File e se for converte para base64 */\n private async serializeBody(requestData: PoHttpRequestData): Promise<PoHttpRequestData> {\n let { body, mimeType, bodyType, fileName } = requestData;\n\n if (body instanceof File) {\n bodyType = 'File';\n mimeType = body.type;\n fileName = body.name;\n body = await PoUtils.toBase64(body);\n }\n\n return { ...requestData, body, mimeType, bodyType, fileName };\n }\n\n private buildUrlParams(schema: PoSyncSchema, baseUrl: string, pageNumber: number): string {\n const params = [];\n params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);\n params.push(`${this.config.dataTransform.getPageParamName()}=${pageNumber}`);\n return `${baseUrl}?${params.join('&')}`;\n }\n\n private checkRecordIdExists(recordId, operation) {\n if (!recordId) {\n const error = {\n message: 'Identifier not defined',\n operation: operation\n };\n\n throw new PoEventSourcingErrorResponse(error);\n }\n }\n\n private concatPageItems(pageAcumulator, requestBody): { entity: string; data: Array<any> } {\n if (requestBody[this.config.dataTransform.getItemsFieldName()]) {\n pageAcumulator.data = [...pageAcumulator.data, ...requestBody[this.config.dataTransform.getItemsFieldName()]];\n }\n return pageAcumulator;\n }\n\n private createEventSourcingItem(\n operation: PoEventSourcingOperation,\n newItem: any | PoHttpRequestData,\n schemaName?: string,\n customRequestId?: string,\n id?: number\n ): PoEventSourcingItem {\n if (!schemaName && operation !== PoEventSourcingOperation.Http) {\n throw new Error('PoSyncSchema is not defined.');\n }\n\n return {\n id: id ? id : new Date().getTime(),\n dateTime: new Date().getTime(),\n schema: schemaName,\n operation: operation,\n record: newItem,\n customRequestId: customRequestId\n };\n }\n\n private createEventSourcingList(\n schemaName: string,\n eventList: Array<PoEventSourcingSummaryItem>\n ): Array<PoEventSourcingItem> {\n return eventList.map((eventItem, index) => {\n const id = new Date().getTime() + index;\n\n return this.createEventSourcingItem(\n eventItem.operation,\n eventItem.record,\n schemaName,\n eventItem.customRequestId,\n id\n );\n });\n }\n\n private createSchemaSyncConfig(schemaName) {\n this.schemasSyncConfig[schemaName] = {\n page: undefined,\n currentUrlDiff: undefined,\n responseDate: undefined\n };\n }\n\n private async deleteOperation(eventSourcingItem: PoEventSourcingItem): Promise<any> {\n try {\n const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);\n\n const recordId = eventSourcingItem.record[schema.idField];\n this.checkRecordIdExists(recordId, PoEventSourcingOperation.Delete);\n\n const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.DELETE);\n const response = await this.sendServerItem(url, PoHttpRequestType.DELETE);\n\n await this.removeEventSourcingValidItem(response.status, eventSourcingItem);\n\n return await this.sendResponseSubject(eventSourcingItem, response);\n } catch (errorResponse) {\n return this.sendResponseSubject(eventSourcingItem, errorResponse, true);\n }\n }\n\n private diffServerItems(currentUrlDiff): Observable<HttpResponse<object>> {\n return this.poHttpClient.get(currentUrlDiff);\n }\n\n private getBodyAndDate(schemaName, response): any {\n const getDateFieldName = this.config.dataTransform.getDateFieldName();\n\n const responseSyncDate = response.body[getDateFieldName];\n\n this.schemasSyncConfig[schemaName]['responseDate'] = responseSyncDate;\n return response.body;\n }\n\n private async getServerDiffRecords(schema: PoSyncSchema, baseUrl: string): Promise<any> {\n const initialAcumulatorPage = { entity: schema.name, data: [] };\n const diffUrl = this.schemasSyncConfig[schema.name]['currentUrlDiff'];\n\n const serverResponse = await this.diffServerItems(diffUrl)\n .pipe(\n map(response => this.getBodyAndDate(schema.name, response)),\n expand(data => this.paginateSchemaData(data, schema, baseUrl)),\n reduce(\n (pageAcumulator, requestBody) => this.concatPageItems(pageAcumulator, requestBody),\n initialAcumulatorPage\n )\n )\n .toPromise();\n\n return serverResponse.data;\n }\n\n private async httpOperation(eventSourcingItem: PoEventSourcingItem): Promise<Array<PoEventSourcingItem> | number> {\n try {\n const requestData: PoHttpRequestData = await this.createPoHttpRequestData(\n eventSourcingItem.record.url,\n eventSourcingItem.record.method,\n eventSourcingItem.record,\n eventSourcingItem.record.headers\n );\n const response = await this.poHttpClient.createRequest(requestData).toPromise();\n const poHttpCommandResponse: PoSyncResponse = {\n id: eventSourcingItem.id,\n customRequestId: eventSourcingItem.customRequestId,\n request: eventSourcingItem.record,\n response: response\n };\n\n this.responseSubject.next(poHttpCommandResponse);\n\n return this.removeEventSourcingValidItem(response.status, eventSourcingItem);\n } catch (errorHttpClient) {\n return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);\n }\n }\n\n private async insertEventSourcingQueue(eventSourcingItem): Promise<Array<PoEventSourcingItem>> {\n const eventSourcingUpdatedQueue = await this.poStorage.appendItemToArray(\n PoEventSourcingService.event_sourcing_name,\n eventSourcingItem\n );\n\n this.notifyEventCreation();\n\n return Promise.resolve(eventSourcingUpdatedQueue);\n }\n\n private async insertOperation(currentEventSourcingItem: PoEventSourcingItem): Promise<any> {\n const schema = await this.poSchemaDefinition.get(currentEventSourcingItem.schema);\n const url = PoEventSourcingService.getUrl(currentEventSourcingItem, schema, PoRequestType.POST);\n\n try {\n const response = await this.sendServerItem(url, PoHttpRequestType.POST, currentEventSourcingItem.record);\n const recordUpdatedByServer = response.body;\n\n await this.removeEventSourcingValidItem(response.status, currentEventSourcingItem);\n\n const id = currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];\n await this.poSchemaService.update(schema, recordUpdatedByServer, id);\n\n const eventSourcingItems: Array<PoEventSourcingItem> = await this.poStorage.get(\n PoEventSourcingService.event_sourcing_name\n );\n await this.updatePendingEventSourcing(\n currentEventSourcingItem,\n schema.idField,\n recordUpdatedByServer,\n eventSourcingItems\n );\n\n return this.sendResponseSubject(currentEventSourcingItem, response);\n } catch (errorHttpClient) {\n return this.sendResponseSubject(currentEventSourcingItem, errorHttpClient, true);\n }\n }\n\n private isValidStatus(status: number): boolean {\n return PoEventSourcingService.VALID_HTTP_STATUS_CODES.includes(status);\n }\n\n private notifyEventCreation(): void {\n if (this.emitter) {\n this.emitter.next();\n }\n }\n\n private paginateSchemaData(data, schema, baseUrl): Observable<null> {\n this.config.dataTransform.transform(data);\n\n if (this.config.dataTransform.hasNext()) {\n this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(\n schema,\n baseUrl,\n ++this.schemasSyncConfig[schema.name]['page']\n );\n\n return this.diffServerItems(this.schemasSyncConfig[schema.name]['currentUrlDiff']).pipe(\n map(response => this.getBodyAndDate(schema.name, response))\n );\n }\n\n return of();\n }\n\n private removeEventSourcingValidItem(\n status,\n eventSourcingItem: PoEventSourcingItem\n ): Promise<Array<PoEventSourcingItem>> {\n if (this.isValidStatus(status) || eventSourcingItem.operation === PoEventSourcingOperation.Http) {\n return this.removeEventSourcingItem(eventSourcingItem.id);\n }\n }\n\n private selectOperation(eventSourcingItem: PoEventSourcingItem): Promise<any> {\n switch (eventSourcingItem.operation) {\n case PoEventSourcingOperation.Insert:\n return this.insertOperation(eventSourcingItem);\n\n case PoEventSourcingOperation.Update:\n return this.updateOperation(eventSourcingItem);\n\n case PoEventSourcingOperation.Delete:\n return this.deleteOperation(eventSourcingItem);\n\n case PoEventSourcingOperation.Http:\n return this.httpOperation(eventSourcingItem);\n }\n }\n\n private sendResponseSubject(\n eventSourcingItem: PoEventSourcingItem,\n response: HttpResponse<object> | HttpErrorResponse | PoEventSourcingErrorResponse,\n isSubjectError: boolean = false\n ): Promise<any> {\n const poSyncResponse: PoSyncResponse = {\n id: eventSourcingItem.id,\n customRequestId: eventSourcingItem.customRequestId,\n request: eventSourcingItem.record,\n response: response\n };\n\n this.stoppedQueueEventSourcing = isSubjectError;\n this.responseSubject.next(poSyncResponse);\n\n return Promise.resolve();\n }\n\n private async sendServerItem(url: string, method: PoHttpRequestType, body?: PoEventSourcingItem['record']) {\n const requestData: PoHttpRequestData = await this.createPoHttpRequestData(url, method, body);\n\n return this.poHttpClient.createRequest(requestData).toPromise();\n }\n\n private async createPoHttpRequestData(\n url: string,\n method: PoHttpRequestType,\n record?: PoEventSourcingItem['record'],\n headers?: Array<PoHttpHeaderOption>\n ): Promise<PoHttpRequestData> {\n let body = record?.body ?? record ?? {};\n\n if (record?.bodyType === 'File') {\n body = await this.createFormData(body, record.fileName, record.mimeType, record.formField);\n }\n\n return { url, method, body, headers };\n }\n\n private async createFormData(\n body: string,\n fileName: string,\n mimeType: string,\n formField: string = 'file'\n ): Promise<FormData> {\n const file = await PoUtils.toFile(body, fileName, mimeType);\n const formData: FormData = new FormData();\n\n formData.append(formField, file, fileName);\n return formData;\n }\n\n private async updateOperation(eventSourcingItem: PoEventSourcingItem): Promise<Array<any> | number> {\n const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);\n const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.PATCH);\n\n try {\n const recordId = eventSourcingItem.record[schema.idField];\n this.checkRecordIdExists(recordId, PoEventSourcingOperation.Update);\n\n const response = await this.sendServerItem(url, PoHttpRequestType.PUT, eventSourcingItem.record);\n await this.removeEventSourcingValidItem(response.status, eventSourcingItem);\n\n return await this.sendResponseSubject(eventSourcingItem, response);\n } catch (errorHttpClient) {\n return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);\n }\n }\n\n private updatePendingEventSourcing(\n currentEventSourcingItem: PoEventSourcingItem,\n idFieldSchema: string,\n inserted: object,\n eventSourcingItems: Array<PoEventSourcingItem>\n ) {\n if (currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName]) {\n eventSourcingItems.forEach((eventSourcingItem, position) => {\n const isCurrentEventSourcingItem =\n !eventSourcingItem.record[idFieldSchema] &&\n eventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName] ===\n currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];\n\n if (isCurrentEventSourcingItem) {\n eventSourcingItems[position].record[idFieldSchema] = inserted[idFieldSchema];\n }\n });\n\n return this.poStorage.set(PoEventSourcingService.event_sourcing_name, eventSourcingItems);\n } else {\n return Promise.resolve();\n }\n }\n\n private async updateRecords(serverRecords: Array<any>, schema: PoSyncSchema) {\n for (const serverRecord of serverRecords) {\n await this.updateRecordByServerRecord(serverRecord, schema);\n }\n }\n\n private async updateRecordByServerRecord(serverRecord, schema) {\n const recordId = serverRecord[schema.idField];\n const storageRecord = await this.poSchemaService.get(schema.name, recordId);\n const existsStorageRecord = !!Object.keys(storageRecord).length;\n\n if (existsStorageRecord && serverRecord[schema.deletedField]) {\n return await this.poSchemaService.remove(schema.name, serverRecord[schema.idField]);\n }\n\n if (existsStorageRecord && !serverRecord[schema.deletedField]) {\n return await this.poSchemaService.update(schema, serverRecord);\n }\n\n if (!existsStorageRecord && !serverRecord[schema.deletedField]) {\n return await this.poSchemaService.create(schema, serverRecord);\n }\n }\n\n private async updateStorageBySchema(schema: PoSyncSchema): Promise<any> {\n this.createSchemaSyncConfig(schema.name);\n\n this.schemasSyncConfig[schema.name]['page'] = 1;\n const baseUrl = `${PoSchemaUtil.getUrl(schema, PoRequestType.DIFF)}/${schema.lastSync}`;\n this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(\n schema,\n baseUrl,\n this.schemasSyncConfig[schema.name]['page']\n );\n\n const serverRecords = await this.getServerDiffRecords(schema, baseUrl);\n\n await this.updateRecords(serverRecords, schema);\n\n schema.lastSync = this.schemasSyncConfig[schema.name]['responseDate'];\n await this.poSchemaDefinition.update(schema);\n }\n\n private updateStorageSchemas(schemas): Array<Promise<Array<any>>> {\n return schemas.map((schema: PoSyncSchema) => this.updateStorageBySchema(schema));\n }\n}\n","import { PoUtils } from '../../utils/utils';\n\nimport { PoResponseApi } from './../../services/po-http-client/interfaces/po-response-api.interface';\nimport { PoSchemaService } from './../../services/po-schema';\nimport { PoSyncSchema } from '../../services/po-sync/interfaces/po-sync-schema.interface';\n\n/**\n * @description\n *\n * Classe utilitária para construir consultas sobre os registros de um *schema*.\n *\n * A utilização dos métodos desta classe é feita a partir do retorno do método `PoEntity.find()`. Por exemplo,\n * para utilizar o método `PoQueryBuilder.page()`, é necessário:\n *\n * ``` typescript\n * PoSyncService.getModel('schema name').find().page(2).exec();\n * ```\n *\n * O `PoQueryBuilder` foi projetado para que os seus métodos sejam\n * chamados em cascata e ao final desse encadeamento invocar o método\n * `PoQueryBuilder.exec()` para que a busca seja concluída. Por exemplo:\n *\n * ``` typescript\n * PoSyncService\n * .getModel('schema name')\n * .find()\n * .page(2)\n * .pageSize(5)\n * .sort()\n * .exec();\n * ```\n */\nexport class PoQueryBuilder {\n private fields: string;\n private filters: any;\n\n private _limit: number;\n private _page: number;\n private _pageSize: number;\n private _sort: string;\n\n constructor(\n private poSchemaService: PoSchemaService,\n private schema: PoSyncSchema\n ) {\n this._page = 1;\n this.filters = {};\n }\n\n /**\n * Ao final da chamada dos métodos do `PoQueryBuilder` utilizados, este método deve ser chamado para que a busca seja concluída.\n *\n * @return {Promise<PoResponseApi | object>} Registros do *schema* na qual foi aplicado a consulta.\n */\n async exec(): Promise<PoResponseApi | object> {\n let storageData = await this.poSchemaService.getAll(this.schema.name);\n\n if (storageData && storageData.length) {\n if (Object.keys(this.filters).length) {\n storageData = this.applyFilters(storageData);\n }\n if (this.fields) {\n storageData = this.applyFields(this.schema.fields, storageData);\n }\n if (this._sort) {\n storageData = this.order(storageData, this._sort);\n }\n\n if (this._limit) {\n return storageData[0];\n } else {\n return this.paginate(storageData);\n }\n } else {\n return {\n hasNext: false,\n items: []\n };\n }\n }\n\n /**\n * Aplica filtros sobre os registros, baseados nos campos e valores definidos como filtro. Por exemplo:\n *\n * ```\n * PoQueryBuilder.filter({ name: 'Marie', age: 24 });\n * ```\n * Retorna todos os registros que contenham a propriedade `name` igual a Marie e `age` igual a 24.\n *\n * @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.\n *\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n filter(filter?: object): PoQueryBuilder {\n if (filter && typeof filter === 'object') {\n this.filters = { ...this.filters, ...filter };\n } else {\n throw new Error('Filter must be an object');\n }\n\n return this;\n }\n\n /**\n * Limita o número de registros que serão retornados.\n *\n * @param {number} limit Número de registros retornados.\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n limit(limit: number): PoQueryBuilder {\n this._limit = limit;\n return this;\n }\n\n /**\n * Especifica a página de registros que se deseja retornar.\n *\n * @param {number} page Número da página.\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n page(page: number): PoQueryBuilder {\n PoUtils.validateParameter({ page });\n\n this._page = page;\n return this;\n }\n\n /**\n * Define quantos elementos serão retornados por página.\n *\n * @param {number} pageSize Número de registros por página.\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n pageSize(pageSize: number): PoQueryBuilder {\n PoUtils.validateParameter({ pageSize });\n\n this._pageSize = pageSize;\n return this;\n }\n\n /**\n * Utilizado para definir quais campos do *schema* serão retornados na consulta.\n *\n * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de\n * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.\n * Por exemplo, a definição abaixo:\n *\n * ```\n * PoQueryBuilder.select('name age address');\n * ```\n * Irá retornar apenas os campos `name`, `age` e `address`. Para não retornar um campo ou mais basta fazer:\n *\n * ```\n * PoQueryBuilder.select('-name -age');\n * ```\n *\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n select(fields: string): PoQueryBuilder {\n PoUtils.validateParameter({ fields });\n\n this.fields = fields;\n return this;\n }\n\n /**\n * Ordena os registros por um campo.\n *\n * @param {string} field Campo a ser ordenado. Para ordenar de forma decrescente basta colocar o caractere `-`\n * na frente do campo. Por exemplo:\n * ```\n * PoQueryBuilder.sort('-name');\n * ```\n *\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n sort(field: string): PoQueryBuilder {\n PoUtils.validateParameter({ field });\n\n this._sort = field;\n return this;\n }\n\n /**\n * Essa função serve como alias para o `PoQueryBuilder.filter()`. É utilizada somente para dar maior legibilidade ao código.\n *\n * @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um novo método do `PoQueryBuilder`.\n */\n where(filter: object): PoQueryBuilder {\n return this.filter(filter);\n }\n\n private applyFields(schemaFields: Array<any>, data: Array<object>): Array<object> {\n const receivedFields = this.fields.split(' ');\n let restrictedFields = [];\n let selectedFields = [];\n\n [selectedFields, restrictedFields] = this.groupFields(receivedFields);\n\n if (!selectedFields.length && restrictedFields.length) {\n selectedFields = [...schemaFields];\n }\n\n if (restrictedFields.length) {\n selectedFields = this.removeRestrictedFields(restrictedFields, selectedFields);\n }\n\n selectedFields = this.removeDuplicate(selectedFields);\n\n return this.removeFieldsData(data, selectedFields);\n }\n\n private applyFilters(data: Array<object>): Array<object> {\n Object.keys(this.filters).forEach(filterKey => {\n data = data.filter(item => item[filterKey] === this.filters[filterKey]);\n });\n\n return data;\n }\n\n private groupFields(receivedFields: Array<string>): Array<Array<string>> {\n const restrictedFields = [];\n const selectedFields = [];\n\n receivedFields.forEach(fields => {\n if (fields.startsWith('-')) {\n restrictedFields.push(fields.substring(1));\n } else {\n selectedFields.push(fields);\n }\n });\n return [selectedFields, restrictedFields];\n }\n\n private paginate(data: Array<any>): { hasNext: boolean; items: Array<any> } {\n const dataLength = data.length;\n const pageSize = this._pageSize || dataLength;\n\n const pages = Math.ceil(dataLength / pageSize);\n const begin = this._page * pageSize - pageSize;\n const end = begin + pageSize;\n\n return { hasNext: this._page < pages, items: data.slice(begin, end) };\n }\n\n private order(data: Array<any>, sortingField: string): Array<any> {\n const descendingOrder = sortingField.startsWith('-');\n sortingField = descendingOrder ? sortingField.substr(1) : sortingField;\n\n return data.sort((optionA, optionB) => {\n if (optionA[sortingField] > optionB[sortingField]) {\n return !descendingOrder ? 1 : -1;\n }\n\n if (optionA[sortingField] < optionB[sortingField]) {\n return !descendingOrder ? -1 : 1;\n }\n\n return 0;\n });\n }\n\n private removeDuplicate(fields): Array<any> {\n return fields.filter((item, position) => fields.indexOf(item) === position);\n }\n\n private removeFieldsData(data: Array<object>, chosenFields: Array<string>): Array<object> {\n data.forEach(item => {\n Object.keys(item).forEach(keyItem => {\n if (!chosenFields.includes(keyItem)) {\n delete item[keyItem];\n }\n });\n });\n return data;\n }\n\n private removeRestrictedFields(restrictedFields: Array<any>, fields: Array<any>) {\n return fields.filter(field => !restrictedFields.includes(field));\n }\n}\n","import { PoUtils } from '../../utils/utils';\n\nimport {\n PoEventSourcingOperation,\n PoEventSourcingService,\n PoEventSourcingSummaryItem\n} from '../../services/po-event-sourcing';\nimport { PoQueryBuilder } from './../po-query-builder/po-query-builder.model';\nimport { PoSchemaService, PoSchemaUtil } from '../../services/po-schema';\nimport { PoSyncSchema } from '../../services/po-sync/interfaces/po-sync-schema.interface';\n\n/**\n * @description\n *\n * Uma instância `PoEntity` representa um *schema* e ela contém métodos que possibilitam manipular seus registros,\n * como por exemplo: buscar, criar e remover.\n *\n * Esta instância pode ser obtida a partir do retorno do método `PoSyncService.getModel('schema name')`.\n */\nexport class PoEntity {\n constructor(\n private eventSourcing: PoEventSourcingService,\n private schema: PoSyncSchema,\n private poSchemaService: PoSchemaService\n ) {}\n\n /**\n * Busca os registros do *schema*, podendo filtrar o resultado a partir do filtro passado e retornando apenas\n * os campos definidos.\n *\n * Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.\n * Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).\n *\n * @param {object} filter Objeto que contém os campos e valores a serem filtrados no *schema*.\n * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de\n * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.\n * Por exemplo, a definição abaixo:\n *\n * ```\n * PoQueryBuilder.select('name age address');\n * ```\n * Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:\n *\n * ```\n * PoQueryBuilder.select('-name -age');\n * ```\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.\n */\n find(filter?: object, fields?: string): PoQueryBuilder {\n const query = new PoQueryBuilder(this.poSchemaService, this.schema);\n\n if (filter) {\n query.filter(filter);\n }\n\n if (fields) {\n query.select(fields);\n }\n\n return query;\n }\n\n /**\n * Busca um registro pelo seu *id*.\n *\n * Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.\n * Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).\n *\n * @param {any} id Identificador do registro.\n * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de\n * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.\n * Por exemplo, a definição abaixo:\n *\n * ```\n * PoQueryBuilder.select('name age address');\n * ```\n * Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:\n *\n * ```\n * PoQueryBuilder.select('-name -age');\n * ```\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.\n */\n findById(id: any, fields?: string): PoQueryBuilder {\n return this.findOne({ [this.schema.idField]: id }, fields);\n }\n\n /**\n * Semelhante ao método `PoEntity.find()`, porém retorna apenas o primeiro registro encontrado na busca.\n *\n * Para que esta busca seja concluída é necessário utilizar o método `PoQueryBuilder.exec()`.\n * Veja mais em: [PoQueryBuilder](/documentation/po-query-builder).\n *\n * @param {any} filter Objeto que contém os campos e valores a serem filtrados no *schema*.\n * @param {string} fields Campos que serão retornados nos registros. Este campos devem estar dentro de\n * uma *string* separados por espaço podendo usar o caractere `-` para excluir campos.\n * Por exemplo, a definição abaixo:\n *\n * ```\n * PoQueryBuilder.select('name age address');\n * ```\n * Irá retornar apenas os campos `name`, `age` e `address`. E para não mostrar um campo ou mais basta fazer:\n *\n * ```\n * PoQueryBuilder.select('-name -age');\n * ```\n * @returns {PoQueryBuilder} Objeto que possibilita encadear um método do `PoQueryBuilder`.\n */\n findOne(filter?: any, fields?: string): PoQueryBuilder {\n const query = this.find(filter, fields);\n query.limit(1);\n return query;\n }\n\n /**\n * Remove um registro.\n *\n * @param {object} record Registro que será removido.\n * @param {string} customRequestId Identificador customizado do comando.\n * @returns {Promise} Promessa que é concluída após o registro ser removido.\n */\n async remove(record: object, customRequestId?: string): Promise<any> {\n PoUtils.validateParameter({ record });\n\n const remove = async () => {\n const idField = record[this.schema.idField] ? this.schema.idField : PoSchemaUtil.syncInternalIdFieldName;\n const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, record)['serverRecord'];\n\n await this.poSchemaService.remove(this.schema.name, record[idField]);\n await this.eventSourcing.remove(this.schema.name, serverRecord, customRequestId);\n };\n\n return this.poSchemaService.limitedCallWrap(remove);\n }\n\n /**\n * Altera ou inclui um registro.\n *\n * > O registro será alterado se ele possuir um *id*, caso contrário um novo registro será criado.\n *\n * @param {object} record Registro que será persistido.\n * @param {string} customRequestId Identificador customizado do comando.\n * @returns {Promise} Promessa que é concluída após o registro ser alterado ou incluído.\n */\n async save(record: object, customRequestId?: string): Promise<any> {\n PoUtils.validateParameter({ record });\n\n return this.poSchemaService.limitedCallWrap(this.selectSaveType.bind(this, record, true, customRequestId));\n }\n\n /**\n * Salva uma lista de registros em lote.\n *\n * > Para cada registro da lista, será inserido um novo registro se o mesmo não tiver *id*, caso contrário\n * será contado como uma atualização de um registro existente.\n *\n * @param {Array<object>} records Lista de registros que serão persistidos.\n * @param {Array<string> | string} customRequestIds Identificador customizado do comando.\n *\n * Ao passar uma lista de identificadores, cada índice da lista de identificadores deverá\n * corresponder ao índice do registro na lista de registros.\n * @returns {Promise<any>} Promessa que é concluída após os registros serem alterados ou incluídos.\n */\n async saveAll(records: Array<object>, customRequestIds?: Array<string> | string): Promise<any> {\n PoUtils.validateParameter({ records });\n\n const saveAll = async () => {\n const batchEvents = [];\n\n for (let index = 0; index < records.length; index++) {\n const record = records[index];\n const sendToEventSourcing = false;\n\n const isNonLocalRecordChanged = await this.isNonLocalRecordChanged(record);\n const updatedRecord = await this.selectSaveType(record, sendToEventSourcing);\n\n if (isNonLocalRecordChanged) {\n const customRequestId = customRequestIds instanceof Array ? customRequestIds[index] : customRequestIds;\n const eventOperation = this.createEventOperation(record, updatedRecord, customRequestId);\n batchEvents.push(eventOperation);\n }\n }\n\n await this.eventSourcing.createBatchEvents(this.schema.name, batchEvents);\n };\n\n return this.poSchemaService.limitedCallWrap(saveAll);\n }\n\n private async create(newRecord: any, sendToEventSourcing: boolean, customRequestId?: string): Promise<any> {\n const time = new Date().getTime();\n\n const syncProperties = {\n [PoSchemaUtil.syncInternalIdFieldName]: time,\n SyncInsertedDateTime: time,\n SyncUpdatedDateTime: null,\n SyncExclusionDateTime: null,\n SyncDeleted: false,\n SyncStatus: 0\n };\n const recordWithSyncProperties = { ...newRecord, ...syncProperties };\n\n const recordedData = await this.poSchemaService.create(this.schema, recordWithSyncProperties);\n\n if (sendToEventSourcing) {\n await this.eventSourcing.create(this.schema.name, recordWithSyncProperties, customRequestId);\n }\n\n return recordedData;\n }\n\n private createEventOperation(\n record: object,\n updatedRecord: object,\n customRequestId?: string\n ): PoEventSourcingSummaryItem {\n const operation = PoSchemaUtil.getRecordId(record, this.schema)\n ? PoEventSourcingOperation.Update\n : PoEventSourcingOperation.Insert;\n\n const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, updatedRecord)['serverRecord'];\n\n return {\n record: serverRecord,\n customRequestId: customRequestId,\n operation: operation\n };\n }\n\n private async isNonLocalRecordChanged(updatedRecord: object): Promise<boolean> {\n const nonLocalFieldNames = PoSchemaUtil.getNonLocalFieldNames(this.schema);\n const record = await this.poSchemaService.get(this.schema.name, updatedRecord[this.schema.idField]);\n\n return !PoSchemaUtil.isModelsEqual(nonLocalFieldNames, record, updatedRecord);\n }\n\n private async selectSaveType(\n record: object,\n sendToEventSourcing: boolean,\n customRequestId?: string\n ): Promise<object> {\n const hasId = PoSchemaUtil.getRecordId(record, this.schema);\n\n return hasId\n ? await this.update(record, sendToEventSourcing, customRequestId)\n : await this.create(record, sendToEventSourcing, customRequestId);\n }\n\n private async update(updatedRecord: any, sendToEventSourcing: boolean, customRequestId?: string): Promise<object> {\n updatedRecord.SyncUpdatedDateTime = new Date().getTime();\n updatedRecord.SyncStatus = 0;\n\n const isNonLocalRecordChanged = await this.isNonLocalRecordChanged(updatedRecord);\n const recordedData = await this.poSchemaService.update(this.schema, updatedRecord);\n\n if (isNonLocalRecordChanged && sendToEventSourcing) {\n const serverRecord = PoSchemaUtil.separateSchemaFields(this.schema, updatedRecord)['serverRecord'];\n await this.eventSourcing.update(this.schema.name, serverRecord, customRequestId);\n }\n\n return recordedData;\n }\n}\n","/**\n * @usedBy PoSyncConfig, PoNetworkStatus\n *\n * @description\n *\n * Tipos de rede existentes no dispositivo.\n */\n\nexport enum PoNetworkType {\n /** Define o tipo de rede como desconhecido (`unknown`). */\n unknown,\n\n /** Define o tipo de rede como `Ethernet`. */\n ethernet,\n\n /** Define o tipo de rede como `WiFi`. */\n wifi,\n\n /** Define o tipo de rede como `2G`. */\n _2g,\n\n /** Define o tipo de rede como `3G`. */\n _3g,\n\n /** Define o tipo de rede como `4G`. */\n _4g,\n\n /**\n * Define o tipo de rede como `cellular`. Isso acontece na utilização dos navegadores\n * dentro do dispositvo móvel, com exceção do *web view*.\n */\n cellular,\n\n /** Define o tipo de rede como `none`. */\n none\n}\n","import { PoDataTransform } from './po-data-transform.model';\n\n/**\n * @docsPrivate\n *\n * @description\n *\n * Classe responsável por implementar a classe `PoDataTransform` com os campos referentes ao padrão de\n * [API do PO UI](https://po-ui.io/guides/api).\n */\nexport class PoDataMessage extends PoDataTransform {\n /**\n * Retorna a propriedade `po_sync_date`, responsável por informar a data da última sincronização no guia de\n * [API do PO UI](https://po-ui.io/guides/api).\n *\n * @returns {string} Nome do campo que contém a data da última sincronização.\n */\n getDateFieldName(): string {\n return 'po_sync_date';\n }\n\n /**\n * Retorna a propriedade `items`, responsável por informar a lista de registros vindos da API no guia de\n * [API do PO UI](https://po-ui.io/guides/api).\n *\n * @returns {string} Nome da propriedade que contém a lista de registros.\n */\n getItemsFieldName(): string {\n return 'items';\n }\n\n /**\n * Retorna a propriedade `page`, responsável por informar o número da página de registros que a API retorna no guia de\n * [API do PO UI](https://po-ui.io/guides/api).\n *\n * @returns {string} Nome da propriedade responsável por informar o número da página de registros.\n */\n getPageParamName(): string {\n return 'page';\n }\n\n /**\n * Retorna a propriedade `pageSize`, responsável pela quantidade de registros que serão exibidos por página no guia de\n * [API do PO UI](https://po-ui.io/guides/api).\n *\n * @returns {string} Nome do parâmetro responsável pela quantidade de registros por página.\n */\n getPageSizeParamName(): string {\n return 'pageSize';\n }\n\n /**\n * Retorna um valor `boolean`, de acordo com a propriedade `hasNext` que é responsável por informar se há uma nova\n * página de registros disponível no guia de [API do PO UI](https://po-ui.io/guides/api).\n *\n * @returns {boolean} Informa se tem próxima página de registros.\n */\n hasNext(): boolean {\n return this.data.hasNext;\n }\n}\n","import { PoNetworkType } from './po-network-type.enum';\n\n/**\n * @description\n *\n * Classe responsável por identificar a conexão de rede disponível no dispositivo.\n */\nexport class PoNetworkStatus {\n private _type: PoNetworkType;\n\n constructor(networtkType) {\n this.setNetworkConnection(networtkType);\n }\n\n /**\n * Retorna se o dispositivo está conectado na rede.\n *\n * @returns {boolean} Status da conexão com a rede.\n */\n get status(): boolean {\n return this.type !== PoNetworkType.none;\n }\n\n /**\n * Retorna o tipo de conexão do dispositivo.\n *\n * @returns {PoNetworkType} Tipo da conexão com a rede.\n */\n get type(): PoNetworkType {\n return this._type;\n }\n\n set type(type: PoNetworkType) {\n this._type = type;\n }\n\n /* istanbul ignore next */\n private setDefaultTypeNavigation() {\n return navigator.onLine ? PoNetworkType['ethernet'] : PoNetworkType.none;\n }\n\n private setNetworkConnection(networtkType): void {\n if (!networtkType) {\n this.type = this.setDefaultTypeNavigation();\n } else {\n const isGenerationMobile = ['2g', '3g', '4g'].includes(networtkType);\n\n this.type = isGenerationMobile ? PoNetworkType['_' + networtkType] : PoNetworkType[String(networtkType)];\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { fromEvent, merge, Observable, Subject } from 'rxjs';\nimport { mapTo } from 'rxjs/operators';\n\nimport { Network } from '@capacitor/network';\n\nimport { PoNetworkStatus } from './../../models';\n\n/**\n * @description\n *\n * O `PoNetworkService` é utilizado para verificar o status e o tipo da conexão de rede do dispositivo.\n */\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PoNetworkService {\n private networkType: string;\n private networkTypeNow: Subject<{ status: boolean; type: string }>;\n private poNetworkStatus: PoNetworkStatus;\n\n constructor() {\n this.initNetwork();\n }\n\n /**\n * Retorna as propriedades tipo e status da conexão do dispositivo no momento da chamada.\n *\n * @returns {PoNetworkStatus} Instância de [PoNetworkStatus](/documentation/po-network-status) com as\n * propriedades da conexão.\n */\n getConnectionStatus(): PoNetworkStatus {\n this.poNetworkStatus = new PoNetworkStatus(this.networkType);\n return this.poNetworkStatus;\n }\n\n /**\n * Notifica as mudanças no tipo de conexão de rede do dispositivo.\n *\n * @returns {Observable<{ status: boolean, type: string }>} Observable com as propriedades da conexão.\n */\n onChange(): Observable<{ status: boolean; type: string }> {\n return this.networkTypeNow.asObservable();\n }\n\n private initNetwork() {\n this.networkTypeNow = new Subject();\n this.initSubscriber();\n }\n\n private async getStatus() {\n return await Network.getStatus();\n }\n\n private async initSubscriber() {\n const networkStatus = await this.getStatus();\n this.networkType = networkStatus.connected ? networkStatus.connectionType : 'none';\n this.networkTypeNow.next({ status: networkStatus.connected, type: this.networkType });\n\n /* istanbul ignore next */\n Network.addListener('networkStatusChange', status => {\n this.networkType = status.connected ? status.connectionType : 'none';\n this.networkTypeNow.next({ status: status.connected, type: this.networkType });\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { forkJoin, Observable, of, Subject, Subscription, timer } from 'rxjs';\nimport { expand, map, mergeMap, reduce } from 'rxjs/operators';\nimport { PoUtils } from '../../utils/utils';\n\nimport { PoDataMessage, PoEntity } from '../../models';\nimport { PoEventSourcingService } from '../po-event-sourcing/po-event-sourcing.service';\nimport { PoHttpClientService } from '../po-http-client/po-http-client.service';\nimport { PoHttpRequestData } from '../po-http-client/interfaces/po-http-request-data.interface';\nimport { PoNetworkService } from '../po-network/po-network.service';\nimport { PoRequestType } from '../../models/po-request-type.enum';\nimport { PoSchemaDefinitionService } from './../po-schema/po-schema-definition/po-schema-definition.service';\nimport { PoSchemaService } from './../po-schema/po-schema.service';\nimport { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';\nimport { PoSyncConfig } from './interfaces/po-sync-config.interface';\nimport { PoSyncResponse } from '../po-sync/interfaces/po-sync-response.interface';\nimport { PoSyncSchema } from './interfaces/po-sync-schema.interface';\n\n/**\n * @description\n *\n * O `PoSyncService` é utilizado para configurar toda a base de dados que receberá as informações que serão\n * armazenadas *offline* vindas do servidor. Nele ocorre toda a preparação dos modelos de dados retornados por\n * cada consulta.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PoSyncService {\n models: Array<PoEntity> = [];\n\n private config: PoSyncConfig;\n private emitter: any;\n private eventSub: Observable<any>;\n private finishSyncSubject: Subject<null> = new Subject<null>();\n private isSyncEnabled: boolean = true;\n private schemas: Array<PoSyncSchema>;\n private subscription: Subscription;\n private syncing: boolean = false;\n private timer: Observable<number>;\n\n constructor(\n private poEventSourcingService: PoEventSourcingService,\n private poHttpClient: PoHttpClientService,\n private poNetworkService: PoNetworkService,\n private poSchemaDefinitionService: PoSchemaDefinitionService,\n private poSchemaService: PoSchemaService\n ) {}\n\n /**\n * Destrói todas as chaves do *storage* referentes ao `po-sync`, ou seja,\n * as definições dos *schemas*, os registros de cada *schema* e a fila\n * de eventos que estão para ser enviados ao servidor *(EventSourcing)*.\n *\n * > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,\n * recomenda-se utilizar o método `prepare()` em seguida.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Alterando as definições dos schemas](/guides/sync-fundamentals).\n *\n * @returns {Promise<any>} Promessa que é resolvida quando as chaves referentes ao `po-sync` forem destruídas.\n */\n async destroy(): Promise<any> {\n const destroyFunction = async () => {\n await this.poSchemaService.destroySchemasRecords();\n await this.poSchemaDefinitionService.destroy();\n await this.poEventSourcingService.destroyEventSourcingQueue();\n };\n\n return this.poSchemaService.limitedCallWrap(destroyFunction);\n }\n\n /**\n * Desabilita todos os tipos de sincronização de dados (periódica, reativa e manual).\n *\n * > Para habilitar novamente a sincronização utilize o método [`PoSyncService.enableSync()`](documentation/po-sync#enable-sync).\n */\n disableSync() {\n this.isSyncEnabled = false;\n\n if (this.timer && this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n /**\n * <a id=\"enable-sync\"></a>\n * Habilita todos os tipos de sincronização de dados (periódica, reativa e manual).\n *\n * Por padrão, sempre que se inicializa uma aplicação com PO Sync as sincronizações já estão habilitadas.\n */\n enableSync() {\n this.isSyncEnabled = true;\n this.createSubscribe();\n }\n\n /**\n * Método que disponibiliza a partir de sua inscrição o evento de retorno das operações da fila de eventos que\n * foram enviadas ao servidor. A cada operação enviada para o servidor, será disparado um evento para a inscrição\n * deste método.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).\n *\n * @returns {Observable<PoSyncResponse>} Observable com um objeto do tipo `PoSyncResponse`.\n */\n getResponses(): Observable<PoSyncResponse> {\n return this.poEventSourcingService.responsesSubject();\n }\n\n /**\n * Retorna uma instância de `PoEntity` para um determinado *schema*.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Manipulando os registros de um schema](/guides/sync-fundamentals).\n *\n * @param {string} schemaName Nome do *schema*.\n * @returns {PoEntity} Objeto para efetuar consultas e alterações nos dados.\n */\n getModel(schemaName: string): PoEntity {\n const model = this.models[schemaName];\n if (!model) {\n throw new Error('Model not found: ' + schemaName);\n }\n return model;\n }\n\n /**\n * Insere uma requisição HTTP na fila de eventos do `po-sync`.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Inserindo requisições HTTP na fila de eventos](/guides/sync-fundamentals).\n *\n * @param {PoHttpRequestData} poHttpRequestData Dados da requisição HTTP.\n * @param {string} customRequestId Identificador customizado da requisição HTTP.\n * @returns {Promise<number>} Promessa com o identificador da requisição HTTP criada.\n */\n insertHttpCommand(requestData: PoHttpRequestData, customRequestId?: string): Promise<number> {\n PoUtils.validateParameter({ requestData });\n\n return this.poEventSourcingService.httpCommand(requestData, customRequestId);\n }\n\n /**\n * Efetua uma chamada na API do servidor para realizar a carga inicial dos dados. Deve ser chamado apenas uma vez\n * na aplicação, após a preparação dos *schemas* realizada através do método `PoSyncService.prepare()`.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Carga inicial dos dados](/guides/sync-fundamentals).\n *\n * @returns {Observable<Array<{ entity: string, data: Array<any> }>>} Observable que notificará quando a\n * carga inicial for concluída.\n */\n loadData(): Observable<Array<{ entity: string; data: Array<any> }>> {\n const loads: Array<Observable<{ entity: string; data: Array<any> }>> = [];\n this.schemas.forEach(el => loads.push(this.loadEntityData(el)));\n return forkJoin(loads);\n }\n\n /**\n * Responsável por notificar sempre que houver sincronismo.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Notificação pós-sincronização](/guides/sync-fundamentals).\n *\n * @returns {Observable<any>} Observable que é disparado a cada sincronismo realizado.\n */\n onSync(): Observable<any> {\n if (!this.eventSub) {\n this.eventSub = Observable.create(e => {\n this.emitter = e;\n });\n }\n return this.eventSub;\n }\n\n /**\n * Prepara a aplicação criando os schemas e aplica as configurações.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Preparando a aplicação](/guides/sync-fundamentals).\n *\n * @param {Array<PoSyncSchema>} schemas Lista de *schemas* a serem preparados.\n * @param {PoSyncConfig} config Configurações adicionais.\n * @returns {Promise<any>} Promessa que é resolvida quando a aplicação estiver preparada para a utilização do `po-sync`.\n */\n prepare(schemas: Array<PoSyncSchema>, config?: PoSyncConfig): Promise<any> {\n PoUtils.validateArray({ schemas });\n\n const defaultSyncConfig: PoSyncConfig = {\n type: this.poNetworkService.getConnectionStatus().type,\n period: 60,\n dataTransform: new PoDataMessage()\n };\n\n this.schemas = schemas;\n this.config = config || defaultSyncConfig;\n this.config.dataTransform = this.config.dataTransform || new PoDataMessage();\n this.poEventSourcingService.config = this.config;\n this.startTimer(this.config.period);\n this.reactiveSync();\n this.poEventSourcingService.onSaveData().subscribe(() => this.sync());\n\n return this.saveSchemas().then(() => {\n this.schemas.forEach(schema => {\n this.models[schema.name] = new PoEntity(this.poEventSourcingService, schema, this.poSchemaService);\n });\n return Promise.resolve();\n });\n }\n\n /**\n * Remove um item da fila de eventos que espera a sincronização.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).\n *\n * @param {any} idEventSourcing Identificador do item da fila de eventos.\n * @returns {Promise<any>} Promessa que é resolvida quando o item da fila de eventos é removido.\n */\n removeItemOfSync(idEventSourcing: any): Promise<any> {\n return this.poEventSourcingService.removeEventSourcingItem(idEventSourcing);\n }\n\n /**\n * Reenvia os comandos pendentes na fila (inclusão, alteração e exclusão) e busca novos dados do servidor.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).\n *\n * @returns {Promise<any>} Promessa que resolve o sincronismo disparado.\n */\n resumeSync(): Promise<any> {\n if (!this.canSync()) {\n const finishSyncSubscription = this.finishSyncSubject.asObservable().subscribe(() => {\n finishSyncSubscription.unsubscribe();\n return this.sync();\n });\n return Promise.resolve();\n }\n\n return this.sync();\n }\n\n /**\n * Dispara o sincronismo enviando os eventos pendentes (inclusão, alteração e exclusão) e buscando novos dados do servidor.\n *\n * O sincronismo somente será executado depois que o acesso a base de dados local do dispositivo for liberada.\n *\n * > Veja mais detalhes em [Fundamentos do PO Sync - Sincronização manual](/guides/sync-fundamentals).\n *\n * @returns {Promise<any>} Promessa que é resolvida quando o sincronismo for finalizado.\n */\n async sync(): Promise<any> {\n if (this.canSync()) {\n this.startSync();\n\n try {\n await this.poEventSourcingService.syncSend();\n await this.poEventSourcingService.syncGet();\n\n if (this.emitter) {\n this.emitter.next();\n }\n\n this.finishSync();\n } catch (error) {\n this.syncError();\n }\n }\n }\n\n private canSync(): boolean {\n if (this.syncing || !this.isSyncEnabled) {\n return false;\n } else {\n const currentConnection = this.poNetworkService.getConnectionStatus();\n const isConfiguredConnection = this.config && currentConnection.type === this.config.type;\n const isConfigIncludesType =\n this.config && this.config.type instanceof Array && this.config.type.includes(currentConnection.type);\n\n return currentConnection.status && (!this.config || isConfiguredConnection || isConfigIncludesType);\n }\n }\n\n private createSubscribe(): void {\n if (this.timer) {\n this.subscription = this.timer.subscribe(() => {\n this.sync().then(() => {\n this.subscription.unsubscribe();\n this.subscription = null;\n this.timer = null;\n this.startTimer(this.config.period);\n });\n });\n }\n }\n\n private finishSync(): void {\n this.syncing = false;\n this.finishSyncSubject.next(null);\n }\n\n private getOnePage(schema: PoSyncSchema, page: number = 1): Observable<any> {\n const params = [];\n params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);\n params.push(`${this.config.dataTransform.getPageParamName()}=${page}`);\n\n const url = `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}?${params.join('&')}`;\n\n return this.poHttpClient.get(url).pipe(\n map(response => response.body),\n mergeMap(responseBody => {\n const now = new Date().getTime();\n responseBody[this.config.dataTransform.getItemsFieldName()].map(item => {\n item.SyncInsertedDateTime = now;\n item.SyncUpdatedDateTime = null;\n item.SyncExclusionDateTime = null;\n item.SyncDeleted = false;\n item.SyncStatus = 2;\n });\n return this.poSchemaService\n .updateAll(schema, responseBody[this.config.dataTransform.getItemsFieldName()])\n .then(() => responseBody);\n })\n );\n }\n\n private loadEntityData(schema: PoSyncSchema): Observable<{ entity: string; data: Array<any> }> {\n let page = 1;\n return this.getOnePage(schema, page).pipe(\n expand(data => {\n this.config.dataTransform.transform(data);\n const hasNext = this.config.dataTransform.hasNext();\n if (hasNext) {\n return this.getOnePage(schema, ++page);\n } else {\n return of();\n }\n }),\n reduce(\n (acc, obj) => {\n acc.data = acc.data.concat(obj[this.config.dataTransform.getItemsFieldName()]);\n return acc;\n },\n {\n entity: schema.name,\n data: []\n }\n )\n );\n }\n\n private reactiveSync(): void {\n this.poNetworkService.onChange().subscribe(networkStatus => {\n if (networkStatus.status) {\n this.startTimer(this.config.period);\n return this.sync();\n }\n\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n });\n }\n\n private async saveSchemas(): Promise<any> {\n const storageSchemas: Array<PoSyncSchema> = await this.poSchemaDefinitionService.getAll();\n this.schemas.forEach(schema => (schema.lastSync = PoSchemaUtil.getLastSync(storageSchemas, schema.name)));\n return this.poSchemaDefinitionService.saveAll(this.schemas);\n }\n\n private startSync(): void {\n this.syncing = true;\n }\n\n private startTimer(period): void {\n if (period && this.isSyncEnabled) {\n this.timer = timer(period * 1000);\n this.createSubscribe();\n }\n }\n\n private syncError(): void {\n this.finishSync();\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { PoEventSourcingService } from './services/po-event-sourcing/po-event-sourcing.service';\nimport { PoHttpClientService } from './services/po-http-client/po-http-client.service';\nimport { PoNetworkService } from './services/po-network/po-network.service';\nimport { PoSchemaDefinitionService } from './services/po-schema/po-schema-definition/po-schema-definition.service';\nimport { PoSchemaService } from './services/po-schema/po-schema.service';\nimport { PoSyncService } from './services/po-sync/po-sync.service';\n\n/**\n * @description\n *\n * Módulo do componente PoSync responsável pela sincronia de dados com backends\n */\n@NgModule({\n providers: [\n PoEventSourcingService,\n PoNetworkService,\n PoSchemaDefinitionService,\n PoSchemaService,\n PoSyncService,\n PoHttpClientService\n ],\n imports: []\n})\nexport class PoSyncModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.PoSchemaDefinitionService","i2","i1","i2.PoSchemaService","i3","i4.PoHttpClientService","i1.PoEventSourcingService","i2.PoHttpClientService","i3.PoNetworkService","i4.PoSchemaDefinitionService","i5.PoSchemaService"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@po-ui/ng-sync",
3
- "version": "21.0.0-next.0",
3
+ "version": "21.0.0-rc.0",
4
4
  "description": "PO UI - Sync",
5
5
  "author": "PO UI",
6
6
  "license": "MIT",
@@ -20,9 +20,9 @@
20
20
  "dependencies": {
21
21
  "@capacitor/core": "^6.2.0",
22
22
  "@capacitor/network": "^6.0.1",
23
- "@po-ui/ng-storage": "21.0.0-next.0",
23
+ "@po-ui/ng-storage": "21.0.0-rc.0",
24
24
  "http-status-codes": "^2.3.0",
25
- "@po-ui/ng-schematics": "21.0.0-next.0",
25
+ "@po-ui/ng-schematics": "21.0.0-rc.0",
26
26
  "tslib": "^2.6.2"
27
27
  },
28
28
  "peerDependencies": {
@@ -30,7 +30,7 @@
30
30
  "@angular-devkit/schematics": "^21",
31
31
  "@capacitor/core": "^6.2.0",
32
32
  "@capacitor/network": "^6.0.1",
33
- "@po-ui/ng-storage": "21.0.0-next.0",
33
+ "@po-ui/ng-storage": "21.0.0-rc.0",
34
34
  "http-status-codes": "^2.3.0",
35
35
  "rxjs": "~7.8.1",
36
36
  "rxjs-compat": "~6.6.0",
Binary file
@@ -47,22 +47,22 @@
47
47
  "factory": "./ng-update/v17/index"
48
48
  },
49
49
  "migration-v18": {
50
- "version": "21.0.0-next.0",
50
+ "version": "21.0.0-rc.0",
51
51
  "description": "Atualiza @po-ui/ng-sync para v18",
52
52
  "factory": "./ng-update/v18/index"
53
53
  },
54
54
  "migration-v19": {
55
- "version": "21.0.0-next.0",
55
+ "version": "21.0.0-rc.0",
56
56
  "description": "Atualiza @po-ui/ng-sync para v19",
57
57
  "factory": "./ng-update/v19/index"
58
58
  },
59
59
  "migration-v20": {
60
- "version": "21.0.0-next.0",
60
+ "version": "21.0.0-rc.0",
61
61
  "description": "Atualiza @po-ui/ng-sync para v20",
62
62
  "factory": "./ng-update/v20/index"
63
63
  },
64
64
  "migration-v21": {
65
- "version": "21.0.0-next.0",
65
+ "version": "21.0.0-rc.0",
66
66
  "description": "Atualiza @po-ui/ng-sync para v21",
67
67
  "factory": "./ng-update/v21/index"
68
68
  }
@@ -17,7 +17,7 @@ function default_1(options) {
17
17
  }
18
18
  function addPoPackageAndInstall() {
19
19
  return (tree, context) => {
20
- (0, package_config_1.addPackageToPackageJson)(tree, '@po-ui/ng-sync', '21.0.0-next.0');
20
+ (0, package_config_1.addPackageToPackageJson)(tree, '@po-ui/ng-sync', '21.0.0-rc.0');
21
21
  // install packages
22
22
  context.addTask(new tasks_1.NodePackageInstallTask());
23
23
  };
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function default_1() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
@@ -9,7 +9,7 @@ const module_1 = require("@po-ui/ng-schematics/module");
9
9
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
10
10
  const changes_1 = require("./changes");
11
11
  function default_1() {
12
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), createUpgradeRule(), postUpdate()]);
12
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), createUpgradeRule(), postUpdate()]);
13
13
  }
14
14
  function postUpdate() {
15
15
  return (_, context) => {
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function default_1() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function default_1() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function default_1() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function default_1() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
@@ -10,7 +10,7 @@ const package_config_1 = require("@po-ui/ng-schematics/package-config");
10
10
  const changes_1 = require("./changes");
11
11
  function updateToV2() {
12
12
  return (0, schematics_1.chain)([
13
- updatePackageJson('21.0.0-next.0', changes_1.dependeciesChanges),
13
+ updatePackageJson('21.0.0-rc.0', changes_1.dependeciesChanges),
14
14
  (0, replace_1.replaceInFile)('tslint.json', changes_1.tsLintChanges),
15
15
  createUpgradeRule(),
16
16
  postUpdate()
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function default_1() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function default_1() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function updateToV3() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function default_1() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function default_1() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
@@ -6,7 +6,7 @@ const tasks_1 = require("@angular-devkit/schematics/tasks");
6
6
  const package_config_1 = require("@po-ui/ng-schematics/package-config");
7
7
  const changes_1 = require("./changes");
8
8
  function default_1() {
9
- return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-next.0', changes_1.updateDepedenciesVersion), postUpdate()]);
9
+ return (0, schematics_1.chain)([(0, package_config_1.updatePackageJson)('21.0.0-rc.0', changes_1.updateDepedenciesVersion), postUpdate()]);
10
10
  }
11
11
  function postUpdate() {
12
12
  return (_, context) => {
Binary file