ngx-material-entity 0.1.3 → 1.0.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.
Files changed (163) hide show
  1. package/README.md +914 -336
  2. package/capsulation/lodash.utilities.d.ts +62 -0
  3. package/capsulation/reflect.utilities.d.ts +56 -0
  4. package/classes/{base-builder.class.d.ts → base.builder.d.ts} +2 -1
  5. package/classes/date.utilities.d.ts +70 -0
  6. package/classes/entity.model.d.ts +20 -0
  7. package/classes/entity.service.d.ts +108 -0
  8. package/classes/{entity-utilities.class.d.ts → entity.utilities.d.ts} +52 -16
  9. package/classes/file.utilities.d.ts +52 -0
  10. package/components/confirm-dialog/confirm-dialog-data.builder.d.ts +1 -1
  11. package/components/input/add-array-item-dialog-data.builder.d.ts +4 -4
  12. package/components/input/add-array-item-dialog-data.d.ts +2 -2
  13. package/components/input/array/array-date-input/array-date-input.component.d.ts +11 -0
  14. package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +20 -0
  15. package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +22 -0
  16. package/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.d.ts +51 -0
  17. package/components/input/array/array-string-chips-input/array-string-chips-input.component.d.ts +44 -0
  18. package/components/input/array/array-table.class.d.ts +49 -0
  19. package/components/input/base-input.component.d.ts +31 -0
  20. package/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.d.ts +10 -0
  21. package/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.d.ts +9 -0
  22. package/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.d.ts +10 -0
  23. package/components/input/custom/custom.component.d.ts +13 -0
  24. package/components/input/date/date-input/date-input.component.d.ts +13 -0
  25. package/components/input/date/date-range-input/date-range-input.component.d.ts +20 -0
  26. package/components/input/date/date-time-input/date-time-input.component.d.ts +31 -0
  27. package/components/input/file/file-default-input/file-default-input.component.d.ts +13 -0
  28. package/components/input/file/file-image-input/file-image-input.component.d.ts +22 -0
  29. package/components/input/file/file-input/dragDrop.directive.d.ts +32 -0
  30. package/components/input/file/file-input/file-input.component.d.ts +32 -0
  31. package/components/input/input.component.d.ts +49 -73
  32. package/components/input/input.module.d.ts +38 -15
  33. package/components/input/number/number-dropdown-input/number-dropdown-input.component.d.ts +9 -0
  34. package/components/input/number/number-input/number-input.component.d.ts +9 -0
  35. package/components/input/string/string-autocomplete-input/string-autocomplete-input.component.d.ts +18 -0
  36. package/components/input/string/string-dropdown-input/string-dropdown-input.component.d.ts +9 -0
  37. package/components/input/string/string-input/string-input.component.d.ts +9 -0
  38. package/components/input/string/string-textbox-input/string-textbox-input.component.d.ts +9 -0
  39. package/components/table/create-dialog/create-dialog-data.builder.d.ts +1 -1
  40. package/components/table/create-dialog/create-entity-dialog-data.builder.d.ts +5 -5
  41. package/components/table/create-dialog/create-entity-dialog-data.d.ts +3 -3
  42. package/components/table/create-dialog/create-entity-dialog.component.d.ts +9 -5
  43. package/components/table/edit-dialog/edit-dialog-data.builder.d.ts +4 -4
  44. package/components/table/edit-dialog/edit-entity-dialog-data.d.ts +3 -3
  45. package/components/table/edit-dialog/edit-entity-dialog.builder.d.ts +5 -5
  46. package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +7 -5
  47. package/components/table/table-data.builder.d.ts +9 -9
  48. package/components/table/table-data.d.ts +8 -8
  49. package/components/table/table.component.d.ts +2 -2
  50. package/decorators/array/array-decorator-internal.data.d.ts +72 -7
  51. package/decorators/array/array-decorator.data.d.ts +179 -13
  52. package/decorators/array/array.decorator.d.ts +3 -3
  53. package/decorators/base/base-property.decorator.d.ts +2 -3
  54. package/decorators/base/decorator-types.enum.d.ts +15 -4
  55. package/decorators/base/dropdown-value.interface.d.ts +14 -0
  56. package/decorators/custom/custom-decorator-internal.data.d.ts +17 -0
  57. package/decorators/custom/custom-decorator.data.d.ts +33 -0
  58. package/decorators/custom/custom.decorator.d.ts +11 -0
  59. package/decorators/date/date-decorator-internal.data.d.ts +44 -0
  60. package/decorators/date/date-decorator.data.d.ts +129 -0
  61. package/decorators/date/date.decorator.d.ts +8 -0
  62. package/decorators/file/file-decorator-internal.data.d.ts +92 -0
  63. package/decorators/file/file-decorator.data.d.ts +92 -0
  64. package/decorators/file/file.decorator.d.ts +9 -0
  65. package/decorators/number/number-decorator-internal.data.d.ts +2 -4
  66. package/decorators/number/number-decorator.data.d.ts +2 -4
  67. package/decorators/number/number.decorator.d.ts +2 -2
  68. package/decorators/object/object-decorator-internal.data.d.ts +3 -3
  69. package/decorators/object/object-decorator.data.d.ts +5 -5
  70. package/decorators/object/object.decorator.d.ts +2 -2
  71. package/decorators/string/string-decorator-internal.data.d.ts +2 -4
  72. package/decorators/string/string-decorator.data.d.ts +2 -4
  73. package/esm2020/capsulation/lodash.utilities.mjs +75 -0
  74. package/esm2020/capsulation/reflect.utilities.mjs +69 -0
  75. package/esm2020/classes/base.builder.mjs +42 -0
  76. package/esm2020/classes/date.utilities.mjs +158 -0
  77. package/esm2020/classes/entity.model.mjs +23 -0
  78. package/esm2020/classes/entity.service.mjs +180 -0
  79. package/esm2020/classes/entity.utilities.mjs +686 -0
  80. package/esm2020/classes/file.utilities.mjs +123 -0
  81. package/esm2020/components/confirm-dialog/confirm-dialog-data.builder.mjs +5 -5
  82. package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +3 -3
  83. package/esm2020/components/input/add-array-item-dialog-data.builder.mjs +4 -4
  84. package/esm2020/components/input/add-array-item-dialog-data.mjs +1 -1
  85. package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +26 -0
  86. package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +50 -0
  87. package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +50 -0
  88. package/esm2020/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +119 -0
  89. package/esm2020/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +104 -0
  90. package/esm2020/components/input/array/array-table.class.mjs +107 -0
  91. package/esm2020/components/input/base-input.component.mjs +39 -0
  92. package/esm2020/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +23 -0
  93. package/esm2020/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +17 -0
  94. package/esm2020/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +23 -0
  95. package/esm2020/components/input/custom/custom.component.mjs +25 -0
  96. package/esm2020/components/input/date/date-input/date-input.component.mjs +23 -0
  97. package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +51 -0
  98. package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +63 -0
  99. package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +24 -0
  100. package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +79 -0
  101. package/esm2020/components/input/file/file-input/dragDrop.directive.mjs +64 -0
  102. package/esm2020/components/input/file/file-input/file-input.component.mjs +152 -0
  103. package/esm2020/components/input/input.component.mjs +143 -179
  104. package/esm2020/components/input/input.module.mjs +76 -6
  105. package/esm2020/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +18 -0
  106. package/esm2020/components/input/number/number-input/number-input.component.mjs +16 -0
  107. package/esm2020/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +37 -0
  108. package/esm2020/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +18 -0
  109. package/esm2020/components/input/string/string-input/string-input.component.mjs +16 -0
  110. package/esm2020/components/input/string/string-textbox-input/string-textbox-input.component.mjs +17 -0
  111. package/esm2020/components/table/create-dialog/create-dialog-data.builder.mjs +3 -3
  112. package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +2 -2
  113. package/esm2020/components/table/create-dialog/create-entity-dialog-data.mjs +1 -1
  114. package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +16 -9
  115. package/esm2020/components/table/edit-dialog/edit-dialog-data.builder.mjs +3 -3
  116. package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +1 -1
  117. package/esm2020/components/table/edit-dialog/edit-entity-dialog.builder.mjs +3 -3
  118. package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +19 -11
  119. package/esm2020/components/table/table-data.builder.mjs +4 -4
  120. package/esm2020/components/table/table-data.mjs +1 -1
  121. package/esm2020/components/table/table.component.mjs +21 -23
  122. package/esm2020/decorators/array/array-decorator-internal.data.mjs +102 -14
  123. package/esm2020/decorators/array/array-decorator.data.mjs +2 -2
  124. package/esm2020/decorators/array/array.decorator.mjs +8 -2
  125. package/esm2020/decorators/base/base-property.decorator.mjs +4 -3
  126. package/esm2020/decorators/base/decorator-types.enum.mjs +10 -1
  127. package/esm2020/decorators/base/dropdown-value.interface.mjs +2 -0
  128. package/esm2020/decorators/base/property-decorator-internal.data.mjs +10 -10
  129. package/esm2020/decorators/base/property-decorator.data.mjs +1 -1
  130. package/esm2020/decorators/boolean/boolean-decorator-internal.data.mjs +3 -3
  131. package/esm2020/decorators/custom/custom-decorator-internal.data.mjs +26 -0
  132. package/esm2020/decorators/custom/custom-decorator.data.mjs +2 -0
  133. package/esm2020/decorators/custom/custom.decorator.mjs +13 -0
  134. package/esm2020/decorators/date/date-decorator-internal.data.mjs +48 -0
  135. package/esm2020/decorators/date/date-decorator.data.mjs +7 -0
  136. package/esm2020/decorators/date/date.decorator.mjs +21 -0
  137. package/esm2020/decorators/file/file-decorator-internal.data.mjs +98 -0
  138. package/esm2020/decorators/file/file-decorator.data.mjs +7 -0
  139. package/esm2020/decorators/file/file.decorator.mjs +22 -0
  140. package/esm2020/decorators/number/number-decorator-internal.data.mjs +1 -1
  141. package/esm2020/decorators/number/number-decorator.data.mjs +1 -1
  142. package/esm2020/decorators/number/number.decorator.mjs +3 -3
  143. package/esm2020/decorators/object/object-decorator-internal.data.mjs +2 -2
  144. package/esm2020/decorators/object/object-decorator.data.mjs +1 -1
  145. package/esm2020/decorators/object/object.decorator.mjs +1 -1
  146. package/esm2020/decorators/string/string-decorator-internal.data.mjs +1 -1
  147. package/esm2020/decorators/string/string-decorator.data.mjs +1 -1
  148. package/esm2020/decorators/string/string.decorator.mjs +1 -1
  149. package/esm2020/mocks/placeholder-data.png.mjs +3 -0
  150. package/esm2020/public-api.mjs +15 -5
  151. package/fesm2015/ngx-material-entity.mjs +2649 -422
  152. package/fesm2015/ngx-material-entity.mjs.map +1 -1
  153. package/fesm2020/ngx-material-entity.mjs +2537 -397
  154. package/fesm2020/ngx-material-entity.mjs.map +1 -1
  155. package/mocks/placeholder-data.png.d.ts +1 -0
  156. package/package.json +7 -1
  157. package/public-api.d.ts +15 -4
  158. package/classes/entity-model.class.d.ts +0 -9
  159. package/classes/entity-service.class.d.ts +0 -66
  160. package/esm2020/classes/base-builder.class.mjs +0 -43
  161. package/esm2020/classes/entity-model.class.mjs +0 -19
  162. package/esm2020/classes/entity-service.class.mjs +0 -76
  163. package/esm2020/classes/entity-utilities.class.mjs +0 -377
