mailgun.js 4.1.0 → 4.1.4
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/.eslintrc +3 -1
- package/CHANGELOG.md +23 -0
- package/dist/lib/domains.d.ts +6 -2
- package/dist/lib/domainsTemplates.d.ts +35 -0
- package/dist/lib/interfaces/DomainTemplates.d.ts +194 -0
- package/dist/lib/interfaces/StatsOptions.d.ts +17 -10
- package/dist/lib/request.d.ts +1 -0
- package/dist/lib/stats.d.ts +5 -4
- package/dist/mailgun.node.js +2 -2
- package/dist/mailgun.node.js.LICENSE.txt +1 -1
- package/dist/mailgun.web.js +2 -2
- package/dist/mailgun.web.js.LICENSE.txt +1 -1
- package/lib/client.ts +3 -1
- package/lib/domains.ts +12 -3
- package/lib/domainsTemplates.ts +235 -0
- package/lib/interfaces/DomainTemplates.ts +238 -0
- package/lib/interfaces/StatsOptions.ts +18 -10
- package/lib/ip-pools.ts +2 -2
- package/lib/request.ts +11 -0
- package/lib/stats.ts +27 -8
- package/package.json +3 -2
- package/test/domains.test.ts +3 -1
- package/test/domainsTemplates.test.ts +392 -0
- package/test/stats.test.ts +1 -1
package/lib/client.ts
CHANGED
|
@@ -18,6 +18,7 @@ import MailListsMembers from './mailListMembers';
|
|
|
18
18
|
import { InputFormData } from './interfaces/IFormData';
|
|
19
19
|
import DomainCredentialsClient from './domainsCredentials';
|
|
20
20
|
import MultipleValidationClient from './multipleValidation';
|
|
21
|
+
import DomainTemplatesClient from './domainsTemplates';
|
|
21
22
|
|
|
22
23
|
export default class Client {
|
|
23
24
|
private request;
|
|
@@ -53,9 +54,10 @@ export default class Client {
|
|
|
53
54
|
this.request = new Request(config, formData);
|
|
54
55
|
const mailListsMembers = new MailListsMembers(this.request);
|
|
55
56
|
const domainCredentialsClient = new DomainCredentialsClient(this.request);
|
|
57
|
+
const domainTemplatesClient = new DomainTemplatesClient(this.request);
|
|
56
58
|
const multipleValidationClient = new MultipleValidationClient(this.request);
|
|
57
59
|
|
|
58
|
-
this.domains = new DomainClient(this.request, domainCredentialsClient);
|
|
60
|
+
this.domains = new DomainClient(this.request, domainCredentialsClient, domainTemplatesClient);
|
|
59
61
|
this.webhooks = new WebhookClient(this.request);
|
|
60
62
|
this.events = new EventClient(this.request);
|
|
61
63
|
this.stats = new StatsClient(this.request);
|
package/lib/domains.ts
CHANGED
|
@@ -37,7 +37,10 @@ import {
|
|
|
37
37
|
UpdateDomainTrackingResponse,
|
|
38
38
|
UpdatedOpenTracking
|
|
39
39
|
} from './interfaces/DomainTracking';
|
|
40
|
+
import { IDomainCredentials } from './interfaces/DomainCredentials';
|
|
41
|
+
import { IDomainTemplatesClient } from './interfaces/DomainTemplates';
|
|
40
42
|
import DomainCredentialsClient from './domainsCredentials';
|
|
43
|
+
import DomainTemplatesClient from './domainsTemplates';
|
|
41
44
|
|
|
42
45
|
export class Domain {
|
|
43
46
|
name: string;
|
|
@@ -72,11 +75,17 @@ export class Domain {
|
|
|
72
75
|
|
|
73
76
|
export default class DomainClient {
|
|
74
77
|
request: Request;
|
|
75
|
-
public domainCredentials:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
+
public domainCredentials: IDomainCredentials;
|
|
79
|
+
public domainTemplates: IDomainTemplatesClient
|
|
80
|
+
|
|
81
|
+
constructor(
|
|
82
|
+
request: Request,
|
|
83
|
+
domainCredentialsClient: DomainCredentialsClient,
|
|
84
|
+
domainTemplatesClient: DomainTemplatesClient
|
|
85
|
+
) {
|
|
78
86
|
this.request = request;
|
|
79
87
|
this.domainCredentials = domainCredentialsClient;
|
|
88
|
+
this.domainTemplates = domainTemplatesClient;
|
|
80
89
|
}
|
|
81
90
|
|
|
82
91
|
private _parseMessage(response: DestroyedDomainResponse) : MessageResponse {
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import urljoin from 'url-join';
|
|
2
|
+
import APIResponse from './interfaces/ApiResponse';
|
|
3
|
+
import Request from './request';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
CreateDomainTemplateAPIResponse,
|
|
7
|
+
CreateDomainTemplateVersionAPIResponse,
|
|
8
|
+
CreateDomainTemplateVersionResult,
|
|
9
|
+
DomainTemplate, DomainTemplateData,
|
|
10
|
+
DomainTemplatesQuery,
|
|
11
|
+
DomainTemplateUpdateData,
|
|
12
|
+
DomainTemplateUpdateVersionData,
|
|
13
|
+
DomainTemplateVersionData,
|
|
14
|
+
GetDomainTemplateAPIResponse,
|
|
15
|
+
IDomainTemplatesClient,
|
|
16
|
+
ListDomainTemplatesAPIResponse,
|
|
17
|
+
ListDomainTemplatesResult,
|
|
18
|
+
ListDomainTemplateVersionsAPIResponse,
|
|
19
|
+
ListDomainTemplateVersionsResult,
|
|
20
|
+
MutateDomainTemplateVersionAPIResponse,
|
|
21
|
+
MutateDomainTemplateVersionResult,
|
|
22
|
+
NotificationAPIResponse,
|
|
23
|
+
NotificationResult,
|
|
24
|
+
ShortTemplateVersion,
|
|
25
|
+
TemplateQuery,
|
|
26
|
+
TemplateVersion,
|
|
27
|
+
UpdateOrDeleteDomainTemplateAPIResponse,
|
|
28
|
+
UpdateOrDeleteDomainTemplateResult
|
|
29
|
+
} from './interfaces/DomainTemplates';
|
|
30
|
+
|
|
31
|
+
export class DomainTemplateItem implements DomainTemplate {
|
|
32
|
+
name : string;
|
|
33
|
+
description : string;
|
|
34
|
+
createdAt : Date | '';
|
|
35
|
+
createdBy : string;
|
|
36
|
+
id : string;
|
|
37
|
+
version?: TemplateVersion;
|
|
38
|
+
versions?: ShortTemplateVersion[];
|
|
39
|
+
|
|
40
|
+
constructor(domainTemplateFromAPI: DomainTemplate) {
|
|
41
|
+
this.name = domainTemplateFromAPI.name;
|
|
42
|
+
this.description = domainTemplateFromAPI.description;
|
|
43
|
+
this.createdAt = domainTemplateFromAPI.createdAt ? new Date(domainTemplateFromAPI.createdAt) : '';
|
|
44
|
+
this.createdBy = domainTemplateFromAPI.createdBy;
|
|
45
|
+
this.id = domainTemplateFromAPI.id;
|
|
46
|
+
|
|
47
|
+
if (domainTemplateFromAPI.version) {
|
|
48
|
+
this.version = domainTemplateFromAPI.version;
|
|
49
|
+
if (domainTemplateFromAPI.version.createdAt) {
|
|
50
|
+
this.version.createdAt = new Date(domainTemplateFromAPI.version.createdAt);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (domainTemplateFromAPI.versions && domainTemplateFromAPI.versions.length) {
|
|
55
|
+
this.versions = domainTemplateFromAPI.versions.map((version) => {
|
|
56
|
+
const result = { ...version };
|
|
57
|
+
result.createdAt = new Date(version.createdAt);
|
|
58
|
+
return result;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export default class DomainTemplatesClient implements IDomainTemplatesClient {
|
|
65
|
+
baseRoute: string;
|
|
66
|
+
request: Request;
|
|
67
|
+
|
|
68
|
+
constructor(request: Request) {
|
|
69
|
+
this.request = request;
|
|
70
|
+
this.baseRoute = '/v3/';
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private parseCreationResponse(data: CreateDomainTemplateAPIResponse): DomainTemplateItem {
|
|
74
|
+
return new DomainTemplateItem(data.body.template);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private parseCreationVersionResponse(
|
|
78
|
+
data: CreateDomainTemplateVersionAPIResponse
|
|
79
|
+
): CreateDomainTemplateVersionResult {
|
|
80
|
+
const result: CreateDomainTemplateVersionResult = {} as CreateDomainTemplateVersionResult;
|
|
81
|
+
result.status = data.status;
|
|
82
|
+
result.message = data.body.message;
|
|
83
|
+
if (data.body && data.body.template) {
|
|
84
|
+
result.template = new DomainTemplateItem(data.body.template);
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private parseMutationResponse(
|
|
90
|
+
data: UpdateOrDeleteDomainTemplateAPIResponse
|
|
91
|
+
): UpdateOrDeleteDomainTemplateResult {
|
|
92
|
+
const result: UpdateOrDeleteDomainTemplateResult = {} as UpdateOrDeleteDomainTemplateResult;
|
|
93
|
+
result.status = data.status;
|
|
94
|
+
result.message = data.body.message;
|
|
95
|
+
if (data.body && data.body.template) {
|
|
96
|
+
result.templateName = data.body.template.name;
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private parseNotificationResponse(data: NotificationAPIResponse): NotificationResult {
|
|
102
|
+
const result: NotificationResult = {} as NotificationResult;
|
|
103
|
+
result.status = data.status;
|
|
104
|
+
result.message = data.body.message;
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private parseMutateTemplateVersionResponse(
|
|
109
|
+
data: MutateDomainTemplateVersionAPIResponse
|
|
110
|
+
): MutateDomainTemplateVersionResult {
|
|
111
|
+
const result: MutateDomainTemplateVersionResult = {} as MutateDomainTemplateVersionResult;
|
|
112
|
+
result.status = data.status;
|
|
113
|
+
result.message = data.body.message;
|
|
114
|
+
if (data.body.template) {
|
|
115
|
+
result.templateName = data.body.template.name;
|
|
116
|
+
result.templateVersion = { tag: data.body.template.version.tag };
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private parseList(response: ListDomainTemplatesAPIResponse): ListDomainTemplatesResult {
|
|
122
|
+
const data = {} as ListDomainTemplatesResult;
|
|
123
|
+
|
|
124
|
+
data.items = response.body.items.map((d: DomainTemplate) => new DomainTemplateItem(d));
|
|
125
|
+
|
|
126
|
+
data.pages = response.body.paging;
|
|
127
|
+
|
|
128
|
+
return data;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private parseListTemplateVersions(
|
|
132
|
+
response: ListDomainTemplateVersionsAPIResponse
|
|
133
|
+
): ListDomainTemplateVersionsResult {
|
|
134
|
+
const data = {} as ListDomainTemplateVersionsResult;
|
|
135
|
+
|
|
136
|
+
data.template = new DomainTemplateItem(response.body.template);
|
|
137
|
+
|
|
138
|
+
data.pages = response.body.paging;
|
|
139
|
+
|
|
140
|
+
return data;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
list(domain: string, query?: DomainTemplatesQuery): Promise<ListDomainTemplatesResult> {
|
|
144
|
+
return this.request.get(urljoin(this.baseRoute, domain, '/templates'), query)
|
|
145
|
+
.then(
|
|
146
|
+
(res: APIResponse) => this.parseList(res)
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
get(domain: string, templateName: string, query?: TemplateQuery): Promise<DomainTemplateItem> {
|
|
151
|
+
return this.request.get(urljoin(this.baseRoute, domain, '/templates/', templateName), query)
|
|
152
|
+
.then(
|
|
153
|
+
(res: GetDomainTemplateAPIResponse) => new DomainTemplateItem(res.body.template)
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
create(
|
|
158
|
+
domain: string,
|
|
159
|
+
data: DomainTemplateData
|
|
160
|
+
): Promise<DomainTemplateItem> {
|
|
161
|
+
return this.request.postWithFD(urljoin(this.baseRoute, domain, '/templates'), data)
|
|
162
|
+
.then((res: CreateDomainTemplateAPIResponse) => this.parseCreationResponse(res));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
update(
|
|
166
|
+
domain: string,
|
|
167
|
+
templateName: string,
|
|
168
|
+
data: DomainTemplateUpdateData
|
|
169
|
+
): Promise<UpdateOrDeleteDomainTemplateResult> {
|
|
170
|
+
return this.request.putWithFD(urljoin(this.baseRoute, domain, '/templates/', templateName), data)
|
|
171
|
+
.then((res: UpdateOrDeleteDomainTemplateAPIResponse) => this.parseMutationResponse(res));
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
destroy(domain: string, templateName: string): Promise<UpdateOrDeleteDomainTemplateResult> {
|
|
175
|
+
return this.request.delete(urljoin(this.baseRoute, domain, '/templates/', templateName))
|
|
176
|
+
.then((res: UpdateOrDeleteDomainTemplateAPIResponse) => this.parseMutationResponse(res));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
destroyAll(domain: string): Promise<NotificationResult> {
|
|
180
|
+
return this.request.delete(urljoin(this.baseRoute, domain, '/templates'))
|
|
181
|
+
.then((res: NotificationAPIResponse) => this.parseNotificationResponse(res));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
createVersion(
|
|
185
|
+
domain: string,
|
|
186
|
+
templateName: string,
|
|
187
|
+
data: DomainTemplateVersionData
|
|
188
|
+
): Promise<CreateDomainTemplateVersionResult> {
|
|
189
|
+
return this.request.postWithFD(urljoin(this.baseRoute, domain, '/templates/', templateName, '/versions'), data)
|
|
190
|
+
.then(
|
|
191
|
+
(res: CreateDomainTemplateVersionAPIResponse) => this.parseCreationVersionResponse(res)
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
getVersion(domain: string, templateName: string, tag: string): Promise<DomainTemplateItem> {
|
|
196
|
+
return this.request.get(urljoin(this.baseRoute, domain, '/templates/', templateName, '/versions/', tag))
|
|
197
|
+
.then(
|
|
198
|
+
(res: GetDomainTemplateAPIResponse) => new DomainTemplateItem(res.body.template)
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
updateVersion(
|
|
203
|
+
domain: string,
|
|
204
|
+
templateName: string,
|
|
205
|
+
tag: string,
|
|
206
|
+
data: DomainTemplateUpdateVersionData
|
|
207
|
+
): Promise<MutateDomainTemplateVersionResult> {
|
|
208
|
+
return this.request.putWithFD(urljoin(this.baseRoute, domain, '/templates/', templateName, '/versions/', tag), data)
|
|
209
|
+
.then(
|
|
210
|
+
// eslint-disable-next-line max-len
|
|
211
|
+
(res: MutateDomainTemplateVersionAPIResponse) => this.parseMutateTemplateVersionResponse(res)
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
destroyVersion(
|
|
216
|
+
domain: string,
|
|
217
|
+
templateName: string,
|
|
218
|
+
tag: string
|
|
219
|
+
): Promise<MutateDomainTemplateVersionResult> {
|
|
220
|
+
return this.request.delete(urljoin(this.baseRoute, domain, '/templates/', templateName, '/versions/', tag))
|
|
221
|
+
// eslint-disable-next-line max-len
|
|
222
|
+
.then((res: MutateDomainTemplateVersionAPIResponse) => this.parseMutateTemplateVersionResponse(res));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
listVersions(
|
|
226
|
+
domain: string,
|
|
227
|
+
templateName: string,
|
|
228
|
+
query?: DomainTemplatesQuery
|
|
229
|
+
): Promise<ListDomainTemplateVersionsResult> {
|
|
230
|
+
return this.request.get(urljoin(this.baseRoute, domain, '/templates', templateName, '/versions'), query)
|
|
231
|
+
.then(
|
|
232
|
+
(res: ListDomainTemplateVersionsAPIResponse) => this.parseListTemplateVersions(res)
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { DomainTemplateItem } from '../domainsTemplates';
|
|
2
|
+
|
|
3
|
+
export enum YesNo {
|
|
4
|
+
YES = 'yes',
|
|
5
|
+
NO = 'no'
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export enum Pages {
|
|
9
|
+
FIRST = 'first',
|
|
10
|
+
LAST = 'last',
|
|
11
|
+
NEXT = 'next',
|
|
12
|
+
PREV = 'prev'
|
|
13
|
+
}
|
|
14
|
+
/* eslint-disable camelcase */
|
|
15
|
+
export interface DomainTemplateData {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
template: string;
|
|
19
|
+
tag?: string;
|
|
20
|
+
engine?: string;
|
|
21
|
+
comment?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface DomainTemplateVersionData {
|
|
25
|
+
template: string;
|
|
26
|
+
tag: string;
|
|
27
|
+
engine?: string;
|
|
28
|
+
comment?: string;
|
|
29
|
+
active?: YesNo;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface DomainTemplateUpdateData {
|
|
33
|
+
description: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface DomainTemplateUpdateVersionData {
|
|
37
|
+
template?: string;
|
|
38
|
+
comment?: string;
|
|
39
|
+
active?: YesNo;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface DomainTemplatesQuery {
|
|
43
|
+
page: Pages;
|
|
44
|
+
limit: number;
|
|
45
|
+
p: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface TemplateQuery {
|
|
49
|
+
active: YesNo;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface ShortTemplateVersion {
|
|
53
|
+
tag: string;
|
|
54
|
+
engine: string;
|
|
55
|
+
mjml: string;
|
|
56
|
+
createdAt: string | Date;
|
|
57
|
+
comment: string;
|
|
58
|
+
active: boolean;
|
|
59
|
+
id: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface TemplateVersion extends ShortTemplateVersion{
|
|
63
|
+
template: string;
|
|
64
|
+
}
|
|
65
|
+
export interface DomainTemplate {
|
|
66
|
+
name: string;
|
|
67
|
+
description: string;
|
|
68
|
+
createdAt: string | Date;
|
|
69
|
+
createdBy: string;
|
|
70
|
+
id: string;
|
|
71
|
+
version?: TemplateVersion;
|
|
72
|
+
versions?: ShortTemplateVersion[];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface CreateDomainTemplateAPIResponse {
|
|
76
|
+
status: number;
|
|
77
|
+
body: {
|
|
78
|
+
message: string;
|
|
79
|
+
template: DomainTemplate;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface ListDomainTemplatesAPIResponse {
|
|
84
|
+
status: number;
|
|
85
|
+
body: {
|
|
86
|
+
items: DomainTemplate[];
|
|
87
|
+
paging: {
|
|
88
|
+
first: string;
|
|
89
|
+
last: string;
|
|
90
|
+
next: string;
|
|
91
|
+
previous: string;
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface ListDomainTemplatesResult {
|
|
97
|
+
items: DomainTemplate[];
|
|
98
|
+
pages: {
|
|
99
|
+
first: string;
|
|
100
|
+
last: string;
|
|
101
|
+
next: string;
|
|
102
|
+
previous: string;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface GetDomainTemplateAPIResponse {
|
|
107
|
+
status: number;
|
|
108
|
+
body: {
|
|
109
|
+
template: DomainTemplate;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface UpdateOrDeleteDomainTemplateAPIResponse {
|
|
114
|
+
status: number;
|
|
115
|
+
body: {
|
|
116
|
+
message: string;
|
|
117
|
+
template: {
|
|
118
|
+
name: string
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export interface UpdateOrDeleteDomainTemplateResult {
|
|
124
|
+
status: number;
|
|
125
|
+
message: string;
|
|
126
|
+
templateName?: string;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export interface NotificationAPIResponse {
|
|
130
|
+
status: number;
|
|
131
|
+
body: {
|
|
132
|
+
message: string;
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface NotificationResult {
|
|
137
|
+
status: number;
|
|
138
|
+
message: string;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export interface CreateDomainTemplateVersionAPIResponse {
|
|
142
|
+
status: number;
|
|
143
|
+
body: {
|
|
144
|
+
message: string;
|
|
145
|
+
template: DomainTemplate;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export interface CreateDomainTemplateVersionResult {
|
|
150
|
+
status: number;
|
|
151
|
+
message: string;
|
|
152
|
+
template: DomainTemplate;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export interface MutateDomainTemplateVersionAPIResponse {
|
|
156
|
+
status: number;
|
|
157
|
+
body: {
|
|
158
|
+
message: string;
|
|
159
|
+
template: {
|
|
160
|
+
name: string;
|
|
161
|
+
version: {
|
|
162
|
+
tag: string;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export interface MutateDomainTemplateVersionResult {
|
|
169
|
+
status: number;
|
|
170
|
+
message: string;
|
|
171
|
+
templateName: string;
|
|
172
|
+
templateVersion: {
|
|
173
|
+
tag: string;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export interface ListDomainTemplateVersionsAPIResponse {
|
|
178
|
+
status: number;
|
|
179
|
+
body: {
|
|
180
|
+
template: {
|
|
181
|
+
name: string;
|
|
182
|
+
description: string;
|
|
183
|
+
createdAt: string;
|
|
184
|
+
createdBy: string;
|
|
185
|
+
id: string;
|
|
186
|
+
versions: ShortTemplateVersion[]
|
|
187
|
+
}
|
|
188
|
+
paging: {
|
|
189
|
+
first: string;
|
|
190
|
+
last: string;
|
|
191
|
+
next: string;
|
|
192
|
+
previous: string;
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export interface ListDomainTemplateVersionsResult {
|
|
198
|
+
template: DomainTemplateItem;
|
|
199
|
+
pages: {
|
|
200
|
+
first: string;
|
|
201
|
+
last: string;
|
|
202
|
+
next: string;
|
|
203
|
+
previous: string;
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export interface IDomainTemplatesClient {
|
|
208
|
+
list(domain: string, query?: DomainTemplatesQuery): Promise<ListDomainTemplatesResult>
|
|
209
|
+
get(domain: string, templateName: string, query: TemplateQuery): Promise<DomainTemplateItem>
|
|
210
|
+
create(domain: string, data: DomainTemplateData): Promise<DomainTemplateItem>
|
|
211
|
+
update(
|
|
212
|
+
domain: string,
|
|
213
|
+
templateName: string,
|
|
214
|
+
data: DomainTemplateUpdateData
|
|
215
|
+
): Promise<UpdateOrDeleteDomainTemplateResult>
|
|
216
|
+
destroy(domain: string, templateName: string): Promise<UpdateOrDeleteDomainTemplateResult>
|
|
217
|
+
destroyAll(domain: string): Promise<NotificationResult>
|
|
218
|
+
createVersion(
|
|
219
|
+
domain: string,
|
|
220
|
+
templateName: string,
|
|
221
|
+
data: DomainTemplateVersionData
|
|
222
|
+
) : Promise<CreateDomainTemplateVersionResult>
|
|
223
|
+
getVersion(domain: string, templateName: string, tag: string): Promise<DomainTemplateItem>
|
|
224
|
+
updateVersion(
|
|
225
|
+
domain: string,
|
|
226
|
+
templateName: string,
|
|
227
|
+
tag: string,
|
|
228
|
+
data: DomainTemplateUpdateVersionData
|
|
229
|
+
): Promise<MutateDomainTemplateVersionResult>
|
|
230
|
+
destroyVersion(
|
|
231
|
+
domain: string,
|
|
232
|
+
templateName: string,
|
|
233
|
+
tag: string): Promise<MutateDomainTemplateVersionResult>
|
|
234
|
+
listVersions(
|
|
235
|
+
domain: string,
|
|
236
|
+
templateName: string,
|
|
237
|
+
query?: DomainTemplatesQuery): Promise<ListDomainTemplateVersionsResult>
|
|
238
|
+
}
|
|
@@ -1,15 +1,23 @@
|
|
|
1
|
-
interface
|
|
1
|
+
export interface Stat {
|
|
2
|
+
time: string | Date,
|
|
3
|
+
delivered: {
|
|
4
|
+
smtp: number,
|
|
5
|
+
http: number,
|
|
6
|
+
total: number
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface StatsOptions {
|
|
2
11
|
start: string | Date;
|
|
3
12
|
end: string | Date;
|
|
4
13
|
resolution: string;
|
|
5
|
-
stats:
|
|
6
|
-
time: string | Date,
|
|
7
|
-
delivered: {
|
|
8
|
-
smtp: number,
|
|
9
|
-
http: number,
|
|
10
|
-
total: number
|
|
11
|
-
}
|
|
12
|
-
}[];
|
|
14
|
+
stats: Stat[];
|
|
13
15
|
}
|
|
14
16
|
|
|
15
|
-
export
|
|
17
|
+
export interface StatsQuery {
|
|
18
|
+
event: string | string[];
|
|
19
|
+
start: string | Date;
|
|
20
|
+
end: string | Date;
|
|
21
|
+
resolution: 'hour'| 'day' | 'month';
|
|
22
|
+
duration: string;
|
|
23
|
+
}
|
package/lib/ip-pools.ts
CHANGED
|
@@ -16,12 +16,12 @@ export default class IpPoolsClient {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
create(data: { name: string, description?: string, ips?: string[] }) {
|
|
19
|
-
return this.request.
|
|
19
|
+
return this.request.postWithFD('/v1/ip_pools', data)
|
|
20
20
|
.then((response: { body: { message: string, pool_id: string } }) => response?.body);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
update(poolId: string, data: IpPoolUpdateData) : Promise<any> {
|
|
24
|
-
return this.request.
|
|
24
|
+
return this.request.patchWithFD(`/v1/ip_pools/${poolId}`, data)
|
|
25
25
|
.then((response: { body: any }) => response?.body);
|
|
26
26
|
}
|
|
27
27
|
|
package/lib/request.ts
CHANGED
|
@@ -165,6 +165,17 @@ class Request {
|
|
|
165
165
|
return this.command('put', url, formData, params);
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
+
patchWithFD(url: string, data: any): Promise<APIResponse> {
|
|
169
|
+
if (!data) {
|
|
170
|
+
throw new Error('Please provide data object');
|
|
171
|
+
}
|
|
172
|
+
const params: any = {
|
|
173
|
+
headers: { 'Content-Type': null }
|
|
174
|
+
};
|
|
175
|
+
const formData = this.createFormData(data);
|
|
176
|
+
return this.command('patch', url, formData, params);
|
|
177
|
+
}
|
|
178
|
+
|
|
168
179
|
createFormData(data: any): NodeFormData | FormData {
|
|
169
180
|
const formData: NodeFormData | FormData = Object.keys(data)
|
|
170
181
|
.filter(function (key) { return data[key]; })
|
package/lib/stats.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import urljoin from 'url-join';
|
|
2
2
|
import Request from './request';
|
|
3
|
-
import StatsOptions from './interfaces/StatsOptions';
|
|
3
|
+
import { StatsQuery, StatsOptions, Stat } from './interfaces/StatsOptions';
|
|
4
4
|
|
|
5
5
|
class Stats {
|
|
6
6
|
start: Date;
|
|
7
7
|
end: Date;
|
|
8
8
|
resolution: string;
|
|
9
|
-
stats:
|
|
9
|
+
stats: Stat[];
|
|
10
10
|
|
|
11
11
|
constructor(data: StatsOptions) {
|
|
12
12
|
this.start = new Date(data.start);
|
|
13
13
|
this.end = new Date(data.end);
|
|
14
14
|
this.resolution = data.resolution;
|
|
15
|
-
this.stats = data.stats.map(function (stat:
|
|
15
|
+
this.stats = data.stats.map(function (stat: Stat) {
|
|
16
16
|
const res = { ...stat };
|
|
17
17
|
res.time = new Date(stat.time);
|
|
18
18
|
return res;
|
|
@@ -27,17 +27,36 @@ export default class StatsClient {
|
|
|
27
27
|
this.request = request;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
private prepareSearchParams(query: StatsQuery): Array<Array<string>> {
|
|
31
|
+
let searchParams = [];
|
|
32
|
+
if (typeof query === 'object' && Object.keys(query).length) {
|
|
33
|
+
searchParams = Object.entries(query).reduce((arrayWithPairs, currentPair) => {
|
|
34
|
+
const [key, value] = currentPair;
|
|
35
|
+
if (Array.isArray(value) && value.length) {
|
|
36
|
+
const repeatedProperty = value.map((item) => [key, item]);
|
|
37
|
+
return [...arrayWithPairs, ...repeatedProperty];
|
|
38
|
+
}
|
|
39
|
+
arrayWithPairs.push([key, value]);
|
|
40
|
+
return arrayWithPairs;
|
|
41
|
+
}, []);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return searchParams;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
_parseStats(response: { body: StatsOptions }): Stats {
|
|
31
48
|
return new Stats(response.body);
|
|
32
49
|
}
|
|
33
50
|
|
|
34
|
-
getDomain(domain: string, query
|
|
35
|
-
|
|
51
|
+
getDomain(domain: string, query?: StatsQuery): Promise<Stats> {
|
|
52
|
+
const searchParams = this.prepareSearchParams(query);
|
|
53
|
+
return this.request.get(urljoin('/v3', domain, 'stats/total'), searchParams)
|
|
36
54
|
.then(this._parseStats);
|
|
37
55
|
}
|
|
38
56
|
|
|
39
|
-
getAccount(query
|
|
40
|
-
|
|
57
|
+
getAccount(query?: StatsQuery): Promise<Stats> {
|
|
58
|
+
const searchParams = this.prepareSearchParams(query);
|
|
59
|
+
return this.request.get('/v3/stats/total', searchParams)
|
|
41
60
|
.then(this._parseStats);
|
|
42
61
|
}
|
|
43
62
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mailgun.js",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.4",
|
|
4
4
|
"main": "dist/mailgun.node.js",
|
|
5
5
|
"browser": "dist/mailgun.web.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"build:release": "webpack --config ./webpack/webpack.release.config.js --progress --color",
|
|
24
24
|
"start": "webpack --watch --config ./webpack/webpack.dev.config.js --progress --color",
|
|
25
25
|
"release": "standard-version -a",
|
|
26
|
-
"test": "multi='dot=- xunit=./results.xml' mocha -t 10000 -R mocha-multi -r ts-node/register test/*.test.ts",
|
|
26
|
+
"test": "multi='dot=- xunit=./results.xml' nyc mocha -t 10000 -R mocha-multi -r ts-node/register test/*.test.ts",
|
|
27
27
|
"test-watch": "mocha -r ts-node/register -w -R dot test/*.test.ts",
|
|
28
28
|
"docs": "typedoc --tsconfig ./tsconfig.json",
|
|
29
29
|
"lint": "eslint . && eslint . --ext .ts",
|
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
"mocha": "^9.1.3",
|
|
64
64
|
"mocha-multi": "^1.1.3",
|
|
65
65
|
"nock": "^13.0.4",
|
|
66
|
+
"nyc": "^15.1.0",
|
|
66
67
|
"path-browserify": "^1.0.1",
|
|
67
68
|
"standard-version": "^9.3.1",
|
|
68
69
|
"terser-webpack-plugin": "^5.2.0",
|