Skip to content

Commit 145b5fe

Browse files
committed
Add Stats API
1 parent 1136e25 commit 145b5fe

14 files changed

Lines changed: 502 additions & 1 deletion

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.mailtrap.examples.general;
2+
3+
import io.mailtrap.api.stats.StatsFilter;
4+
import io.mailtrap.config.MailtrapConfig;
5+
import io.mailtrap.factory.MailtrapClientFactory;
6+
7+
public class StatsExample {
8+
9+
private static final String TOKEN = "<YOUR MAILTRAP TOKEN>";
10+
private static final long ACCOUNT_ID = 1L;
11+
12+
public static void main(String[] args) {
13+
final var config = new MailtrapConfig.Builder()
14+
.token(TOKEN)
15+
.build();
16+
17+
final var client = MailtrapClientFactory.createMailtrapClient(config);
18+
19+
final var filter = StatsFilter.builder()
20+
.startDate("2026-01-01")
21+
.endDate("2026-01-31")
22+
.build();
23+
24+
System.out.println("=== Aggregated Stats ===");
25+
System.out.println(client.generalApi().stats().getStats(ACCOUNT_ID, filter));
26+
27+
System.out.println("\n=== Stats by Domains ===");
28+
System.out.println(client.generalApi().stats().byDomain(ACCOUNT_ID, filter));
29+
30+
System.out.println("\n=== Stats by Categories ===");
31+
System.out.println(client.generalApi().stats().byCategory(ACCOUNT_ID, filter));
32+
33+
System.out.println("\n=== Stats by Email Service Providers ===");
34+
System.out.println(client.generalApi().stats().byEmailServiceProvider(ACCOUNT_ID, filter));
35+
36+
System.out.println("\n=== Stats by Date ===");
37+
System.out.println(client.generalApi().stats().byDate(ACCOUNT_ID, filter));
38+
}
39+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package io.mailtrap.api.stats;
2+
3+
import io.mailtrap.model.response.stats.SendingStatGroupResponse;
4+
import io.mailtrap.model.response.stats.SendingStatsResponse;
5+
6+
import java.util.List;
7+
8+
/**
9+
* Interface representing the Mailtrap API for interaction with sending statistics
10+
*/
11+
public interface Stats {
12+
13+
/**
14+
* Get aggregated sending stats
15+
*
16+
* @param accountId unique account ID
17+
* @param filter stats filter parameters
18+
* @return aggregated sending statistics
19+
*/
20+
SendingStatsResponse getStats(long accountId, StatsFilter filter);
21+
22+
/**
23+
* Get sending stats grouped by domains
24+
*
25+
* @param accountId unique account ID
26+
* @param filter stats filter parameters
27+
* @return list of sending statistics grouped by domain
28+
*/
29+
List<SendingStatGroupResponse> byDomain(long accountId, StatsFilter filter);
30+
31+
/**
32+
* Get sending stats grouped by categories
33+
*
34+
* @param accountId unique account ID
35+
* @param filter stats filter parameters
36+
* @return list of sending statistics grouped by category
37+
*/
38+
List<SendingStatGroupResponse> byCategory(long accountId, StatsFilter filter);
39+
40+
/**
41+
* Get sending stats grouped by email service providers
42+
*
43+
* @param accountId unique account ID
44+
* @param filter stats filter parameters
45+
* @return list of sending statistics grouped by email service provider
46+
*/
47+
List<SendingStatGroupResponse> byEmailServiceProvider(long accountId, StatsFilter filter);
48+
49+
/**
50+
* Get sending stats grouped by date
51+
*
52+
* @param accountId unique account ID
53+
* @param filter stats filter parameters
54+
* @return list of sending statistics grouped by date
55+
*/
56+
List<SendingStatGroupResponse> byDate(long accountId, StatsFilter filter);
57+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.mailtrap.api.stats;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.util.List;
9+
10+
@Data
11+
@NoArgsConstructor
12+
@AllArgsConstructor
13+
@Builder
14+
public class StatsFilter {
15+
private String startDate;
16+
private String endDate;
17+
private List<Long> sendingDomainIds;
18+
private List<String> sendingStreams;
19+
private List<String> categories;
20+
private List<String> emailServiceProviders;
21+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package io.mailtrap.api.stats;
2+
3+
import io.mailtrap.Constants;
4+
import io.mailtrap.api.apiresource.ApiResource;
5+
import io.mailtrap.config.MailtrapConfig;
6+
import io.mailtrap.http.RequestData;
7+
import io.mailtrap.model.response.stats.SendingStatGroupResponse;
8+
import io.mailtrap.model.response.stats.SendingStatsResponse;
9+
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.Optional;
13+
14+
import static io.mailtrap.http.RequestData.entry;
15+
16+
public class StatsImpl extends ApiResource implements Stats {
17+
18+
public StatsImpl(final MailtrapConfig config) {
19+
super(config);
20+
this.apiHost = Constants.GENERAL_HOST;
21+
}
22+
23+
@Override
24+
public SendingStatsResponse getStats(final long accountId, final StatsFilter filter) {
25+
return httpClient.get(
26+
buildUrl(accountId, ""),
27+
new RequestData(buildStatsQueryParams(filter)),
28+
SendingStatsResponse.class
29+
);
30+
}
31+
32+
@Override
33+
public List<SendingStatGroupResponse> byDomain(final long accountId, final StatsFilter filter) {
34+
return httpClient.getList(
35+
buildUrl(accountId, "/domains"),
36+
new RequestData(buildStatsQueryParams(filter)),
37+
SendingStatGroupResponse.class
38+
);
39+
}
40+
41+
@Override
42+
public List<SendingStatGroupResponse> byCategory(final long accountId, final StatsFilter filter) {
43+
return httpClient.getList(
44+
buildUrl(accountId, "/categories"),
45+
new RequestData(buildStatsQueryParams(filter)),
46+
SendingStatGroupResponse.class
47+
);
48+
}
49+
50+
@Override
51+
public List<SendingStatGroupResponse> byEmailServiceProvider(final long accountId, final StatsFilter filter) {
52+
return httpClient.getList(
53+
buildUrl(accountId, "/email_service_providers"),
54+
new RequestData(buildStatsQueryParams(filter)),
55+
SendingStatGroupResponse.class
56+
);
57+
}
58+
59+
@Override
60+
public List<SendingStatGroupResponse> byDate(final long accountId, final StatsFilter filter) {
61+
return httpClient.getList(
62+
buildUrl(accountId, "/date"),
63+
new RequestData(buildStatsQueryParams(filter)),
64+
SendingStatGroupResponse.class
65+
);
66+
}
67+
68+
private String buildUrl(final long accountId, final String suffix) {
69+
return String.format(apiHost + "/api/accounts/%d/stats%s", accountId, suffix);
70+
}
71+
72+
private Map<String, ? extends Optional<?>> buildStatsQueryParams(final StatsFilter filter) {
73+
return RequestData.buildQueryParams(
74+
entry("start_date", Optional.ofNullable(filter.getStartDate())),
75+
entry("end_date", Optional.ofNullable(filter.getEndDate())),
76+
entry("sending_domain_ids[]", Optional.ofNullable(filter.getSendingDomainIds())),
77+
entry("sending_streams[]", Optional.ofNullable(filter.getSendingStreams())),
78+
entry("categories[]", Optional.ofNullable(filter.getCategories())),
79+
entry("email_service_providers[]", Optional.ofNullable(filter.getEmailServiceProviders()))
80+
);
81+
}
82+
}

src/main/java/io/mailtrap/client/api/MailtrapGeneralApi.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.mailtrap.api.accounts.Accounts;
55
import io.mailtrap.api.billing.Billing;
66
import io.mailtrap.api.permissions.Permissions;
7+
import io.mailtrap.api.stats.Stats;
78
import lombok.Getter;
89
import lombok.RequiredArgsConstructor;
910
import lombok.experimental.Accessors;
@@ -19,4 +20,5 @@ public class MailtrapGeneralApi {
1920
private final Accounts accounts;
2021
private final Billing billing;
2122
private final Permissions permissions;
23+
private final Stats stats;
2224
}

src/main/java/io/mailtrap/factory/MailtrapClientFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.mailtrap.api.projects.ProjectsImpl;
2020
import io.mailtrap.api.sendingdomains.SendingDomainsImpl;
2121
import io.mailtrap.api.sendingemails.SendingEmailsImpl;
22+
import io.mailtrap.api.stats.StatsImpl;
2223
import io.mailtrap.api.suppressions.SuppressionsImpl;
2324
import io.mailtrap.api.testingemails.TestingEmailsImpl;
2425
import io.mailtrap.client.MailtrapClient;
@@ -87,8 +88,9 @@ private static MailtrapGeneralApi createGeneralApi(final MailtrapConfig config)
8788
final var accounts = new AccountsImpl(config);
8889
final var billing = new BillingImpl(config);
8990
final var permissions = new PermissionsImpl(config);
91+
final var stats = new StatsImpl(config);
9092

91-
return new MailtrapGeneralApi(accountAccess, accounts, billing, permissions);
93+
return new MailtrapGeneralApi(accountAccess, accounts, billing, permissions, stats);
9294
}
9395

9496
private static MailtrapEmailSendingApi createSendingApi(final MailtrapConfig config) {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.mailtrap.model.response.stats;
2+
3+
import com.fasterxml.jackson.annotation.JsonAnySetter;
4+
import lombok.Data;
5+
6+
@Data
7+
public class SendingStatGroupResponse {
8+
9+
private String name;
10+
private Object value;
11+
private SendingStatsResponse stats;
12+
13+
@JsonAnySetter
14+
public void setDynamicField(String key, Object value) {
15+
if (!"stats".equals(key)) {
16+
this.name = key;
17+
this.value = value;
18+
}
19+
}
20+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.mailtrap.model.response.stats;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Data;
5+
6+
@Data
7+
public class SendingStatsResponse {
8+
9+
@JsonProperty("delivery_count")
10+
private int deliveryCount;
11+
12+
@JsonProperty("delivery_rate")
13+
private double deliveryRate;
14+
15+
@JsonProperty("bounce_count")
16+
private int bounceCount;
17+
18+
@JsonProperty("bounce_rate")
19+
private double bounceRate;
20+
21+
@JsonProperty("open_count")
22+
private int openCount;
23+
24+
@JsonProperty("open_rate")
25+
private double openRate;
26+
27+
@JsonProperty("click_count")
28+
private int clickCount;
29+
30+
@JsonProperty("click_rate")
31+
private double clickRate;
32+
33+
@JsonProperty("spam_count")
34+
private int spamCount;
35+
36+
@JsonProperty("spam_rate")
37+
private double spamRate;
38+
}

0 commit comments

Comments
 (0)