From 97e4c0aa7f56c4e7a77c41a73271f2c0cf9ef735 Mon Sep 17 00:00:00 2001 From: Brett Meyer Date: Sun, 2 Mar 2025 00:49:35 -0500 Subject: [PATCH 1/9] contact search --- pom.xml | 158 +++++++++--------- .../apiv3/ActiveCampaignClient.java | 7 + .../apiv3/request/RequestWithQueryString.java | 18 ++ .../apiv3/request/contact/ContactSearch.java | 17 ++ .../request/contact/ContactSearchRequest.java | 39 +++++ .../contact/ContactSearchResponse.java | 40 +++++ 6 files changed, 198 insertions(+), 81 deletions(-) create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/RequestWithQueryString.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearchRequest.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java diff --git a/pom.xml b/pom.xml index bbd4046..5684678 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.sourcelab.activecampaign ApiClient - 1.0-SNAPSHOT + 1.0.0-SNAPSHOT jar @@ -170,8 +170,8 @@ maven-compiler-plugin 3.8.1 - 1.8 - 1.8 + 21 + 21 @@ -193,63 +193,63 @@ - - org.apache.maven.plugins - maven-checkstyle-plugin - ${checkstyle.plugin.version} - - - checkstyle-validate - validate - - ${checkstyle.ruleset} - utf-8 - true - warning - true - false - - - ${skipCheckStyle} - - - - checkstyle - - - check - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - com.mycila - license-maven-plugin - 3.0 - -
LICENSE.txt
- - **/.md - **/.bak - **.yml - **.yaml - **.xml - build/** - src/test/resources/** - src/main/resources/** - -
- - - compile - - check - - - -
+ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -265,35 +265,31 @@ - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${checkstyle.plugin.version} - - - com.puppycrawl.tools - checkstyle - ${checkstyle.version} - - - - - + + + + + + + + + + + + + + + + + - - - - - myrepository - file:/Users/stephen.powis/Documents/code/ai-facebook-web/repo + ossrh + https://oss.sonatype.org/content/repositories/snapshots diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java index 2fe2d38..3ce532c 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java @@ -26,6 +26,8 @@ import org.sourcelab.activecampaign.apiv3.request.contact.Contact; import org.sourcelab.activecampaign.apiv3.request.contact.ContactCreateRequest; import org.sourcelab.activecampaign.apiv3.request.contact.ContactRetrieveRequest; +import org.sourcelab.activecampaign.apiv3.request.contact.ContactSearch; +import org.sourcelab.activecampaign.apiv3.request.contact.ContactSearchRequest; import org.sourcelab.activecampaign.apiv3.request.contactList.ContactListSubscribeRequest; import org.sourcelab.activecampaign.apiv3.request.contactTag.ContactTag; import org.sourcelab.activecampaign.apiv3.request.contactTag.ContactTagCreateRequest; @@ -40,6 +42,7 @@ import org.sourcelab.activecampaign.apiv3.response.account.AccountResponse; import org.sourcelab.activecampaign.apiv3.response.contact.ContactCreateResponse; import org.sourcelab.activecampaign.apiv3.response.contact.ContactRetrieveResponse; +import org.sourcelab.activecampaign.apiv3.response.contact.ContactSearchResponse; import org.sourcelab.activecampaign.apiv3.response.contactTag.ContactTagCreateResponse; import org.sourcelab.activecampaign.apiv3.response.contactTag.ContactTagDeleteResponse; import org.sourcelab.activecampaign.apiv3.response.customField.CustomFieldListResponse; @@ -145,6 +148,10 @@ public ContactRetrieveResponse contactRetrieve(final long contactId) { return submitRequest(new ContactRetrieveRequest(contactId)); } + public ContactSearchResponse contactSearch(ContactSearch contactSearch) { + return submitRequest(new ContactSearchRequest(contactSearch)); + } + public TagListResponse tagList() { return submitRequest(new TagListRequest()); } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/RequestWithQueryString.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/RequestWithQueryString.java new file mode 100644 index 0000000..ad62d69 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/RequestWithQueryString.java @@ -0,0 +1,18 @@ +package org.sourcelab.activecampaign.apiv3.request; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +public abstract class RequestWithQueryString { + + protected final Map queryParams = new HashMap<>(); + + public String buildQueryString() { + return queryParams.entrySet().stream() + .map(p -> p.getKey() + "=" + URLEncoder.encode(p.getValue(), StandardCharsets.UTF_8)) + .reduce((p1, p2) -> p1 + "&" + p2) + .orElse(""); + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java new file mode 100644 index 0000000..675f3d8 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java @@ -0,0 +1,17 @@ +package org.sourcelab.activecampaign.apiv3.request.contact; + +import org.sourcelab.activecampaign.apiv3.request.RequestWithQueryString; + +public class ContactSearch extends RequestWithQueryString { + + public ContactSearch withListId(final long listId) { + queryParams.put("listid", listId + ""); + return this; + } + + // yyyy-mm-dd + public ContactSearch withFilterCreatedAfter(final String filterCreatedAfter) { + queryParams.put("filters[created_after]", filterCreatedAfter); + return this; + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearchRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearchRequest.java new file mode 100644 index 0000000..f909a4d --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearchRequest.java @@ -0,0 +1,39 @@ +package org.sourcelab.activecampaign.apiv3.request.contact; + +import org.sourcelab.activecampaign.JacksonFactory; +import org.sourcelab.activecampaign.apiv3.response.contact.ContactSearchResponse; +import org.sourcelab.http.rest.request.Request; +import org.sourcelab.http.rest.request.RequestMethod; +import org.sourcelab.http.rest.request.body.NoBodyContent; +import org.sourcelab.http.rest.request.body.RequestBodyContent; + +import java.io.IOException; + +public class ContactSearchRequest implements Request { + + private final ContactSearch contactSearch; + + public ContactSearchRequest(final ContactSearch contactSearch) { + this.contactSearch = contactSearch; + } + + @Override + public String getApiEndpoint() { + return "api/3/contacts?" + contactSearch.buildQueryString(); + } + + @Override + public RequestMethod getRequestMethod() { + return RequestMethod.GET; + } + + @Override + public RequestBodyContent getRequestBody() { + return new NoBodyContent(); + } + + @Override + public ContactSearchResponse parseResponse(final String response) throws IOException { + return JacksonFactory.newInstance().readValue(response, ContactSearchResponse.class); + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java new file mode 100644 index 0000000..86c7919 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java @@ -0,0 +1,40 @@ +package org.sourcelab.activecampaign.apiv3.response.contact; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.sourcelab.activecampaign.apiv3.request.contact.Contact; +import org.sourcelab.activecampaign.apiv3.request.contact.ContactBuilder; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ContactSearchResponse { + private final List contacts = new ArrayList<>(); + + @JsonCreator + public ContactSearchResponse( + @JsonProperty("contacts") final List> contactsValues + ) { + for (Map contactValues : contactsValues) { + final ContactBuilder builder = Contact.newBuilder() + .withPhone((String) contactValues.get("phone")) + .withFirstName((String) contactValues.get("firstName")) + .withLastName((String) contactValues.get("lastName")) + .withEmail((String) contactValues.get("email")) + .withId((String) contactValues.get("id")); + + if (contactValues.containsKey("links")) { + builder.withLinks((Map) contactValues.get("links")); + } + + contacts.add(builder.build()); + } + } + + public List getContacts() { + return contacts; + } +} From bc7e1804afb2ff8f4302e7c83ccd1abf669bdd62 Mon Sep 17 00:00:00 2001 From: Brett Meyer Date: Thu, 17 Apr 2025 23:18:30 -0400 Subject: [PATCH 2/9] deal search + deal custom fields list --- .../apiv3/ActiveCampaignClient.java | 13 +++ .../apiv3/request/contact/ContactSearch.java | 4 +- .../apiv3/request/deal/Deal.java | 99 +++++++++++++++++++ .../apiv3/request/deal/DealCustomField.java | 56 +++++++++++ .../deal/DealCustomFieldListRequest.java | 39 ++++++++ .../apiv3/request/deal/DealSearch.java | 17 ++++ .../apiv3/request/deal/DealSearchRequest.java | 39 ++++++++ .../contact/ContactSearchResponse.java | 1 + .../deal/DealCustomFieldListResponse.java | 40 ++++++++ .../response/deal/DealSearchResponse.java | 44 +++++++++ 10 files changed, 350 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/Deal.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomField.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearchRequest.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java index 3ce532c..f29a68b 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java @@ -33,6 +33,9 @@ import org.sourcelab.activecampaign.apiv3.request.contactTag.ContactTagCreateRequest; import org.sourcelab.activecampaign.apiv3.request.contactTag.ContactTagDeleteRequest; import org.sourcelab.activecampaign.apiv3.request.customField.CustomFieldListRequest; +import org.sourcelab.activecampaign.apiv3.request.deal.DealCustomFieldListRequest; +import org.sourcelab.activecampaign.apiv3.request.deal.DealSearch; +import org.sourcelab.activecampaign.apiv3.request.deal.DealSearchRequest; import org.sourcelab.activecampaign.apiv3.request.list.ListListRequest; import org.sourcelab.activecampaign.apiv3.request.tag.TagCreateRequest; import org.sourcelab.activecampaign.apiv3.request.tag.TagListRequest; @@ -46,6 +49,8 @@ import org.sourcelab.activecampaign.apiv3.response.contactTag.ContactTagCreateResponse; import org.sourcelab.activecampaign.apiv3.response.contactTag.ContactTagDeleteResponse; import org.sourcelab.activecampaign.apiv3.response.customField.CustomFieldListResponse; +import org.sourcelab.activecampaign.apiv3.response.deal.DealCustomFieldListResponse; +import org.sourcelab.activecampaign.apiv3.response.deal.DealSearchResponse; import org.sourcelab.activecampaign.apiv3.response.list.ListListResponse; import org.sourcelab.activecampaign.apiv3.response.tag.TagCreateResponse; import org.sourcelab.activecampaign.apiv3.response.tag.TagListResponse; @@ -152,6 +157,14 @@ public ContactSearchResponse contactSearch(ContactSearch contactSearch) { return submitRequest(new ContactSearchRequest(contactSearch)); } + public DealSearchResponse dealSearch(DealSearch dealSearch) { + return submitRequest(new DealSearchRequest(dealSearch)); + } + + public DealCustomFieldListResponse dealCustomFieldsList(Long dealId) { + return submitRequest(new DealCustomFieldListRequest(dealId)); + } + public TagListResponse tagList() { return submitRequest(new TagListRequest()); } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java index 675f3d8..30192f9 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java @@ -10,8 +10,8 @@ public ContactSearch withListId(final long listId) { } // yyyy-mm-dd - public ContactSearch withFilterCreatedAfter(final String filterCreatedAfter) { - queryParams.put("filters[created_after]", filterCreatedAfter); + public ContactSearch withCreatedAfter(final String createdAfter) { + queryParams.put("filters[created_after]", createdAfter); return this; } } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/Deal.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/Deal.java new file mode 100644 index 0000000..b365eba --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/Deal.java @@ -0,0 +1,99 @@ +package org.sourcelab.activecampaign.apiv3.request.deal; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@JsonRootName(value = "deal") +@JsonIgnoreProperties(ignoreUnknown = true) +public class Deal { + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private final Long id; + private final Long contact; + private final Long organization; + private final String title; + private final String description; + private final Long stage; + private final Long status; // Open, Won, Lost + + // Related links + private final Map links; + + @JsonCreator + public Deal( + @JsonProperty("id") final Long id, + @JsonProperty("contact") final Long contact, + @JsonProperty("organization") final Long organization, + @JsonProperty("title") final String title, + @JsonProperty("description") final String description, + @JsonProperty("stage") final Long stage, + @JsonProperty("status") final Long status, + @JsonProperty("links") final Map links + ) { + this.id = id; + this.contact = contact; + this.organization = organization; + this.title = title; + this.description = description; + this.stage = stage; + this.status = status; + + if (links == null) { + this.links = Collections.emptyMap(); + } else { + this.links = Collections.unmodifiableMap(new HashMap<>(links)); + } + } + + public Long getId() { + return id; + } + + public Long getContact() { + return contact; + } + + public Long getOrganization() { + return organization; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public Long getStage() { + return stage; + } + + public Long getStatus() { + return status; + } + + public Map getLinks() { + return links; + } + + @Override + public String toString() { + return "Deal{" + + "id=" + id + + ", contact='" + contact + '\'' + + ", organization='" + organization + '\'' + + ", title='" + title + '\'' + + ", description='" + description + '\'' + + ", stage='" + stage + '\'' + + ", status='" + status + '\'' + + ", links=" + links + + '}'; + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomField.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomField.java new file mode 100644 index 0000000..ffc7196 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomField.java @@ -0,0 +1,56 @@ +package org.sourcelab.activecampaign.apiv3.request.deal; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "dealCustomFieldDatum") +@JsonIgnoreProperties(ignoreUnknown = true) +public class DealCustomField { + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private final Long id; + private final Long dealId; + private final Long customFieldId; + private final String fieldValue; + + @JsonCreator + public DealCustomField( + @JsonProperty("id") final Long id, + @JsonProperty("dealId") final Long dealId, + @JsonProperty("customFieldId") final Long customFieldId, + @JsonProperty("fieldValue") final String fieldValue + ) { + this.id = id; + this.dealId = dealId; + this.customFieldId = customFieldId; + this.fieldValue = fieldValue; + } + + public Long getId() { + return id; + } + + public Long getDealId() { + return dealId; + } + + public Long getCustomFieldId() { + return customFieldId; + } + + public String getFieldValue() { + return fieldValue; + } + + @Override + public String toString() { + return "DealCustomField{" + + "id=" + id + + ", dealId=" + dealId + + ", customFieldId=" + customFieldId + + ", fieldValue='" + fieldValue + '\'' + + '}'; + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java new file mode 100644 index 0000000..1b8fa64 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java @@ -0,0 +1,39 @@ +package org.sourcelab.activecampaign.apiv3.request.deal; + +import org.sourcelab.activecampaign.JacksonFactory; +import org.sourcelab.activecampaign.apiv3.response.deal.DealCustomFieldListResponse; +import org.sourcelab.http.rest.request.Request; +import org.sourcelab.http.rest.request.RequestMethod; +import org.sourcelab.http.rest.request.body.NoBodyContent; +import org.sourcelab.http.rest.request.body.RequestBodyContent; + +import java.io.IOException; + +public class DealCustomFieldListRequest implements Request { + + private final Long dealId; + + public DealCustomFieldListRequest(final Long dealId) { + this.dealId = dealId; + } + + @Override + public String getApiEndpoint() { + return "api/3/dealCustomFieldData?filters[dealId]=" + dealId; + } + + @Override + public RequestMethod getRequestMethod() { + return RequestMethod.GET; + } + + @Override + public RequestBodyContent getRequestBody() { + return new NoBodyContent(); + } + + @Override + public DealCustomFieldListResponse parseResponse(final String response) throws IOException { + return JacksonFactory.newInstance().readValue(response, DealCustomFieldListResponse.class); + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java new file mode 100644 index 0000000..c3448f1 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java @@ -0,0 +1,17 @@ +package org.sourcelab.activecampaign.apiv3.request.deal; + +import org.sourcelab.activecampaign.apiv3.request.RequestWithQueryString; + +public class DealSearch extends RequestWithQueryString { + + public DealSearch withContact(final String contact) { + queryParams.put("filters[contact]", contact); + return this; + } + + // yyyy-mm-dd + public DealSearch withCreatedAfter(final String after) { + queryParams.put("filters[created_after]", after); + return this; + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearchRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearchRequest.java new file mode 100644 index 0000000..d717fef --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearchRequest.java @@ -0,0 +1,39 @@ +package org.sourcelab.activecampaign.apiv3.request.deal; + +import org.sourcelab.activecampaign.JacksonFactory; +import org.sourcelab.activecampaign.apiv3.response.deal.DealSearchResponse; +import org.sourcelab.http.rest.request.Request; +import org.sourcelab.http.rest.request.RequestMethod; +import org.sourcelab.http.rest.request.body.NoBodyContent; +import org.sourcelab.http.rest.request.body.RequestBodyContent; + +import java.io.IOException; + +public class DealSearchRequest implements Request { + + private final DealSearch dealSearch; + + public DealSearchRequest(final DealSearch dealSearch) { + this.dealSearch = dealSearch; + } + + @Override + public String getApiEndpoint() { + return "api/3/deals?" + dealSearch.buildQueryString(); + } + + @Override + public RequestMethod getRequestMethod() { + return RequestMethod.GET; + } + + @Override + public RequestBodyContent getRequestBody() { + return new NoBodyContent(); + } + + @Override + public DealSearchResponse parseResponse(final String response) throws IOException { + return JacksonFactory.newInstance().readValue(response, DealSearchResponse.class); + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java index 86c7919..7dda2c1 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java @@ -14,6 +14,7 @@ public class ContactSearchResponse { private final List contacts = new ArrayList<>(); + // TODO: Necessary? Simply unmarshal into the list of contacts? @JsonCreator public ContactSearchResponse( @JsonProperty("contacts") final List> contactsValues diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java new file mode 100644 index 0000000..156fe41 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java @@ -0,0 +1,40 @@ +package org.sourcelab.activecampaign.apiv3.response.deal; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.sourcelab.activecampaign.apiv3.request.deal.DealCustomField; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class DealCustomFieldListResponse { +// private final List dealCustomFieldData; + private final List dealCustomFields = new ArrayList<>(); + + @JsonCreator + public DealCustomFieldListResponse( +// @JsonProperty("dealCustomFieldData") final List dealCustomFieldData + // TODO: temporarily keeping this so I can see all the values for debugging + @JsonProperty("dealCustomFieldData") final List> dealCustomFieldData + ) { +// this.deals = deals; + + for (Map dealCustomFieldMap : dealCustomFieldData) { + final DealCustomField dealCustomField = new DealCustomField( + Long.parseLong(dealCustomFieldMap.get("id").toString()), + Long.parseLong(dealCustomFieldMap.get("dealId").toString()), + Long.parseLong(dealCustomFieldMap.get("customFieldId").toString()), + dealCustomFieldMap.get("fieldValue").toString() + ); + + dealCustomFields.add(dealCustomField); + } + } + + public List getDealCustomFields() { + return dealCustomFields; + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java new file mode 100644 index 0000000..7218d69 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java @@ -0,0 +1,44 @@ +package org.sourcelab.activecampaign.apiv3.response.deal; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.sourcelab.activecampaign.apiv3.request.deal.Deal; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class DealSearchResponse { +// private final List deals; + private final List deals = new ArrayList<>(); + + @JsonCreator + public DealSearchResponse( +// @JsonProperty("deals") final List deals + // TODO: temporarily keeping this so I can see all the values for debugging + @JsonProperty("deals") final List> dealsValues + ) { +// this.deals = deals; + + for (Map dealValues : dealsValues) { + final Deal deal = new Deal( + Long.parseLong((String) dealValues.get("id")), + null, //@JsonProperty("contact") final String contact, + null, //@JsonProperty("organization") final String organization, + null, //@JsonProperty("title") final String title, + null, //@JsonProperty("description") final String description, + null, //@JsonProperty("stage") final String stage, + null, //@JsonProperty("status") final String status, + (Map) dealValues.get("links") + ); + + deals.add(deal); + } + } + + public List getDeals() { + return deals; + } +} From d3a01c1b7eed5ba26e45a46fdc33b0bc387137d3 Mon Sep 17 00:00:00 2001 From: Brett Meyer Date: Fri, 25 Apr 2025 22:38:10 -0400 Subject: [PATCH 3/9] stage/pipeline list requests --- .../apiv3/ActiveCampaignClient.java | 12 ++++ .../request/pipeline/PipelineListRequest.java | 20 ++++++ .../apiv3/request/stage/StageListRequest.java | 20 ++++++ .../apiv3/response/pipeline/Pipeline.java | 63 +++++++++++++++++++ .../pipeline/PipelineListResponse.java | 35 +++++++++++ .../apiv3/response/stage/Stage.java | 54 ++++++++++++++++ .../response/stage/StageListResponse.java | 35 +++++++++++ 7 files changed, 239 insertions(+) create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/pipeline/PipelineListRequest.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/stage/StageListRequest.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/Pipeline.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/PipelineListResponse.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/Stage.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/StageListResponse.java diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java index f29a68b..a35679e 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java @@ -37,6 +37,8 @@ import org.sourcelab.activecampaign.apiv3.request.deal.DealSearch; import org.sourcelab.activecampaign.apiv3.request.deal.DealSearchRequest; import org.sourcelab.activecampaign.apiv3.request.list.ListListRequest; +import org.sourcelab.activecampaign.apiv3.request.pipeline.PipelineListRequest; +import org.sourcelab.activecampaign.apiv3.request.stage.StageListRequest; import org.sourcelab.activecampaign.apiv3.request.tag.TagCreateRequest; import org.sourcelab.activecampaign.apiv3.request.tag.TagListRequest; import org.sourcelab.activecampaign.apiv3.request.user.UsersMeRequest; @@ -52,6 +54,8 @@ import org.sourcelab.activecampaign.apiv3.response.deal.DealCustomFieldListResponse; import org.sourcelab.activecampaign.apiv3.response.deal.DealSearchResponse; import org.sourcelab.activecampaign.apiv3.response.list.ListListResponse; +import org.sourcelab.activecampaign.apiv3.response.pipeline.PipelineListResponse; +import org.sourcelab.activecampaign.apiv3.response.stage.StageListResponse; import org.sourcelab.activecampaign.apiv3.response.tag.TagCreateResponse; import org.sourcelab.activecampaign.apiv3.response.tag.TagListResponse; import org.sourcelab.activecampaign.apiv3.response.user.UsersMeResponse; @@ -189,6 +193,14 @@ public CustomFieldListResponse customFieldList() { return submitRequest(new CustomFieldListRequest()); } + public PipelineListResponse pipelineList() { + return submitRequest(new PipelineListRequest()); + } + + public StageListResponse stageList() { + return submitRequest(new StageListRequest()); + } + public ListListResponse listList() { return submitRequest(new ListListRequest()); } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/pipeline/PipelineListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/pipeline/PipelineListRequest.java new file mode 100644 index 0000000..5d492d7 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/pipeline/PipelineListRequest.java @@ -0,0 +1,20 @@ +package org.sourcelab.activecampaign.apiv3.request.pipeline; + +import org.sourcelab.activecampaign.JacksonFactory; +import org.sourcelab.activecampaign.apiv3.response.pipeline.PipelineListResponse; +import org.sourcelab.http.rest.request.GetRequest; + +import java.io.IOException; + +public class PipelineListRequest implements GetRequest { + + @Override + public String getApiEndpoint() { + return "api/3/dealGroups"; + } + + @Override + public PipelineListResponse parseResponse(final String response) throws IOException { + return JacksonFactory.newInstance().readValue(response, PipelineListResponse.class); + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/stage/StageListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/stage/StageListRequest.java new file mode 100644 index 0000000..da63d12 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/stage/StageListRequest.java @@ -0,0 +1,20 @@ +package org.sourcelab.activecampaign.apiv3.request.stage; + +import org.sourcelab.activecampaign.JacksonFactory; +import org.sourcelab.activecampaign.apiv3.response.stage.StageListResponse; +import org.sourcelab.http.rest.request.GetRequest; + +import java.io.IOException; + +public class StageListRequest implements GetRequest { + + @Override + public String getApiEndpoint() { + return "api/3/dealStages"; + } + + @Override + public StageListResponse parseResponse(final String response) throws IOException { + return JacksonFactory.newInstance().readValue(response, StageListResponse.class); + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/Pipeline.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/Pipeline.java new file mode 100644 index 0000000..54e43bc --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/Pipeline.java @@ -0,0 +1,63 @@ +package org.sourcelab.activecampaign.apiv3.response.pipeline; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class Pipeline { + private final Long id; + private final String title; + private final List stages; + + private final Map links; + + @JsonCreator + public Pipeline( + @JsonProperty("id") final Long id, + @JsonProperty("title") final String title, + @JsonProperty("stages") final List stages, + @JsonProperty("links") final Map links + ) { + this.id = id; + this.title = title; + this.stages = stages; + + if (links == null) { + this.links = Collections.emptyMap(); + } else { + this.links = Collections.unmodifiableMap(new HashMap<>(links)); + } + } + + public Long getId() { + return id; + } + + public String getTitle() { + return title; + } + + public List getStages() { + return stages; + } + + public Map getLinks() { + return links; + } + + @Override + public String toString() { + return "Pipeline{" + + "id=" + id + + ", title='" + title + '\'' + + ", stages=" + stages + + ", links=" + links + + '}'; + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/PipelineListResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/PipelineListResponse.java new file mode 100644 index 0000000..db0509e --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/PipelineListResponse.java @@ -0,0 +1,35 @@ +package org.sourcelab.activecampaign.apiv3.response.pipeline; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class PipelineListResponse { + private final List pipelines; + + @JsonCreator + public PipelineListResponse( + @JsonProperty("dealGroups") final List pipelines) { + if (pipelines == null) { + this.pipelines = Collections.emptyList(); + } else { + this.pipelines = Collections.unmodifiableList(new ArrayList<>(pipelines)); + } + } + + public List getPipelines() { + return pipelines; + } + + @Override + public String toString() { + return "PipelineListResponse{" + + "pipelines=" + pipelines + + '}'; + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/Stage.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/Stage.java new file mode 100644 index 0000000..aabfe13 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/Stage.java @@ -0,0 +1,54 @@ +package org.sourcelab.activecampaign.apiv3.response.stage; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class Stage { + private final Long id; + private final String title; + + private final Map links; + + @JsonCreator + public Stage( + @JsonProperty("id") final Long id, + @JsonProperty("title") final String title, + @JsonProperty("links") final Map links + ) { + this.id = id; + this.title = title; + + if (links == null) { + this.links = Collections.emptyMap(); + } else { + this.links = Collections.unmodifiableMap(new HashMap<>(links)); + } + } + + public Long getId() { + return id; + } + + public String getTitle() { + return title; + } + + public Map getLinks() { + return links; + } + + @Override + public String toString() { + return "Stage{" + + "id=" + id + + ", title='" + title + '\'' + + ", links=" + links + + '}'; + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/StageListResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/StageListResponse.java new file mode 100644 index 0000000..cffb640 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/StageListResponse.java @@ -0,0 +1,35 @@ +package org.sourcelab.activecampaign.apiv3.response.stage; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class StageListResponse { + private final List stages; + + @JsonCreator + public StageListResponse( + @JsonProperty("dealStages") final List stages) { + if (stages == null) { + this.stages = Collections.emptyList(); + } else { + this.stages = Collections.unmodifiableList(new ArrayList<>(stages)); + } + } + + public List getStages() { + return stages; + } + + @Override + public String toString() { + return "StageListResponse{" + + "stages=" + stages + + '}'; + } +} From 85701648eff7a87aa15f8bc6dcf3b8ab7b391d64 Mon Sep 17 00:00:00 2001 From: Brett Meyer Date: Fri, 25 Apr 2025 23:07:30 -0400 Subject: [PATCH 4/9] added Meta to multiple responses --- .../contact/ContactSearchResponse.java | 43 ++++++++++--------- .../customField/CustomFieldListResponse.java | 12 +++++- .../deal/DealCustomFieldListResponse.java | 19 +++++++- .../pipeline/PipelineListResponse.java | 12 +++++- .../response/stage/StageListResponse.java | 18 ++++++-- 5 files changed, 77 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java index 7dda2c1..8ca84f2 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/contact/ContactSearchResponse.java @@ -1,41 +1,44 @@ package org.sourcelab.activecampaign.apiv3.response.contact; import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import org.sourcelab.activecampaign.apiv3.request.contact.Contact; -import org.sourcelab.activecampaign.apiv3.request.contact.ContactBuilder; +import org.sourcelab.activecampaign.apiv3.response.Meta; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Map; -@JsonIgnoreProperties(ignoreUnknown = true) public class ContactSearchResponse { - private final List contacts = new ArrayList<>(); + private final List contacts; + private final Meta meta; - // TODO: Necessary? Simply unmarshal into the list of contacts? @JsonCreator public ContactSearchResponse( - @JsonProperty("contacts") final List> contactsValues + @JsonProperty("contacts") final List contacts, + @JsonProperty("meta") final Meta meta ) { - for (Map contactValues : contactsValues) { - final ContactBuilder builder = Contact.newBuilder() - .withPhone((String) contactValues.get("phone")) - .withFirstName((String) contactValues.get("firstName")) - .withLastName((String) contactValues.get("lastName")) - .withEmail((String) contactValues.get("email")) - .withId((String) contactValues.get("id")); - - if (contactValues.containsKey("links")) { - builder.withLinks((Map) contactValues.get("links")); - } - - contacts.add(builder.build()); + if (contacts == null) { + this.contacts = Collections.emptyList(); + } else { + this.contacts = Collections.unmodifiableList(new ArrayList<>(contacts)); } + this.meta = meta; } public List getContacts() { return contacts; } + + public Meta getMeta() { + return meta; + } + + @Override + public String toString() { + return "AccountListResponse{" + + "contacts=" + contacts + + ", meta=" + meta + + '}'; + } } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/customField/CustomFieldListResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/customField/CustomFieldListResponse.java index 4ecb76c..e667681 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/customField/CustomFieldListResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/customField/CustomFieldListResponse.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import org.sourcelab.activecampaign.apiv3.response.Meta; import java.util.ArrayList; import java.util.Collections; @@ -30,28 +31,37 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class CustomFieldListResponse { private final List fields; + private final Meta meta; /** * Constructor. */ @JsonCreator public CustomFieldListResponse( - @JsonProperty("fields") final List fields) { + @JsonProperty("fields") final List fields, + @JsonProperty("meta") final Meta meta + ) { if (fields == null) { this.fields = Collections.emptyList(); } else { this.fields = Collections.unmodifiableList(new ArrayList<>(fields)); } + this.meta = meta; } public List getFields() { return fields; } + public Meta getMeta() { + return meta; + } + @Override public String toString() { return "CustomFieldListResponse{" + "fields=" + fields + + ", meta=" + meta + '}'; } } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java index 156fe41..d73cfbf 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import org.sourcelab.activecampaign.apiv3.request.deal.DealCustomField; +import org.sourcelab.activecampaign.apiv3.response.Meta; import java.util.ArrayList; import java.util.List; @@ -13,12 +14,14 @@ public class DealCustomFieldListResponse { // private final List dealCustomFieldData; private final List dealCustomFields = new ArrayList<>(); + private final Meta meta; @JsonCreator public DealCustomFieldListResponse( // @JsonProperty("dealCustomFieldData") final List dealCustomFieldData // TODO: temporarily keeping this so I can see all the values for debugging - @JsonProperty("dealCustomFieldData") final List> dealCustomFieldData + @JsonProperty("dealCustomFieldData") final List> dealCustomFieldData, + @JsonProperty("meta") final Meta meta ) { // this.deals = deals; @@ -32,9 +35,23 @@ public DealCustomFieldListResponse( dealCustomFields.add(dealCustomField); } + + this.meta = meta; } public List getDealCustomFields() { return dealCustomFields; } + + public Meta getMeta() { + return meta; + } + + @Override + public String toString() { + return "DealCustomFieldListResponse{" + + "dealCustomFields=" + dealCustomFields + + ", meta=" + meta + + '}'; + } } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/PipelineListResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/PipelineListResponse.java index db0509e..4a84496 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/PipelineListResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/pipeline/PipelineListResponse.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import org.sourcelab.activecampaign.apiv3.response.Meta; import java.util.ArrayList; import java.util.Collections; @@ -11,15 +12,19 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class PipelineListResponse { private final List pipelines; + private final Meta meta; @JsonCreator public PipelineListResponse( - @JsonProperty("dealGroups") final List pipelines) { + @JsonProperty("dealGroups") final List pipelines, + @JsonProperty("meta") final Meta meta + ) { if (pipelines == null) { this.pipelines = Collections.emptyList(); } else { this.pipelines = Collections.unmodifiableList(new ArrayList<>(pipelines)); } + this.meta = meta; } public List getPipelines() { @@ -30,6 +35,11 @@ public List getPipelines() { public String toString() { return "PipelineListResponse{" + "pipelines=" + pipelines + + ", meta=" + meta + '}'; } + + public Meta getMeta() { + return meta; + } } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/StageListResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/StageListResponse.java index cffb640..b978ca6 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/StageListResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/stage/StageListResponse.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import org.sourcelab.activecampaign.apiv3.response.Meta; import java.util.ArrayList; import java.util.Collections; @@ -11,25 +12,34 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class StageListResponse { private final List stages; + private final Meta meta; @JsonCreator public StageListResponse( - @JsonProperty("dealStages") final List stages) { + @JsonProperty("dealStages") final List stages, + @JsonProperty("meta") final Meta meta + ) { if (stages == null) { this.stages = Collections.emptyList(); } else { this.stages = Collections.unmodifiableList(new ArrayList<>(stages)); } + this.meta = meta; } public List getStages() { return stages; } + public Meta getMeta() { + return meta; + } + @Override public String toString() { - return "StageListResponse{" - + "stages=" + stages - + '}'; + return "StageListResponse{" + + "stages=" + stages + + ", meta=" + meta + + '}'; } } From 55a3bc2ab6d0d25f0abbfd9087a202384b4f90d4 Mon Sep 17 00:00:00 2001 From: Brett Meyer Date: Fri, 25 Apr 2025 23:11:41 -0400 Subject: [PATCH 5/9] RequestWithQueryString -> DTOWithQueryString --- .../{RequestWithQueryString.java => DTOWithQueryString.java} | 2 +- .../activecampaign/apiv3/request/contact/ContactSearch.java | 4 ++-- .../activecampaign/apiv3/request/deal/DealSearch.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/org/sourcelab/activecampaign/apiv3/request/{RequestWithQueryString.java => DTOWithQueryString.java} (91%) diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/RequestWithQueryString.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/DTOWithQueryString.java similarity index 91% rename from src/main/java/org/sourcelab/activecampaign/apiv3/request/RequestWithQueryString.java rename to src/main/java/org/sourcelab/activecampaign/apiv3/request/DTOWithQueryString.java index ad62d69..f987bd9 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/RequestWithQueryString.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/DTOWithQueryString.java @@ -5,7 +5,7 @@ import java.util.HashMap; import java.util.Map; -public abstract class RequestWithQueryString { +public abstract class DTOWithQueryString { protected final Map queryParams = new HashMap<>(); diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java index 30192f9..4db7f05 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java @@ -1,8 +1,8 @@ package org.sourcelab.activecampaign.apiv3.request.contact; -import org.sourcelab.activecampaign.apiv3.request.RequestWithQueryString; +import org.sourcelab.activecampaign.apiv3.request.DTOWithQueryString; -public class ContactSearch extends RequestWithQueryString { +public class ContactSearch extends DTOWithQueryString { public ContactSearch withListId(final long listId) { queryParams.put("listid", listId + ""); diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java index c3448f1..8f38ad5 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java @@ -1,8 +1,8 @@ package org.sourcelab.activecampaign.apiv3.request.deal; -import org.sourcelab.activecampaign.apiv3.request.RequestWithQueryString; +import org.sourcelab.activecampaign.apiv3.request.DTOWithQueryString; -public class DealSearch extends RequestWithQueryString { +public class DealSearch extends DTOWithQueryString { public DealSearch withContact(final String contact) { queryParams.put("filters[contact]", contact); From 299a2bd2648c17ae558f607e42a169e073e3c115 Mon Sep 17 00:00:00 2001 From: Brett Meyer Date: Fri, 25 Apr 2025 23:40:13 -0400 Subject: [PATCH 6/9] pagination offsets to all list requests --- .../apiv3/ActiveCampaignClient.java | 32 +++++++++---------- .../request/account/AccountListRequest.java | 8 ++++- .../request/contact/ContactSearchRequest.java | 6 ++-- .../customField/CustomFieldListRequest.java | 8 ++++- .../deal/DealCustomFieldListRequest.java | 6 ++-- .../apiv3/request/deal/DealSearchRequest.java | 6 ++-- .../request/pipeline/PipelineListRequest.java | 8 ++++- .../apiv3/request/stage/StageListRequest.java | 8 ++++- .../apiv3/request/tag/TagListRequest.java | 10 ++++-- .../activecampaign/apiv3/response/Meta.java | 6 ++-- .../response/deal/DealSearchResponse.java | 19 ++++++++++- .../ActiveCampaignClientTest.java | 7 ++-- .../account/AccountListRequestTest.java | 2 +- 13 files changed, 89 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java index a35679e..bffd29d 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java @@ -100,8 +100,8 @@ public UsersMeResponse usersMe() { * Retrieve all existing accounts. * @return all accounts. */ - public AccountListResponse accountList() { - return submitRequest(new AccountListRequest()); + public AccountListResponse accountList(long offset) { + return submitRequest(new AccountListRequest(offset)); } public AccountResponse accountsRetrieve(final Long id) { @@ -157,20 +157,20 @@ public ContactRetrieveResponse contactRetrieve(final long contactId) { return submitRequest(new ContactRetrieveRequest(contactId)); } - public ContactSearchResponse contactSearch(ContactSearch contactSearch) { - return submitRequest(new ContactSearchRequest(contactSearch)); + public ContactSearchResponse contactSearch(ContactSearch contactSearch, long offset) { + return submitRequest(new ContactSearchRequest(contactSearch, offset)); } - public DealSearchResponse dealSearch(DealSearch dealSearch) { - return submitRequest(new DealSearchRequest(dealSearch)); + public DealSearchResponse dealSearch(DealSearch dealSearch, long offset) { + return submitRequest(new DealSearchRequest(dealSearch, offset)); } - public DealCustomFieldListResponse dealCustomFieldsList(Long dealId) { - return submitRequest(new DealCustomFieldListRequest(dealId)); + public DealCustomFieldListResponse dealCustomFieldsList(Long dealId, long offset) { + return submitRequest(new DealCustomFieldListRequest(dealId, offset)); } - public TagListResponse tagList() { - return submitRequest(new TagListRequest()); + public TagListResponse tagList(long offset) { + return submitRequest(new TagListRequest(offset)); } public TagCreateResponse tagCreate(final TagCreateRequest request) { @@ -189,16 +189,16 @@ public ContactTagDeleteResponse contactTagDelete(final ContactTag contactTag) { * Retrieve all Custom Fields defined. * @return Custom Field List Response. */ - public CustomFieldListResponse customFieldList() { - return submitRequest(new CustomFieldListRequest()); + public CustomFieldListResponse customFieldList(long offset) { + return submitRequest(new CustomFieldListRequest(offset)); } - public PipelineListResponse pipelineList() { - return submitRequest(new PipelineListRequest()); + public PipelineListResponse pipelineList(long offset) { + return submitRequest(new PipelineListRequest(offset)); } - public StageListResponse stageList() { - return submitRequest(new StageListRequest()); + public StageListResponse stageList(long offset) { + return submitRequest(new StageListRequest(offset)); } public ListListResponse listList() { diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/account/AccountListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/account/AccountListRequest.java index ffa6818..ad54f3b 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/account/AccountListRequest.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/account/AccountListRequest.java @@ -27,9 +27,15 @@ */ public class AccountListRequest implements GetRequest { + private final long offset; + + public AccountListRequest(long offset) { + this.offset = offset; + } + @Override public String getApiEndpoint() { - return "api/3/accounts"; + return "api/3/accounts?offset=" + offset; } @Override diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearchRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearchRequest.java index f909a4d..d8fd81a 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearchRequest.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearchRequest.java @@ -12,14 +12,16 @@ public class ContactSearchRequest implements Request { private final ContactSearch contactSearch; + private final long offset; - public ContactSearchRequest(final ContactSearch contactSearch) { + public ContactSearchRequest(final ContactSearch contactSearch, long offset) { this.contactSearch = contactSearch; + this.offset = offset; } @Override public String getApiEndpoint() { - return "api/3/contacts?" + contactSearch.buildQueryString(); + return "api/3/contacts?offset=" + offset + "&" + contactSearch.buildQueryString(); } @Override diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/customField/CustomFieldListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/customField/CustomFieldListRequest.java index 54cd903..cc8d4a0 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/customField/CustomFieldListRequest.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/customField/CustomFieldListRequest.java @@ -27,9 +27,15 @@ */ public class CustomFieldListRequest implements GetRequest { + private final long offset; + + public CustomFieldListRequest(long offset) { + this.offset = offset; + } + @Override public String getApiEndpoint() { - return "api/3/fields"; + return "api/3/fields?offset=" + offset; } @Override diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java index 1b8fa64..14493e0 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java @@ -12,14 +12,16 @@ public class DealCustomFieldListRequest implements Request { private final Long dealId; + private final long offset; - public DealCustomFieldListRequest(final Long dealId) { + public DealCustomFieldListRequest(final Long dealId, long offset) { this.dealId = dealId; + this.offset = offset; } @Override public String getApiEndpoint() { - return "api/3/dealCustomFieldData?filters[dealId]=" + dealId; + return "api/3/dealCustomFieldData?offset=" + offset + "&filters[dealId]=" + dealId; } @Override diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearchRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearchRequest.java index d717fef..5f3e248 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearchRequest.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearchRequest.java @@ -12,14 +12,16 @@ public class DealSearchRequest implements Request { private final DealSearch dealSearch; + private final long offset; - public DealSearchRequest(final DealSearch dealSearch) { + public DealSearchRequest(final DealSearch dealSearch, long offset) { this.dealSearch = dealSearch; + this.offset = offset; } @Override public String getApiEndpoint() { - return "api/3/deals?" + dealSearch.buildQueryString(); + return "api/3/deals?offset=" + offset + "&" + dealSearch.buildQueryString(); } @Override diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/pipeline/PipelineListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/pipeline/PipelineListRequest.java index 5d492d7..528a9ba 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/pipeline/PipelineListRequest.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/pipeline/PipelineListRequest.java @@ -8,9 +8,15 @@ public class PipelineListRequest implements GetRequest { + private final long offset; + + public PipelineListRequest(long offset) { + this.offset = offset; + } + @Override public String getApiEndpoint() { - return "api/3/dealGroups"; + return "api/3/dealGroups?offset=" + offset; } @Override diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/stage/StageListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/stage/StageListRequest.java index da63d12..6a03387 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/stage/StageListRequest.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/stage/StageListRequest.java @@ -8,9 +8,15 @@ public class StageListRequest implements GetRequest { + private final long offset; + + public StageListRequest(long offset) { + this.offset = offset; + } + @Override public String getApiEndpoint() { - return "api/3/dealStages"; + return "api/3/dealStages?offset=" + offset; } @Override diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/tag/TagListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/tag/TagListRequest.java index 65057a7..508da44 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/tag/TagListRequest.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/tag/TagListRequest.java @@ -23,13 +23,19 @@ import java.io.IOException; /** - * Represents an account list request. + * Represents a tag list request. */ public class TagListRequest implements GetRequest { + private final long offset; + + public TagListRequest(long offset) { + this.offset = offset; + } + @Override public String getApiEndpoint() { - return "api/3/tags"; + return "api/3/tags?offset=" + offset; } @Override diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/Meta.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/Meta.java index 531a31e..c6f0e2f 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/Meta.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/Meta.java @@ -23,16 +23,16 @@ * Meta response object. */ public class Meta { - private final int total; + private final long total; @JsonCreator public Meta( - @JsonProperty("total") final int total + @JsonProperty("total") final long total ) { this.total = total; } - public int getTotal() { + public long getTotal() { return total; } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java index 7218d69..9a9affb 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import org.sourcelab.activecampaign.apiv3.request.deal.Deal; +import org.sourcelab.activecampaign.apiv3.response.Meta; import java.util.ArrayList; import java.util.List; @@ -13,12 +14,14 @@ public class DealSearchResponse { // private final List deals; private final List deals = new ArrayList<>(); + private final Meta meta; @JsonCreator public DealSearchResponse( // @JsonProperty("deals") final List deals // TODO: temporarily keeping this so I can see all the values for debugging - @JsonProperty("deals") final List> dealsValues + @JsonProperty("deals") final List> dealsValues, + @JsonProperty("meta") final Meta meta ) { // this.deals = deals; @@ -36,9 +39,23 @@ public DealSearchResponse( deals.add(deal); } + + this.meta = meta; } public List getDeals() { return deals; } + + public Meta getMeta() { + return meta; + } + + @Override + public String toString() { + return "DealSearchResponse{" + + "deals=" + deals + + ", meta=" + meta + + '}'; + } } diff --git a/src/test/java/org/sourcelab/activecampaign/ActiveCampaignClientTest.java b/src/test/java/org/sourcelab/activecampaign/ActiveCampaignClientTest.java index 3c98e5b..dd1a387 100644 --- a/src/test/java/org/sourcelab/activecampaign/ActiveCampaignClientTest.java +++ b/src/test/java/org/sourcelab/activecampaign/ActiveCampaignClientTest.java @@ -25,7 +25,6 @@ import org.sourcelab.activecampaign.apiv3.ActiveCampaignClient; import org.sourcelab.activecampaign.apiv3.ApiConfig; import org.sourcelab.activecampaign.apiv3.request.contact.Contact; -import org.sourcelab.activecampaign.apiv3.request.contact.ContactRetrieveRequest; import org.sourcelab.activecampaign.apiv3.request.contactList.ContactListSubscribeRequest; import org.sourcelab.activecampaign.apiv3.request.contactTag.ContactTag; import org.sourcelab.activecampaign.apiv3.request.tag.TagCreateRequest; @@ -135,7 +134,7 @@ void testAccountsResource() { assertNotNull(resp.getAccount()); assertNotNull(resp.getAccount().getId()); - final AccountListResponse response = apiV3Client.accountList(); + final AccountListResponse response = apiV3Client.accountList(0); //logger.info("{}", response); final Optional createdAccountOptional = response.getAccounts() @@ -251,7 +250,7 @@ void testContactRetrieve_doesNotExist() { */ @Test void testListCustomFields() { - final CustomFieldListResponse resp = apiV3Client.customFieldList(); + final CustomFieldListResponse resp = apiV3Client.customFieldList(0); logger.info("Resop: {}", resp); } @@ -273,7 +272,7 @@ void testTagCreate() { */ @Test void testTagList() { - final TagListResponse resp = apiV3Client.tagList(); + final TagListResponse resp = apiV3Client.tagList(0); logger.info("Resop: {}", resp); } diff --git a/src/test/java/org/sourcelab/activecampaign/apiv3/request/account/AccountListRequestTest.java b/src/test/java/org/sourcelab/activecampaign/apiv3/request/account/AccountListRequestTest.java index 4b60e7c..fe7f1b1 100644 --- a/src/test/java/org/sourcelab/activecampaign/apiv3/request/account/AccountListRequestTest.java +++ b/src/test/java/org/sourcelab/activecampaign/apiv3/request/account/AccountListRequestTest.java @@ -35,7 +35,7 @@ class AccountListRequestTest extends AbstractRequestTest { @Test void testParsingResponse() throws IOException { final String input = readFile("accountsList.json"); - final AccountListResponse parsed = new AccountListRequest() + final AccountListResponse parsed = new AccountListRequest(0) .parseResponse(input); // Validate accounts From aef8c43a2083a375be608d8e2d339d40a4b745b8 Mon Sep 17 00:00:00 2001 From: Brett Meyer Date: Sat, 26 Apr 2025 00:18:43 -0400 Subject: [PATCH 7/9] updates to ContactSearch/DealSearch filters, fully parse the DealSearchResponse, refactored custom field list vs custom field value list --- .../apiv3/ActiveCampaignClient.java | 10 ++- .../apiv3/request/contact/ContactSearch.java | 18 ++++ .../deal/DealCustomFieldListRequest.java | 46 +++++----- .../deal/DealCustomFieldValueListRequest.java | 39 ++++++++ .../apiv3/request/deal/DealSearch.java | 31 ++++++- .../deal/DealCustomFieldListResponse.java | 64 +++++++------ .../DealCustomFieldValueListResponse.java | 49 ++++++++++ .../apiv3/response/deal/DealField.java | 90 +++++++++++++++++++ .../response/deal/DealSearchResponse.java | 14 +-- 9 files changed, 292 insertions(+), 69 deletions(-) create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldValueListRequest.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldValueListResponse.java create mode 100644 src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealField.java diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java index bffd29d..68945a2 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java @@ -34,6 +34,7 @@ import org.sourcelab.activecampaign.apiv3.request.contactTag.ContactTagDeleteRequest; import org.sourcelab.activecampaign.apiv3.request.customField.CustomFieldListRequest; import org.sourcelab.activecampaign.apiv3.request.deal.DealCustomFieldListRequest; +import org.sourcelab.activecampaign.apiv3.request.deal.DealCustomFieldValueListRequest; import org.sourcelab.activecampaign.apiv3.request.deal.DealSearch; import org.sourcelab.activecampaign.apiv3.request.deal.DealSearchRequest; import org.sourcelab.activecampaign.apiv3.request.list.ListListRequest; @@ -52,6 +53,7 @@ import org.sourcelab.activecampaign.apiv3.response.contactTag.ContactTagDeleteResponse; import org.sourcelab.activecampaign.apiv3.response.customField.CustomFieldListResponse; import org.sourcelab.activecampaign.apiv3.response.deal.DealCustomFieldListResponse; +import org.sourcelab.activecampaign.apiv3.response.deal.DealCustomFieldValueListResponse; import org.sourcelab.activecampaign.apiv3.response.deal.DealSearchResponse; import org.sourcelab.activecampaign.apiv3.response.list.ListListResponse; import org.sourcelab.activecampaign.apiv3.response.pipeline.PipelineListResponse; @@ -165,8 +167,12 @@ public DealSearchResponse dealSearch(DealSearch dealSearch, long offset) { return submitRequest(new DealSearchRequest(dealSearch, offset)); } - public DealCustomFieldListResponse dealCustomFieldsList(Long dealId, long offset) { - return submitRequest(new DealCustomFieldListRequest(dealId, offset)); + public DealCustomFieldListResponse dealCustomFieldList() { + return submitRequest(new DealCustomFieldListRequest()); + } + + public DealCustomFieldValueListResponse dealCustomFieldValueList(Long dealId) { + return submitRequest(new DealCustomFieldValueListRequest(dealId)); } public TagListResponse tagList(long offset) { diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java index 4db7f05..ebcb7b0 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/contact/ContactSearch.java @@ -9,9 +9,27 @@ public ContactSearch withListId(final long listId) { return this; } + // yyyy-mm-dd + public ContactSearch withCreatedBefore(final String createdBefore) { + queryParams.put("filters[created_before]", createdBefore); + return this; + } + // yyyy-mm-dd public ContactSearch withCreatedAfter(final String createdAfter) { queryParams.put("filters[created_after]", createdAfter); return this; } + + // yyyy-mm-dd + public ContactSearch withUpdatedBefore(final String updatedBefore) { + queryParams.put("filters[updated_before]", updatedBefore); + return this; + } + + // yyyy-mm-dd + public ContactSearch withUpdatedAfter(final String updatedAfter) { + queryParams.put("filters[updated_after]", updatedAfter); + return this; + } } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java index 14493e0..45bf647 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldListRequest.java @@ -1,37 +1,35 @@ +/** + * Copyright 2019, 2020, 2021 SourceLab.org https://github.com/SourceLabOrg/activecampaign-java-client + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ package org.sourcelab.activecampaign.apiv3.request.deal; import org.sourcelab.activecampaign.JacksonFactory; import org.sourcelab.activecampaign.apiv3.response.deal.DealCustomFieldListResponse; -import org.sourcelab.http.rest.request.Request; -import org.sourcelab.http.rest.request.RequestMethod; -import org.sourcelab.http.rest.request.body.NoBodyContent; -import org.sourcelab.http.rest.request.body.RequestBodyContent; +import org.sourcelab.http.rest.request.GetRequest; import java.io.IOException; -public class DealCustomFieldListRequest implements Request { - - private final Long dealId; - private final long offset; - - public DealCustomFieldListRequest(final Long dealId, long offset) { - this.dealId = dealId; - this.offset = offset; - } +/** + * Represents an account list request. + */ +public class DealCustomFieldListRequest implements GetRequest { @Override public String getApiEndpoint() { - return "api/3/dealCustomFieldData?offset=" + offset + "&filters[dealId]=" + dealId; - } - - @Override - public RequestMethod getRequestMethod() { - return RequestMethod.GET; - } - - @Override - public RequestBodyContent getRequestBody() { - return new NoBodyContent(); + return "api/3/dealCustomFieldMeta"; } @Override diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldValueListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldValueListRequest.java new file mode 100644 index 0000000..b5ba648 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldValueListRequest.java @@ -0,0 +1,39 @@ +package org.sourcelab.activecampaign.apiv3.request.deal; + +import org.sourcelab.activecampaign.JacksonFactory; +import org.sourcelab.activecampaign.apiv3.response.deal.DealCustomFieldValueListResponse; +import org.sourcelab.http.rest.request.Request; +import org.sourcelab.http.rest.request.RequestMethod; +import org.sourcelab.http.rest.request.body.NoBodyContent; +import org.sourcelab.http.rest.request.body.RequestBodyContent; + +import java.io.IOException; + +public class DealCustomFieldValueListRequest implements Request { + + private final Long dealId; + + public DealCustomFieldValueListRequest(final Long dealId) { + this.dealId = dealId; + } + + @Override + public String getApiEndpoint() { + return "api/3/dealCustomFieldData?&filters[dealId]=" + dealId; + } + + @Override + public RequestMethod getRequestMethod() { + return RequestMethod.GET; + } + + @Override + public RequestBodyContent getRequestBody() { + return new NoBodyContent(); + } + + @Override + public DealCustomFieldValueListResponse parseResponse(final String response) throws IOException { + return JacksonFactory.newInstance().readValue(response, DealCustomFieldValueListResponse.class); + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java index 8f38ad5..f41fab4 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealSearch.java @@ -4,14 +4,37 @@ public class DealSearch extends DTOWithQueryString { - public DealSearch withContact(final String contact) { - queryParams.put("filters[contact]", contact); + public DealSearch withContact(final long contactId) { + queryParams.put("filters[contact]", contactId + ""); return this; } // yyyy-mm-dd - public DealSearch withCreatedAfter(final String after) { - queryParams.put("filters[created_after]", after); + public DealSearch withCreatedBefore(final String createdBefore) { + queryParams.put("filters[created_before]", createdBefore); + return this; + } + + // yyyy-mm-dd + public DealSearch withCreatedAfter(final String createdAfter) { + queryParams.put("filters[created_after]", createdAfter); + return this; + } + + // yyyy-mm-dd + public DealSearch withUpdatedBefore(final String updatedBefore) { + queryParams.put("filters[updated_before]", updatedBefore); + return this; + } + + // yyyy-mm-dd + public DealSearch withUpdatedAfter(final String updatedAfter) { + queryParams.put("filters[updated_after]", updatedAfter); + return this; + } + + public DealSearch withStage(final long stageId) { + queryParams.put("filters[stage]", stageId + ""); return this; } } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java index d73cfbf..4382f91 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldListResponse.java @@ -1,57 +1,55 @@ +/** + * Copyright 2019, 2020, 2021 SourceLab.org https://github.com/SourceLabOrg/activecampaign-java-client + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ package org.sourcelab.activecampaign.apiv3.response.deal; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import org.sourcelab.activecampaign.apiv3.request.deal.DealCustomField; -import org.sourcelab.activecampaign.apiv3.response.Meta; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) public class DealCustomFieldListResponse { -// private final List dealCustomFieldData; - private final List dealCustomFields = new ArrayList<>(); - private final Meta meta; + private final List fields; + /** + * Constructor. + */ @JsonCreator public DealCustomFieldListResponse( -// @JsonProperty("dealCustomFieldData") final List dealCustomFieldData - // TODO: temporarily keeping this so I can see all the values for debugging - @JsonProperty("dealCustomFieldData") final List> dealCustomFieldData, - @JsonProperty("meta") final Meta meta + @JsonProperty("dealCustomFieldMeta") final List fields ) { -// this.deals = deals; - - for (Map dealCustomFieldMap : dealCustomFieldData) { - final DealCustomField dealCustomField = new DealCustomField( - Long.parseLong(dealCustomFieldMap.get("id").toString()), - Long.parseLong(dealCustomFieldMap.get("dealId").toString()), - Long.parseLong(dealCustomFieldMap.get("customFieldId").toString()), - dealCustomFieldMap.get("fieldValue").toString() - ); - - dealCustomFields.add(dealCustomField); + if (fields == null) { + this.fields = Collections.emptyList(); + } else { + this.fields = Collections.unmodifiableList(new ArrayList<>(fields)); } - - this.meta = meta; - } - - public List getDealCustomFields() { - return dealCustomFields; } - public Meta getMeta() { - return meta; + public List getFields() { + return fields; } @Override public String toString() { - return "DealCustomFieldListResponse{" + - "dealCustomFields=" + dealCustomFields + - ", meta=" + meta + - '}'; + return "DealCustomFieldListResponse{" + + "fields=" + fields + + '}'; } } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldValueListResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldValueListResponse.java new file mode 100644 index 0000000..8d013e4 --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldValueListResponse.java @@ -0,0 +1,49 @@ +package org.sourcelab.activecampaign.apiv3.response.deal; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.sourcelab.activecampaign.apiv3.request.deal.DealCustomField; +import org.sourcelab.activecampaign.apiv3.response.Meta; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class DealCustomFieldValueListResponse { +// private final List dealCustomFieldData; + private final List dealCustomFields = new ArrayList<>(); + + @JsonCreator + public DealCustomFieldValueListResponse( +// @JsonProperty("dealCustomFieldData") final List dealCustomFieldData + // TODO: temporarily keeping this so I can see all the values for debugging + @JsonProperty("dealCustomFieldData") final List> dealCustomFieldData, + @JsonProperty("meta") final Meta meta + ) { +// this.deals = deals; + + for (Map dealCustomFieldMap : dealCustomFieldData) { + final DealCustomField dealCustomField = new DealCustomField( + Long.parseLong(dealCustomFieldMap.get("id").toString()), + Long.parseLong(dealCustomFieldMap.get("dealId").toString()), + Long.parseLong(dealCustomFieldMap.get("customFieldId").toString()), + (String) dealCustomFieldMap.get("fieldValue") + ); + + dealCustomFields.add(dealCustomField); + } + } + + public List getDealCustomFields() { + return dealCustomFields; + } + + @Override + public String toString() { + return "DealCustomFieldValueListResponse{" + + "dealCustomFields=" + dealCustomFields + + '}'; + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealField.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealField.java new file mode 100644 index 0000000..a40328b --- /dev/null +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealField.java @@ -0,0 +1,90 @@ +/** + * Copyright 2019, 2020, 2021 SourceLab.org https://github.com/SourceLabOrg/activecampaign-java-client + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package org.sourcelab.activecampaign.apiv3.response.deal; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class DealField { + private final Long id; + private final String fieldLabel; + private final String fieldType; + private final String fieldDefault; + + // Related links + private final Map links; + + @JsonCreator + public DealField( + @JsonProperty("id") final Long id, + @JsonProperty("fieldLabel") final String fieldLabel, + @JsonProperty("fieldType") final String fieldType, + @JsonProperty("fieldDefault") final String fieldDefault, + @JsonProperty("links") final Map links + ) { + this.id = id; + this.fieldLabel = fieldLabel; + this.fieldType = fieldType; + this.fieldDefault = fieldDefault; + + if (links == null) { + this.links = Collections.emptyMap(); + } else { + this.links = Collections.unmodifiableMap(new HashMap<>(links)); + } + } + + public Long getId() { + return id; + } + + public String getFieldLabel() { + return fieldLabel; + } + + public String getFieldType() { + return fieldType; + } + + public String getFieldDefault() { + return fieldDefault; + } + + public Map getLinks() { + return links; + } + + @Override + public String toString() { + return "Field{" + + "id=" + id + + ", fieldLabel='" + fieldLabel + '\'' + + ", fieldType='" + fieldType + '\'' + + ", fieldDefault='" + fieldDefault + '\'' + + ", links=" + links + + '}'; + } +} diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java index 9a9affb..d651e46 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java @@ -26,14 +26,16 @@ public DealSearchResponse( // this.deals = deals; for (Map dealValues : dealsValues) { + String organization = (String) dealValues.get("organization"); final Deal deal = new Deal( Long.parseLong((String) dealValues.get("id")), - null, //@JsonProperty("contact") final String contact, - null, //@JsonProperty("organization") final String organization, - null, //@JsonProperty("title") final String title, - null, //@JsonProperty("description") final String description, - null, //@JsonProperty("stage") final String stage, - null, //@JsonProperty("status") final String status, + Long.parseLong((String) dealValues.get("contact")), + (organization == null || organization.isEmpty()) + ? null : Long.parseLong((String) dealValues.get("organization")), + (String) dealValues.get("title"), + (String) dealValues.get("description"), + Long.parseLong((String) dealValues.get("stage")), + Long.parseLong((String) dealValues.get("status")), (Map) dealValues.get("links") ); From aa85cf3aa3a56ace3f1e49b2556ff64584ce2eb6 Mon Sep 17 00:00:00 2001 From: Brett Meyer Date: Tue, 13 May 2025 21:10:17 -0400 Subject: [PATCH 8/9] Deal dates --- .../apiv3/request/deal/Deal.java | 18 +++++++++++++++++- .../response/deal/DealSearchResponse.java | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/Deal.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/Deal.java index b365eba..66c6974 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/Deal.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/Deal.java @@ -21,6 +21,8 @@ public class Deal { private final String description; private final Long stage; private final Long status; // Open, Won, Lost + private final String createdDate; + private final String updatedDate; // Related links private final Map links; @@ -34,6 +36,8 @@ public Deal( @JsonProperty("description") final String description, @JsonProperty("stage") final Long stage, @JsonProperty("status") final Long status, + @JsonProperty("cdate") final String createdDate, + @JsonProperty("mdate") final String updatedDate, @JsonProperty("links") final Map links ) { this.id = id; @@ -43,8 +47,10 @@ public Deal( this.description = description; this.stage = stage; this.status = status; + this.createdDate = createdDate; + this.updatedDate = updatedDate; - if (links == null) { + if (links == null) { this.links = Collections.emptyMap(); } else { this.links = Collections.unmodifiableMap(new HashMap<>(links)); @@ -79,6 +85,14 @@ public Long getStatus() { return status; } + public String getCreatedDate() { + return createdDate; + } + + public String getUpdatedDate() { + return updatedDate; + } + public Map getLinks() { return links; } @@ -93,6 +107,8 @@ public String toString() { ", description='" + description + '\'' + ", stage='" + stage + '\'' + ", status='" + status + '\'' + + ", createdDate='" + createdDate + '\'' + + ", updatedDate='" + updatedDate + '\'' + ", links=" + links + '}'; } diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java index d651e46..cbb195d 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealSearchResponse.java @@ -36,6 +36,8 @@ public DealSearchResponse( (String) dealValues.get("description"), Long.parseLong((String) dealValues.get("stage")), Long.parseLong((String) dealValues.get("status")), + (String) dealValues.get("cdate"), + (String) dealValues.get("mdate"), (Map) dealValues.get("links") ); From a3a8714297dc928b4939f06034deef52ab47b320 Mon Sep 17 00:00:00 2001 From: Brett Meyer Date: Thu, 15 May 2025 15:41:05 -0400 Subject: [PATCH 9/9] support offset in DealCustomFieldValueListRequest --- .../activecampaign/apiv3/ActiveCampaignClient.java | 4 ++-- .../request/deal/DealCustomFieldValueListRequest.java | 6 ++++-- .../response/deal/DealCustomFieldValueListResponse.java | 8 ++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java index 68945a2..b982582 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/ActiveCampaignClient.java @@ -171,8 +171,8 @@ public DealCustomFieldListResponse dealCustomFieldList() { return submitRequest(new DealCustomFieldListRequest()); } - public DealCustomFieldValueListResponse dealCustomFieldValueList(Long dealId) { - return submitRequest(new DealCustomFieldValueListRequest(dealId)); + public DealCustomFieldValueListResponse dealCustomFieldValueList(Long dealId, long offset) { + return submitRequest(new DealCustomFieldValueListRequest(dealId, offset)); } public TagListResponse tagList(long offset) { diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldValueListRequest.java b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldValueListRequest.java index b5ba648..2d56cdf 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldValueListRequest.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/request/deal/DealCustomFieldValueListRequest.java @@ -12,14 +12,16 @@ public class DealCustomFieldValueListRequest implements Request { private final Long dealId; + private final long offset; - public DealCustomFieldValueListRequest(final Long dealId) { + public DealCustomFieldValueListRequest(final Long dealId, long offset) { this.dealId = dealId; + this.offset = offset; } @Override public String getApiEndpoint() { - return "api/3/dealCustomFieldData?&filters[dealId]=" + dealId; + return "api/3/dealCustomFieldData?offset=" + offset + "&filters[dealId]=" + dealId; } @Override diff --git a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldValueListResponse.java b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldValueListResponse.java index 8d013e4..cd56f0e 100644 --- a/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldValueListResponse.java +++ b/src/main/java/org/sourcelab/activecampaign/apiv3/response/deal/DealCustomFieldValueListResponse.java @@ -14,6 +14,7 @@ public class DealCustomFieldValueListResponse { // private final List dealCustomFieldData; private final List dealCustomFields = new ArrayList<>(); + private final Meta meta; @JsonCreator public DealCustomFieldValueListResponse( @@ -34,16 +35,23 @@ public DealCustomFieldValueListResponse( dealCustomFields.add(dealCustomField); } + + this.meta = meta; } public List getDealCustomFields() { return dealCustomFields; } + public Meta getMeta() { + return meta; + } + @Override public String toString() { return "DealCustomFieldValueListResponse{" + "dealCustomFields=" + dealCustomFields + + ", meta=" + meta + '}'; } }