From 3ad60be2c5f35c248680b3159701b571e1c86d6a Mon Sep 17 00:00:00 2001 From: Sudipto Sarkar Date: Sun, 3 May 2020 16:15:24 +0530 Subject: [PATCH] Added comment updation. * Added comment updation. * Ignored extra fields in Term (for example added by the yoast plugin) --- .../afrozaar/wordpress/wpapi/v2/Client.java | 57 +++++ .../wordpress/wpapi/v2/Wordpress.java | 3 +- .../wordpress/wpapi/v2/api/Comments.java | 18 ++ .../wordpress/wpapi/v2/model/Comment.java | 223 ++++++++++++++++++ .../wordpress/wpapi/v2/model/Term.java | 9 + .../wordpress/wpapi/v2/request/Request.java | 3 + 6 files changed, 312 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/afrozaar/wordpress/wpapi/v2/api/Comments.java create mode 100644 src/main/java/com/afrozaar/wordpress/wpapi/v2/model/Comment.java diff --git a/src/main/java/com/afrozaar/wordpress/wpapi/v2/Client.java b/src/main/java/com/afrozaar/wordpress/wpapi/v2/Client.java index cbe396e..1348907 100644 --- a/src/main/java/com/afrozaar/wordpress/wpapi/v2/Client.java +++ b/src/main/java/com/afrozaar/wordpress/wpapi/v2/Client.java @@ -199,6 +199,13 @@ public Post deletePost(Post post) { return exchange.getBody(); } + @Override + public Comment updateComment(Comment comment) { + final ResponseEntity exchange = + doExchange1(Request.COMMENT, HttpMethod.POST, Comment.class, forExpand(comment.getId()), ImmutableMap.of(), fieldsFrom(comment)); + return exchange.getBody(); + } + @Override public PagedResponse search(SearchRequest search) { final URI uri = search.usingClient(this).build().toUri(); @@ -992,6 +999,56 @@ protected Map fieldsFrom(Post post) { return builder.build(); } + @VisibleForTesting + @SuppressWarnings("unchecked") + protected Map fieldsFrom(Comment comment) { + ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); + + BiConsumer biConsumer = (key, value) -> ofNullable(value).ifPresent(v -> builder.put(key, v)); + + List processableFields = Arrays.asList( + "author", + "author_email", + "author_ip", + "author_name", + "author_url", + "author_user_agent", + "content", + "date", + "date_gmt", + "parent", + "post", + // "status", + "meta" + ); + + // types ignored for now: slug, status, type + + Arrays.stream(comment.getClass().getDeclaredFields()) + .filter(field -> field.getAnnotationsByType(JsonProperty.class).length > 0) + .map(field -> tuple(field, field.getAnnotationsByType(JsonProperty.class)[0])) + .filter(fieldTuple -> processableFields.contains(fieldTuple.v2.value())) + .forEach(field -> { + try { + ReflectionUtils.makeAccessible(field.v1); + Object theField = field.v1.get(comment); + if (nonNull(theField)) { + final Object value; + if (theField instanceof RenderableField) { + value = ((RenderableField) theField).getRendered(); + } else { + value = theField; + } + biConsumer.accept(field.v2.value(), value); + } + } catch (IllegalAccessException e) { + LOG.error("Error populating comment fields builder for field '{}'", field.v1.getName(), e); + } + }); + + return builder.build(); + } + private ResponseEntity doExchange0(HttpMethod method, URI uri, Class typeRef, B body, @Nullable MediaType mediaType) { final RequestEntity.BodyBuilder builder = RequestEntity.method(method, uri) .header(userAgentTuple.v1, userAgentTuple.v2); diff --git a/src/main/java/com/afrozaar/wordpress/wpapi/v2/Wordpress.java b/src/main/java/com/afrozaar/wordpress/wpapi/v2/Wordpress.java index b08819d..ff3c6f8 100644 --- a/src/main/java/com/afrozaar/wordpress/wpapi/v2/Wordpress.java +++ b/src/main/java/com/afrozaar/wordpress/wpapi/v2/Wordpress.java @@ -1,6 +1,7 @@ package com.afrozaar.wordpress.wpapi.v2; import com.afrozaar.wordpress.wpapi.v2.api.Categories; +import com.afrozaar.wordpress.wpapi.v2.api.Comments; import com.afrozaar.wordpress.wpapi.v2.api.CustomCalls; import com.afrozaar.wordpress.wpapi.v2.api.Medias; import com.afrozaar.wordpress.wpapi.v2.api.Pages; @@ -16,7 +17,7 @@ import java.net.URI; import java.util.function.Function; -public interface Wordpress extends Posts, PostMetas, Taxonomies, Terms, Medias, Pages, Users, Tags, Categories, CustomCalls { +public interface Wordpress extends Posts, Comments, PostMetas, Taxonomies, Terms, Medias, Pages, Users, Tags, Categories, CustomCalls { String getContext(); diff --git a/src/main/java/com/afrozaar/wordpress/wpapi/v2/api/Comments.java b/src/main/java/com/afrozaar/wordpress/wpapi/v2/api/Comments.java new file mode 100644 index 0000000..befa1cd --- /dev/null +++ b/src/main/java/com/afrozaar/wordpress/wpapi/v2/api/Comments.java @@ -0,0 +1,18 @@ +package com.afrozaar.wordpress.wpapi.v2.api; + +import com.afrozaar.wordpress.wpapi.v2.model.Comment; +import com.afrozaar.wordpress.wpapi.v2.request.Request; +import com.afrozaar.wordpress.wpapi.v2.request.SearchRequest; + +public interface Comments { + + /** + * Search request just returning the first page of comments. + */ + static SearchRequest.Builder listBuilder() { + return SearchRequest.Builder.aSearchRequest(Comment.class) + .withUri(Request.COMMENTS); + } + + Comment updateComment(Comment comment); +} diff --git a/src/main/java/com/afrozaar/wordpress/wpapi/v2/model/Comment.java b/src/main/java/com/afrozaar/wordpress/wpapi/v2/model/Comment.java new file mode 100644 index 0000000..929a577 --- /dev/null +++ b/src/main/java/com/afrozaar/wordpress/wpapi/v2/model/Comment.java @@ -0,0 +1,223 @@ +package com.afrozaar.wordpress.wpapi.v2.model; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "id", + "post", + "parent", + "author", + "author_name", + "author_url", + "date", + "date_gmt", + "content", + "link", + "status", + "type", + "author_avatar_urls", + "meta", + "_links" +}) +public class Comment { + + @JsonProperty("id") + private Integer id; + @JsonProperty("post") + private Integer post; + @JsonProperty("parent") + private Integer parent; + @JsonProperty("author") + private Integer author; + @JsonProperty("author_name") + private String authorName; + @JsonProperty("author_email") + private String authorEmail; + @JsonProperty("author_url") + private String authorUrl; + @JsonProperty("date") + private String date; + @JsonProperty("date_gmt") + private String dateGmt; + @JsonProperty("content") + private Content content; + @JsonProperty("link") + private String link; + @JsonProperty("status") + private String status; + @JsonProperty("type") + private String type; + @JsonProperty("author_avatar_urls") + private AvatarUrls avatarUrls; + @JsonProperty("meta") + private List meta = new ArrayList<>(); + @JsonProperty("_links") + private Links links; + + @JsonProperty("id") + public Integer getId() { + return id; + } + + @JsonProperty("id") + public void setId(Integer id) { + this.id = id; + } + + @JsonProperty("post") + public Integer getPost() { + return post; + } + + @JsonProperty("post") + public void setPost(Integer post) { + this.post = post; + } + + @JsonProperty("parent") + public Integer getParent() { + return parent; + } + + @JsonProperty("parent") + public void setParent(Integer parent) { + this.parent = parent; + } + + @JsonProperty("author") + public Integer getAuthor() { + return author; + } + + @JsonProperty("author") + public void setAuthor(Integer author) { + this.author = author; + } + + @JsonProperty("author_name") + public String getAuthorName() { + return authorName; + } + + @JsonProperty("author_name") + public void setAuthorName(String authorName) { + this.authorName = authorName; + } + + @JsonProperty("author_email") + public String getAuthorEmail() { + return authorEmail; + } + + @JsonProperty("author_email") + public void setAuthorEmail(String authorEmail) { + this.authorEmail = authorEmail; + } + + @JsonProperty("author_url") + public String getAuthorUrl() { + return authorUrl; + } + + @JsonProperty("author_url") + public void setAuthorUrl(String authorUrl) { + this.authorUrl = authorUrl; + } + + @JsonProperty("date") + public String getDate() { + return date; + } + + @JsonProperty("date") + public void setDate(String date) { + this.date = date; + } + + @JsonProperty("date_gmt") + public String getDateGmt() { + return dateGmt; + } + + @JsonProperty("date_gmt") + public void setDateGmt(String dateGmt) { + this.dateGmt = dateGmt; + } + + @JsonProperty("content") + public Content getContent() { + return content; + } + + @JsonProperty("content") + public void setContent(Content content) { + this.content = content; + } + + @JsonProperty("link") + public String getLink() { + return link; + } + + @JsonProperty("link") + public void setLink(String link) { + this.link = link; + } + + @JsonProperty("status") + public String getStatus() { + return status; + } + + @JsonProperty("status") + public void setStatus(String status) { + this.status = status; + } + + @JsonProperty("type") + public String getType() { + return type; + } + + @JsonProperty("type") + public void setType(String type) { + this.type = type; + } + + @JsonProperty("author_avatar_urls") + public AvatarUrls getAvatarUrls() { + return avatarUrls; + } + + @JsonProperty("author_avatar_urls") + public void setAvatarUrls(AvatarUrls avatarUrls) { + this.avatarUrls = avatarUrls; + } + + @JsonProperty("meta") + public List getMeta() { + return meta; + } + + @JsonProperty("meta") + public void setMeta(List meta) { + this.meta = meta; + } + + @JsonProperty("_links") + public Links getLinks() { + return links; + } + + @JsonProperty("_links") + public void setLinks(Links links) { + this.links = links; + } + +} diff --git a/src/main/java/com/afrozaar/wordpress/wpapi/v2/model/Term.java b/src/main/java/com/afrozaar/wordpress/wpapi/v2/model/Term.java index 964ca8e..601c0cd 100644 --- a/src/main/java/com/afrozaar/wordpress/wpapi/v2/model/Term.java +++ b/src/main/java/com/afrozaar/wordpress/wpapi/v2/model/Term.java @@ -1,5 +1,7 @@ package com.afrozaar.wordpress.wpapi.v2.model; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.google.common.collect.ImmutableMap; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -28,6 +30,8 @@ public class Term { private String taxonomySlug; @JsonProperty("parent") private Long parentId; + @JsonIgnore + private Map additionalProps; @JsonProperty("meta") //TODO: Keep an eye on https://github.com/WP-API/WP-API/issues/2859 and fix once it is resolved. private List meta; @@ -105,6 +109,11 @@ public void setMeta(List meta) { this.meta = meta; } + @JsonAnyGetter + public void setAdditionalProps(Map additionalProps) { + this.additionalProps = additionalProps; + } + public Map asMap() { final ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); BiConsumer c = (index, value) -> Optional.ofNullable(value).ifPresent(val -> builder.put(index, val)); diff --git a/src/main/java/com/afrozaar/wordpress/wpapi/v2/request/Request.java b/src/main/java/com/afrozaar/wordpress/wpapi/v2/request/Request.java index 787290d..4c5b599 100644 --- a/src/main/java/com/afrozaar/wordpress/wpapi/v2/request/Request.java +++ b/src/main/java/com/afrozaar/wordpress/wpapi/v2/request/Request.java @@ -21,6 +21,9 @@ public abstract class Request { public static final String POST_TERM = "/posts/{postId}/{taxonomy}/{termId}"; public static final String POST_TAGS = "/tags?post={postId}"; + public static final String COMMENTS = "/comments"; + public static final String COMMENT = "/comments/{id}"; + public static final String METAS = "/posts/{postId}/meta"; public static final String META = "/posts/{postId}/meta/{metaId}"; public static final String CUSTOM_POST_METAS = "/{postType}/{postId}/meta";