@metigan/angular 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 (48) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +581 -0
  3. package/dist/LICENSE +22 -0
  4. package/dist/README.md +581 -0
  5. package/dist/esm2022/metigan-angular.mjs +5 -0
  6. package/dist/esm2022/public-api.mjs +21 -0
  7. package/dist/esm2022/src/lib/audiences.service.mjs +157 -0
  8. package/dist/esm2022/src/lib/config.mjs +30 -0
  9. package/dist/esm2022/src/lib/contacts.service.mjs +267 -0
  10. package/dist/esm2022/src/lib/email.service.mjs +267 -0
  11. package/dist/esm2022/src/lib/errors.mjs +40 -0
  12. package/dist/esm2022/src/lib/forms.service.mjs +180 -0
  13. package/dist/esm2022/src/lib/http-client.service.mjs +111 -0
  14. package/dist/esm2022/src/lib/metigan.module.mjs +67 -0
  15. package/dist/esm2022/src/lib/metigan.service.mjs +72 -0
  16. package/dist/esm2022/src/lib/templates.service.mjs +85 -0
  17. package/dist/esm2022/src/lib/types.mjs +6 -0
  18. package/dist/fesm2022/metigan-angular.mjs +1241 -0
  19. package/dist/fesm2022/metigan-angular.mjs.map +1 -0
  20. package/dist/index.d.ts +5 -0
  21. package/dist/public-api.d.ts +15 -0
  22. package/dist/src/lib/audiences.service.d.ts +62 -0
  23. package/dist/src/lib/config.d.ts +28 -0
  24. package/dist/src/lib/contacts.service.d.ts +80 -0
  25. package/dist/src/lib/email.service.d.ts +44 -0
  26. package/dist/src/lib/errors.d.ts +24 -0
  27. package/dist/src/lib/forms.service.d.ts +67 -0
  28. package/dist/src/lib/http-client.service.d.ts +46 -0
  29. package/dist/src/lib/metigan.module.d.ts +27 -0
  30. package/dist/src/lib/metigan.service.d.ts +27 -0
  31. package/dist/src/lib/templates.service.d.ts +36 -0
  32. package/dist/src/lib/types.d.ts +329 -0
  33. package/examples/basic.component.ts +113 -0
  34. package/ng-package.json +8 -0
  35. package/package.json +68 -0
  36. package/public-api.ts +26 -0
  37. package/src/lib/audiences.service.ts +230 -0
  38. package/src/lib/config.ts +35 -0
  39. package/src/lib/contacts.service.ts +377 -0
  40. package/src/lib/email.service.ts +286 -0
  41. package/src/lib/errors.ts +45 -0
  42. package/src/lib/forms.service.ts +263 -0
  43. package/src/lib/http-client.service.ts +156 -0
  44. package/src/lib/metigan.module.ts +55 -0
  45. package/src/lib/metigan.service.ts +80 -0
  46. package/src/lib/templates.service.ts +103 -0
  47. package/src/lib/types.ts +398 -0
  48. package/tsconfig.json +38 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Metigan Audiences Service
