package com.uservoice.uservoicesdk.model; import com.uservoice.uservoicesdk.babayaga.Babayaga; import com.uservoice.uservoicesdk.rest.Callback; import com.uservoice.uservoicesdk.rest.RestTask; import com.uservoice.uservoicesdk.rest.RestTaskCallback; import org.json.JSONException; import org.json.JSONObject; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class Suggestion extends BaseModel { private String title; private String text; private String status; private String statusColor; private String creatorName; private String adminResponseText; private String adminResponseUserName; private String adminResponseAvatarUrl; private Date adminResponseCreatedAt; private Date createdAt; private Category category; private int numberOfComments; private int numberOfSubscribers; private int forumId; private boolean subscribed; private String forumName; public static void loadSuggestions(Forum forum, int page, final Callback<List<Suggestion>> callback) { Map<String, String> params = new HashMap<String, String>(); params.put("page", String.valueOf(page)); params.put("per_page", "20"); params.put("filter", "public"); params.put("sort", getClientConfig().getSuggestionSort()); doGet(apiPath("/forums/%d/suggestions.json", forum.getId()), params, new RestTaskCallback(callback) { @Override public void onComplete(JSONObject object) throws JSONException { callback.onModel(deserializeList(object, "suggestions", Suggestion.class)); } }); } public static RestTask searchSuggestions(Forum forum, String query, final Callback<List<Suggestion>> callback) { Map<String, String> params = new HashMap<String, String>(); params.put("query", query); return doGet(apiPath("/forums/%d/suggestions/search.json", forum.getId()), params, new RestTaskCallback(callback) { @Override public void onComplete(JSONObject object) throws JSONException { callback.onModel(deserializeList(object, "suggestions", Suggestion.class)); } }); } public static void createSuggestion(Forum forum, Category category, String title, String text, int numberOfVotes, final Callback<Suggestion> callback) { Map<String, String> params = new HashMap<String, String>(); params.put("suggestion[votes]", String.valueOf(numberOfVotes)); params.put("suggestion[title]", title); params.put("suggestion[text]", text); if (category != null) params.put("suggestion[category_id]", String.valueOf(category.getId())); doPost(apiPath("/forums/%d/suggestions.json", forum.getId()), params, new RestTaskCallback(callback) { @Override public void onComplete(JSONObject object) throws JSONException { callback.onModel(deserializeObject(object, "suggestion", Suggestion.class)); } }); } public void subscribe(final Callback<Suggestion> callback) { Map<String, String> params = new HashMap<String, String>(); params.put("subscribe", "true"); doPost(apiPath("/forums/%d/suggestions/%d/watch.json", forumId, id), params, new RestTaskCallback(callback) { @Override public void onComplete(JSONObject result) throws JSONException { Babayaga.track(Babayaga.Event.VOTE_IDEA, getId()); Babayaga.track(Babayaga.Event.SUBSCRIBE_IDEA, getId()); load(result.getJSONObject("suggestion")); callback.onModel(Suggestion.this); } }); } public void unsubscribe(final Callback<Suggestion> callback) { Map<String, String> params = new HashMap<String, String>(); params.put("subscribe", "false"); doPost(apiPath("/forums/%d/suggestions/%d/watch.json", forumId, id), params, new RestTaskCallback(callback) { @Override public void onComplete(JSONObject result) throws JSONException { load(result.getJSONObject("suggestion")); callback.onModel(Suggestion.this); } }); } @Override public void load(JSONObject object) throws JSONException { super.load(object); title = getString(object, "title"); text = getString(object, "formatted_text"); createdAt = getDate(object, "created_at"); forumId = object.getJSONObject("topic").getJSONObject("forum").getInt("id"); forumName = object.getJSONObject("topic").getJSONObject("forum").getString("name"); subscribed = object.has("subscribed") && object.getBoolean("subscribed"); if (!object.isNull("category")) category = deserializeObject(object, "category", Category.class); numberOfComments = object.getInt("comments_count"); numberOfSubscribers = object.getInt("subscriber_count"); if (!object.isNull("creator")) creatorName = getString(object.getJSONObject("creator"), "name"); if (!object.isNull("status")) { JSONObject statusObject = object.getJSONObject("status"); status = getString(statusObject, "name"); statusColor = getString(statusObject, "hex_color"); } if (!object.isNull("response")) { JSONObject response = object.getJSONObject("response"); adminResponseText = getString(response, "formatted_text"); adminResponseCreatedAt = getDate(response, "created_at"); JSONObject responseUser = response.getJSONObject("creator"); adminResponseUserName = getString(responseUser, "name"); adminResponseAvatarUrl = getString(responseUser, "avatar_url"); } } public String getForumName() { return forumName; } public boolean isSubscribed() { return subscribed; } public int getForumId() { return forumId; } public String getTitle() { return title; } public String getText() { return text; } public String getStatus() { return status; } public String getStatusColor() { return statusColor; } public String getCreatorName() { return creatorName; } public String getAdminResponseText() { return adminResponseText; } public String getAdminResponseUserName() { return adminResponseUserName; } public String getAdminResponseAvatarUrl() { return adminResponseAvatarUrl; } public Date getAdminResponseCreatedAt() { return adminResponseCreatedAt; } public Date getCreatedAt() { return createdAt; } public Category getCategory() { return category; } public int getNumberOfComments() { return numberOfComments; } public int getNumberOfSubscribers() { return numberOfSubscribers; } public void commentPosted(Comment comment) { numberOfComments += 1; } }