package com.instructure.canvasapi.api; import com.instructure.canvasapi.model.CanvasContext; import com.instructure.canvasapi.model.DiscussionEntry; import com.instructure.canvasapi.model.DiscussionTopic; import com.instructure.canvasapi.model.DiscussionTopicHeader; import com.instructure.canvasapi.utilities.APIHelpers; import com.instructure.canvasapi.utilities.CanvasCallback; import com.instructure.canvasapi.utilities.ExhaustiveBridgeCallback; import retrofit.Callback; import retrofit.client.Response; import retrofit.http.Body; import retrofit.http.GET; import retrofit.http.POST; import retrofit.http.PUT; import retrofit.http.Path; import retrofit.http.Query; /** * * Copyright (c) 2015 Instructure. All rights reserved. */ public class DiscussionAPI extends BuildInterfaceAPI { interface DiscussionsInterface { @GET("/{context_id}/discussion_topics") void getFirstPageDiscussions(@Path("context_id") long course_id, Callback<DiscussionTopicHeader[]> callback); @GET("/{context_id}/discussion_topics?scope=pinned") void getFirstPagePinnedDiscussions(@Path("context_id") long course_id, Callback<DiscussionTopicHeader[]> callback); @GET("/{context_id}/discussion_topics") void getStudentGroupDiscussionTopicHeader(@Path("context_id") long course_id, @Query("root_topic_id") long rootTopicId, Callback<DiscussionTopicHeader[]> callback); @GET("/{next}") void getNextPageDiscussions(@Path(value = "next", encode = false) String nextURL, Callback<DiscussionTopicHeader[]> callback); @GET("/{context_id}/discussion_topics/{discussionid}") void getDetailedDiscussion(@Path("context_id") long courseId, @Path("discussionid") long discussionId, Callback<DiscussionTopicHeader> callback); @GET("/canvas/{parentId}/{studentId}/courses/{courseId}/discussion_topics/{discussionTopicId}") void getDetailedDiscussionAirwolf(@Path("parentId") String parentId, @Path("studentId") String studentId, @Path("courseId") String courseId, @Path("discussionTopicId") String discussionTopicId, Callback<DiscussionTopicHeader> callback); @GET("/{context_id}/discussion_topics/{discussionid}/view") void getFullDiscussionTopic(@Path("context_id") long courseId, @Path("discussionid") long discussionId, Callback<DiscussionTopic> callback); @GET("/{context_id}/discussion_topics/") void getFilteredDiscussionTopic(@Path("context_id") long courseId, @Query("search_term") String searchTerm, Callback<DiscussionTopicHeader[]> callback); @POST("/{context_id}/discussion_topics/{discussionid}/entries/") void postDiscussionEntry(@Path("context_id") long courseId, @Path("discussionid") long discussionId, @Query("message") String message, @Body String body, Callback<DiscussionEntry> callback); @POST("/{context_id}/discussion_topics/{discussionid}/entries/{entryid}/replies") void postDiscussionReply(@Path("context_id") long courseId, @Path("discussionid") long discussionId, @Path("entryid") long entryId, @Query("message")String message, @Body String body, Callback<DiscussionEntry> callback); @POST("/{context_id}/discussion_topics/") void postNewDiscussion(@Path("context_id")long courseId, @Query("title") String title, @Query("message")String message, @Query("is_announcement")int announcement, @Query("discussion_type")String discussion_type, @Body String body, Callback<DiscussionTopicHeader> callback); @POST("/{context_id}/discussion_topics/") void postNewDiscussionAndPublish(@Path("context_id")long courseId, @Query("title") String title, @Query("message")String message, @Query("is_announcement")int announcement, @Query("published") int isPublished, @Query("discussion_type")String discussion_type, @Body String body, Callback<DiscussionTopicHeader> callback); @PUT("/{context_id}/discussion_topics/{topic_id}") void updateDiscussionTopic(@Path("context_id") long courseId, @Path("topic_id") long topicId, @Query("title") String title, @Query("message")String message, @Query("published") int isPublished, @Query("discussion_type")String discussion_type, @Body String body, Callback<DiscussionTopicHeader> callback); @POST("/{context_id}/discussion_topics/{discussionId}/entries/{entryId}/rating") void rateDiscussionEntry(@Path("context_id") long courseId, @Path("discussionId") long discussionId, @Path("entryId") long entryId, @Query("rating") int rating, @Body String body, Callback<Response> callback); @PUT("/{context_id}/discussion_topics/{topic_id}") void pinDiscussion(@Path("context_id") long courseId, @Path("topic_id") long discussionId, @Query("pinned") boolean pinned, @Body String body, Callback<DiscussionTopicHeader> callback); } ///////////////////////////////////////////////////////////////////////// // API Calls ///////////////////////////////////////////////////////////////////////// public static void getFirstPageDiscussions(CanvasContext canvasContext, final CanvasCallback<DiscussionTopicHeader[]> callback) { if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } buildCacheInterface(DiscussionsInterface.class, callback, canvasContext).getFirstPageDiscussions(canvasContext.getId(), callback); buildInterface(DiscussionsInterface.class, callback, canvasContext).getFirstPageDiscussions(canvasContext.getId(), callback); } public static void getFirstPageDiscussionsChained(CanvasContext canvasContext, final CanvasCallback<DiscussionTopicHeader[]> callback, boolean isCached) { if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } if (isCached) { buildCacheInterface(DiscussionsInterface.class, callback, canvasContext).getFirstPageDiscussions(canvasContext.getId(), callback); } else { buildInterface(DiscussionsInterface.class, callback, canvasContext).getFirstPageDiscussions(canvasContext.getId(), callback); } } public static void getFirstPagePinnedDiscussions(CanvasContext canvasContext, final CanvasCallback<DiscussionTopicHeader[]> callback) { if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } buildCacheInterface(DiscussionsInterface.class, callback, canvasContext).getFirstPagePinnedDiscussions(canvasContext.getId(), callback); buildInterface(DiscussionsInterface.class, callback, canvasContext).getFirstPagePinnedDiscussions(canvasContext.getId(), callback); } public static void getAllPinnedDiscussionsExhaustive(CanvasContext canvasContext, final CanvasCallback<DiscussionTopicHeader[]> callback) { if (APIHelpers.paramIsNull(callback)) return; CanvasCallback<DiscussionTopicHeader[]> bridge = new ExhaustiveBridgeCallback<>(DiscussionTopicHeader.class, callback, new ExhaustiveBridgeCallback.ExhaustiveBridgeEvents() { @Override public void performApiCallWithExhaustiveCallback(CanvasCallback bridgeCallback, String nextURL, boolean isCached) { if(callback.isCancelled()) { return; } getNextPageDiscussionsChained(nextURL, bridgeCallback, isCached); } }); buildCacheInterface(DiscussionsInterface.class, callback, canvasContext).getFirstPagePinnedDiscussions(canvasContext.getId(), callback); buildInterface(DiscussionsInterface.class, callback, canvasContext).getFirstPagePinnedDiscussions(canvasContext.getId(), callback); } public static void getStudentGroupDiscussionTopicHeaderChained(CanvasContext canvasContext, long rootTopicId, final CanvasCallback<DiscussionTopicHeader[]> callback, boolean isCached) { if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } if (isCached) { buildCacheInterface(DiscussionsInterface.class, callback, canvasContext).getStudentGroupDiscussionTopicHeader(canvasContext.getId(), rootTopicId, callback); } else { buildInterface(DiscussionsInterface.class, callback, canvasContext).getStudentGroupDiscussionTopicHeader(canvasContext.getId(), rootTopicId, callback); } } public static void getStudentGroupDiscussionTopicHeader(CanvasContext canvasContext, long rootTopicId, final CanvasCallback<DiscussionTopicHeader[]> callback) { if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } buildCacheInterface(DiscussionsInterface.class, callback, canvasContext).getStudentGroupDiscussionTopicHeader(canvasContext.getId(), rootTopicId, callback); buildInterface(DiscussionsInterface.class, callback, canvasContext).getStudentGroupDiscussionTopicHeader(canvasContext.getId(), rootTopicId, callback); } public static void getNextPageDiscussionsChained(String nextURL, CanvasCallback<DiscussionTopicHeader[]> callback, boolean isCached) { if (APIHelpers.paramIsNull(callback, nextURL)) { return; } callback.setIsNextPage(true); if (isCached) { buildCacheInterface(DiscussionsInterface.class, callback, false).getNextPageDiscussions(nextURL, callback); } else { buildInterface(DiscussionsInterface.class, callback, false).getNextPageDiscussions(nextURL, callback); } } public static void getNextPageDiscussions(String nextURL, CanvasCallback<DiscussionTopicHeader[]> callback) { if (APIHelpers.paramIsNull(callback, nextURL)) { return; } callback.setIsNextPage(true); buildCacheInterface(DiscussionsInterface.class, callback, false).getNextPageDiscussions(nextURL, callback); buildInterface(DiscussionsInterface.class, callback, false).getNextPageDiscussions(nextURL, callback); } public static void getDetailedDiscussion(CanvasContext canvasContext, long discussion_id, CanvasCallback<DiscussionTopicHeader> callback) { if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } buildCacheInterface(DiscussionsInterface.class, callback, canvasContext).getDetailedDiscussion(canvasContext.getId(), discussion_id, callback); buildInterface(DiscussionsInterface.class, callback, canvasContext).getDetailedDiscussion(canvasContext.getId(), discussion_id, callback); } public static void getDetailedDiscussionAirwolf(String parentId, String studentId, String courseId, String discussionTopicId, CanvasCallback<DiscussionTopicHeader> callback) { if (APIHelpers.paramIsNull(callback, parentId, studentId, courseId, discussionTopicId)) { return; } buildCacheInterface(DiscussionsInterface.class, APIHelpers.getAirwolfDomain(callback.getContext()), callback).getDetailedDiscussionAirwolf(parentId, studentId, courseId, discussionTopicId, callback); buildInterface(DiscussionsInterface.class, APIHelpers.getAirwolfDomain(callback.getContext()), callback).getDetailedDiscussionAirwolf(parentId, studentId, courseId, discussionTopicId, callback); } public static void getFullDiscussionTopicChained(CanvasContext canvasContext, long discussion_id, CanvasCallback<DiscussionTopic> callback, boolean isCached) { if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } if (isCached) { buildCacheInterface(DiscussionsInterface.class, callback, canvasContext).getFullDiscussionTopic(canvasContext.getId(), discussion_id, callback); } else { buildInterface(DiscussionsInterface.class, callback, canvasContext).getFullDiscussionTopic(canvasContext.getId(), discussion_id, callback); } } public static void getFullDiscussionTopic(CanvasContext canvasContext, long discussion_id, CanvasCallback<DiscussionTopic> callback) { if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } buildCacheInterface(DiscussionsInterface.class, callback, canvasContext).getFullDiscussionTopic(canvasContext.getId(), discussion_id, callback); buildInterface(DiscussionsInterface.class, callback, canvasContext).getFullDiscussionTopic(canvasContext.getId(), discussion_id, callback); } public static void getFilteredDiscussionTopic(CanvasContext canvasContext, String searchTerm, CanvasCallback<DiscussionTopicHeader[]> callback) { if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } buildCacheInterface(DiscussionsInterface.class, callback, canvasContext).getFilteredDiscussionTopic(canvasContext.getId(), searchTerm, callback); buildInterface(DiscussionsInterface.class, callback, canvasContext).getFilteredDiscussionTopic(canvasContext.getId(), searchTerm, callback); } public static void postDiscussionEntry(CanvasContext canvasContext, long discussionId, String message, CanvasCallback<DiscussionEntry> callback){ if (APIHelpers.paramIsNull(callback, message, canvasContext)) { return; } buildInterface(DiscussionsInterface.class, callback, canvasContext).postDiscussionEntry(canvasContext.getId(), discussionId, message, "", callback); } public static void postDiscussionReply(CanvasContext canvasContext, long discussionId, long entryId, String message, CanvasCallback<DiscussionEntry> callback){ if (APIHelpers.paramIsNull(callback, message, canvasContext)) { return; } buildInterface(DiscussionsInterface.class, callback, canvasContext).postDiscussionReply(canvasContext.getId(), discussionId, entryId, message, "", callback); } public static void postNewDiscussion(CanvasContext canvasContext, String title, String message, boolean threaded, boolean is_announcement, CanvasCallback<DiscussionTopicHeader> callback){ if (APIHelpers.paramIsNull(callback, message, title, canvasContext)) { return; } String type = ""; if (threaded) type = "threaded"; else type = "side_comment"; int announcement = APIHelpers.booleanToInt(is_announcement); buildInterface(DiscussionsInterface.class, callback, canvasContext).postNewDiscussion(canvasContext.getId(), title, message, announcement, type, "", callback); } public static void postNewDiscussionAndPublish(CanvasContext canvasContext, String title, String message, boolean threaded, boolean is_announcement, boolean isPublished, CanvasCallback<DiscussionTopicHeader> callback){ if (APIHelpers.paramIsNull(callback, message, title, canvasContext)) { return; } String type = ""; if (threaded) type = "threaded"; else type = "side_comment"; int announcement = APIHelpers.booleanToInt(is_announcement); int publish = APIHelpers.booleanToInt(isPublished); buildInterface(DiscussionsInterface.class, callback, canvasContext).postNewDiscussionAndPublish(canvasContext.getId(), title, message, announcement, publish, type, "", callback); } public static void updateDiscussionTopic(CanvasContext canvasContext, long topicId, String title, String message, boolean threaded, boolean isPublished, CanvasCallback<DiscussionTopicHeader> callback){ if (APIHelpers.paramIsNull(callback, message, title, canvasContext)) { return; } String type = ""; if (threaded) type = "threaded"; else type = "side_comment"; int publish = APIHelpers.booleanToInt(isPublished); buildInterface(DiscussionsInterface.class, callback, canvasContext).updateDiscussionTopic(canvasContext.getId(), topicId, title, message, publish, type, "", callback); } /** * @param rating can only be 1 or 0 */ public static void rateDiscussionEntry(CanvasContext canvasContext, long discussionId, long entryId, int rating, CanvasCallback<Response> callback){ if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } buildInterface(DiscussionsInterface.class, callback, canvasContext).rateDiscussionEntry(canvasContext.getId(), discussionId, entryId, rating, "", callback); } /** * Allows users with correct permissions to pin a discussion * @param canvasContext A CanvasContext * @param topicId The topic id of the DiscussionTopicHeader (not the root topic id) * @param pin A true/false value to denote if you wish to pin or unpin a discussion * @param callback A java thing that is kind of stinky */ public static void pinDiscussion(CanvasContext canvasContext, long topicId, boolean pin, CanvasCallback<DiscussionTopicHeader> callback) { if (APIHelpers.paramIsNull(callback, canvasContext)) { return; } buildInterface(DiscussionsInterface.class, callback, canvasContext).pinDiscussion(canvasContext.getId(), topicId, pin, "", callback); } }