@@ -0,0 +1,23 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { string } from '../decorators/string/string.decorator';
3
+ import { EntityUtilities } from './entity.utilities';
4
+ /**
5
+ * A base Entity class with a builtin id.
6
+ */
7
+ export class Entity {
8
+ constructor(entity) {
9
+ EntityUtilities.new(this, entity);
10
+ }
11
+ }
12
+ __decorate([
13
+ string({
14
+ omitForCreate: true,
15
+ omitForUpdate: true,
16
+ display: false,
17
+ displayStyle: 'line',
18
+ displayName: 'ID',
19
+ required: true
20
+ }),
21
+ __metadata("design:type", String)
22
+ ], Entity.prototype, "id", void 0);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY2xhc3Nlcy9lbnRpdHkubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFZckQ7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLE1BQU07SUFjeEIsWUFBWSxNQUFlO1FBQ3ZCLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDSjtBQUxHO0lBUkMsTUFBTSxDQUFDO1FBQ0osYUFBYSxFQUFFLElBQUk7UUFDbkIsYUFBYSxFQUFFLElBQUk7UUFDbkIsT0FBTyxFQUFFLEtBQUs7UUFDZCxZQUFZLEVBQUUsTUFBTTtRQUNwQixXQUFXLEVBQUUsSUFBSTtRQUNqQixRQUFRLEVBQUUsSUFBSTtLQUNqQixDQUFDOztrQ0FDVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0cmluZyB9IGZyb20gJy4uL2RlY29yYXRvcnMvc3RyaW5nL3N0cmluZy5kZWNvcmF0b3InO1xuaW1wb3J0IHsgRW50aXR5VXRpbGl0aWVzIH0gZnJvbSAnLi9lbnRpdHkudXRpbGl0aWVzJztcblxuLyoqXG4gKiBUaGUgbmV3YWJsZSB0eXBlIHVzZWQgd2hlbmV2ZXIgYW4gZW50aXR5IGNsYXNzIGlzIHBhc3NlZCB0byBjcmVhdGUgYW4gZW50aXR5IGFuZCBpbml0aWFsaXplIGl0cyBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IHR5cGUgRW50aXR5Q2xhc3NOZXdhYmxlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4gPSBuZXcoZGF0YT86IEVudGl0eVR5cGUpID0+IEVudGl0eVR5cGU7XG5cbi8qKlxuICogVGhlIEdlbmVyaWMgQmFzZSBFbnRpdHlUeXBlLlxuICovXG5leHBvcnQgdHlwZSBCYXNlRW50aXR5VHlwZTxUPiA9IHsgW0sgaW4ga2V5b2YgVF06IHVua25vd24gfTtcblxuLyoqXG4gKiBBIGJhc2UgRW50aXR5IGNsYXNzIHdpdGggYSBidWlsdGluIGlkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRW50aXR5LlxuICAgICAqL1xuICAgIEBzdHJpbmcoe1xuICAgICAgICBvbWl0Rm9yQ3JlYXRlOiB0cnVlLFxuICAgICAgICBvbWl0Rm9yVXBkYXRlOiB0cnVlLFxuICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgZGlzcGxheVN0eWxlOiAnbGluZScsXG4gICAgICAgIGRpc3BsYXlOYW1lOiAnSUQnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0pXG4gICAgaWQhOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihlbnRpdHk/OiBFbnRpdHkpIHtcbiAgICAgICAgRW50aXR5VXRpbGl0aWVzLm5ldyh0aGlzLCBlbnRpdHkpO1xuICAgIH1cbn0iXX0=
@@ -0,0 +1,180 @@
1
+ import { BehaviorSubject, firstValueFrom } from 'rxjs';
2
+ import { EntityUtilities } from './entity.utilities';
3
+ import { LodashUtilities } from '../capsulation/lodash.utilities';
4
+ import { DecoratorTypes } from '../decorators/base/decorator-types.enum';
5
+ import { FileUtilities } from './file.utilities';
6
+ /**
7
+ * A generic EntityService class.
8
+ * Offers basic CRUD-functionality.
9
+ * You should create a service for every Entity you have.
10
+ * If you extend from this you need to make sure that the extended Service can be injected.
11
+ */
12
+ export class EntityService {
13
+ constructor(http) {
14
+ this.http = http;
15
+ /**
16
+ * The key which holds the id value.
17
+ *
18
+ * @default 'id'
19
+ */
20
+ this.idKey = 'id';
21
+ /**
22
+ * A subject of all the entity values.
23
+ * Can be subscribed to when you want to do a specific thing whenever the entities change.
24
+ */
25
+ this.entitiesSubject = new BehaviorSubject([]);
26
+ }
27
+ /**
28
+ * Gets the entities in an array from the internal entitiesSubject.
29
+ *
30
+ * @returns The current entities in form of an array.
31
+ */
32
+ get entities() {
33
+ return this.entitiesSubject.value;
34
+ }
35
+ /**
36
+ * Creates a new Entity and pushes it to the entities array.
37
+ *
38
+ * @param entity - The data of the entity to create.
39
+ * All values that should be omitted will be removed from it inside this method.
40
+ * @returns A Promise of the created entity.
41
+ */
42
+ async create(entity) {
43
+ const body = LodashUtilities.omit(entity, EntityUtilities.getOmitForCreate(entity));
44
+ const filePropertyKeys = EntityUtilities.getFileProperties(entity);
45
+ if (!filePropertyKeys.length) {
46
+ return await this.createWithJson(body);
47
+ }
48
+ else {
49
+ return await this.createWithFormData(body, filePropertyKeys, entity);
50
+ }
51
+ }
52
+ // TODO: Find a way to use blobs with jest
53
+ /* istanbul ignore next */
54
+ /**
55
+ * Creates the entity with form data when the entity contains files in contrast to creating it with a normal json body.
56
+ * All file values are stored inside their respective property key and their name.
57
+ * Form data is able to handle setting multiple files to the same key.
58
+ *
59
+ * @param body - The body Of the request.
60
+ * @param filePropertyKeys - All property keys that are files and need to be added to the form data.
61
+ * @param entity - The entity to create. This is needed in addition to the body because the body doesn't contain any metadata.
62
+ * @returns The created entity from the server.
63
+ */
64
+ async createWithFormData(body, filePropertyKeys, entity) {
65
+ const formData = new FormData();
66
+ formData.append('body', JSON.stringify(LodashUtilities.omit(body, filePropertyKeys)));
67
+ for (const key of filePropertyKeys) {
68
+ if (EntityUtilities.getPropertyMetadata(entity, key, DecoratorTypes.FILE_DEFAULT).multiple) {
69
+ const fileDataValues = body[key];
70
+ for (const value of fileDataValues) {
71
+ formData.append(key, (await FileUtilities.getFileData(value)).file, value.name);
72
+ }
73
+ }
74
+ else {
75
+ const fileData = body[key];
76
+ formData.append(key, (await FileUtilities.getFileData(fileData)).file, fileData.name);
77
+ }
78
+ }
79
+ const e = await firstValueFrom(this.http.post(this.baseUrl, formData));
80
+ this.entities.push(e);
81
+ this.entitiesSubject.next(this.entities);
82
+ return e;
83
+ }
84
+ /**
85
+ * Creates the entity with a normal json body in contrast to creating it with form data when the entity contains files.
86
+ *
87
+ * @param body - The body Of the request.
88
+ * @returns The created entity from the server.
89
+ */
90
+ async createWithJson(body) {
91
+ const e = await firstValueFrom(this.http.post(this.baseUrl, body));
92
+ this.entities.push(e);
93
+ this.entitiesSubject.next(this.entities);
94
+ return e;
95
+ }
96
+ /**
97
+ * Gets all existing entities and pushes them to the entities array.
98
+ *
99
+ * @returns A Promise of all received Entities.
100
+ */
101
+ async read() {
102
+ const e = await firstValueFrom(this.http.get(this.baseUrl));
103
+ this.entitiesSubject.next(e);
104
+ return e;
105
+ }
106
+ /**
107
+ * Updates a specific Entity.
108
+ *
109
+ * @param entity - The updated Entity
110
+ * All values that should be omitted will be removed from it inside this method.
111
+ * @param entityPriorChanges - The current Entity.
112
+ * It Is used to get changed values and only update them instead of sending the whole entity data.
113
+ */
114
+ async update(entity, entityPriorChanges) {
115
+ const body = LodashUtilities.omit(await EntityUtilities.difference(entity, entityPriorChanges), EntityUtilities.getOmitForUpdate(entity));
116
+ const filePropertyKeys = EntityUtilities.getFileProperties(entityPriorChanges);
117
+ if (!filePropertyKeys.length) {
118
+ await this.updateWithJson(body, entityPriorChanges[this.idKey]);
119
+ }
120
+ else {
121
+ await this.updateWithFormData(body, filePropertyKeys, entity, entityPriorChanges[this.idKey]);
122
+ }
123
+ }
124
+ // TODO: Find a way to use blobs with jest
125
+ /* istanbul ignore next */
126
+ /**
127
+ * Updates the entity with form data when the entity contains files in contrast to creating it with a normal json body.
128
+ * All file values are stored inside their respective property key and their name.
129
+ * Form data is able to handle setting multiple files to the same key.
130
+ *
131
+ * @param body - The request body. Already contains only properties that have changed.
132
+ * @param filePropertyKeys - The keys of all properties which are files and need to separately be appended to the form data.
133
+ * @param entity - The original entity. Is needed to get the metadata of all the files.
134
+ * @param id - The id of the entity to update.
135
+ */
136
+ async updateWithFormData(body, filePropertyKeys, entity, id) {
137
+ const formData = new FormData();
138
+ formData.append('body', JSON.stringify(LodashUtilities.omitBy(body, LodashUtilities.isNil)));
139
+ for (const key of filePropertyKeys) {
140
+ if (EntityUtilities.getPropertyMetadata(entity, key, DecoratorTypes.FILE_DEFAULT).multiple) {
141
+ // eslint-disable-next-line max-len
142
+ const fileDataValues = body[key];
143
+ for (const value of fileDataValues) {
144
+ formData.append(key, (await FileUtilities.getFileData(value)).file, value.name);
145
+ }
146
+ }
147
+ else {
148
+ // eslint-disable-next-line max-len
149
+ const fileData = body[key];
150
+ formData.append(key, (await FileUtilities.getFileData(fileData)).file, fileData.name);
151
+ }
152
+ }
153
+ const updatedEntity = await firstValueFrom(this.http.patch(`${this.baseUrl}/${id}`, formData));
154
+ this.entities[this.entities.findIndex(e => e[this.idKey] === id)] = updatedEntity;
155
+ this.entitiesSubject.next(this.entities);
156
+ }
157
+ /**
158
+ * Updates the entity with a normal json body in contrast to updating it with form data when the entity contains files.
159
+ *
160
+ * @param body - The body of the Request. Has already removed all unnecessary values.
161
+ * @param id - The id of the entity to update.
162
+ */
163
+ async updateWithJson(body, id) {
164
+ const updatedEntity = await firstValueFrom(this.http.patch(`${this.baseUrl}/${id}`, LodashUtilities.omitBy(body, LodashUtilities.isNil)));
165
+ this.entities[this.entities.findIndex(e => e[this.idKey] === id)] = updatedEntity;
166
+ this.entitiesSubject.next(this.entities);
167
+ }
168
+ /**
169
+ * Deletes a specific Entity.
170
+ *
171
+ * @param entity - The entity to delete.
172
+ */
173
+ async delete(entity) {
174
+ await firstValueFrom(this.http.delete(`${this.baseUrl}/${entity[this.idKey]}`));
175
+ // the == comparison instead of === is to catch ids that are numbers.
176
+ this.entities.splice(this.entities.findIndex(e => e[this.idKey] === entity[this.idKey]), 1);
177
+ this.entitiesSubject.next(this.entities);
178
+ }
179
+ }
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jbGFzc2VzL2VudGl0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUdqRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBZ0IsYUFBYTtJQW9DL0IsWUFBNkIsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQXRCN0M7Ozs7V0FJRztRQUNNLFVBQUssR0FBcUIsSUFBd0IsQ0FBQztRQUU1RDs7O1dBR0c7UUFDTSxvQkFBZSxHQUFrQyxJQUFJLGVBQWUsQ0FBZSxFQUFFLENBQUMsQ0FBQztJQVdoRCxDQUFDO0lBVGpEOzs7O09BSUc7SUFDSCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFJRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWtCO1FBQzNCLE1BQU0sSUFBSSxHQUF3QixlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQXdCLENBQUM7UUFDaEksTUFBTSxnQkFBZ0IsR0FBeUIsZUFBZSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7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LENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUNsRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWtCO1FBQzNCLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRW50aXR5VXRpbGl0aWVzIH0gZnJvbSAnLi9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IExvZGFzaFV0aWxpdGllcyB9IGZyb20gJy4uL2NhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgRGVjb3JhdG9yVHlwZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jhc2UvZGVjb3JhdG9yLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgRmlsZURhdGEgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBGaWxlVXRpbGl0aWVzIH0gZnJvbSAnLi9maWxlLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBCYXNlRW50aXR5VHlwZSB9IGZyb20gJy4vZW50aXR5Lm1vZGVsJztcblxuLyoqXG4gKiBBIGdlbmVyaWMgRW50aXR5U2VydmljZSBjbGFzcy5cbiAqIE9mZmVycyBiYXNpYyBDUlVELWZ1bmN0aW9uYWxpdHkuXG4gKiBZb3Ugc2hvdWxkIGNyZWF0ZSBhIHNlcnZpY2UgZm9yIGV2ZXJ5IEVudGl0eSB5b3UgaGF2ZS5cbiAqIElmIHlvdSBleHRlbmQgZnJvbSB0aGlzIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBleHRlbmRlZCBTZXJ2aWNlIGNhbiBiZSBpbmplY3RlZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVudGl0eVNlcnZpY2U8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgdXJsIHVzZWQgZm9yIGFwaSByZXF1ZXN0cy4gSWYgdSB3YW50IHRvIGhhdmUgbW9yZSBjb250cm9sIG92ZXIgdGhpcyxcbiAgICAgKiB5b3UgY2FuIG92ZXJyaWRlIHRoZSBjcmVhdGUsIHJlYWQsIHVwZGF0ZSBhbmQgZGVsZXRlIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgU2VuZHMgYSBQT1NULVJlcXVlc3QgdG8gYmFzZVVybC5cbiAgICAgKlxuICAgICAqIFJlYWQgU2VuZHMgYSBHRVQtUmVxdWVzdCB0byBiYXNlVXJsLlxuICAgICAqXG4gICAgICogVXBkYXRlIFNlbmRzIGEgUEFUQ0gtUmVxdWVzdCB0byBiYXNlVXJsL3tpZH0uXG4gICAgICpcbiAgICAgKiBEZWxldGUgU2VuZHMgYSBERUwtUmVxdWVzdCB0byBiYXNlVXJsL3tpZH0uXG4gICAgICovXG4gICAgYWJzdHJhY3QgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgd2hpY2ggaG9sZHMgdGhlIGlkIHZhbHVlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgJ2lkJ1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkS2V5OiBrZXlvZiBFbnRpdHlUeXBlID0gJ2lkJyBhcyBrZXlvZiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogQSBzdWJqZWN0IG9mIGFsbCB0aGUgZW50aXR5IHZhbHVlcy5cbiAgICAgKiBDYW4gYmUgc3Vic2NyaWJlZCB0byB3aGVuIHlvdSB3YW50IHRvIGRvIGEgc3BlY2lmaWMgdGhpbmcgd2hlbmV2ZXIgdGhlIGVudGl0aWVzIGNoYW5nZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbnRpdGllc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxFbnRpdHlUeXBlW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFbnRpdHlUeXBlW10+KFtdKTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVudGl0aWVzIGluIGFuIGFycmF5IGZyb20gdGhlIGludGVybmFsIGVudGl0aWVzU3ViamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGVudGl0aWVzIGluIGZvcm0gb2YgYW4gYXJyYXkuXG4gICAgICovXG4gICAgZ2V0IGVudGl0aWVzKCk6IEVudGl0eVR5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0aWVzU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQpIHt9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEVudGl0eSBhbmQgcHVzaGVzIGl0IHRvIHRoZSBlbnRpdGllcyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZGF0YSBvZiB0aGUgZW50aXR5IHRvIGNyZWF0ZS5cbiAgICAgKiBBbGwgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgd2lsbCBiZSByZW1vdmVkIGZyb20gaXQgaW5zaWRlIHRoaXMgbWV0aG9kLlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBvZiB0aGUgY3JlYXRlZCBlbnRpdHkuXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlKGVudGl0eTogRW50aXR5VHlwZSk6IFByb21pc2U8RW50aXR5VHlwZT4ge1xuICAgICAgICBjb25zdCBib2R5OiBQYXJ0aWFsPEVudGl0eVR5cGU+ID0gTG9kYXNoVXRpbGl0aWVzLm9taXQoZW50aXR5LCBFbnRpdHlVdGlsaXRpZXMuZ2V0T21pdEZvckNyZWF0ZShlbnRpdHkpKSBhcyBQYXJ0aWFsPEVudGl0eVR5cGU+O1xuICAgICAgICBjb25zdCBmaWxlUHJvcGVydHlLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IEVudGl0eVV0aWxpdGllcy5nZXRGaWxlUHJvcGVydGllcyhlbnRpdHkpO1xuICAgICAgICBpZiAoIWZpbGVQcm9wZXJ0eUtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVXaXRoSnNvbihib2R5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVdpdGhGb3JtRGF0YShib2R5LCBmaWxlUHJvcGVydHlLZXlzLCBlbnRpdHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byB1c2UgYmxvYnMgd2l0aCBqZXN0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBlbnRpdHkgd2l0aCBmb3JtIGRhdGEgd2hlbiB0aGUgZW50aXR5IGNvbnRhaW5zIGZpbGVzIGluIGNvbnRyYXN0IHRvIGNyZWF0aW5nIGl0IHdpdGggYSBub3JtYWwganNvbiBib2R5LlxuICAgICAqIEFsbCBmaWxlIHZhbHVlcyBhcmUgc3RvcmVkIGluc2lkZSB0aGVpciByZXNwZWN0aXZlIHByb3BlcnR5IGtleSBhbmQgdGhlaXIgbmFtZS5cbiAgICAgKiBGb3JtIGRhdGEgaXMgYWJsZSB0byBoYW5kbGUgc2V0dGluZyBtdWx0aXBsZSBmaWxlcyB0byB0aGUgc2FtZSBrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYm9keSAtIFRoZSBib2R5IE9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBmaWxlUHJvcGVydHlLZXlzIC0gQWxsIHByb3BlcnR5IGtleXMgdGhhdCBhcmUgZmlsZXMgYW5kIG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlIGZvcm0gZGF0YS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBjcmVhdGUuIFRoaXMgaXMgbmVlZGVkIGluIGFkZGl0aW9uIHRvIHRoZSBib2R5IGJlY2F1c2UgdGhlIGJvZHkgZG9lc24ndCBjb250YWluIGFueSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBlbnRpdHkgZnJvbSB0aGUgc2VydmVyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBjcmVhdGVXaXRoRm9ybURhdGEoXG4gICAgICAgIGJvZHk6IFBhcnRpYWw8RW50aXR5VHlwZT4sXG4gICAgICAgIGZpbGVQcm9wZXJ0eUtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdLFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGVcbiAgICApOiBQcm9taXNlPEVudGl0eVR5cGU+IHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdib2R5JywgSlNPTi5zdHJpbmdpZnkoTG9kYXNoVXRpbGl0aWVzLm9taXQoYm9keSwgZmlsZVByb3BlcnR5S2V5cykpKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZmlsZVByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgaWYgKEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5LCBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQpLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZURhdGFWYWx1ZXM6IEZpbGVEYXRhW10gPSBib2R5W2tleV0gYXMgRmlsZURhdGFbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGZpbGVEYXRhVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXkgYXMgc3RyaW5nLCAoYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRGF0YSh2YWx1ZSkpLmZpbGUsIHZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVEYXRhOiBGaWxlRGF0YSA9IGJvZHlba2V5XSBhcyBGaWxlRGF0YTtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5IGFzIHN0cmluZywgKGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEoZmlsZURhdGEpKS5maWxlLCBmaWxlRGF0YS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLnBvc3Q8RW50aXR5VHlwZT4odGhpcy5iYXNlVXJsLCBmb3JtRGF0YSkpO1xuICAgICAgICB0aGlzLmVudGl0aWVzLnB1c2goZSk7XG4gICAgICAgIHRoaXMuZW50aXRpZXNTdWJqZWN0Lm5leHQodGhpcy5lbnRpdGllcyk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGVudGl0eSB3aXRoIGEgbm9ybWFsIGpzb24gYm9keSBpbiBjb250cmFzdCB0byBjcmVhdGluZyBpdCB3aXRoIGZvcm0gZGF0YSB3aGVuIHRoZSBlbnRpdHkgY29udGFpbnMgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYm9keSAtIFRoZSBib2R5IE9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGVudGl0eSBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVdpdGhKc29uKGJvZHk6IFBhcnRpYWw8RW50aXR5VHlwZT4pOiBQcm9taXNlPEVudGl0eVR5cGU+IHtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuaHR0cC5wb3N0PEVudGl0eVR5cGU+KHRoaXMuYmFzZVVybCwgYm9keSkpO1xuICAgICAgICB0aGlzLmVudGl0aWVzLnB1c2goZSk7XG4gICAgICAgIHRoaXMuZW50aXRpZXNTdWJqZWN0Lm5leHQodGhpcy5lbnRpdGllcyk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGV4aXN0aW5nIGVudGl0aWVzIGFuZCBwdXNoZXMgdGhlbSB0byB0aGUgZW50aXRpZXMgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2Ugb2YgYWxsIHJlY2VpdmVkIEVudGl0aWVzLlxuICAgICAqL1xuICAgIGFzeW5jIHJlYWQoKTogUHJvbWlzZTxFbnRpdHlUeXBlW10+IHtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8RW50aXR5VHlwZVtdPih0aGlzLmJhc2VVcmwpKTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1N1YmplY3QubmV4dChlKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhIHNwZWNpZmljIEVudGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgdXBkYXRlZCBFbnRpdHlcbiAgICAgKiBBbGwgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgd2lsbCBiZSByZW1vdmVkIGZyb20gaXQgaW5zaWRlIHRoaXMgbWV0aG9kLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgY3VycmVudCBFbnRpdHkuXG4gICAgICogSXQgSXMgdXNlZCB0byBnZXQgY2hhbmdlZCB2YWx1ZXMgYW5kIG9ubHkgdXBkYXRlIHRoZW0gaW5zdGVhZCBvZiBzZW5kaW5nIHRoZSB3aG9sZSBlbnRpdHkgZGF0YS5cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGUoZW50aXR5OiBFbnRpdHlUeXBlLCBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYm9keTogUGFydGlhbDxFbnRpdHlUeXBlPiA9IExvZGFzaFV0aWxpdGllcy5vbWl0KFxuICAgICAgICAgICAgYXdhaXQgRW50aXR5VXRpbGl0aWVzLmRpZmZlcmVuY2UoZW50aXR5LCBlbnRpdHlQcmlvckNoYW5nZXMpLFxuICAgICAgICAgICAgRW50aXR5VXRpbGl0aWVzLmdldE9taXRGb3JVcGRhdGUoZW50aXR5KVxuICAgICAgICApIGFzIHVua25vd24gYXMgUGFydGlhbDxFbnRpdHlUeXBlPjtcbiAgICAgICAgY29uc3QgZmlsZVByb3BlcnR5S2V5cyA9IEVudGl0eVV0aWxpdGllcy5nZXRGaWxlUHJvcGVydGllcyhlbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICBpZiAoIWZpbGVQcm9wZXJ0eUtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVdpdGhKc29uKGJvZHksIGVudGl0eVByaW9yQ2hhbmdlc1t0aGlzLmlkS2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVdpdGhGb3JtRGF0YShib2R5LCBmaWxlUHJvcGVydHlLZXlzLCBlbnRpdHksIGVudGl0eVByaW9yQ2hhbmdlc1t0aGlzLmlkS2V5XSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHVzZSBibG9icyB3aXRoIGplc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGVudGl0eSB3aXRoIGZvcm0gZGF0YSB3aGVuIHRoZSBlbnRpdHkgY29udGFpbnMgZmlsZXMgaW4gY29udHJhc3QgdG8gY3JlYXRpbmcgaXQgd2l0aCBhIG5vcm1hbCBqc29uIGJvZHkuXG4gICAgICogQWxsIGZpbGUgdmFsdWVzIGFyZSBzdG9yZWQgaW5zaWRlIHRoZWlyIHJlc3BlY3RpdmUgcHJvcGVydHkga2V5IGFuZCB0aGVpciBuYW1lLlxuICAgICAqIEZvcm0gZGF0YSBpcyBhYmxlIHRvIGhhbmRsZSBzZXR0aW5nIG11bHRpcGxlIGZpbGVzIHRvIHRoZSBzYW1lIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5IC0gVGhlIHJlcXVlc3QgYm9keS4gQWxyZWFkeSBjb250YWlucyBvbmx5IHByb3BlcnRpZXMgdGhhdCBoYXZlIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIGZpbGVQcm9wZXJ0eUtleXMgLSBUaGUga2V5cyBvZiBhbGwgcHJvcGVydGllcyB3aGljaCBhcmUgZmlsZXMgYW5kIG5lZWQgdG8gc2VwYXJhdGVseSBiZSBhcHBlbmRlZCB0byB0aGUgZm9ybSBkYXRhLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgb3JpZ2luYWwgZW50aXR5LiBJcyBuZWVkZWQgdG8gZ2V0IHRoZSBtZXRhZGF0YSBvZiBhbGwgdGhlIGZpbGVzLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgZW50aXR5IHRvIHVwZGF0ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlV2l0aEZvcm1EYXRhKFxuICAgICAgICBib2R5OiBQYXJ0aWFsPEVudGl0eVR5cGU+LFxuICAgICAgICBmaWxlUHJvcGVydHlLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBpZDogRW50aXR5VHlwZVtrZXlvZiBFbnRpdHlUeXBlXVxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2JvZHknLCBKU09OLnN0cmluZ2lmeShMb2Rhc2hVdGlsaXRpZXMub21pdEJ5KGJvZHksIExvZGFzaFV0aWxpdGllcy5pc05pbCkpKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZmlsZVByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgaWYgKEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5LCBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQpLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlRGF0YVZhbHVlcyA9IGJvZHlba2V5XSBhcyBGaWxlRGF0YVtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZmlsZURhdGFWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSBhcyBzdHJpbmcsIChhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKHZhbHVlKSkuZmlsZSwgdmFsdWUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlRGF0YSA9IGJvZHlba2V5XSBhcyBGaWxlRGF0YTtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5IGFzIHN0cmluZywgKGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEoZmlsZURhdGEpKS5maWxlLCBmaWxlRGF0YS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVkRW50aXR5ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICB0aGlzLmh0dHAucGF0Y2g8RW50aXR5VHlwZT4oYCR7dGhpcy5iYXNlVXJsfS8ke2lkfWAsIGZvcm1EYXRhKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVudGl0aWVzW3RoaXMuZW50aXRpZXMuZmluZEluZGV4KGUgPT4gZVt0aGlzLmlkS2V5XSA9PT0gaWQpXSA9IHVwZGF0ZWRFbnRpdHk7XG4gICAgICAgIHRoaXMuZW50aXRpZXNTdWJqZWN0Lm5leHQodGhpcy5lbnRpdGllcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZW50aXR5IHdpdGggYSBub3JtYWwganNvbiBib2R5IGluIGNvbnRyYXN0IHRvIHVwZGF0aW5nIGl0IHdpdGggZm9ybSBkYXRhIHdoZW4gdGhlIGVudGl0eSBjb250YWlucyBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5IC0gVGhlIGJvZHkgb2YgdGhlIFJlcXVlc3QuIEhhcyBhbHJlYWR5IHJlbW92ZWQgYWxsIHVubmVjZXNzYXJ5IHZhbHVlcy5cbiAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIGVudGl0eSB0byB1cGRhdGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVdpdGhKc29uKGJvZHk6IFBhcnRpYWw8RW50aXR5VHlwZT4sIGlkOiBFbnRpdHlUeXBlW2tleW9mIEVudGl0eVR5cGVdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRFbnRpdHkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICAgIHRoaXMuaHR0cC5wYXRjaDxFbnRpdHlUeXBlPihcbiAgICAgICAgICAgICAgICBgJHt0aGlzLmJhc2VVcmx9LyR7aWR9YCxcbiAgICAgICAgICAgICAgICBMb2Rhc2hVdGlsaXRpZXMub21pdEJ5KGJvZHksIExvZGFzaFV0aWxpdGllcy5pc05pbClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1t0aGlzLmVudGl0aWVzLmZpbmRJbmRleChlID0+IGVbdGhpcy5pZEtleV0gPT09IGlkKV0gPSB1cGRhdGVkRW50aXR5O1xuICAgICAgICB0aGlzLmVudGl0aWVzU3ViamVjdC5uZXh0KHRoaXMuZW50aXRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgYSBzcGVjaWZpYyBFbnRpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBkZWxldGUuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlKGVudGl0eTogRW50aXR5VHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmh0dHAuZGVsZXRlPHZvaWQ+KGAke3RoaXMuYmFzZVVybH0vJHtlbnRpdHlbdGhpcy5pZEtleV19YCkpO1xuICAgICAgICAvLyB0aGUgPT0gY29tcGFyaXNvbiBpbnN0ZWFkIG9mID09PSBpcyB0byBjYXRjaCBpZHMgdGhhdCBhcmUgbnVtYmVycy5cbiAgICAgICAgdGhpcy5lbnRpdGllcy5zcGxpY2UodGhpcy5lbnRpdGllcy5maW5kSW5kZXgoZSA9PiBlW3RoaXMuaWRLZXldID09PSBlbnRpdHlbdGhpcy5pZEtleV0pLCAxKTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1N1YmplY3QubmV4dCh0aGlzLmVudGl0aWVzKTtcbiAgICB9XG59Il19