From c219cef20c4571c5de16cb9fd2c5b660677b21bc Mon Sep 17 00:00:00 2001 From: ZeterTheDuck Date: Mon, 4 May 2026 10:08:43 -0600 Subject: [PATCH 1/3] refactor: remove TicketAuditVia, as its behavior is duplicated in TicketVia, which has more code. TicketComment references TicketVia instead of TicketAuditVia --- .../lol/pbu/z4j/model/TicketAuditVia.java | 66 ------------------- .../java/lol/pbu/z4j/model/TicketComment.java | 2 +- 2 files changed, 1 insertion(+), 67 deletions(-) delete mode 100644 src/main/java/lol/pbu/z4j/model/TicketAuditVia.java diff --git a/src/main/java/lol/pbu/z4j/model/TicketAuditVia.java b/src/main/java/lol/pbu/z4j/model/TicketAuditVia.java deleted file mode 100644 index ae9d644..0000000 --- a/src/main/java/lol/pbu/z4j/model/TicketAuditVia.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2026 Peanut Butter Unicorn, LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package lol.pbu.z4j.model; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import io.micronaut.core.annotation.Nullable; -import io.micronaut.serde.annotation.Serdeable; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.util.Map; - -/** - * Describes how the object was created. See the Via object reference - * - * @author Jonathan-Zollinger - * @since 0.1.1 - */ -@Accessors(chain = true) -@NoArgsConstructor -@AllArgsConstructor -@Data -@JsonPropertyOrder({ - TicketAuditVia.JSON_PROPERTY_CHANNEL, - TicketAuditVia.JSON_PROPERTY_SOURCE, -}) -@Serdeable -public class TicketAuditVia { - - public static final String JSON_PROPERTY_CHANNEL = "channel"; - public static final String JSON_PROPERTY_SOURCE = "source"; - - /** - * This tells you how the ticket or event was created. Examples: \"web\", \"mobile\", \"rule\", \"system\" - */ - @Nullable - @JsonProperty(JSON_PROPERTY_CHANNEL) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String channel; - - /** - * For some channels a source object gives more information about how or why the ticket or event was created - */ - @Nullable - @JsonProperty(JSON_PROPERTY_SOURCE) - @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS) - private Map source; - -} diff --git a/src/main/java/lol/pbu/z4j/model/TicketComment.java b/src/main/java/lol/pbu/z4j/model/TicketComment.java index e5797a5..413b597 100644 --- a/src/main/java/lol/pbu/z4j/model/TicketComment.java +++ b/src/main/java/lol/pbu/z4j/model/TicketComment.java @@ -174,7 +174,7 @@ public class TicketComment { @Valid @JsonProperty(JSON_PROPERTY_VIA) @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private TicketAuditVia via; + private TicketVia via; /** * Add an item to the uploads property in a chainable fashion. From f545df0d21ddec00ff0247146d66fc0bd957484b Mon Sep 17 00:00:00 2001 From: ZeterTheDuck Date: Mon, 4 May 2026 10:19:41 -0600 Subject: [PATCH 2/3] refactor: remove repeated code in Attachment Attachment is just AttachmentBase with support for thumbnails. Remove AttachmentThumbnails as it is redundant. --- .../java/lol/pbu/z4j/model/Attachment.java | 118 +----------------- 1 file changed, 3 insertions(+), 115 deletions(-) diff --git a/src/main/java/lol/pbu/z4j/model/Attachment.java b/src/main/java/lol/pbu/z4j/model/Attachment.java index d3b3a3a..b1d57dc 100644 --- a/src/main/java/lol/pbu/z4j/model/Attachment.java +++ b/src/main/java/lol/pbu/z4j/model/Attachment.java @@ -23,6 +23,7 @@ import jakarta.validation.Valid; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @@ -38,6 +39,7 @@ @NoArgsConstructor @AllArgsConstructor @Data +@EqualsAndHashCode(callSuper = false) @JsonPropertyOrder({ Attachment.JSON_PROPERTY_CONTENT_TYPE, Attachment.JSON_PROPERTY_CONTENT_URL, @@ -55,124 +57,10 @@ Attachment.JSON_PROPERTY_THUMBNAILS, }) @Serdeable -public class Attachment { +public class Attachment extends AttachmentBase { - public static final String JSON_PROPERTY_CONTENT_TYPE = "content_type"; - public static final String JSON_PROPERTY_CONTENT_URL = "content_url"; - public static final String JSON_PROPERTY_DELETED = "deleted"; - public static final String JSON_PROPERTY_FILE_NAME = "file_name"; - public static final String JSON_PROPERTY_HEIGHT = "height"; - public static final String JSON_PROPERTY_ID = "id"; - public static final String JSON_PROPERTY_INLINE = "inline"; - public static final String JSON_PROPERTY_MALWARE_ACCESS_OVERRIDE = "malware_access_override"; - public static final String JSON_PROPERTY_MALWARE_SCAN_RESULT = "malware_scan_result"; - public static final String JSON_PROPERTY_MAPPED_CONTENT_URL = "mapped_content_url"; - public static final String JSON_PROPERTY_SIZE = "size"; - public static final String JSON_PROPERTY_URL = "url"; - public static final String JSON_PROPERTY_WIDTH = "width"; public static final String JSON_PROPERTY_THUMBNAILS = "thumbnails"; - /** - * The content type of the image. Example value: \"image/png\" - */ - @Nullable - @JsonProperty(JSON_PROPERTY_CONTENT_TYPE) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String contentType; - - /** - * A full URL where the attachment image file can be downloaded. The file may be hosted externally so take care not to inadvertently send Zendesk authentication credentials. See Working with url properties - */ - @Nullable - @JsonProperty(JSON_PROPERTY_CONTENT_URL) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String contentUrl; - - /** - * If true, the attachment has been deleted - */ - @Nullable - @JsonProperty(JSON_PROPERTY_DELETED) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Boolean deleted; - - /** - * The name of the image file - */ - @Nullable - @JsonProperty(JSON_PROPERTY_FILE_NAME) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String fileName; - - /** - * The height of the image file in pixels. If height is unknown, returns null - */ - @Nullable - @JsonProperty(JSON_PROPERTY_HEIGHT) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String height; - - /** - * Automatically assigned when created - */ - @Nullable - @JsonProperty(JSON_PROPERTY_ID) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Integer id; - - /** - * If true, the attachment is excluded from the attachment list and the attachment's URL can be referenced within the comment of a ticket. Default is false - */ - @Nullable - @JsonProperty(JSON_PROPERTY_INLINE) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Boolean inline; - - /** - * If true, you can download an attachment flagged as malware. If false, you can't download such an attachment. - */ - @Nullable - @JsonProperty(JSON_PROPERTY_MALWARE_ACCESS_OVERRIDE) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Boolean malwareAccessOverride; - - @Nullable - @JsonProperty(JSON_PROPERTY_MALWARE_SCAN_RESULT) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private AttachmentBaseMalwareScanResult malwareScanResult; - - /** - * The URL the attachment image file has been mapped to - */ - @Nullable - @JsonProperty(JSON_PROPERTY_MAPPED_CONTENT_URL) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String mappedContentUrl; - - /** - * The size of the image file in bytes - */ - @Nullable - @JsonProperty(JSON_PROPERTY_SIZE) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Integer size; - - /** - * A URL to access the attachment details - */ - @Nullable - @JsonProperty(JSON_PROPERTY_URL) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String url; - - /** - * The width of the image file in pixels. If width is unknown, returns null - */ - @Nullable - @JsonProperty(JSON_PROPERTY_WIDTH) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String width; - /** * An array of attachment objects. Note that photo thumbnails do not have thumbnails */ From 0096397f317535e8760f5811bcd648ae363e6ac7 Mon Sep 17 00:00:00 2001 From: ZeterTheDuck Date: Mon, 4 May 2026 10:29:09 -0600 Subject: [PATCH 3/3] refactor: remove repeated code in TicketCreateInput TicketCreateInput now extends TicketUpdateInput --- .../lol/pbu/z4j/model/TicketCreateInput.java | 321 +----------------- 1 file changed, 5 insertions(+), 316 deletions(-) diff --git a/src/main/java/lol/pbu/z4j/model/TicketCreateInput.java b/src/main/java/lol/pbu/z4j/model/TicketCreateInput.java index 47e5374..554e88b 100644 --- a/src/main/java/lol/pbu/z4j/model/TicketCreateInput.java +++ b/src/main/java/lol/pbu/z4j/model/TicketCreateInput.java @@ -21,7 +21,6 @@ import io.micronaut.core.annotation.Nullable; import io.micronaut.serde.annotation.Serdeable; import jakarta.validation.Valid; -import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotNull; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -29,7 +28,6 @@ import lombok.ToString; import lombok.experimental.Accessors; -import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; @@ -40,7 +38,7 @@ * @since 0.1.1 */ @Accessors(chain = true) -@EqualsAndHashCode +@EqualsAndHashCode(callSuper = false) @ToString @Getter @Setter @@ -82,32 +80,8 @@ TicketCreateInput.JSON_PROPERTY_VIA_FOLLOWUP_SOURCE_ID, }) @Serdeable -public class TicketCreateInput { +public class TicketCreateInput extends TicketUpdateInput { - public static final String JSON_PROPERTY_COMMENT = "comment"; - public static final String JSON_PROPERTY_ADDITIONAL_COLLABORATORS = "additional_collaborators"; - public static final String JSON_PROPERTY_ASSIGNEE_EMAIL = "assignee_email"; - public static final String JSON_PROPERTY_ASSIGNEE_ID = "assignee_id"; - public static final String JSON_PROPERTY_ATTRIBUTE_VALUE_IDS = "attribute_value_ids"; - public static final String JSON_PROPERTY_COLLABORATOR_IDS = "collaborator_ids"; - public static final String JSON_PROPERTY_CUSTOM_FIELDS = "custom_fields"; - public static final String JSON_PROPERTY_CUSTOM_STATUS_ID = "custom_status_id"; - public static final String JSON_PROPERTY_DUE_AT = "due_at"; - public static final String JSON_PROPERTY_EMAIL_CCS = "email_ccs"; - public static final String JSON_PROPERTY_EXTERNAL_ID = "external_id"; - public static final String JSON_PROPERTY_FOLLOWERS = "followers"; - public static final String JSON_PROPERTY_GROUP_ID = "group_id"; - public static final String JSON_PROPERTY_ORGANIZATION_ID = "organization_id"; - public static final String JSON_PROPERTY_PRIORITY = "priority"; - public static final String JSON_PROPERTY_PROBLEM_ID = "problem_id"; - public static final String JSON_PROPERTY_REQUESTER_ID = "requester_id"; - public static final String JSON_PROPERTY_SAFE_UPDATE = "safe_update"; - public static final String JSON_PROPERTY_SHARING_AGREEMENT_IDS = "sharing_agreement_ids"; - public static final String JSON_PROPERTY_STATUS = "status"; - public static final String JSON_PROPERTY_SUBJECT = "subject"; - public static final String JSON_PROPERTY_TAGS = "tags"; - public static final String JSON_PROPERTY_TYPE = "type"; - public static final String JSON_PROPERTY_UPDATED_STAMP = "updated_stamp"; public static final String JSON_PROPERTY_BRAND_ID = "brand_id"; public static final String JSON_PROPERTY_COLLABORATORS = "collaborators"; public static final String JSON_PROPERTY_EMAIL_CC_IDS = "email_cc_ids"; @@ -120,187 +94,6 @@ public class TicketCreateInput { public static final String JSON_PROPERTY_VIA = "via"; public static final String JSON_PROPERTY_VIA_FOLLOWUP_SOURCE_ID = "via_followup_source_id"; - @NotNull - @Valid - @JsonProperty(JSON_PROPERTY_COMMENT) - private TicketComment comment; - - /** - * An array of numeric IDs, emails, or objects containing name and email properties. See Setting Collaborators. An email notification is sent to them when the ticket is updated - */ - @Nullable - @JsonProperty(JSON_PROPERTY_ADDITIONAL_COLLABORATORS) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private List<@Valid Collaborator> additionalCollaborators; - - /** - * The email address of the agent to assign the ticket to - */ - @Nullable - @Email - @JsonProperty(JSON_PROPERTY_ASSIGNEE_EMAIL) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String assigneeEmail; - - /** - * The agent currently assigned to the ticket - */ - @Nullable - @JsonProperty(JSON_PROPERTY_ASSIGNEE_ID) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Integer assigneeId; - - /** - * An array of the IDs of attribute values to be associated with the ticket - */ - @Nullable - @JsonProperty(JSON_PROPERTY_ATTRIBUTE_VALUE_IDS) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private List<@NotNull Integer> attributeValueIds; - - /** - * The ids of users currently CC'ed on the ticket - */ - @Nullable - @JsonProperty(JSON_PROPERTY_COLLABORATOR_IDS) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private List<@NotNull Integer> collaboratorIds; - - /** - * Custom fields for the ticket. See Setting custom field values - */ - @Nullable - @JsonProperty(JSON_PROPERTY_CUSTOM_FIELDS) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private List<@Valid CustomField> customFields; - - /** - * The custom ticket status id of the ticket. See custom ticket statuses - */ - @Nullable - @JsonProperty(JSON_PROPERTY_CUSTOM_STATUS_ID) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Integer customStatusId; - - /** - * If this is a ticket of type \"task\" it has a due date. Due date format uses ISO 8601 format. - */ - @Nullable - @JsonProperty(JSON_PROPERTY_DUE_AT) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private ZonedDateTime dueAt; - - /** - * An array of objects that represent agent or end users email CCs to add or delete from the ticket. See Setting email CCs - */ - @Nullable - @JsonProperty(JSON_PROPERTY_EMAIL_CCS) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private List<@Valid EmailCC> emailCcs; - - /** - * An id you can use to link Zendesk Support tickets to local records - */ - @Nullable - @JsonProperty(JSON_PROPERTY_EXTERNAL_ID) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String externalId; - - /** - * An array of objects that represent agent followers to add or delete from the ticket. See Setting followers - */ - @Nullable - @JsonProperty(JSON_PROPERTY_FOLLOWERS) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private List<@Valid Follower> followers; - - /** - * The group this ticket is assigned to - */ - @Nullable - @JsonProperty(JSON_PROPERTY_GROUP_ID) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Integer groupId; - - /** - * The organization of the requester. You can only specify the ID of an organization associated with the requester. See Organization Memberships - */ - @Nullable - @JsonProperty(JSON_PROPERTY_ORGANIZATION_ID) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Integer organizationId; - - @Nullable - @JsonProperty(JSON_PROPERTY_PRIORITY) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private TicketUpdateInputPriority priority; - - /** - * For tickets of type \"incident\", the ID of the problem the incident is linked to - */ - @Nullable - @JsonProperty(JSON_PROPERTY_PROBLEM_ID) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Integer problemId; - - /** - * The user who requested this ticket - */ - @Nullable - @JsonProperty(JSON_PROPERTY_REQUESTER_ID) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Integer requesterId; - - /** - * Optional boolean. Prevents updates with outdated ticket data (`updated_stamp` property required when true) - */ - @Nullable - @JsonProperty(JSON_PROPERTY_SAFE_UPDATE) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private Boolean safeUpdate; - - /** - * An array of the numeric IDs of sharing agreements. Note that this replaces any existing agreements - */ - @Nullable - @JsonProperty(JSON_PROPERTY_SHARING_AGREEMENT_IDS) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private List<@NotNull Integer> sharingAgreementIds; - - @Nullable - @JsonProperty(JSON_PROPERTY_STATUS) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private TicketUpdateInputStatus status; - - /** - * The value of the subject field for this ticket - */ - @Nullable - @JsonProperty(JSON_PROPERTY_SUBJECT) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private String subject; - - /** - * The array of tags applied to this ticket - */ - @Nullable - @JsonProperty(JSON_PROPERTY_TAGS) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private List<@NotNull String> tags; - - @Nullable - @JsonProperty(JSON_PROPERTY_TYPE) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private TicketUpdateInputType type; - - /** - * Datetime of last update received from API. See the safe_update property - */ - @Nullable - @JsonProperty(JSON_PROPERTY_UPDATED_STAMP) - @JsonInclude(JsonInclude.Include.USE_DEFAULTS) - private ZonedDateTime updatedStamp; - /** * Enterprise only. The id of the brand this ticket is associated with */ @@ -318,7 +111,7 @@ public class TicketCreateInput { private List<@Valid Collaborator> collaborators; /** - * The ids of agents or end users currently CC'ed on the ticket. See CCs and followers resources in the Support Help Center + * The ids of agents or end users currently CC'ed on the ticket. See CCs and followers resources in the Support Help Center */ @Nullable @JsonProperty(JSON_PROPERTY_EMAIL_CC_IDS) @@ -326,7 +119,7 @@ public class TicketCreateInput { private List<@NotNull Long> emailCcIds; /** - * The ids of agents currently following the ticket. See CCs and followers resources + * The ids of agents currently following the ticket. See CCs and followers resources */ @Nullable @JsonProperty(JSON_PROPERTY_FOLLOWER_IDS) @@ -388,111 +181,7 @@ public class TicketCreateInput { private Long viaFollowupSourceId; public TicketCreateInput(TicketComment comment) { - this.comment = comment; - } - - /** - * Add an item to the additionalCollaborators property in a chainable fashion. - * - * @return The same instance of TicketCreateInput for chaining. - */ - public TicketCreateInput addAdditionalCollaboratorsItem(Collaborator additionalCollaboratorsItem) { - if (additionalCollaborators == null) { - additionalCollaborators = new ArrayList<>(); - } - additionalCollaborators.add(additionalCollaboratorsItem); - return this; - } - - /** - * Add an item to the attributeValueIds property in a chainable fashion. - * - * @return The same instance of TicketCreateInput for chaining. - */ - public TicketCreateInput addAttributeValueIdsItem(Integer attributeValueIdsItem) { - if (attributeValueIds == null) { - attributeValueIds = new ArrayList<>(); - } - attributeValueIds.add(attributeValueIdsItem); - return this; - } - - /** - * Add an item to the collaboratorIds property in a chainable fashion. - * - * @return The same instance of TicketCreateInput for chaining. - */ - public TicketCreateInput addCollaboratorIdsItem(Integer collaboratorIdsItem) { - if (collaboratorIds == null) { - collaboratorIds = new ArrayList<>(); - } - collaboratorIds.add(collaboratorIdsItem); - return this; - } - - /** - * Add an item to the customFields property in a chainable fashion. - * - * @return The same instance of TicketCreateInput for chaining. - */ - public TicketCreateInput addCustomFieldsItem(CustomField customFieldsItem) { - if (customFields == null) { - customFields = new ArrayList<>(); - } - customFields.add(customFieldsItem); - return this; - } - - /** - * Add an item to the emailCcs property in a chainable fashion. - * - * @return The same instance of TicketCreateInput for chaining. - */ - public TicketCreateInput addEmailCcsItem(EmailCC emailCcsItem) { - if (emailCcs == null) { - emailCcs = new ArrayList<>(); - } - emailCcs.add(emailCcsItem); - return this; - } - - /** - * Add an item to the followers property in a chainable fashion. - * - * @return The same instance of TicketCreateInput for chaining. - */ - public TicketCreateInput addFollowersItem(Follower followersItem) { - if (followers == null) { - followers = new ArrayList<>(); - } - followers.add(followersItem); - return this; - } - - /** - * Add an item to the sharingAgreementIds property in a chainable fashion. - * - * @return The same instance of TicketCreateInput for chaining. - */ - public TicketCreateInput addSharingAgreementIdsItem(Integer sharingAgreementIdsItem) { - if (sharingAgreementIds == null) { - sharingAgreementIds = new ArrayList<>(); - } - sharingAgreementIds.add(sharingAgreementIdsItem); - return this; - } - - /** - * Add an item to the tags property in a chainable fashion. - * - * @return The same instance of TicketCreateInput for chaining. - */ - public TicketCreateInput addTagsItem(String tagsItem) { - if (tags == null) { - tags = new ArrayList<>(); - } - tags.add(tagsItem); - return this; + setComment(comment); } /**