3
+ * Service for audience/list management
4
+ */
5
+ import { Injectable } from '@angular/core';
6
+ import { throwError } from 'rxjs';
7
+ import { HttpParams } from '@angular/common/http';
8
+ import { API_URL, DEFAULT_TIMEOUT, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY } from './config';
9
+ import { ValidationError, MetiganError } from './errors';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./http-client.service";
12
+ export class MetiganAudiencesService {
13
+ http;
14
+ apiKey = '';
15
+ apiUrl = API_URL;
16
+ timeout = DEFAULT_TIMEOUT;
17
+ retryCount = DEFAULT_RETRY_COUNT;
18
+ retryDelay = DEFAULT_RETRY_DELAY;
19
+ constructor(http) {
20
+ this.http = http;
21
+ }
22
+ /**
23
+ * Initialize the service with API key and options
24
+ */
25
+ initialize(apiKey, options) {
26
+ if (!apiKey) {
27
+ throw new MetiganError('API key is required');
28
+ }
29
+ this.apiKey = apiKey;
30
+ this.apiUrl = options?.apiUrl || API_URL;
31
+ this.timeout = options?.timeout || DEFAULT_TIMEOUT;
32
+ this.retryCount = options?.retryCount || DEFAULT_RETRY_COUNT;
33
+ this.retryDelay = options?.retryDelay || DEFAULT_RETRY_DELAY;
34
+ }
35
+ /**
36
+ * Get default headers
37
+ */
38
+ getHeaders() {
39
+ return {
40
+ 'Content-Type': 'application/json',
41
+ 'x-api-key': this.apiKey,
42
+ 'User-Agent': 'AngularSDK/1.0'
43
+ };
44
+ }
45
+ /**
46
+ * Create a new audience
47
+ */
48
+ create(options) {
49
+ if (!this.apiKey) {
50
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
51
+ }
52
+ if (!options.name) {
53
+ return throwError(() => new ValidationError('Audience name is required'));
54
+ }
55
+ return this.http.post(`${this.apiUrl}/api/audiences`, options, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
56
+ }
57
+ /**
58
+ * Get audience by ID
59
+ */
60
+ get(audienceId) {
61
+ if (!this.apiKey) {
62
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
63
+ }
64
+ if (!audienceId) {
65
+ return throwError(() => new ValidationError('Audience ID is required'));
66
+ }
67
+ return this.http.get(`${this.apiUrl}/api/audiences/${audienceId}`, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
68
+ }
69
+ /**
70
+ * Update an audience
71
+ */
72
+ update(audienceId, options) {
73
+ if (!this.apiKey) {
74
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
75
+ }
76
+ if (!audienceId) {
77
+ return throwError(() => new ValidationError('Audience ID is required'));
78
+ }
79
+ return this.http.put(`${this.apiUrl}/api/audiences/${audienceId}`, options, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
80
+ }
81
+ /**
82
+ * Delete an audience
83
+ */
84
+ delete(audienceId) {
85
+ if (!this.apiKey) {
86
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
87
+ }
88
+ if (!audienceId) {
89
+ return throwError(() => new ValidationError('Audience ID is required'));
90
+ }
91
+ return this.http.delete(`${this.apiUrl}/api/audiences/${audienceId}`, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
92
+ }
93
+ /**
94
+ * List all audiences
95
+ */
96
+ list(options) {
97
+ if (!this.apiKey) {
98
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
99
+ }
100
+ let params = new HttpParams();
101
+ if (options?.page) {
102
+ params = params.set('page', options.page.toString());
103
+ }
104
+ if (options?.limit) {
105
+ params = params.set('limit', options.limit.toString());
106
+ }
107
+ return this.http.get(`${this.apiUrl}/api/audiences`, {
108
+ headers: this.getHeaders(),
109
+ params: params
110
+ }, this.retryCount, this.retryDelay);
111
+ }
112
+ /**
113
+ * Get audience statistics
114
+ */
115
+ getStats(audienceId) {
116
+ if (!this.apiKey) {
117
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
118
+ }
119
+ if (!audienceId) {
120
+ return throwError(() => new ValidationError('Audience ID is required'));
121
+ }
122
+ return this.http.get(`${this.apiUrl}/api/audiences/${audienceId}/stats`, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
123
+ }
124
+ /**
125
+ * Clean audience (remove bounced/unsubscribed contacts)
126
+ */
127
+ clean(audienceId) {
128
+ if (!this.apiKey) {
129
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
130
+ }
131
+ if (!audienceId) {
132
+ return throwError(() => new ValidationError('Audience ID is required'));
133
+ }
134
+ return this.http.post(`${this.apiUrl}/api/audiences/${audienceId}/clean`, {}, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
135
+ }
136
+ /**
137
+ * Merge audiences (source into target)
138
+ */
139
+ merge(sourceAudienceId, targetAudienceId) {
140
+ if (!this.apiKey) {
141
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
142
+ }
143
+ if (!sourceAudienceId || !targetAudienceId) {
144
+ return throwError(() => new ValidationError('Source and target audience IDs are required'));
145
+ }
146
+ return this.http.post(`${this.apiUrl}/api/audiences/${sourceAudienceId}/merge`, { targetAudienceId }, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
147
+ }
148
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MetiganAudiencesService, deps: [{ token: i1.MetiganHttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
149
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MetiganAudiencesService, providedIn: 'root' });
150
+ }
151
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MetiganAudiencesService, decorators: [{
152
+ type: Injectable,
153
+ args: [{
154
+ providedIn: 'root'
155
+ }]
156
+ }], ctorParameters: () => [{ type: i1.MetiganHttpClient }] });
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaWVuY2VzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2F1ZGllbmNlcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDOUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQWF6RCxNQUFNLE9BQU8sdUJBQXVCO0lBT2Q7SUFOWixNQUFNLEdBQVcsRUFBRSxDQUFDO0lBQ3BCLE1BQU0sR0FBVyxPQUFPLENBQUM7SUFDekIsT0FBTyxHQUFXLGVBQWUsQ0FBQztJQUNsQyxVQUFVLEdBQVcsbUJBQW1CLENBQUM7SUFDekMsVUFBVSxHQUFXLG1CQUFtQixDQUFDO0lBRWpELFlBQW9CLElBQXVCO1FBQXZCLFNBQUksR0FBSixJQUFJLENBQW1CO0lBQUcsQ0FBQztJQUUvQzs7T0FFRztJQUNILFVBQVUsQ0FBQyxNQUFjLEVBQUUsT0FBeUY7UUFDbEgsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxFQUFFLE9BQU8sSUFBSSxlQUFlLENBQUM7UUFDbkQsSUFB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LElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUM5QixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZ0JBQXdCLEVBQUUsZ0JBQXdCO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsbURBQW1ELENBQUMsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNDLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksZUFBZSxDQUFDLDZDQUE2QyxDQUFDLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsR0FBRyxJQUFJLENBQUMsTUFBTSxrQkFBa0IsZ0JBQWdCLFFBQVEsRUFDeEQsRUFBRSxnQkFBZ0IsRUFBRSxFQUNwQixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFDOUIsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO0lBQ0osQ0FBQzt3R0E1TVUsdUJBQXVCOzRHQUF2Qix1QkFBdUIsY0FGdEIsTUFBTTs7NEZBRVAsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBNZXRpZ2FuIEF1ZGllbmNlcyBTZXJ2aWNlXHJcbiAqIFNlcnZpY2UgZm9yIGF1ZGllbmNlL2xpc3QgbWFuYWdlbWVudFxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBNZXRpZ2FuSHR0cENsaWVudCB9IGZyb20gJy4vaHR0cC1jbGllbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEFQSV9VUkwsIERFRkFVTFRfVElNRU9VVCwgREVGQVVMVF9SRVRSWV9DT1VOVCwgREVGQVVMVF9SRVRSWV9ERUxBWSB9IGZyb20gJy4vY29uZmlnJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yLCBNZXRpZ2FuRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XHJcbmltcG9ydCB7XHJcbiAgQXVkaWVuY2UsXHJcbiAgQ3JlYXRlQXVkaWVuY2VPcHRpb25zLFxyXG4gIFVwZGF0ZUF1ZGllbmNlT3B0aW9ucyxcclxuICBBdWRpZW5jZUxpc3RSZXNwb25zZSxcclxuICBBdWRpZW5jZVN0YXRzLFxyXG4gIFBhZ2luYXRpb25PcHRpb25zXHJcbn0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZXRpZ2FuQXVkaWVuY2VzU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBhcGlLZXk6IHN0cmluZyA9ICcnO1xyXG4gIHByaXZhdGUgYXBpVXJsOiBzdHJpbmcgPSBBUElfVVJMO1xyXG4gIHByaXZhdGUgdGltZW91dDogbnVtYmVyID0gREVGQVVMVF9USU1FT1VUO1xyXG4gIHByaXZhdGUgcmV0cnlDb3VudDogbnVtYmVyID0gREVGQVVMVF9SRVRSWV9DT1VOVDtcclxuICBwcml2YXRlIHJldHJ5RGVsYXk6IG51bWJlciA9IERFRkFVTFRfUkVUUllfREVMQVk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogTWV0aWdhbkh0dHBDbGllbnQpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemUgdGhlIHNlcnZpY2Ugd2l0aCBBUEkga2V5IGFuZCBvcHRpb25zXHJcbiAgICovXHJcbiAgaW5pdGlhbGl6ZShhcGlLZXk6IHN0cmluZywgb3B0aW9ucz86IHsgYXBpVXJsPzogc3RyaW5nOyB0aW1lb3V0PzogbnVtYmVyOyByZXRyeUNvdW50PzogbnVtYmVyOyByZXRyeURlbGF5PzogbnVtYmVyIH0pOiB2b2lkIHtcclxuICAgIGlmICghYXBpS2V5KSB7XHJcbiAgICAgIHRocm93IG5ldyBNZXRpZ2FuRXJyb3IoJ0FQSSBrZXkgaXMgcmVxdWlyZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFwaUtleSA9IGFwaUtleTtcclxuICAgIHRoaXMuYXBpVXJsID0gb3B0aW9ucz8uYXBpVXJsIHx8IEFQSV9VUkw7XHJcbiAgICB0aGlzLnRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0IHx8IERFRkFVTFRfVElNRU9VVDtcclxuICAgIHRoaXMucmV0cnlDb3VudCA9IG9wdGlvbnM/LnJldHJ5Q291bnQgfHwgREVGQVVMVF9SRVRSWV9DT1VOVDtcclxuICAgIHRoaXMucmV0cnlEZWxheSA9IG9wdGlvbnM/LnJldHJ5RGVsYXkgfHwgREVGQVVMVF9SRVRSWV9ERUxBWTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkZWZhdWx0IGhlYWRlcnNcclxuICAgKi9cclxuICBwcml2YXRlIGdldEhlYWRlcnMoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ0FuZ3VsYXJTREsvMS4wJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIG5ldyBhdWRpZW5jZVxyXG4gICAqL1xyXG4gIGNyZWF0ZShvcHRpb25zOiBDcmVhdGVBdWRpZW5jZU9wdGlvbnMpOiBPYnNlcnZhYmxlPEF1ZGllbmNlPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpS2V5KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBNZXRpZ2FuRXJyb3IoJ1NlcnZpY2Ugbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXRpYWxpemUoKSBmaXJzdC4nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFvcHRpb25zLm5hbWUpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IFZhbGlkYXRpb25FcnJvcignQXVkaWVuY2UgbmFtZSBpcyByZXF1aXJlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXVkaWVuY2U+KFxyXG4gICAgICBgJHt0aGlzLmFwaVVybH0vYXBpL2F1ZGllbmNlc2AsXHJcbiAgICAgIG9wdGlvbnMsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfSxcclxuICAgICAgdGhpcy5yZXRyeUNvdW50LFxyXG4gICAgICB0aGlzLnJldHJ5RGVsYXlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYXVkaWVuY2UgYnkgSURcclxuICAgKi9cclxuICBnZXQoYXVkaWVuY2VJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBdWRpZW5jZT4ge1xyXG4gICAgaWYgKCF0aGlzLmFwaUtleSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTWV0aWdhbkVycm9yKCdTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghYXVkaWVuY2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdBdWRpZW5jZSBJRCBpcyByZXF1aXJlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBdWRpZW5jZT4oXHJcbiAgICAgIGAke3RoaXMuYXBpVXJsfS9hcGkvYXVkaWVuY2VzLyR7YXVkaWVuY2VJZH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpIH0sXHJcbiAgICAgIHRoaXMucmV0cnlDb3VudCxcclxuICAgICAgdGhpcy5yZXRyeURlbGF5XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGFuIGF1ZGllbmNlXHJcbiAgICovXHJcbiAgdXBkYXRlKGF1ZGllbmNlSWQ6IHN0cmluZywgb3B0aW9uczogVXBkYXRlQXVkaWVuY2VPcHRpb25zKTogT2JzZXJ2YWJsZTxBdWRpZW5jZT4ge1xyXG4gICAgaWYgKCF0aGlzLmFwaUtleSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTWV0aWdhbkVycm9yKCdTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghYXVkaWVuY2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdBdWRpZW5jZSBJRCBpcyByZXF1aXJlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBdWRpZW5jZT4oXHJcbiAgICAgIGAke3RoaXMuYXBpVXJsfS9hcGkvYXVkaWVuY2VzLyR7YXVkaWVuY2VJZH1gLFxyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpIH0sXHJcbiAgICAgIHRoaXMucmV0cnlDb3VudCxcclxuICAgICAgdGhpcy5yZXRyeURlbGF5XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIGFuIGF1ZGllbmNlXHJcbiAgICovXHJcbiAgZGVsZXRlKGF1ZGllbmNlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLmFwaUtleSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTWV0aWdhbkVycm9yKCdTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghYXVkaWVuY2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdBdWRpZW5jZSBJRCBpcyByZXF1aXJlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTx2b2lkPihcclxuICAgICAgYCR7dGhpcy5hcGlVcmx9L2FwaS9hdWRpZW5jZXMvJHthdWRpZW5jZUlkfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfSxcclxuICAgICAgdGhpcy5yZXRyeUNvdW50LFxyXG4gICAgICB0aGlzLnJldHJ5RGVsYXlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0IGFsbCBhdWRpZW5jZXNcclxuICAgKi9cclxuICBsaXN0KG9wdGlvbnM/OiBQYWdpbmF0aW9uT3B0aW9ucyk6IE9ic2VydmFibGU8QXVkaWVuY2VMaXN0UmVzcG9uc2U+IHtcclxuICAgIGlmICghdGhpcy5hcGlLZXkpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IE1ldGlnYW5FcnJvcignU2VydmljZSBub3QgaW5pdGlhbGl6ZWQuIENhbGwgaW5pdGlhbGl6ZSgpIGZpcnN0LicpKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChvcHRpb25zPy5wYWdlKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3BhZ2UnLCBvcHRpb25zLnBhZ2UudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucz8ubGltaXQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbGltaXQnLCBvcHRpb25zLmxpbWl0LnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEF1ZGllbmNlTGlzdFJlc3BvbnNlPihcclxuICAgICAgYCR7dGhpcy5hcGlVcmx9L2FwaS9hdWRpZW5jZXNgLFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXHJcbiAgICAgICAgcGFyYW1zOiBwYXJhbXNcclxuICAgICAgfSxcclxuICAgICAgdGhpcy5yZXRyeUNvdW50LFxyXG4gICAgICB0aGlzLnJldHJ5RGVsYXlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYXVkaWVuY2Ugc3RhdGlzdGljc1xyXG4gICAqL1xyXG4gIGdldFN0YXRzKGF1ZGllbmNlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXVkaWVuY2VTdGF0cz4ge1xyXG4gICAgaWYgKCF0aGlzLmFwaUtleSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTWV0aWdhbkVycm9yKCdTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghYXVkaWVuY2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdBdWRpZW5jZSBJRCBpcyByZXF1aXJlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBdWRpZW5jZVN0YXRzPihcclxuICAgICAgYCR7dGhpcy5hcGlVcmx9L2FwaS9hdWRpZW5jZXMvJHthdWRpZW5jZUlkfS9zdGF0c2AsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfSxcclxuICAgICAgdGhpcy5yZXRyeUNvdW50LFxyXG4gICAgICB0aGlzLnJldHJ5RGVsYXlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhbiBhdWRpZW5jZSAocmVtb3ZlIGJvdW5jZWQvdW5zdWJzY3JpYmVkIGNvbnRhY3RzKVxyXG4gICAqL1xyXG4gIGNsZWFuKGF1ZGllbmNlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8eyByZW1vdmVkOiBudW1iZXIgfT4ge1xyXG4gICAgaWYgKCF0aGlzLmFwaUtleSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTWV0aWdhbkVycm9yKCdTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghYXVkaWVuY2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdBdWRpZW5jZSBJRCBpcyByZXF1aXJlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8eyByZW1vdmVkOiBudW1iZXIgfT4oXHJcbiAgICAgIGAke3RoaXMuYXBpVXJsfS9hcGkvYXVkaWVuY2VzLyR7YXVkaWVuY2VJZH0vY2xlYW5gLFxyXG4gICAgICB7fSxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSB9LFxyXG4gICAgICB0aGlzLnJldHJ5Q291bnQsXHJcbiAgICAgIHRoaXMucmV0cnlEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1lcmdlIGF1ZGllbmNlcyAoc291cmNlIGludG8gdGFyZ2V0KVxyXG4gICAqL1xyXG4gIG1lcmdlKHNvdXJjZUF1ZGllbmNlSWQ6IHN0cmluZywgdGFyZ2V0QXVkaWVuY2VJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBdWRpZW5jZT4ge1xyXG4gICAgaWYgKCF0aGlzLmFwaUtleSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTWV0aWdhbkVycm9yKCdTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghc291cmNlQXVkaWVuY2VJZCB8fCAhdGFyZ2V0QXVkaWVuY2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdTb3VyY2UgYW5kIHRhcmdldCBhdWRpZW5jZSBJRHMgYXJlIHJlcXVpcmVkJykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBdWRpZW5jZT4oXHJcbiAgICAgIGAke3RoaXMuYXBpVXJsfS9hcGkvYXVkaWVuY2VzLyR7c291cmNlQXVkaWVuY2VJZH0vbWVyZ2VgLFxyXG4gICAgICB7IHRhcmdldEF1ZGllbmNlSWQgfSxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSB9LFxyXG4gICAgICB0aGlzLnJldHJ5Q291bnQsXHJcbiAgICAgIHRoaXMucmV0cnlEZWxheVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Metigan Library Configuration
3
+ * Central configuration file for all modules
4
+ */
5
+ /**
6
+ * Default API URL for Metigan services
7
+ * All API calls are routed through this single endpoint
8
+ *
9
+ * Can be overridden with METIGAN_API_URL environment variable for testing
10
+ */
11
+ export const API_URL = (typeof process !== 'undefined' && process.env?.['METIGAN_API_URL'])
12
+ || 'https://api.metigan.com';
13
+ /**
14
+ * SDK Version
15
+ */
16
+ export const SDK_VERSION = '1.0.0';
17
+ /**
18
+ * Default timeout for API requests (in milliseconds)
19
+ */
20
+ export const DEFAULT_TIMEOUT = 30000;
21
+ /**
22
+ * Default retry configuration
23
+ */
24
+ export const DEFAULT_RETRY_COUNT = 3;
25
+ export const DEFAULT_RETRY_DELAY = 1000;
26
+ /**
27
+ * Maximum file size for attachments (7MB)
28
+ */
29
+ export const MAX_FILE_SIZE = 7 * 1024 * 1024;
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7T0FDdEYseUJBQXlCLENBQUM7QUFFL0I7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBRW5DOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQztBQUVyQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUNyQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFeEM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogTWV0aWdhbiBMaWJyYXJ5IENvbmZpZ3VyYXRpb25cclxuICogQ2VudHJhbCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGFsbCBtb2R1bGVzXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgQVBJIFVSTCBmb3IgTWV0aWdhbiBzZXJ2aWNlc1xyXG4gKiBBbGwgQVBJIGNhbGxzIGFyZSByb3V0ZWQgdGhyb3VnaCB0aGlzIHNpbmdsZSBlbmRwb2ludFxyXG4gKiBcclxuICogQ2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBNRVRJR0FOX0FQSV9VUkwgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHRlc3RpbmdcclxuICovXHJcbmV4cG9ydCBjb25zdCBBUElfVVJMID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudj8uWydNRVRJR0FOX0FQSV9VUkwnXSkgXHJcbiAgfHwgJ2h0dHBzOi8vYXBpLm1ldGlnYW4uY29tJztcclxuXHJcbi8qKlxyXG4gKiBTREsgVmVyc2lvblxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNES19WRVJTSU9OID0gJzEuMC4wJztcclxuXHJcbi8qKlxyXG4gKiBEZWZhdWx0IHRpbWVvdXQgZm9yIEFQSSByZXF1ZXN0cyAoaW4gbWlsbGlzZWNvbmRzKVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDMwMDAwO1xyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgcmV0cnkgY29uZmlndXJhdGlvblxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVUUllfQ09VTlQgPSAzO1xyXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVRSWV9ERUxBWSA9IDEwMDA7XHJcblxyXG4vKipcclxuICogTWF4aW11bSBmaWxlIHNpemUgZm9yIGF0dGFjaG1lbnRzICg3TUIpXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTUFYX0ZJTEVfU0laRSA9IDcgKiAxMDI0ICogMTAyNDtcclxuXHJcbiJdfQ==
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Metigan Contacts Service
3
+ * Service for contact/subscriber management
4
+ */
5
+ import { Injectable } from '@angular/core';
6
+ import { throwError } from 'rxjs';
7
+ import { HttpParams } from '@angular/common/http';
8
+ import { API_URL, DEFAULT_TIMEOUT, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY } from './config';
9
+ import { ValidationError, MetiganError } from './errors';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./http-client.service";
12
+ export class MetiganContactsService {
13
+ http;
14
+ apiKey = '';
15
+ apiUrl = API_URL;
16
+ timeout = DEFAULT_TIMEOUT;
17
+ retryCount = DEFAULT_RETRY_COUNT;
18
+ retryDelay = DEFAULT_RETRY_DELAY;
19
+ constructor(http) {
20
+ this.http = http;
21
+ }
22
+ /**
23
+ * Initialize the service with API key and options
24
+ */
25
+ initialize(apiKey, options) {
26
+ if (!apiKey) {
27
+ throw new MetiganError('API key is required');
28
+ }
29
+ this.apiKey = apiKey;
30
+ this.apiUrl = options?.apiUrl || API_URL;
31
+ this.timeout = options?.timeout || DEFAULT_TIMEOUT;
32
+ this.retryCount = options?.retryCount || DEFAULT_RETRY_COUNT;
33
+ this.retryDelay = options?.retryDelay || DEFAULT_RETRY_DELAY;
34
+ }
35
+ /**
36
+ * Get default headers
37
+ */
38
+ getHeaders() {
39
+ return {
40
+ 'Content-Type': 'application/json',
41
+ 'x-api-key': this.apiKey,
42
+ 'User-Agent': 'AngularSDK/1.0'
43
+ };
44
+ }
45
+ /**
46
+ * Validate email format
47
+ */
48
+ validateEmail(email) {
49
+ if (!email || typeof email !== 'string')
50
+ return false;
51
+ const parts = email.split('@');
52
+ if (parts.length !== 2)
53
+ return false;
54
+ if (parts[0].length === 0)
55
+ return false;
56
+ const domainParts = parts[1].split('.');
57
+ if (domainParts.length < 2)
58
+ return false;
59
+ if (domainParts.some(part => part.length === 0))
60
+ return false;
61
+ return true;
62
+ }
63
+ /**
64
+ * Create a new contact
65
+ */
66
+ create(options) {
67
+ if (!this.apiKey) {
68
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
69
+ }
70
+ if (!options.email || !this.validateEmail(options.email)) {
71
+ return throwError(() => new ValidationError('Valid email is required'));
72
+ }
73
+ if (!options.audienceId) {
74
+ return throwError(() => new ValidationError('Audience ID is required'));
75
+ }
76
+ return this.http.post(`${this.apiUrl}/api/contacts`, options, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
77
+ }
78
+ /**
79
+ * Get contact by ID
80
+ */
81
+ get(contactId) {
82
+ if (!this.apiKey) {
83
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
84
+ }
85
+ if (!contactId) {
86
+ return throwError(() => new ValidationError('Contact ID is required'));
87
+ }
88
+ return this.http.get(`${this.apiUrl}/api/contacts/${contactId}`, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
89
+ }
90
+ /**
91
+ * Get contact by email
92
+ */
93
+ getByEmail(email, audienceId) {
94
+ if (!this.apiKey) {
95
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
96
+ }
97
+ if (!email || !this.validateEmail(email)) {
98
+ return throwError(() => new ValidationError('Valid email is required'));
99
+ }
100
+ if (!audienceId) {
101
+ return throwError(() => new ValidationError('Audience ID is required'));
102
+ }
103
+ let params = new HttpParams();
104
+ params = params.set('email', email);
105
+ params = params.set('audienceId', audienceId);
106
+ return this.http.get(`${this.apiUrl}/api/contacts`, {
107
+ headers: this.getHeaders(),
108
+ params: params
109
+ }, this.retryCount, this.retryDelay);
110
+ }
111
+ /**
112
+ * Update a contact
113
+ */
114
+ update(contactId, options) {
115
+ if (!this.apiKey) {
116
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
117
+ }
118
+ if (!contactId) {
119
+ return throwError(() => new ValidationError('Contact ID is required'));
120
+ }
121
+ return this.http.put(`${this.apiUrl}/api/contacts/${contactId}`, options, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
122
+ }
123
+ /**
124
+ * Delete a contact
125
+ */
126
+ delete(contactId) {
127
+ if (!this.apiKey) {
128
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
129
+ }
130
+ if (!contactId) {
131
+ return throwError(() => new ValidationError('Contact ID is required'));
132
+ }
133
+ return this.http.delete(`${this.apiUrl}/api/contacts/${contactId}`, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
134
+ }
135
+ /**
136
+ * List contacts with filters
137
+ */
138
+ list(filters) {
139
+ if (!this.apiKey) {
140
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
141
+ }
142
+ let params = new HttpParams();
143
+ if (filters?.audienceId) {
144
+ params = params.set('audienceId', filters.audienceId);
145
+ }
146
+ if (filters?.status) {
147
+ params = params.set('status', filters.status);
148
+ }
149
+ if (filters?.tag) {
150
+ params = params.set('tag', filters.tag);
151
+ }
152
+ if (filters?.search) {
153
+ params = params.set('search', filters.search);
154
+ }
155
+ if (filters?.page) {
156
+ params = params.set('page', filters.page.toString());
157
+ }
158
+ if (filters?.limit) {
159
+ params = params.set('limit', filters.limit.toString());
160
+ }
161
+ return this.http.get(`${this.apiUrl}/api/contacts`, {
162
+ headers: this.getHeaders(),
163
+ params: params
164
+ }, this.retryCount, this.retryDelay);
165
+ }
166
+ /**
167
+ * Search contacts
168
+ */
169
+ search(query, audienceId) {
170
+ if (!this.apiKey) {
171
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
172
+ }
173
+ if (!query) {
174
+ return throwError(() => new ValidationError('Search query is required'));
175
+ }
176
+ let params = new HttpParams();
177
+ params = params.set('search', query);
178
+ if (audienceId) {
179
+ params = params.set('audienceId', audienceId);
180
+ }
181
+ return this.http.get(`${this.apiUrl}/api/contacts/search`, {
182
+ headers: this.getHeaders(),
183
+ params: params
184
+ }, this.retryCount, this.retryDelay);
185
+ }
186
+ /**
187
+ * Bulk import contacts
188
+ */
189
+ bulkImport(contacts, audienceId) {
190
+ if (!this.apiKey) {
191
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
192
+ }
193
+ if (!contacts || contacts.length === 0) {
194
+ return throwError(() => new ValidationError('Contacts array is required'));
195
+ }
196
+ if (!audienceId) {
197
+ return throwError(() => new ValidationError('Audience ID is required'));
198
+ }
199
+ return this.http.post(`${this.apiUrl}/api/contacts/bulk`, { contacts, audienceId }, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
200
+ }
201
+ /**
202
+ * Subscribe a contact
203
+ */
204
+ subscribe(contactId) {
205
+ if (!this.apiKey) {
206
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
207
+ }
208
+ if (!contactId) {
209
+ return throwError(() => new ValidationError('Contact ID is required'));
210
+ }
211
+ return this.http.post(`${this.apiUrl}/api/contacts/${contactId}/subscribe`, {}, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
212
+ }
213
+ /**
214
+ * Unsubscribe a contact
215
+ */
216
+ unsubscribe(contactId) {
217
+ if (!this.apiKey) {
218
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
219
+ }
220
+ if (!contactId) {
221
+ return throwError(() => new ValidationError('Contact ID is required'));
222
+ }
223
+ return this.http.post(`${this.apiUrl}/api/contacts/${contactId}/unsubscribe`, {}, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
224
+ }
225
+ /**
226
+ * Add tags to a contact
227
+ */
228
+ addTags(contactId, tags) {
229
+ if (!this.apiKey) {
230
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
231
+ }
232
+ if (!contactId) {
233
+ return throwError(() => new ValidationError('Contact ID is required'));
234
+ }
235
+ if (!tags || tags.length === 0) {
236
+ return throwError(() => new ValidationError('Tags array is required'));
237
+ }
238
+ return this.http.post(`${this.apiUrl}/api/contacts/${contactId}/tags`, { tags }, { headers: this.getHeaders() }, this.retryCount, this.retryDelay);
239
+ }
240
+ /**
241
+ * Remove tags from a contact
242
+ */
243
+ removeTags(contactId, tags) {
244
+ if (!this.apiKey) {
245
+ return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));
246
+ }
247
+ if (!contactId) {
248
+ return throwError(() => new ValidationError('Contact ID is required'));
249
+ }
250
+ if (!tags || tags.length === 0) {
251
+ return throwError(() => new ValidationError('Tags array is required'));
252
+ }
253
+ return this.http.delete(`${this.apiUrl}/api/contacts/${contactId}/tags`, {
254
+ headers: this.getHeaders(),
255
+ params: { tags: tags.join(',') }
256
+ }, this.retryCount, this.retryDelay);
257
+ }
258
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MetiganContactsService, deps: [{ token: i1.MetiganHttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
259
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MetiganContactsService, providedIn: 'root' });
260
+ }
261
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MetiganContactsService, decorators: [{
262
+ type: Injectable,
263
+ args: [{
264
+ providedIn: 'root'
265
+ }]
266
+ }], ctorParameters: () => [{ type: i1.MetiganHttpClient }] });
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udGFjdHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7QUFhekQsTUFBTSxPQUFPLHNCQUFzQjtJQU9iO0lBTlosTUFBTSxHQUFXLEVBQUUsQ0FBQztJQUNwQixNQUFNLEdBQVcsT0FBTyxDQUFDO0lBQ3pCLE9BQU8sR0FBVyxlQUFlLENBQUM7SUFDbEMsVUFBVSxHQUFXLG1CQUFtQixDQUFDO0lBQ3pDLFVBQVUsR0FBVyxtQkFBbUIsQ0FBQztJQUVqRCxZQUFvQixJQUF1QjtRQUF2QixTQUFJLEdBQUosSUFBSSxDQUFtQjtJQUFHLENBQUM7SUFFL0M7O09BRUc7SUFDSCxVQUFVLENBQUMsTUFBYyxFQUFFLE9BQXlGO1FBQ2xILElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLE9BQU8sQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksZUFBZSxDQUFDO1FBQ25ELElBQUks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QUMvQztZQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzFCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1NBQ2pDLEVBQ0QsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO0lBQ0osQ0FBQzt3R0EvVlUsc0JBQXNCOzRHQUF0QixzQkFBc0IsY0FGckIsTUFBTTs7NEZBRVAsc0JBQXNCO2tCQUhsQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBNZXRpZ2FuIENvbnRhY3RzIFNlcnZpY2VcclxuICogU2VydmljZSBmb3IgY29udGFjdC9zdWJzY3JpYmVyIG1hbmFnZW1lbnRcclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgTWV0aWdhbkh0dHBDbGllbnQgfSBmcm9tICcuL2h0dHAtY2xpZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBUElfVVJMLCBERUZBVUxUX1RJTUVPVVQsIERFRkFVTFRfUkVUUllfQ09VTlQsIERFRkFVTFRfUkVUUllfREVMQVkgfSBmcm9tICcuL2NvbmZpZyc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciwgTWV0aWdhbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xyXG5pbXBvcnQge1xyXG4gIENvbnRhY3QsXHJcbiAgQ3JlYXRlQ29udGFjdE9wdGlvbnMsXHJcbiAgVXBkYXRlQ29udGFjdE9wdGlvbnMsXHJcbiAgQ29udGFjdExpc3RGaWx0ZXJzLFxyXG4gIENvbnRhY3RMaXN0UmVzcG9uc2UsXHJcbiAgQnVsa0NvbnRhY3RSZXN1bHRcclxufSBmcm9tICcuL3R5cGVzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1ldGlnYW5Db250YWN0c1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgYXBpS2V5OiBzdHJpbmcgPSAnJztcclxuICBwcml2YXRlIGFwaVVybDogc3RyaW5nID0gQVBJX1VSTDtcclxuICBwcml2YXRlIHRpbWVvdXQ6IG51bWJlciA9IERFRkFVTFRfVElNRU9VVDtcclxuICBwcml2YXRlIHJldHJ5Q291bnQ6IG51bWJlciA9IERFRkFVTFRfUkVUUllfQ09VTlQ7XHJcbiAgcHJpdmF0ZSByZXRyeURlbGF5OiBudW1iZXIgPSBERUZBVUxUX1JFVFJZX0RFTEFZO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IE1ldGlnYW5IdHRwQ2xpZW50KSB7fVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplIHRoZSBzZXJ2aWNlIHdpdGggQVBJIGtleSBhbmQgb3B0aW9uc1xyXG4gICAqL1xyXG4gIGluaXRpYWxpemUoYXBpS2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGFwaVVybD86IHN0cmluZzsgdGltZW91dD86IG51bWJlcjsgcmV0cnlDb3VudD86IG51bWJlcjsgcmV0cnlEZWxheT86IG51bWJlciB9KTogdm9pZCB7XHJcbiAgICBpZiAoIWFwaUtleSkge1xyXG4gICAgICB0aHJvdyBuZXcgTWV0aWdhbkVycm9yKCdBUEkga2V5IGlzIHJlcXVpcmVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcGlLZXkgPSBhcGlLZXk7XHJcbiAgICB0aGlzLmFwaVVybCA9IG9wdGlvbnM/LmFwaVVybCB8fCBBUElfVVJMO1xyXG4gICAgdGhpcy50aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCB8fCBERUZBVUxUX1RJTUVPVVQ7XHJcbiAgICB0aGlzLnJldHJ5Q291bnQgPSBvcHRpb25zPy5yZXRyeUNvdW50IHx8IERFRkFVTFRfUkVUUllfQ09VTlQ7XHJcbiAgICB0aGlzLnJldHJ5RGVsYXkgPSBvcHRpb25zPy5yZXRyeURlbGF5IHx8IERFRkFVTFRfUkVUUllfREVMQVk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgZGVmYXVsdCBoZWFkZXJzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdBbmd1bGFyU0RLLzEuMCdcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZSBlbWFpbCBmb3JtYXRcclxuICAgKi9cclxuICBwcml2YXRlIHZhbGlkYXRlRW1haWwoZW1haWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFlbWFpbCB8fCB0eXBlb2YgZW1haWwgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBwYXJ0cyA9IGVtYWlsLnNwbGl0KCdAJyk7XHJcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAocGFydHNbMF0ubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBkb21haW5QYXJ0cyA9IHBhcnRzWzFdLnNwbGl0KCcuJyk7XHJcbiAgICBpZiAoZG9tYWluUGFydHMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKGRvbWFpblBhcnRzLnNvbWUocGFydCA9PiBwYXJ0Lmxlbmd0aCA9PT0gMCkpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGNvbnRhY3RcclxuICAgKi9cclxuICBjcmVhdGUob3B0aW9uczogQ3JlYXRlQ29udGFjdE9wdGlvbnMpOiBPYnNlcnZhYmxlPENvbnRhY3Q+IHtcclxuICAgIGlmICghdGhpcy5hcGlLZXkpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IE1ldGlnYW5FcnJvcignU2VydmljZSBub3QgaW5pdGlhbGl6ZWQuIENhbGwgaW5pdGlhbGl6ZSgpIGZpcnN0LicpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW9wdGlvbnMuZW1haWwgfHwgIXRoaXMudmFsaWRhdGVFbWFpbChvcHRpb25zLmVtYWlsKSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdWYWxpZCBlbWFpbCBpcyByZXF1aXJlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW9wdGlvbnMuYXVkaWVuY2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdBdWRpZW5jZSBJRCBpcyByZXF1aXJlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q29udGFjdD4oXHJcbiAgICAgIGAke3RoaXMuYXBpVXJsfS9hcGkvY29udGFjdHNgLFxyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpIH0sXHJcbiAgICAgIHRoaXMucmV0cnlDb3VudCxcclxuICAgICAgdGhpcy5yZXRyeURlbGF5XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGNvbnRhY3QgYnkgSURcclxuICAgKi9cclxuICBnZXQoY29udGFjdElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbnRhY3Q+IHtcclxuICAgIGlmICghdGhpcy5hcGlLZXkpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IE1ldGlnYW5FcnJvcignU2VydmljZSBub3QgaW5pdGlhbGl6ZWQuIENhbGwgaW5pdGlhbGl6ZSgpIGZpcnN0LicpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbnRhY3RJZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdDb250YWN0IElEIGlzIHJlcXVpcmVkJykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENvbnRhY3Q+KFxyXG4gICAgICBgJHt0aGlzLmFwaVVybH0vYXBpL2NvbnRhY3RzLyR7Y29udGFjdElkfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfSxcclxuICAgICAgdGhpcy5yZXRyeUNvdW50LFxyXG4gICAgICB0aGlzLnJldHJ5RGVsYXlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29udGFjdCBieSBlbWFpbFxyXG4gICAqL1xyXG4gIGdldEJ5RW1haWwoZW1haWw6IHN0cmluZywgYXVkaWVuY2VJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDb250YWN0PiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpS2V5KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBNZXRpZ2FuRXJyb3IoJ1NlcnZpY2Ugbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXRpYWxpemUoKSBmaXJzdC4nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFlbWFpbCB8fCAhdGhpcy52YWxpZGF0ZUVtYWlsKGVtYWlsKSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdWYWxpZCBlbWFpbCBpcyByZXF1aXJlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWF1ZGllbmNlSWQpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IFZhbGlkYXRpb25FcnJvcignQXVkaWVuY2UgSUQgaXMgcmVxdWlyZWQnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdlbWFpbCcsIGVtYWlsKTtcclxuICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2F1ZGllbmNlSWQnLCBhdWRpZW5jZUlkKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDb250YWN0PihcclxuICAgICAgYCR7dGhpcy5hcGlVcmx9L2FwaS9jb250YWN0c2AsXHJcbiAgICAgIHtcclxuICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSxcclxuICAgICAgICBwYXJhbXM6IHBhcmFtc1xyXG4gICAgICB9LFxyXG4gICAgICB0aGlzLnJldHJ5Q291bnQsXHJcbiAgICAgIHRoaXMucmV0cnlEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBhIGNvbnRhY3RcclxuICAgKi9cclxuICB1cGRhdGUoY29udGFjdElkOiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZUNvbnRhY3RPcHRpb25zKTogT2JzZXJ2YWJsZTxDb250YWN0PiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpS2V5KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBNZXRpZ2FuRXJyb3IoJ1NlcnZpY2Ugbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXRpYWxpemUoKSBmaXJzdC4nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjb250YWN0SWQpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IFZhbGlkYXRpb25FcnJvcignQ29udGFjdCBJRCBpcyByZXF1aXJlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxDb250YWN0PihcclxuICAgICAgYCR7dGhpcy5hcGlVcmx9L2FwaS9jb250YWN0cy8ke2NvbnRhY3RJZH1gLFxyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpIH0sXHJcbiAgICAgIHRoaXMucmV0cnlDb3VudCxcclxuICAgICAgdGhpcy5yZXRyeURlbGF5XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIGEgY29udGFjdFxyXG4gICAqL1xyXG4gIGRlbGV0ZShjb250YWN0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLmFwaUtleSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTWV0aWdhbkVycm9yKCdTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29udGFjdElkKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0NvbnRhY3QgSUQgaXMgcmVxdWlyZWQnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8dm9pZD4oXHJcbiAgICAgIGAke3RoaXMuYXBpVXJsfS9hcGkvY29udGFjdHMvJHtjb250YWN0SWR9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSB9LFxyXG4gICAgICB0aGlzLnJldHJ5Q291bnQsXHJcbiAgICAgIHRoaXMucmV0cnlEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3QgY29udGFjdHMgd2l0aCBmaWx0ZXJzXHJcbiAgICovXHJcbiAgbGlzdChmaWx0ZXJzPzogQ29udGFjdExpc3RGaWx0ZXJzKTogT2JzZXJ2YWJsZTxDb250YWN0TGlzdFJlc3BvbnNlPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpS2V5KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBNZXRpZ2FuRXJyb3IoJ1NlcnZpY2Ugbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXRpYWxpemUoKSBmaXJzdC4nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBpZiAoZmlsdGVycz8uYXVkaWVuY2VJZCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdhdWRpZW5jZUlkJywgZmlsdGVycy5hdWRpZW5jZUlkKTtcclxuICAgIH1cclxuICAgIGlmIChmaWx0ZXJzPy5zdGF0dXMpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc3RhdHVzJywgZmlsdGVycy5zdGF0dXMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpbHRlcnM/LnRhZykge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCd0YWcnLCBmaWx0ZXJzLnRhZyk7XHJcbiAgICB9XHJcbiAgICBpZiAoZmlsdGVycz8uc2VhcmNoKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3NlYXJjaCcsIGZpbHRlcnMuc2VhcmNoKTtcclxuICAgIH1cclxuICAgIGlmIChmaWx0ZXJzPy5wYWdlKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3BhZ2UnLCBmaWx0ZXJzLnBhZ2UudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZmlsdGVycz8ubGltaXQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnbGltaXQnLCBmaWx0ZXJzLmxpbWl0LnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENvbnRhY3RMaXN0UmVzcG9uc2U+KFxyXG4gICAgICBgJHt0aGlzLmFwaVVybH0vYXBpL2NvbnRhY3RzYCxcclxuICAgICAge1xyXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxyXG4gICAgICAgIHBhcmFtczogcGFyYW1zXHJcbiAgICAgIH0sXHJcbiAgICAgIHRoaXMucmV0cnlDb3VudCxcclxuICAgICAgdGhpcy5yZXRyeURlbGF5XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VhcmNoIGNvbnRhY3RzXHJcbiAgICovXHJcbiAgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcsIGF1ZGllbmNlSWQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbnRhY3RbXT4ge1xyXG4gICAgaWYgKCF0aGlzLmFwaUtleSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTWV0aWdhbkVycm9yKCdTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcXVlcnkpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IFZhbGlkYXRpb25FcnJvcignU2VhcmNoIHF1ZXJ5IGlzIHJlcXVpcmVkJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc2VhcmNoJywgcXVlcnkpO1xyXG4gICAgaWYgKGF1ZGllbmNlSWQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnYXVkaWVuY2VJZCcsIGF1ZGllbmNlSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENvbnRhY3RbXT4oXHJcbiAgICAgIGAke3RoaXMuYXBpVXJsfS9hcGkvY29udGFjdHMvc2VhcmNoYCxcclxuICAgICAge1xyXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxyXG4gICAgICAgIHBhcmFtczogcGFyYW1zXHJcbiAgICAgIH0sXHJcbiAgICAgIHRoaXMucmV0cnlDb3VudCxcclxuICAgICAgdGhpcy5yZXRyeURlbGF5XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVsayBpbXBvcnQgY29udGFjdHNcclxuICAgKi9cclxuICBidWxrSW1wb3J0KGNvbnRhY3RzOiBDcmVhdGVDb250YWN0T3B0aW9uc1tdLCBhdWRpZW5jZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEJ1bGtDb250YWN0UmVzdWx0PiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpS2V5KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBNZXRpZ2FuRXJyb3IoJ1NlcnZpY2Ugbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXRpYWxpemUoKSBmaXJzdC4nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjb250YWN0cyB8fCBjb250YWN0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IFZhbGlkYXRpb25FcnJvcignQ29udGFjdHMgYXJyYXkgaXMgcmVxdWlyZWQnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFhdWRpZW5jZUlkKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0F1ZGllbmNlIElEIGlzIHJlcXVpcmVkJykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxCdWxrQ29udGFjdFJlc3VsdD4oXHJcbiAgICAgIGAke3RoaXMuYXBpVXJsfS9hcGkvY29udGFjdHMvYnVsa2AsXHJcbiAgICAgIHsgY29udGFjdHMsIGF1ZGllbmNlSWQgfSxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSB9LFxyXG4gICAgICB0aGlzLnJldHJ5Q291bnQsXHJcbiAgICAgIHRoaXMucmV0cnlEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YnNjcmliZSBhIGNvbnRhY3RcclxuICAgKi9cclxuICBzdWJzY3JpYmUoY29udGFjdElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbnRhY3Q+IHtcclxuICAgIGlmICghdGhpcy5hcGlLZXkpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IE1ldGlnYW5FcnJvcignU2VydmljZSBub3QgaW5pdGlhbGl6ZWQuIENhbGwgaW5pdGlhbGl6ZSgpIGZpcnN0LicpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbnRhY3RJZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdDb250YWN0IElEIGlzIHJlcXVpcmVkJykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDb250YWN0PihcclxuICAgICAgYCR7dGhpcy5hcGlVcmx9L2FwaS9jb250YWN0cy8ke2NvbnRhY3RJZH0vc3Vic2NyaWJlYCxcclxuICAgICAge30sXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfSxcclxuICAgICAgdGhpcy5yZXRyeUNvdW50LFxyXG4gICAgICB0aGlzLnJldHJ5RGVsYXlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVbnN1YnNjcmliZSBhIGNvbnRhY3RcclxuICAgKi9cclxuICB1bnN1YnNjcmliZShjb250YWN0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q29udGFjdD4ge1xyXG4gICAgaWYgKCF0aGlzLmFwaUtleSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTWV0aWdhbkVycm9yKCdTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29udGFjdElkKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0NvbnRhY3QgSUQgaXMgcmVxdWlyZWQnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENvbnRhY3Q+KFxyXG4gICAgICBgJHt0aGlzLmFwaVVybH0vYXBpL2NvbnRhY3RzLyR7Y29udGFjdElkfS91bnN1YnNjcmliZWAsXHJcbiAgICAgIHt9LFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpIH0sXHJcbiAgICAgIHRoaXMucmV0cnlDb3VudCxcclxuICAgICAgdGhpcy5yZXRyeURlbGF5XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIHRhZ3MgdG8gYSBjb250YWN0XHJcbiAgICovXHJcbiAgYWRkVGFncyhjb250YWN0SWQ6IHN0cmluZywgdGFnczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPENvbnRhY3Q+IHtcclxuICAgIGlmICghdGhpcy5hcGlLZXkpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IE1ldGlnYW5FcnJvcignU2VydmljZSBub3QgaW5pdGlhbGl6ZWQuIENhbGwgaW5pdGlhbGl6ZSgpIGZpcnN0LicpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbnRhY3RJZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdDb250YWN0IElEIGlzIHJlcXVpcmVkJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGFncyB8fCB0YWdzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKCdUYWdzIGFycmF5IGlzIHJlcXVpcmVkJykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDb250YWN0PihcclxuICAgICAgYCR7dGhpcy5hcGlVcmx9L2FwaS9jb250YWN0cy8ke2NvbnRhY3RJZH0vdGFnc2AsXHJcbiAgICAgIHsgdGFncyB9LFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpIH0sXHJcbiAgICAgIHRoaXMucmV0cnlDb3VudCxcclxuICAgICAgdGhpcy5yZXRyeURlbGF5XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHRhZ3MgZnJvbSBhIGNvbnRhY3RcclxuICAgKi9cclxuICByZW1vdmVUYWdzKGNvbnRhY3RJZDogc3RyaW5nLCB0YWdzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8Q29udGFjdD4ge1xyXG4gICAgaWYgKCF0aGlzLmFwaUtleSkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTWV0aWdhbkVycm9yKCdTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29udGFjdElkKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0NvbnRhY3QgSUQgaXMgcmVxdWlyZWQnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0YWdzIHx8IHRhZ3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ1RhZ3MgYXJyYXkgaXMgcmVxdWlyZWQnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8Q29udGFjdD4oXHJcbiAgICAgIGAke3RoaXMuYXBpVXJsfS9hcGkvY29udGFjdHMvJHtjb250YWN0SWR9L3RhZ3NgLFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXHJcbiAgICAgICAgcGFyYW1zOiB7IHRhZ3M6IHRhZ3Muam9pbignLCcpIH1cclxuICAgICAgfSxcclxuICAgICAgdGhpcy5yZXRyeUNvdW50LFxyXG4gICAgICB0aGlzLnJldHJ5RGVsYXlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=