diff --git a/src/main/java/co/lettermint/api/ApiClient.java b/src/main/java/co/lettermint/api/ApiClient.java index b00b260..225756a 100644 --- a/src/main/java/co/lettermint/api/ApiClient.java +++ b/src/main/java/co/lettermint/api/ApiClient.java @@ -193,18 +193,6 @@ public ProjectRotateTokenResponse rotateToken(String projectId) { return client.post("/projects/" + segment(projectId) + "/rotate-token", null, ProjectRotateTokenResponse.class); } - public ProjectUpdateMembersResponse updateMembers(String projectId, UpdateProjectMembersData payload) { - return client.put("/projects/" + segment(projectId) + "/members", payload, ProjectUpdateMembersResponse.class); - } - - public ProjectAddMemberResponse addMember(String projectId, String teamMemberId) { - return client.post("/projects/" + segment(projectId) + "/members/" + segment(teamMemberId), null, ProjectAddMemberResponse.class); - } - - public ProjectRemoveMemberResponse removeMember(String projectId, String teamMemberId) { - return client.delete("/projects/" + segment(projectId) + "/members/" + segment(teamMemberId), ProjectRemoveMemberResponse.class); - } - public RouteIndexResponse routes(String projectId) { return routes(projectId, null); } @@ -305,6 +293,10 @@ public TeamUsageDetailData usage(Map query) { return client.get("/team/usage", TeamUsageDetailData.class, query); } + public TeamRolesResponse roles() { + return client.get("/team/roles", TeamRolesResponse.class); + } + public TeamMembersResponse members() { return members(null); } @@ -312,6 +304,14 @@ public TeamMembersResponse members() { public TeamMembersResponse members(Map query) { return client.get("/team/members", TeamMembersResponse.class, query); } + + public TeamMemberData member(String userId) { + return client.get("/team/members/" + segment(userId), TeamMemberData.class); + } + + public TeamMemberData updateMemberAssignment(String userId, UpdateTeamMemberAssignmentData payload) { + return client.put("/team/members/" + segment(userId) + "/assignment", payload, TeamMemberData.class); + } } public static class WebhooksEndpoint { diff --git a/src/main/java/co/lettermint/client/LettermintClient.java b/src/main/java/co/lettermint/client/LettermintClient.java index 6532eee..1c9dd94 100644 --- a/src/main/java/co/lettermint/client/LettermintClient.java +++ b/src/main/java/co/lettermint/client/LettermintClient.java @@ -92,7 +92,11 @@ public T post(String path, Object payload, Class responseClass, Map T post(String path, Object payload, TypeReference responseType) { - return request("POST", url(path, null), payload, null, responseType, null); + return post(path, payload, responseType, null); + } + + public T post(String path, Object payload, TypeReference responseType, Map headers) { + return request("POST", url(path, null), payload, null, responseType, headers); } public T get(String path, Class responseClass) { diff --git a/src/main/java/co/lettermint/endpoints/EmailEndpoint.java b/src/main/java/co/lettermint/endpoints/EmailEndpoint.java index 38a62f8..faad957 100644 --- a/src/main/java/co/lettermint/endpoints/EmailEndpoint.java +++ b/src/main/java/co/lettermint/endpoints/EmailEndpoint.java @@ -26,7 +26,8 @@ public class EmailEndpoint extends Endpoint { private List attachments; private String route; private Map metadata; - private List tags; + private String tag; + private Map settings; private String idempotencyKey; public EmailEndpoint(LettermintClient client) { @@ -50,7 +51,8 @@ private void reset() { this.attachments = new ArrayList<>(); this.route = null; this.metadata = new LinkedHashMap<>(); - this.tags = new ArrayList<>(); + this.tag = null; + this.settings = null; this.idempotencyKey = null; } @@ -196,10 +198,18 @@ public EmailEndpoint metadata(String key, Object value) { } /** - * Add tags to the email. + * Set the email tag. */ - public EmailEndpoint tag(String... tags) { - this.tags.addAll(Arrays.asList(tags)); + public EmailEndpoint tag(String tag) { + this.tag = tag; + return this; + } + + /** + * Set per-email settings that override the selected route. + */ + public EmailEndpoint settings(Map settings) { + this.settings = new LinkedHashMap<>(settings); return this; } @@ -231,7 +241,17 @@ public SendEmailResponse send() { } public List sendBatch(List payloads) { - return client.post("/send/batch", payloads, new TypeReference>() {}); + Map requestHeaders = null; + + if (idempotencyKey != null && !idempotencyKey.isEmpty()) { + requestHeaders = Collections.singletonMap("Idempotency-Key", idempotencyKey); + } + + try { + return client.post("/send/batch", payloads, new TypeReference>() {}, requestHeaders); + } finally { + reset(); + } } public String ping() { @@ -289,8 +309,12 @@ private Map buildPayload() { payload.put("metadata", metadata); } - if (!tags.isEmpty()) { - payload.put("tags", tags); + if (tag != null) { + payload.put("tag", tag); + } + + if (settings != null) { + payload.put("settings", settings); } return payload; diff --git a/src/main/java/co/lettermint/models/api/BuiltInTeamRole.java b/src/main/java/co/lettermint/models/api/BuiltInTeamRole.java new file mode 100644 index 0000000..69ede0c --- /dev/null +++ b/src/main/java/co/lettermint/models/api/BuiltInTeamRole.java @@ -0,0 +1,9 @@ +package co.lettermint.models.api; + +public final class BuiltInTeamRole { + public static final String OWNER = "owner"; + public static final String ADMIN = "admin"; + public static final String MEMBER = "member"; + + private BuiltInTeamRole() {} +} diff --git a/src/main/java/co/lettermint/models/api/CursorPaginator.java b/src/main/java/co/lettermint/models/api/CursorPaginator.java new file mode 100644 index 0000000..d2f99fc --- /dev/null +++ b/src/main/java/co/lettermint/models/api/CursorPaginator.java @@ -0,0 +1,29 @@ +package co.lettermint.models.api; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CursorPaginator { + @JsonProperty("data") + public List data; + + @JsonProperty("path") + public String path; + + @JsonProperty("per_page") + public Integer perPage; + + @JsonProperty("next_cursor") + public String nextCursor; + + @JsonProperty("next_page_url") + public String nextPageUrl; + + @JsonProperty("prev_cursor") + public String prevCursor; + + @JsonProperty("prev_page_url") + public String prevPageUrl; +} diff --git a/src/main/java/co/lettermint/models/api/DkimMode.java b/src/main/java/co/lettermint/models/api/DkimMode.java new file mode 100644 index 0000000..d407c19 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/DkimMode.java @@ -0,0 +1,8 @@ +package co.lettermint.models.api; + +public final class DkimMode { + public static final String LEGACYTXT = "legacy_txt"; + public static final String MANAGEDCNAME = "managed_cname"; + + private DkimMode() {} +} diff --git a/src/main/java/co/lettermint/models/api/DnsRecordPurpose.java b/src/main/java/co/lettermint/models/api/DnsRecordPurpose.java new file mode 100644 index 0000000..d6ecdc3 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/DnsRecordPurpose.java @@ -0,0 +1,11 @@ +package co.lettermint.models.api; + +public final class DnsRecordPurpose { + public static final String RETURNPATH = "return_path"; + public static final String DMARC = "dmarc"; + public static final String DKIMLEGACY = "dkim_legacy"; + public static final String DKIMPRIMARY = "dkim_primary"; + public static final String DKIMSECONDARY = "dkim_secondary"; + + private DnsRecordPurpose() {} +} diff --git a/src/main/java/co/lettermint/models/api/DnsVerificationScope.java b/src/main/java/co/lettermint/models/api/DnsVerificationScope.java new file mode 100644 index 0000000..dc5bfa7 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/DnsVerificationScope.java @@ -0,0 +1,10 @@ +package co.lettermint.models.api; + +public final class DnsVerificationScope { + public static final String REQUIRED = "required"; + public static final String RECOMMENDED = "recommended"; + public static final String MIGRATION = "migration"; + public static final String DEPRECATED = "deprecated"; + + private DnsVerificationScope() {} +} diff --git a/src/main/java/co/lettermint/models/api/DomainData.java b/src/main/java/co/lettermint/models/api/DomainData.java index 3131896..0b00fd5 100644 --- a/src/main/java/co/lettermint/models/api/DomainData.java +++ b/src/main/java/co/lettermint/models/api/DomainData.java @@ -13,6 +13,12 @@ public class DomainData { @JsonProperty("domain") public String domain; + @JsonProperty("dkim_mode") + public String dkimMode; + + @JsonProperty("rotation_ready") + public Boolean rotationReady; + @JsonProperty("status_changed_at") public String statusChangedAt; diff --git a/src/main/java/co/lettermint/models/api/DomainDnsRecordData.java b/src/main/java/co/lettermint/models/api/DomainDnsRecordData.java index 78fa64a..fd00586 100644 --- a/src/main/java/co/lettermint/models/api/DomainDnsRecordData.java +++ b/src/main/java/co/lettermint/models/api/DomainDnsRecordData.java @@ -9,7 +9,7 @@ public class DomainDnsRecordData { public String id; @JsonProperty("type") - public RecordType type; + public String type; @JsonProperty("hostname") public String hostname; @@ -21,7 +21,16 @@ public class DomainDnsRecordData { public String content; @JsonProperty("status") - public DnsRecordStatus status; + public String status; + + @JsonProperty("purpose") + public String purpose; + + @JsonProperty("verification_scope") + public String verificationScope; + + @JsonProperty("required_for_verification") + public Boolean requiredForVerification; @JsonProperty("verified_at") public String verifiedAt; diff --git a/src/main/java/co/lettermint/models/api/DomainListData.java b/src/main/java/co/lettermint/models/api/DomainListData.java index 43fcb65..729d540 100644 --- a/src/main/java/co/lettermint/models/api/DomainListData.java +++ b/src/main/java/co/lettermint/models/api/DomainListData.java @@ -12,7 +12,10 @@ public class DomainListData { public String domain; @JsonProperty("status") - public DomainStatus status; + public String status; + + @JsonProperty("dkim_mode") + public String dkimMode; @JsonProperty("status_changed_at") public String statusChangedAt; diff --git a/src/main/java/co/lettermint/models/api/DomainVerifyDnsRecordsResponse.java b/src/main/java/co/lettermint/models/api/DomainVerifyDnsRecordsResponse.java index b9f5979..79e2aae 100644 --- a/src/main/java/co/lettermint/models/api/DomainVerifyDnsRecordsResponse.java +++ b/src/main/java/co/lettermint/models/api/DomainVerifyDnsRecordsResponse.java @@ -2,9 +2,14 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) public class DomainVerifyDnsRecordsResponse { @JsonProperty("message") public String message; + + @JsonProperty("recommended_failed_records") + public List> recommendedFailedRecords; } diff --git a/src/main/java/co/lettermint/models/api/MessageData.java b/src/main/java/co/lettermint/models/api/MessageData.java index 257810f..5b6a82f 100644 --- a/src/main/java/co/lettermint/models/api/MessageData.java +++ b/src/main/java/co/lettermint/models/api/MessageData.java @@ -11,10 +11,10 @@ public class MessageData { public String id; @JsonProperty("type") - public MessageType type; + public String type; @JsonProperty("status") - public MessageStatus status; + public String status; @JsonProperty("status_changed_at") public String statusChangedAt; diff --git a/src/main/java/co/lettermint/models/api/MessageEventData.java b/src/main/java/co/lettermint/models/api/MessageEventData.java index 450e9b5..d49a262 100644 --- a/src/main/java/co/lettermint/models/api/MessageEventData.java +++ b/src/main/java/co/lettermint/models/api/MessageEventData.java @@ -10,7 +10,7 @@ public class MessageEventData { public String messageId; @JsonProperty("event") - public MessageEventType event; + public String event; @JsonProperty("metadata") public Map metadata; diff --git a/src/main/java/co/lettermint/models/api/MessageIndexResponse.java b/src/main/java/co/lettermint/models/api/MessageIndexResponse.java index 23d273e..7a1db83 100644 --- a/src/main/java/co/lettermint/models/api/MessageIndexResponse.java +++ b/src/main/java/co/lettermint/models/api/MessageIndexResponse.java @@ -3,27 +3,16 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) public class MessageIndexResponse { @JsonProperty("data") public List data; - @JsonProperty("path") - public String path; + @JsonProperty("links") + public List links; - @JsonProperty("per_page") - public Integer perPage; - - @JsonProperty("next_cursor") - public String nextCursor; - - @JsonProperty("next_page_url") - public String nextPageUrl; - - @JsonProperty("prev_cursor") - public String prevCursor; - - @JsonProperty("prev_page_url") - public String prevPageUrl; + @JsonProperty("meta") + public Map meta; } diff --git a/src/main/java/co/lettermint/models/api/MessageListData.java b/src/main/java/co/lettermint/models/api/MessageListData.java index 5b0390d..b38861b 100644 --- a/src/main/java/co/lettermint/models/api/MessageListData.java +++ b/src/main/java/co/lettermint/models/api/MessageListData.java @@ -10,10 +10,13 @@ public class MessageListData { public String id; @JsonProperty("type") - public MessageType type; + public String type; @JsonProperty("status") - public MessageStatus status; + public String status; + + @JsonProperty("spam_score") + public Double spamScore; @JsonProperty("from_email") public String fromEmail; @@ -39,6 +42,9 @@ public class MessageListData { @JsonProperty("tag") public String tag; + @JsonProperty("status_changed_at") + public String statusChangedAt; + @JsonProperty("created_at") public String createdAt; } diff --git a/src/main/java/co/lettermint/models/api/ProjectAccessScope.java b/src/main/java/co/lettermint/models/api/ProjectAccessScope.java new file mode 100644 index 0000000..0e084a1 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/ProjectAccessScope.java @@ -0,0 +1,8 @@ +package co.lettermint.models.api; + +public final class ProjectAccessScope { + public static final String ALL = "all"; + public static final String SELECTED = "selected"; + + private ProjectAccessScope() {} +} diff --git a/src/main/java/co/lettermint/models/api/ProjectAddMemberResponse.java b/src/main/java/co/lettermint/models/api/ProjectAddMemberResponse.java deleted file mode 100644 index 6c9fad4..0000000 --- a/src/main/java/co/lettermint/models/api/ProjectAddMemberResponse.java +++ /dev/null @@ -1,10 +0,0 @@ -package co.lettermint.models.api; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class ProjectAddMemberResponse { - @JsonProperty("message") - public String message; -} diff --git a/src/main/java/co/lettermint/models/api/ProjectData.java b/src/main/java/co/lettermint/models/api/ProjectData.java index 9b33780..3734281 100644 --- a/src/main/java/co/lettermint/models/api/ProjectData.java +++ b/src/main/java/co/lettermint/models/api/ProjectData.java @@ -42,12 +42,6 @@ public class ProjectData { @JsonProperty("domains_count") public Integer domainsCount; - @JsonProperty("team_members") - public List teamMembers; - - @JsonProperty("team_members_count") - public Integer teamMembersCount; - @JsonProperty("last_28_days") public MessageStatsData last28Days; diff --git a/src/main/java/co/lettermint/models/api/ProjectListData.java b/src/main/java/co/lettermint/models/api/ProjectListData.java index 05f40c8..2e35eb8 100644 --- a/src/main/java/co/lettermint/models/api/ProjectListData.java +++ b/src/main/java/co/lettermint/models/api/ProjectListData.java @@ -20,9 +20,6 @@ public class ProjectListData { @JsonProperty("domains_count") public Integer domainsCount; - @JsonProperty("team_members_count") - public Integer teamMembersCount; - @JsonProperty("last_28_days") public MessageStatsData last28Days; diff --git a/src/main/java/co/lettermint/models/api/ProjectRemoveMemberResponse.java b/src/main/java/co/lettermint/models/api/ProjectRemoveMemberResponse.java deleted file mode 100644 index 7f6c163..0000000 --- a/src/main/java/co/lettermint/models/api/ProjectRemoveMemberResponse.java +++ /dev/null @@ -1,10 +0,0 @@ -package co.lettermint.models.api; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class ProjectRemoveMemberResponse { - @JsonProperty("message") - public String message; -} diff --git a/src/main/java/co/lettermint/models/api/ProjectUpdateMembersResponse.java b/src/main/java/co/lettermint/models/api/ProjectUpdateMembersResponse.java deleted file mode 100644 index 3f0915a..0000000 --- a/src/main/java/co/lettermint/models/api/ProjectUpdateMembersResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package co.lettermint.models.api; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class ProjectUpdateMembersResponse { - @JsonProperty("data") - public ProjectData data; - - @JsonProperty("message") - public String message; -} diff --git a/src/main/java/co/lettermint/models/api/RbacConflictCode.java b/src/main/java/co/lettermint/models/api/RbacConflictCode.java new file mode 100644 index 0000000..31ab13f --- /dev/null +++ b/src/main/java/co/lettermint/models/api/RbacConflictCode.java @@ -0,0 +1,11 @@ +package co.lettermint.models.api; + +public final class RbacConflictCode { + public static final String STALERESOURCE = "stale_resource"; + public static final String OWNERPROTECTED = "owner_protected"; + public static final String LASTOWNER = "last_owner"; + public static final String BUILTINROLEIMMUTABLE = "built_in_role_immutable"; + public static final String CUSTOMROLEREQUIRESPRO = "custom_role_requires_pro"; + + private RbacConflictCode() {} +} diff --git a/src/main/java/co/lettermint/models/api/RbacPermission.java b/src/main/java/co/lettermint/models/api/RbacPermission.java new file mode 100644 index 0000000..e28b9d2 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/RbacPermission.java @@ -0,0 +1,46 @@ +package co.lettermint.models.api; + +public final class RbacPermission { + public static final String TEAMMANAGE = "team:manage"; + public static final String BILLINGMANAGE = "billing:manage"; + public static final String SECURITYMANAGE = "security:manage"; + public static final String AUDITREAD = "audit:read"; + public static final String SUPPORTMANAGE = "support:manage"; + public static final String MEMBERSREAD = "members:read"; + public static final String MEMBERSMANAGE = "members:manage"; + public static final String ROLESMANAGE = "roles:manage"; + public static final String TEAMTOKENSREAD = "team_tokens:read"; + public static final String TEAMTOKENSMANAGE = "team_tokens:manage"; + public static final String TEAMTOKENSROTATE = "team_tokens:rotate"; + public static final String TEAMTOKENSREVOKE = "team_tokens:revoke"; + public static final String PROJECTSCREATE = "projects:create"; + public static final String TEAMSUPPRESSIONSREAD = "team_suppressions:read"; + public static final String TEAMSUPPRESSIONSADD = "team_suppressions:add"; + public static final String TEAMSUPPRESSIONSREMOVE = "team_suppressions:remove"; + public static final String PROJECTSREAD = "projects:read"; + public static final String PROJECTSMANAGE = "projects:manage"; + public static final String PROJECTSDELETE = "projects:delete"; + public static final String ROUTESREAD = "routes:read"; + public static final String ROUTESMANAGE = "routes:manage"; + public static final String ROUTESDELETE = "routes:delete"; + public static final String DOMAINSREAD = "domains:read"; + public static final String DOMAINSMANAGE = "domains:manage"; + public static final String DOMAINSDELETE = "domains:delete"; + public static final String PROJECTTOKENSREAD = "project_tokens:read"; + public static final String PROJECTTOKENSMANAGE = "project_tokens:manage"; + public static final String PROJECTTOKENSROTATE = "project_tokens:rotate"; + public static final String PROJECTTOKENSREVOKE = "project_tokens:revoke"; + public static final String WEBHOOKSREAD = "webhooks:read"; + public static final String WEBHOOKSMANAGE = "webhooks:manage"; + public static final String WEBHOOKSDELETE = "webhooks:delete"; + public static final String WEBHOOKSROTATESECRET = "webhooks:rotate_secret"; + public static final String STATSREAD = "stats:read"; + public static final String MESSAGESREAD = "messages:read"; + public static final String MESSAGESREADCONTENT = "messages:read_content"; + public static final String MESSAGESSEND = "messages:send"; + public static final String SUPPRESSIONSREAD = "suppressions:read"; + public static final String SUPPRESSIONSADD = "suppressions:add"; + public static final String SUPPRESSIONSREMOVE = "suppressions:remove"; + + private RbacPermission() {} +} diff --git a/src/main/java/co/lettermint/models/api/RouteData.java b/src/main/java/co/lettermint/models/api/RouteData.java index e065dba..240c937 100644 --- a/src/main/java/co/lettermint/models/api/RouteData.java +++ b/src/main/java/co/lettermint/models/api/RouteData.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) public class RouteData { @@ -18,7 +20,7 @@ public class RouteData { public String name; @JsonProperty("route_type") - public RouteType routeType; + public String routeType; @JsonProperty("is_default") public Boolean isDefault; @@ -36,7 +38,10 @@ public class RouteData { public Double inboundSpamThreshold; @JsonProperty("attachment_delivery") - public AttachmentDelivery attachmentDelivery; + public String attachmentDelivery; + + @JsonProperty("settings") + public Map settings; @JsonProperty("project") public ProjectData project; @@ -48,7 +53,7 @@ public class RouteData { public Integer suppressedRecipientsCount; @JsonProperty("statistics") - public Object statistics; + public List statistics; @JsonProperty("created_at") public String createdAt; diff --git a/src/main/java/co/lettermint/models/api/RouteListData.java b/src/main/java/co/lettermint/models/api/RouteListData.java index b798531..99f9627 100644 --- a/src/main/java/co/lettermint/models/api/RouteListData.java +++ b/src/main/java/co/lettermint/models/api/RouteListData.java @@ -15,7 +15,7 @@ public class RouteListData { public String name; @JsonProperty("route_type") - public RouteType routeType; + public String routeType; @JsonProperty("is_default") public Boolean isDefault; diff --git a/src/main/java/co/lettermint/models/api/RouteStatisticData.java b/src/main/java/co/lettermint/models/api/RouteStatisticData.java index 9080003..fcf1b4d 100644 --- a/src/main/java/co/lettermint/models/api/RouteStatisticData.java +++ b/src/main/java/co/lettermint/models/api/RouteStatisticData.java @@ -29,6 +29,15 @@ public class RouteStatisticData { @JsonProperty("inbound_received_count") public Integer inboundReceivedCount; + @JsonProperty("observed_opened_count") + public Integer observedOpenedCount; + + @JsonProperty("human_opened_count") + public Integer humanOpenedCount; + + @JsonProperty("privacy_opened_count") + public Integer privacyOpenedCount; + @JsonProperty("effective_opened_count") public Integer effectiveOpenedCount; diff --git a/src/main/java/co/lettermint/models/api/SendMailRequest.java b/src/main/java/co/lettermint/models/api/SendMailRequest.java index 24f36bf..e16c940 100644 --- a/src/main/java/co/lettermint/models/api/SendMailRequest.java +++ b/src/main/java/co/lettermint/models/api/SendMailRequest.java @@ -13,18 +13,6 @@ public class SendMailRequest { @JsonProperty("from") public String fromValue; - @JsonProperty("subject") - public String subject; - - @JsonProperty("tag") - public String tag; - - @JsonProperty("html") - public String html; - - @JsonProperty("text") - public String text; - @JsonProperty("to") public List to; @@ -37,15 +25,27 @@ public class SendMailRequest { @JsonProperty("reply_to") public List replyTo; + @JsonProperty("subject") + public String subject; + @JsonProperty("headers") public Map headers; @JsonProperty("metadata") public Map metadata; + @JsonProperty("tag") + public String tag; + @JsonProperty("settings") public Map settings; + @JsonProperty("html") + public String html; + + @JsonProperty("text") + public String text; + @JsonProperty("attachments") public List> attachments; } diff --git a/src/main/java/co/lettermint/models/api/StatsDailyData.java b/src/main/java/co/lettermint/models/api/StatsDailyData.java index ca8d0d0..61c5a5c 100644 --- a/src/main/java/co/lettermint/models/api/StatsDailyData.java +++ b/src/main/java/co/lettermint/models/api/StatsDailyData.java @@ -35,6 +35,15 @@ public class StatsDailyData { @JsonProperty("broadcast") public StatsTypeData broadcast; + @JsonProperty("observed_opened") + public Integer observedOpened; + + @JsonProperty("human_opened") + public Integer humanOpened; + + @JsonProperty("privacy_opened") + public Integer privacyOpened; + @JsonProperty("effective_opened") public Integer effectiveOpened; diff --git a/src/main/java/co/lettermint/models/api/StatsTotalsData.java b/src/main/java/co/lettermint/models/api/StatsTotalsData.java index 6926dc2..f281270 100644 --- a/src/main/java/co/lettermint/models/api/StatsTotalsData.java +++ b/src/main/java/co/lettermint/models/api/StatsTotalsData.java @@ -32,6 +32,15 @@ public class StatsTotalsData { @JsonProperty("broadcast") public StatsTypeData broadcast; + @JsonProperty("observed_opened") + public Integer observedOpened; + + @JsonProperty("human_opened") + public Integer humanOpened; + + @JsonProperty("privacy_opened") + public Integer privacyOpened; + @JsonProperty("effective_opened") public Integer effectiveOpened; diff --git a/src/main/java/co/lettermint/models/api/StoreProjectData.java b/src/main/java/co/lettermint/models/api/StoreProjectData.java index 8ac6658..2bb93cb 100644 --- a/src/main/java/co/lettermint/models/api/StoreProjectData.java +++ b/src/main/java/co/lettermint/models/api/StoreProjectData.java @@ -12,7 +12,7 @@ public class StoreProjectData { public Boolean smtpEnabled; @JsonProperty("initial_routes") - public InitialRoutes initialRoutes; + public String initialRoutes; @JsonProperty("short_token") public Boolean shortToken; diff --git a/src/main/java/co/lettermint/models/api/StoreRouteData.java b/src/main/java/co/lettermint/models/api/StoreRouteData.java index 46c7caf..f64ae57 100644 --- a/src/main/java/co/lettermint/models/api/StoreRouteData.java +++ b/src/main/java/co/lettermint/models/api/StoreRouteData.java @@ -9,7 +9,7 @@ public class StoreRouteData { public String name; @JsonProperty("route_type") - public RouteType routeType; + public String routeType; @JsonProperty("slug") public String slug; diff --git a/src/main/java/co/lettermint/models/api/StoreSuppressionData.java b/src/main/java/co/lettermint/models/api/StoreSuppressionData.java index 08e392e..ebc3313 100644 --- a/src/main/java/co/lettermint/models/api/StoreSuppressionData.java +++ b/src/main/java/co/lettermint/models/api/StoreSuppressionData.java @@ -9,18 +9,18 @@ public class StoreSuppressionData { @JsonProperty("email") public String email; + @JsonProperty("emails") + public List emails; + @JsonProperty("reason") - public SuppressionReason reason; + public String reason; @JsonProperty("scope") - public SuppressionScope scope; + public String scope; @JsonProperty("route_id") public String routeId; @JsonProperty("project_id") public String projectId; - - @JsonProperty("emails") - public List emails; } diff --git a/src/main/java/co/lettermint/models/api/StoreWebhookData.java b/src/main/java/co/lettermint/models/api/StoreWebhookData.java index a571d1b..82f3195 100644 --- a/src/main/java/co/lettermint/models/api/StoreWebhookData.java +++ b/src/main/java/co/lettermint/models/api/StoreWebhookData.java @@ -15,12 +15,12 @@ public class StoreWebhookData { @JsonProperty("url") public String url; + @JsonProperty("events") + public List events; + @JsonProperty("enabled") public Boolean enabled; @JsonProperty("include_machine_events") public Boolean includeMachineEvents; - - @JsonProperty("events") - public List events; } diff --git a/src/main/java/co/lettermint/models/api/SuppressedRecipientData.java b/src/main/java/co/lettermint/models/api/SuppressedRecipientData.java index 23e46b3..4f0c819 100644 --- a/src/main/java/co/lettermint/models/api/SuppressedRecipientData.java +++ b/src/main/java/co/lettermint/models/api/SuppressedRecipientData.java @@ -9,16 +9,16 @@ public class SuppressedRecipientData { public String id; @JsonProperty("type") - public SuppressionType type; + public String type; @JsonProperty("value") public String value; @JsonProperty("reason") - public SuppressionReason reason; + public String reason; @JsonProperty("scope") - public SuppressionScope scope; + public String scope; @JsonProperty("project_id") public String projectId; @@ -26,6 +26,9 @@ public class SuppressedRecipientData { @JsonProperty("route_id") public String routeId; + @JsonProperty("source_message") + public SuppressionSourceMessageData sourceMessage; + @JsonProperty("created_at") public String createdAt; diff --git a/src/main/java/co/lettermint/models/api/SuppressionDestroyResponse.java b/src/main/java/co/lettermint/models/api/SuppressionDestroyResponse.java index df191f3..79b6fa2 100644 --- a/src/main/java/co/lettermint/models/api/SuppressionDestroyResponse.java +++ b/src/main/java/co/lettermint/models/api/SuppressionDestroyResponse.java @@ -5,6 +5,15 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class SuppressionDestroyResponse { + @JsonProperty("success") + public Boolean success; + + @JsonProperty("status") + public String status; + @JsonProperty("message") public String message; + + @JsonProperty("confidence") + public Double confidence; } diff --git a/src/main/java/co/lettermint/models/api/SuppressionSourceMessageData.java b/src/main/java/co/lettermint/models/api/SuppressionSourceMessageData.java new file mode 100644 index 0000000..9ceb129 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/SuppressionSourceMessageData.java @@ -0,0 +1,19 @@ +package co.lettermint.models.api; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class SuppressionSourceMessageData { + @JsonProperty("id") + public String id; + + @JsonProperty("available") + public Boolean available; + + @JsonProperty("subject") + public String subject; + + @JsonProperty("created_at") + public String createdAt; +} diff --git a/src/main/java/co/lettermint/models/api/TeamData.java b/src/main/java/co/lettermint/models/api/TeamData.java index 5cb9917..4d8e178 100644 --- a/src/main/java/co/lettermint/models/api/TeamData.java +++ b/src/main/java/co/lettermint/models/api/TeamData.java @@ -13,13 +13,16 @@ public class TeamData { public String name; @JsonProperty("type") - public TeamType type; + public String type; @JsonProperty("plan") - public Plan plan; + public String plan; + + @JsonProperty("included_volume") + public Integer includedVolume; @JsonProperty("tier") - public VolumeTier tier; + public Integer tier; @JsonProperty("verified_at") public String verifiedAt; diff --git a/src/main/java/co/lettermint/models/api/TeamMemberData.java b/src/main/java/co/lettermint/models/api/TeamMemberData.java index df38f73..4a9dfbc 100644 --- a/src/main/java/co/lettermint/models/api/TeamMemberData.java +++ b/src/main/java/co/lettermint/models/api/TeamMemberData.java @@ -2,17 +2,24 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) public class TeamMemberData { @JsonProperty("id") public String id; - @JsonProperty("user") - public UserData user; + @JsonProperty("name") + public String name; + + @JsonProperty("email") + public String email; @JsonProperty("role") - public String role; + public Map role; + + @JsonProperty("project_access") + public TeamMemberProjectAccessData projectAccess; @JsonProperty("joined_at") public String joinedAt; diff --git a/src/main/java/co/lettermint/models/api/TeamMemberProjectAccessData.java b/src/main/java/co/lettermint/models/api/TeamMemberProjectAccessData.java new file mode 100644 index 0000000..7a70a15 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/TeamMemberProjectAccessData.java @@ -0,0 +1,15 @@ +package co.lettermint.models.api; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class TeamMemberProjectAccessData { + @JsonProperty("scope") + public String scope; + + @JsonProperty("projects") + public List> projects; +} diff --git a/src/main/java/co/lettermint/models/api/UserData.java b/src/main/java/co/lettermint/models/api/TeamRoleData.java similarity index 54% rename from src/main/java/co/lettermint/models/api/UserData.java rename to src/main/java/co/lettermint/models/api/TeamRoleData.java index e051b7c..4ac46f2 100644 --- a/src/main/java/co/lettermint/models/api/UserData.java +++ b/src/main/java/co/lettermint/models/api/TeamRoleData.java @@ -2,18 +2,22 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; @JsonIgnoreProperties(ignoreUnknown = true) -public class UserData { +public class TeamRoleData { @JsonProperty("id") public String id; @JsonProperty("name") public String name; - @JsonProperty("email") - public String email; + @JsonProperty("system_key") + public String systemKey; - @JsonProperty("avatar") - public String avatar; + @JsonProperty("permissions") + public List permissions; + + @JsonProperty("assignable") + public Boolean assignable; } diff --git a/src/main/java/co/lettermint/models/api/UpdateProjectMembersData.java b/src/main/java/co/lettermint/models/api/TeamRolesResponse.java similarity index 65% rename from src/main/java/co/lettermint/models/api/UpdateProjectMembersData.java rename to src/main/java/co/lettermint/models/api/TeamRolesResponse.java index fe87319..958eae0 100644 --- a/src/main/java/co/lettermint/models/api/UpdateProjectMembersData.java +++ b/src/main/java/co/lettermint/models/api/TeamRolesResponse.java @@ -5,7 +5,7 @@ import java.util.List; @JsonIgnoreProperties(ignoreUnknown = true) -public class UpdateProjectMembersData { - @JsonProperty("team_member_ids") - public List teamMemberIds; +public class TeamRolesResponse { + @JsonProperty("data") + public List data; } diff --git a/src/main/java/co/lettermint/models/api/TlsPolicy.java b/src/main/java/co/lettermint/models/api/TlsPolicy.java new file mode 100644 index 0000000..f99ef38 --- /dev/null +++ b/src/main/java/co/lettermint/models/api/TlsPolicy.java @@ -0,0 +1,8 @@ +package co.lettermint.models.api; + +public final class TlsPolicy { + public static final String OPPORTUNISTIC = "opportunistic"; + public static final String ENFORCED = "enforced"; + + private TlsPolicy() {} +} diff --git a/src/main/java/co/lettermint/models/api/UpdateRouteInboundSettingsData.java b/src/main/java/co/lettermint/models/api/UpdateRouteInboundSettingsData.java index f08235d..96a51a8 100644 --- a/src/main/java/co/lettermint/models/api/UpdateRouteInboundSettingsData.java +++ b/src/main/java/co/lettermint/models/api/UpdateRouteInboundSettingsData.java @@ -12,5 +12,5 @@ public class UpdateRouteInboundSettingsData { public Double inboundSpamThreshold; @JsonProperty("attachment_delivery") - public AttachmentDelivery attachmentDelivery; + public String attachmentDelivery; } diff --git a/src/main/java/co/lettermint/models/api/UpdateRouteSettingsData.java b/src/main/java/co/lettermint/models/api/UpdateRouteSettingsData.java index b0dda41..2aa39fb 100644 --- a/src/main/java/co/lettermint/models/api/UpdateRouteSettingsData.java +++ b/src/main/java/co/lettermint/models/api/UpdateRouteSettingsData.java @@ -11,8 +11,14 @@ public class UpdateRouteSettingsData { @JsonProperty("track_clicks") public Boolean trackClicks; - @JsonProperty("disable_plaintext_generation") - public Boolean disablePlaintextGeneration; + @JsonProperty("generate_plaintext_fallback") + public Boolean generatePlaintextFallback; + + @JsonProperty("suppress_auto_responders") + public Boolean suppressAutoResponders; + + @JsonProperty("tls") + public String tls; @JsonProperty("disable_hosted_unsubscribe") public Boolean disableHostedUnsubscribe; diff --git a/src/main/java/co/lettermint/models/api/UpdateTeamMemberAssignmentData.java b/src/main/java/co/lettermint/models/api/UpdateTeamMemberAssignmentData.java new file mode 100644 index 0000000..47d131e --- /dev/null +++ b/src/main/java/co/lettermint/models/api/UpdateTeamMemberAssignmentData.java @@ -0,0 +1,14 @@ +package co.lettermint.models.api; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class UpdateTeamMemberAssignmentData { + @JsonProperty("role_id") + public String roleId; + + @JsonProperty("project_access") + public Map projectAccess; +} diff --git a/src/main/java/co/lettermint/models/api/UpdateWebhookData.java b/src/main/java/co/lettermint/models/api/UpdateWebhookData.java index a6b2547..16e1de3 100644 --- a/src/main/java/co/lettermint/models/api/UpdateWebhookData.java +++ b/src/main/java/co/lettermint/models/api/UpdateWebhookData.java @@ -12,12 +12,12 @@ public class UpdateWebhookData { @JsonProperty("url") public String url; + @JsonProperty("events") + public List events; + @JsonProperty("enabled") public Boolean enabled; @JsonProperty("include_machine_events") public Boolean includeMachineEvents; - - @JsonProperty("events") - public List events; } diff --git a/src/main/java/co/lettermint/models/api/VolumeTier.java b/src/main/java/co/lettermint/models/api/VolumeTier.java deleted file mode 100644 index 25d82cf..0000000 --- a/src/main/java/co/lettermint/models/api/VolumeTier.java +++ /dev/null @@ -1,15 +0,0 @@ -package co.lettermint.models.api; - -public final class VolumeTier { - public static final int VALUE_300 = 300; - public static final int VALUE_10000 = 10000; - public static final int VALUE_50000 = 50000; - public static final int VALUE_125000 = 125000; - public static final int VALUE_300000 = 300000; - public static final int VALUE_500000 = 500000; - public static final int VALUE_750000 = 750000; - public static final int VALUE_1000000 = 1000000; - public static final int VALUE_1500000 = 1500000; - - private VolumeTier() {} -} diff --git a/src/main/java/co/lettermint/models/api/WebhookDeliveryData.java b/src/main/java/co/lettermint/models/api/WebhookDeliveryData.java index 05eafe0..a85a7de 100644 --- a/src/main/java/co/lettermint/models/api/WebhookDeliveryData.java +++ b/src/main/java/co/lettermint/models/api/WebhookDeliveryData.java @@ -13,10 +13,10 @@ public class WebhookDeliveryData { public String webhookId; @JsonProperty("event_type") - public WebhookEvent eventType; + public String eventType; @JsonProperty("status") - public WebhookDeliveryStatus status; + public String status; @JsonProperty("attempt_number") public Integer attemptNumber; diff --git a/src/main/java/co/lettermint/models/api/WebhookDeliveryListData.java b/src/main/java/co/lettermint/models/api/WebhookDeliveryListData.java index d1929e1..d128b29 100644 --- a/src/main/java/co/lettermint/models/api/WebhookDeliveryListData.java +++ b/src/main/java/co/lettermint/models/api/WebhookDeliveryListData.java @@ -12,10 +12,10 @@ public class WebhookDeliveryListData { public String webhookId; @JsonProperty("event_type") - public WebhookEvent eventType; + public String eventType; @JsonProperty("status") - public WebhookDeliveryStatus status; + public String status; @JsonProperty("attempt_number") public Integer attemptNumber; diff --git a/src/main/java/co/lettermint/models/api/WebhookEvent.java b/src/main/java/co/lettermint/models/api/WebhookEvent.java index 867efb1..5428226 100644 --- a/src/main/java/co/lettermint/models/api/WebhookEvent.java +++ b/src/main/java/co/lettermint/models/api/WebhookEvent.java @@ -15,6 +15,8 @@ public final class WebhookEvent { public static final String MESSAGECLICKED = "message.clicked"; public static final String MESSAGEINBOUND = "message.inbound"; public static final String MESSAGEPOLICYREJECTED = "message.policy_rejected"; + public static final String SUPPRESSIONADDED = "suppression.added"; + public static final String SUPPRESSIONREMOVED = "suppression.removed"; public static final String WEBHOOKTEST = "webhook.test"; private WebhookEvent() {} diff --git a/src/main/java/co/lettermint/models/api/WebhookListData.java b/src/main/java/co/lettermint/models/api/WebhookListData.java index de5782d..185452b 100644 --- a/src/main/java/co/lettermint/models/api/WebhookListData.java +++ b/src/main/java/co/lettermint/models/api/WebhookListData.java @@ -19,7 +19,7 @@ public class WebhookListData { public String url; @JsonProperty("events") - public List events; + public List events; @JsonProperty("enabled") public Boolean enabled; diff --git a/src/test/java/co/lettermint/ApiClientTest.java b/src/test/java/co/lettermint/ApiClientTest.java index 3435591..4636244 100644 --- a/src/test/java/co/lettermint/ApiClientTest.java +++ b/src/test/java/co/lettermint/ApiClientTest.java @@ -84,11 +84,13 @@ void sendsBatchEmailsWithTypedPayloads() throws Exception { List response = Lettermint .email("sending-token", server.url("/v1").toString()) + .idempotencyKey("batch-key") .sendBatch(Collections.singletonList(payload)); RecordedRequest request = server.takeRequest(); assertEquals("/v1/send/batch", request.getPath()); assertEquals("sending-token", request.getHeader("x-lettermint-token")); + assertEquals("batch-key", request.getHeader("Idempotency-Key")); assertEquals("msg_123", response.get(0).messageId); } } @@ -99,6 +101,9 @@ void apiEndpointPathsAreEncodedAndTyped() throws Exception { server.enqueue(new MockResponse().setHeader("Content-Type", "application/json").setBody("{\"id\":\"domain_123\"}")); server.enqueue(new MockResponse().setBody("")); server.enqueue(new MockResponse().setHeader("Content-Type", "application/json").setBody("{\"data\":{\"verified\":true}}")); + server.enqueue(new MockResponse().setHeader("Content-Type", "application/json").setBody("{\"data\":[]}")); + server.enqueue(new MockResponse().setHeader("Content-Type", "application/json").setBody("{\"id\":\"user/id\"}")); + server.enqueue(new MockResponse().setHeader("Content-Type", "application/json").setBody("{\"id\":\"user/id\"}")); server.start(); ApiClient api = Lettermint.api("api-token", server.url("/v1").toString()); @@ -106,10 +111,24 @@ void apiEndpointPathsAreEncodedAndTyped() throws Exception { assertEquals("domain_123", api.domains().retrieve("domain/id").id); assertEquals("", api.messages().html("msg/id")); assertTrue(api.routes().verifyInboundDomain("route/id").data.containsKey("verified")); + assertTrue(api.team().roles().data.isEmpty()); + assertEquals("user/id", api.team().member("user/id").id); + + co.lettermint.models.api.UpdateTeamMemberAssignmentData assignment = + new co.lettermint.models.api.UpdateTeamMemberAssignmentData(); + assignment.roleId = "role_123"; + assignment.projectAccess = Collections.singletonMap("scope", "all"); + assertEquals("user/id", api.team().updateMemberAssignment("user/id", assignment).id); assertEquals("/v1/domains/domain%2Fid", server.takeRequest().getPath()); assertEquals("/v1/messages/msg%2Fid/html", server.takeRequest().getPath()); assertEquals("/v1/routes/route%2Fid/verify-inbound-domain", server.takeRequest().getPath()); + assertEquals("/v1/team/roles", server.takeRequest().getPath()); + assertEquals("/v1/team/members/user%2Fid", server.takeRequest().getPath()); + RecordedRequest assignmentRequest = server.takeRequest(); + assertEquals("PUT", assignmentRequest.getMethod()); + assertEquals("/v1/team/members/user%2Fid/assignment", assignmentRequest.getPath()); + assertTrue(assignmentRequest.getBody().readUtf8().contains("\"role_id\":\"role_123\"")); } } @@ -142,11 +161,13 @@ void publicClientRejectsAbsoluteRequestPaths() throws Exception { void generatedApiModelsMatchCurrentTeamSchema() { assertEquals("auto_replied", co.lettermint.models.api.MessageEventType.AUTOREPLIED); assertEquals("message.auto_replied", co.lettermint.models.api.WebhookEvent.MESSAGEAUTOREPLIED); - assertEquals(300000, co.lettermint.models.api.VolumeTier.VALUE_300000); + assertEquals("admin", co.lettermint.models.api.BuiltInTeamRole.ADMIN); + assertEquals("enforced", co.lettermint.models.api.TlsPolicy.ENFORCED); co.lettermint.models.api.UpdateRouteSettingsData settings = new co.lettermint.models.api.UpdateRouteSettingsData(); settings.redactEmailContent = true; - settings.disablePlaintextGeneration = false; + settings.generatePlaintextFallback = false; + settings.tls = co.lettermint.models.api.TlsPolicy.ENFORCED; co.lettermint.models.api.UpdateRouteInboundSettingsData inboundSettings = new co.lettermint.models.api.UpdateRouteInboundSettingsData(); inboundSettings.inboundSpamThreshold = 3.0; @@ -168,13 +189,43 @@ void generatedApiModelsMatchCurrentTeamSchema() { blockedFileTypes.extensions = Collections.singletonList("exe"); blockedFileTypes.mimeTypes = Collections.singletonList("application/x-msdownload"); - assertFalse(routeUpdate.settings.disablePlaintextGeneration); + co.lettermint.models.api.TeamData team = new co.lettermint.models.api.TeamData(); + team.includedVolume = 300000; + + co.lettermint.models.api.TeamRoleData role = new co.lettermint.models.api.TeamRoleData(); + role.assignable = true; + role.permissions = Collections.singletonList(co.lettermint.models.api.RbacPermission.MEMBERSMANAGE); + + co.lettermint.models.api.UpdateTeamMemberAssignmentData assignment = + new co.lettermint.models.api.UpdateTeamMemberAssignmentData(); + assignment.roleId = "role_123"; + assignment.projectAccess = Collections.singletonMap("scope", "selected"); + + co.lettermint.models.api.DomainData domain = new co.lettermint.models.api.DomainData(); + domain.dkimMode = co.lettermint.models.api.DkimMode.MANAGEDCNAME; + + co.lettermint.models.api.SuppressedRecipientData recipient = new co.lettermint.models.api.SuppressedRecipientData(); + recipient.sourceMessage = new co.lettermint.models.api.SuppressionSourceMessageData(); + recipient.sourceMessage.id = "msg_123"; + + co.lettermint.models.api.MessageListData message = new co.lettermint.models.api.MessageListData(); + message.spamScore = 2.5; + + assertFalse(routeUpdate.settings.generatePlaintextFallback); + assertEquals("enforced", routeUpdate.settings.tls); assertEquals(3.0, routeUpdate.inboundSettings.inboundSpamThreshold); assertFalse(projectUpdate.redactEmailContent); assertTrue(projectCreate.shortToken); assertTrue(project.redactEmailContent); assertEquals("global", co.lettermint.models.api.SuppressionScope.GLOBAL); assertEquals("application/x-msdownload", blockedFileTypes.mimeTypes.get(0)); + assertEquals(300000, team.includedVolume); + assertTrue(role.assignable); + assertEquals("members:manage", role.permissions.get(0)); + assertEquals("role_123", assignment.roleId); + assertEquals("managed_cname", domain.dkimMode); + assertEquals("msg_123", recipient.sourceMessage.id); + assertEquals(2.5, message.spamScore); } @Test @@ -202,9 +253,6 @@ void apiExposesDocumentedOperations() throws Exception { methods.put("project.update", api.projects().getClass().getMethod("update", String.class, co.lettermint.models.api.UpdateProjectData.class)); methods.put("project.destroy", api.projects().getClass().getMethod("delete", String.class)); methods.put("project.rotateToken", api.projects().getClass().getMethod("rotateToken", String.class)); - methods.put("project.updateMembers", api.projects().getClass().getMethod("updateMembers", String.class, co.lettermint.models.api.UpdateProjectMembersData.class)); - methods.put("project.addMember", api.projects().getClass().getMethod("addMember", String.class, String.class)); - methods.put("project.removeMember", api.projects().getClass().getMethod("removeMember", String.class, String.class)); methods.put("route.index", api.projects().getClass().getMethod("routes", String.class)); methods.put("route.store", api.projects().getClass().getMethod("createRoute", String.class, co.lettermint.models.api.StoreRouteData.class)); methods.put("route.show", api.routes().getClass().getMethod("retrieve", String.class)); @@ -218,7 +266,10 @@ void apiExposesDocumentedOperations() throws Exception { methods.put("team.show", api.team().getClass().getMethod("retrieve")); methods.put("team.update", api.team().getClass().getMethod("update", co.lettermint.models.api.UpdateTeamData.class)); methods.put("team.usage", api.team().getClass().getMethod("usage")); + methods.put("team.roles", api.team().getClass().getMethod("roles")); methods.put("team.members", api.team().getClass().getMethod("members")); + methods.put("team.members.show", api.team().getClass().getMethod("member", String.class)); + methods.put("team.members.assignment.update", api.team().getClass().getMethod("updateMemberAssignment", String.class, co.lettermint.models.api.UpdateTeamMemberAssignmentData.class)); methods.put("webhook.index", api.webhooks().getClass().getMethod("list")); methods.put("webhook.store", api.webhooks().getClass().getMethod("create", co.lettermint.models.api.StoreWebhookData.class)); methods.put("webhook.show", api.webhooks().getClass().getMethod("retrieve", String.class)); diff --git a/src/test/java/co/lettermint/EmailEndpointTest.java b/src/test/java/co/lettermint/EmailEndpointTest.java index 7a9dc71..3fd93d9 100644 --- a/src/test/java/co/lettermint/EmailEndpointTest.java +++ b/src/test/java/co/lettermint/EmailEndpointTest.java @@ -63,12 +63,18 @@ void testEmailWithAllOptions() throws Exception { .setHeader("Content-Type", "application/json")); Map headers = new HashMap<>(); - headers.put("X-Custom-Header", "custom-value"); + headers.put("Message-ID", ""); + headers.put("X-LM-Preserve-Message-ID", "true"); Map metadata = new HashMap<>(); metadata.put("userId", "user_123"); metadata.put("campaign", "welcome"); + Map settings = new HashMap<>(); + settings.put("track_opens", false); + settings.put("track_clicks", true); + settings.put("tls", "enforced"); + SendEmailResponse response = lettermint.email() .from("John Doe ") .to("recipient1@example.com", "recipient2@example.com") @@ -84,7 +90,8 @@ void testEmailWithAllOptions() throws Exception { .attach("invite.ics", "base64icalFile", null, "text/calendar; method=REQUEST") .route("route-slug-123") .metadata(metadata) - .tag("welcome", "onboarding") + .tag("welcome") + .settings(settings) .idempotencyKey("unique-key-123") .send(); @@ -103,7 +110,13 @@ void testEmailWithAllOptions() throws Exception { assertTrue(body.contains("\"html\":\"

Hello World

\"")); assertTrue(body.contains("\"text\":\"Hello World\"")); assertTrue(body.contains("\"route\":\"route-slug-123\"")); - assertTrue(body.contains("\"tags\":[\"welcome\",\"onboarding\"]")); + assertTrue(body.contains("\"tag\":\"welcome\"")); + assertTrue(body.contains("\"settings\":")); + assertTrue(body.contains("\"track_opens\":false")); + assertTrue(body.contains("\"track_clicks\":true")); + assertTrue(body.contains("\"tls\":\"enforced\"")); + assertTrue(body.contains("\"Message-ID\":\"\"")); + assertTrue(body.contains("\"X-LM-Preserve-Message-ID\":\"true\"")); assertTrue(body.contains("{\"filename\":\"document.pdf\",\"content\":\"base64content\"}")); assertTrue(body.contains("{\"filename\":\"logo.png\",\"content\":\"base64logo\",\"content_id\":\"logo-cid\"}")); assertTrue(body.contains("{\"filename\":\"invite.ics\",\"content\":\"base64icalFile\",\"content_type\":\"text/calendar; method=REQUEST\"}"));