@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.
- package/LICENSE +22 -0
- package/README.md +581 -0
- package/dist/LICENSE +22 -0
- package/dist/README.md +581 -0
- package/dist/esm2022/metigan-angular.mjs +5 -0
- package/dist/esm2022/public-api.mjs +21 -0
- package/dist/esm2022/src/lib/audiences.service.mjs +157 -0
- package/dist/esm2022/src/lib/config.mjs +30 -0
- package/dist/esm2022/src/lib/contacts.service.mjs +267 -0
- package/dist/esm2022/src/lib/email.service.mjs +267 -0
- package/dist/esm2022/src/lib/errors.mjs +40 -0
- package/dist/esm2022/src/lib/forms.service.mjs +180 -0
- package/dist/esm2022/src/lib/http-client.service.mjs +111 -0
- package/dist/esm2022/src/lib/metigan.module.mjs +67 -0
- package/dist/esm2022/src/lib/metigan.service.mjs +72 -0
- package/dist/esm2022/src/lib/templates.service.mjs +85 -0
- package/dist/esm2022/src/lib/types.mjs +6 -0
- package/dist/fesm2022/metigan-angular.mjs +1241 -0
- package/dist/fesm2022/metigan-angular.mjs.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/public-api.d.ts +15 -0
- package/dist/src/lib/audiences.service.d.ts +62 -0
- package/dist/src/lib/config.d.ts +28 -0
- package/dist/src/lib/contacts.service.d.ts +80 -0
- package/dist/src/lib/email.service.d.ts +44 -0
- package/dist/src/lib/errors.d.ts +24 -0
- package/dist/src/lib/forms.service.d.ts +67 -0
- package/dist/src/lib/http-client.service.d.ts +46 -0
- package/dist/src/lib/metigan.module.d.ts +27 -0
- package/dist/src/lib/metigan.service.d.ts +27 -0
- package/dist/src/lib/templates.service.d.ts +36 -0
- package/dist/src/lib/types.d.ts +329 -0
- package/examples/basic.component.ts +113 -0
- package/ng-package.json +8 -0
- package/package.json +68 -0
- package/public-api.ts +26 -0
- package/src/lib/audiences.service.ts +230 -0
- package/src/lib/config.ts +35 -0
- package/src/lib/contacts.service.ts +377 -0
- package/src/lib/email.service.ts +286 -0
- package/src/lib/errors.ts +45 -0
- package/src/lib/forms.service.ts +263 -0
- package/src/lib/http-client.service.ts +156 -0
- package/src/lib/metigan.module.ts +55 -0
- package/src/lib/metigan.service.ts +80 -0
- package/src/lib/templates.service.ts +103 -0
- package/src/lib/types.ts +398 -0
- 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=
|