use of de.tum.in.www1.artemis.domain.metis.Reaction in project Artemis by ls1intum.
the class ReactionService method deleteReactionById.
/**
* Determines authority to delete reaction and deletes the reaction
*
* @param reactionId id of the reaction to delete
* @param courseId id of the course the according posting belongs to
*/
public void deleteReactionById(Long reactionId, Long courseId) {
final User user = userRepository.getUserWithGroupsAndAuthorities();
final Course course = courseRepository.findByIdElseThrow(courseId);
Reaction reaction = reactionRepository.findByIdElseThrow(reactionId);
// check if user that wants to delete reaction is user that created the reaction
if (!user.equals(reaction.getUser())) {
throw new AccessForbiddenException("Reaction", reaction.getId());
}
// get affected post that will be sent as payload in according websocket message
Post updatedPost;
if (reaction.getPost() != null) {
updatedPost = reaction.getPost();
updatedPost.removeReaction(reaction);
} else {
AnswerPost updatedAnswerPost = reaction.getAnswerPost();
updatedAnswerPost.removeReaction(reaction);
updatedPost = updatedAnswerPost.getPost();
// remove and add operations on sets identify an AnswerPost by its id; to update a certain property of an existing answer post,
// we need to remove the existing AnswerPost (based on unchanged id in updatedAnswerPost) and add the updatedAnswerPost afterwards
updatedPost.removeAnswerPost(updatedAnswerPost);
updatedPost.addAnswerPost(updatedAnswerPost);
}
postService.broadcastForPost(new MetisPostDTO(updatedPost, MetisPostAction.UPDATE_POST), course);
reactionRepository.deleteById(reactionId);
}
use of de.tum.in.www1.artemis.domain.metis.Reaction in project Artemis by ls1intum.
the class ReactionIntegrationTest method testDeletePostReaction.
@Test
@WithMockUser(username = "student2", roles = "USER")
public void testDeletePostReaction() throws Exception {
// student 1 is the author of the post and student 2 reacts on this post
Post postReactedOn = existingPostsWithAnswers.get(0);
Reaction reactionToSaveOnPost = createReactionOnPost(postReactedOn);
Reaction reactionToBeDeleted = request.postWithResponseBody("/api/courses/" + courseId + "/postings/reactions", reactionToSaveOnPost, Reaction.class, HttpStatus.CREATED);
// student 2 deletes their reaction on this post
request.delete("/api/courses/" + courseId + "/postings/reactions/" + reactionToBeDeleted.getId(), HttpStatus.OK);
assertThat(postReactedOn.getReactions()).hasSameSizeAs(reactionRepository.findReactionsByPostId(postReactedOn.getId()));
assertThat(reactionRepository.findById(reactionToBeDeleted.getId())).isEmpty();
}
use of de.tum.in.www1.artemis.domain.metis.Reaction in project Artemis by ls1intum.
the class ReactionIntegrationTest method testGetPostsForCourse_OrderByVoteCountDESC.
// GET
@Test
@WithMockUser(username = "student1", roles = "USER")
public void testGetPostsForCourse_OrderByVoteCountDESC() throws Exception {
PostSortCriterion sortCriterion = PostSortCriterion.VOTES;
SortingOrder sortingOrder = SortingOrder.DESCENDING;
User student1 = database.getUserByLogin("student1");
User student2 = database.getUserByLogin("student2");
// student 1 is the author of the post and reacts on this post
Post postReactedOn = existingPostsWithAnswers.get(0);
createVoteReactionOnPost(postReactedOn, student1);
Post postReactedOn2 = existingPostsWithAnswers.get(1);
createVoteReactionOnPost(postReactedOn2, student1);
createVoteReactionOnPost(postReactedOn2, student2);
// refresh posts after reactions are added
existingPostsWithAnswers = postRepository.findPostsForCourse(courseId, null, false, false, false, null);
var params = new LinkedMultiValueMap<String, String>();
// ordering only available in course discussions page, where paging is enabled
params.add("pagingEnabled", "true");
params.add("page", "0");
params.add("size", String.valueOf(MAX_POSTS_PER_PAGE));
params.add("postSortCriterion", sortCriterion.toString());
params.add("sortingOrder", sortingOrder.toString());
List<Post> returnedPosts = request.getList("/api/courses/" + courseId + "/posts", HttpStatus.OK, Post.class, params);
existingPostsWithAnswers.sort(Comparator.comparing((Post post) -> post.getReactions().stream().filter(reaction -> reaction.getEmojiId().equals(VOTE_EMOJI_ID)).count()).reversed());
assertThat(returnedPosts).isEqualTo(existingPostsWithAnswers);
}
use of de.tum.in.www1.artemis.domain.metis.Reaction in project Artemis by ls1intum.
the class ReactionIntegrationTest method testDeleteOwnAnswerPostReaction.
@Test
@WithMockUser(username = "student1", roles = "USER")
public void testDeleteOwnAnswerPostReaction() throws Exception {
// student 1 is the author of the post and reacts on this post
AnswerPost answerPostReactedOn = existingAnswerPosts.get(0);
Reaction reactionToSaveOnPost = createReactionOnAnswerPost(answerPostReactedOn);
Reaction reactionToBeDeleted = request.postWithResponseBody("/api/courses/" + courseId + "/postings/reactions", reactionToSaveOnPost, Reaction.class, HttpStatus.CREATED);
// student 1 deletes their reaction on this post
request.delete("/api/courses/" + courseId + "/postings/reactions/" + reactionToBeDeleted.getId(), HttpStatus.OK);
assertThat(answerPostReactedOn.getReactions()).hasSameSizeAs(reactionRepository.findReactionsByPostId(answerPostReactedOn.getId()));
assertThat(reactionRepository.findById(reactionToBeDeleted.getId())).isEmpty();
}
use of de.tum.in.www1.artemis.domain.metis.Reaction in project Artemis by ls1intum.
the class ReactionIntegrationTest method testDeleteOwnPostReaction.
// DELETE
@Test
@WithMockUser(username = "student1", roles = "USER")
public void testDeleteOwnPostReaction() throws Exception {
// student 1 is the author of the post and reacts on this post
Post postReactedOn = existingPostsWithAnswers.get(0);
Reaction reactionToSaveOnPost = createReactionOnPost(postReactedOn);
Reaction reactionToBeDeleted = request.postWithResponseBody("/api/courses/" + courseId + "/postings/reactions", reactionToSaveOnPost, Reaction.class, HttpStatus.CREATED);
// student 1 deletes their reaction on this post
request.delete("/api/courses/" + courseId + "/postings/reactions/" + reactionToBeDeleted.getId(), HttpStatus.OK);
assertThat(postReactedOn.getReactions()).hasSameSizeAs(reactionRepository.findReactionsByPostId(postReactedOn.getId()));
assertThat(reactionRepository.findById(reactionToBeDeleted.getId())).isEmpty();
}
Aggregations