Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions examples/java/io/mailtrap/examples/general/StatsExample.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package io.mailtrap.examples.general;

import io.mailtrap.api.stats.StatsFilter;
import io.mailtrap.config.MailtrapConfig;
import io.mailtrap.factory.MailtrapClientFactory;

public class StatsExample {

private static final String TOKEN = "<YOUR MAILTRAP TOKEN>";
private static final long ACCOUNT_ID = 1L;

// Set these to the desired date range (format: YYYY-MM-DD)
private static final String START_DATE = "<START_DATE>";
private static final String END_DATE = "<END_DATE>";

public static void main(String[] args) {
final var config = new MailtrapConfig.Builder()
.token(TOKEN)
.build();

final var client = MailtrapClientFactory.createMailtrapClient(config);

final var filter = StatsFilter.builder()
.startDate(START_DATE)
.endDate(END_DATE)
.build();

System.out.println("=== Aggregated Stats ===");
System.out.println(client.generalApi().stats().getStats(ACCOUNT_ID, filter));

System.out.println("\n=== Stats by Domains ===");
System.out.println(client.generalApi().stats().byDomain(ACCOUNT_ID, filter));

System.out.println("\n=== Stats by Categories ===");
System.out.println(client.generalApi().stats().byCategory(ACCOUNT_ID, filter));

System.out.println("\n=== Stats by Email Service Providers ===");
System.out.println(client.generalApi().stats().byEmailServiceProvider(ACCOUNT_ID, filter));

System.out.println("\n=== Stats by Date ===");
System.out.println(client.generalApi().stats().byDate(ACCOUNT_ID, filter));
}
}
57 changes: 57 additions & 0 deletions src/main/java/io/mailtrap/api/stats/Stats.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package io.mailtrap.api.stats;

import io.mailtrap.model.response.stats.SendingStatGroupResponse;
import io.mailtrap.model.response.stats.SendingStatsResponse;

import java.util.List;

/**
* Interface representing the Mailtrap API for interaction with sending statistics
*/
public interface Stats {

/**
* Get aggregated sending stats
*
* @param accountId unique account ID
* @param filter stats filter parameters
* @return aggregated sending statistics
*/
SendingStatsResponse getStats(long accountId, StatsFilter filter);

/**
* Get sending stats grouped by domains
*
* @param accountId unique account ID
* @param filter stats filter parameters
* @return list of sending statistics grouped by domain
*/
List<SendingStatGroupResponse> byDomain(long accountId, StatsFilter filter);

/**
* Get sending stats grouped by categories
*
* @param accountId unique account ID
* @param filter stats filter parameters
* @return list of sending statistics grouped by category
*/
List<SendingStatGroupResponse> byCategory(long accountId, StatsFilter filter);

/**
* Get sending stats grouped by email service providers
*
* @param accountId unique account ID
* @param filter stats filter parameters
* @return list of sending statistics grouped by email service provider
*/
List<SendingStatGroupResponse> byEmailServiceProvider(long accountId, StatsFilter filter);

/**
* Get sending stats grouped by date
*
* @param accountId unique account ID
* @param filter stats filter parameters
* @return list of sending statistics grouped by date
*/
List<SendingStatGroupResponse> byDate(long accountId, StatsFilter filter);
}
21 changes: 21 additions & 0 deletions src/main/java/io/mailtrap/api/stats/StatsFilter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.mailtrap.api.stats;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class StatsFilter {
private String startDate;
private String endDate;
private List<Long> sendingDomainIds;
private List<String> sendingStreams;
private List<String> categories;
private List<String> emailServiceProviders;
}
92 changes: 92 additions & 0 deletions src/main/java/io/mailtrap/api/stats/StatsImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package io.mailtrap.api.stats;

import io.mailtrap.Constants;
import io.mailtrap.api.apiresource.ApiResource;
import io.mailtrap.config.MailtrapConfig;
import io.mailtrap.http.RequestData;
import io.mailtrap.model.response.stats.SendingStatGroupResponse;
import io.mailtrap.model.response.stats.SendingStatsResponse;

import java.util.List;
import java.util.Map;
import java.util.Optional;

import static io.mailtrap.http.RequestData.entry;

public class StatsImpl extends ApiResource implements Stats {

public StatsImpl(final MailtrapConfig config) {
super(config);
this.apiHost = Constants.GENERAL_HOST;
}

@Override
public SendingStatsResponse getStats(final long accountId, final StatsFilter filter) {
return httpClient.get(
buildUrl(accountId, ""),
new RequestData(buildStatsQueryParams(filter)),
SendingStatsResponse.class
);
}

@Override
public List<SendingStatGroupResponse> byDomain(final long accountId, final StatsFilter filter) {
return httpClient.getList(
buildUrl(accountId, "/domains"),
new RequestData(buildStatsQueryParams(filter)),
SendingStatGroupResponse.class
);
}

@Override
public List<SendingStatGroupResponse> byCategory(final long accountId, final StatsFilter filter) {
return httpClient.getList(
buildUrl(accountId, "/categories"),
new RequestData(buildStatsQueryParams(filter)),
SendingStatGroupResponse.class
);
}

@Override
public List<SendingStatGroupResponse> byEmailServiceProvider(final long accountId, final StatsFilter filter) {
return httpClient.getList(
buildUrl(accountId, "/email_service_providers"),
new RequestData(buildStatsQueryParams(filter)),
SendingStatGroupResponse.class
);
}

@Override
public List<SendingStatGroupResponse> byDate(final long accountId, final StatsFilter filter) {
return httpClient.getList(
buildUrl(accountId, "/date"),
new RequestData(buildStatsQueryParams(filter)),
SendingStatGroupResponse.class
);
}

private String buildUrl(final long accountId, final String suffix) {
return String.format(apiHost + "/api/accounts/%d/stats%s", accountId, suffix);
}

private Map<String, ? extends Optional<?>> buildStatsQueryParams(final StatsFilter filter) {
if (filter == null) {
throw new IllegalArgumentException("filter must not be null");
}
if (filter.getStartDate() == null || filter.getStartDate().trim().isEmpty()) {
throw new IllegalArgumentException("startDate must not be null or empty");
}
if (filter.getEndDate() == null || filter.getEndDate().trim().isEmpty()) {
throw new IllegalArgumentException("endDate must not be null or empty");
}

return RequestData.buildQueryParams(
entry("start_date", Optional.ofNullable(filter.getStartDate())),
entry("end_date", Optional.ofNullable(filter.getEndDate())),
entry("sending_domain_ids[]", Optional.ofNullable(filter.getSendingDomainIds())),
entry("sending_streams[]", Optional.ofNullable(filter.getSendingStreams())),
entry("categories[]", Optional.ofNullable(filter.getCategories())),
entry("email_service_providers[]", Optional.ofNullable(filter.getEmailServiceProviders()))
);
}
}
2 changes: 2 additions & 0 deletions src/main/java/io/mailtrap/client/api/MailtrapGeneralApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.mailtrap.api.accounts.Accounts;
import io.mailtrap.api.billing.Billing;
import io.mailtrap.api.permissions.Permissions;
import io.mailtrap.api.stats.Stats;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;
Expand All @@ -19,4 +20,5 @@ public class MailtrapGeneralApi {
private final Accounts accounts;
private final Billing billing;
private final Permissions permissions;
private final Stats stats;
}
4 changes: 3 additions & 1 deletion src/main/java/io/mailtrap/factory/MailtrapClientFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import io.mailtrap.api.projects.ProjectsImpl;
import io.mailtrap.api.sendingdomains.SendingDomainsImpl;
import io.mailtrap.api.sendingemails.SendingEmailsImpl;
import io.mailtrap.api.stats.StatsImpl;
import io.mailtrap.api.suppressions.SuppressionsImpl;
import io.mailtrap.api.testingemails.TestingEmailsImpl;
import io.mailtrap.client.MailtrapClient;
Expand Down Expand Up @@ -87,8 +88,9 @@ private static MailtrapGeneralApi createGeneralApi(final MailtrapConfig config)
final var accounts = new AccountsImpl(config);
final var billing = new BillingImpl(config);
final var permissions = new PermissionsImpl(config);
final var stats = new StatsImpl(config);

return new MailtrapGeneralApi(accountAccess, accounts, billing, permissions);
return new MailtrapGeneralApi(accountAccess, accounts, billing, permissions, stats);
}

private static MailtrapEmailSendingApi createSendingApi(final MailtrapConfig config) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.mailtrap.model.response.stats;

import com.fasterxml.jackson.annotation.JsonAnySetter;
import lombok.Data;

@Data
public class SendingStatGroupResponse {

private String name;
private Object value;
private SendingStatsResponse stats;

@JsonAnySetter
public void setDynamicField(String key, Object value) {
if (!"stats".equals(key)) {
this.name = key;
this.value = value;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.mailtrap.model.response.stats;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

@Data
public class SendingStatsResponse {

@JsonProperty("delivery_count")
private int deliveryCount;

@JsonProperty("delivery_rate")
private double deliveryRate;

@JsonProperty("bounce_count")
private int bounceCount;

@JsonProperty("bounce_rate")
private double bounceRate;

@JsonProperty("open_count")
private int openCount;

@JsonProperty("open_rate")
private double openRate;

@JsonProperty("click_count")
private int clickCount;

@JsonProperty("click_rate")
private double clickRate;

@JsonProperty("spam_count")
private int spamCount;

@JsonProperty("spam_rate")
private double spamRate;
}
Loading