From 7d8e00bf0c549df9f2e74ad7b2c0be04fe70436d Mon Sep 17 00:00:00 2001 From: Daniel Gerhardt <code@dgerhardt.net> Date: Sun, 11 Feb 2018 21:54:33 +0100 Subject: [PATCH] Fix Content handling for /v2 --- .../controller/v2/ContentController.java | 69 +++++++++++-------- .../couchdb/CouchDbAnswerRepository.java | 4 +- .../couchdb/CouchDbContentRepository.java | 7 +- .../thm/arsnova/services/ContentService.java | 3 +- .../arsnova/services/ContentServiceImpl.java | 69 +++++++++---------- 5 files changed, 80 insertions(+), 72 deletions(-) diff --git a/src/main/java/de/thm/arsnova/controller/v2/ContentController.java b/src/main/java/de/thm/arsnova/controller/v2/ContentController.java index 9191456fe..7c9721d54 100644 --- a/src/main/java/de/thm/arsnova/controller/v2/ContentController.java +++ b/src/main/java/de/thm/arsnova/controller/v2/ContentController.java @@ -104,6 +104,8 @@ public class ContentController extends PaginationController { @ResponseStatus(HttpStatus.CREATED) public Content postContent(@RequestBody final Content content) { de.thm.arsnova.entities.Content contentV3 = fromV2Migrator.migrate(content); + final String roomId = roomService.getIdByShortId(content.getSessionKeyword()); + contentV3.setRoomId(roomId); if (contentService.save(contentV3) != null) { return toV2Migrator.migrate(contentV3); } @@ -132,11 +134,7 @@ public class ContentController extends PaginationController { @PathVariable final String contentId, @RequestBody final Content content ) { - try { - return toV2Migrator.migrate(contentService.update(fromV2Migrator.migrate(content))); - } catch (final Exception e) { - throw new BadRequestException(); - } + return toV2Migrator.migrate(contentService.update(fromV2Migrator.migrate(content))); } @ApiOperation(value = "Start new Pi Round on content, identified by provided id, with an optional time", @@ -203,8 +201,8 @@ public class ContentController extends PaginationController { public void setVotingAdmissionForAllContents( @RequestParam(value = "sessionkey") final String roomShortId, @RequestParam(value = "disable", defaultValue = "false", required = false) final Boolean disableVote, - @RequestParam(value = "lecturequestionsonly", defaultValue = "false", required = false) final boolean lectureContentsOnly, - @RequestParam(value = "preparationquestionsonly", defaultValue = "false", required = false) final boolean preparationContentsOnly + @RequestParam(value = "lecturequestionsonly", defaultValue = "false", required = false) boolean lectureContentsOnly, + @RequestParam(value = "preparationquestionsonly", defaultValue = "false", required = false) boolean preparationContentsOnly ) { String roomId = roomService.getIdByShortId(roomShortId); boolean disable = false; @@ -214,6 +212,8 @@ public class ContentController extends PaginationController { disable = disableVote; } + /* FIXME: Content variant is ignored for now */ + lectureContentsOnly = preparationContentsOnly = false; if (lectureContentsOnly) { contents = contentService.getLectureContents(roomId); contentService.setVotingAdmissions(roomId, disable, contents); @@ -221,7 +221,8 @@ public class ContentController extends PaginationController { contents = contentService.getPreparationContents(roomId); contentService.setVotingAdmissions(roomId, disable, contents); } else { - contentService.setVotingAdmissionForAllContents(roomId, disable); + contents = contentService.getByRoomId(roomId); + contentService.setVotingAdmissions(roomId, disable, contents); } } @@ -235,7 +236,7 @@ public class ContentController extends PaginationController { ) { de.thm.arsnova.entities.Content contentV3 = fromV2Migrator.migrate(content); if (publish != null) { - contentV3.getState().setVisible(!publish); + contentV3.getState().setVisible(publish); } contentService.update(contentV3); } @@ -246,13 +247,15 @@ public class ContentController extends PaginationController { public void publishAllContents( @RequestParam(value = "sessionkey") final String roomShortId, @RequestParam(required = false) final Boolean publish, - @RequestParam(value = "lecturequestionsonly", defaultValue = "false", required = false) final boolean lectureContentsOnly, - @RequestParam(value = "preparationquestionsonly", defaultValue = "false", required = false) final boolean preparationContentsOnly + @RequestParam(value = "lecturequestionsonly", defaultValue = "false", required = false) boolean lectureContentsOnly, + @RequestParam(value = "preparationquestionsonly", defaultValue = "false", required = false) boolean preparationContentsOnly ) { String roomId = roomService.getIdByShortId(roomShortId); boolean p = publish == null || publish; List<de.thm.arsnova.entities.Content> contents; + /* FIXME: Content variant is ignored for now */ + lectureContentsOnly = preparationContentsOnly = false; if (lectureContentsOnly) { contents = contentService.getLectureContents(roomId); contentService.publishContents(roomId, p, contents); @@ -300,14 +303,16 @@ public class ContentController extends PaginationController { @Pagination public List<Content> getContents( @RequestParam(value = "sessionkey") final String roomShortId, - @RequestParam(value = "lecturequestionsonly", defaultValue = "false") final boolean lectureContentsOnly, - @RequestParam(value = "flashcardsonly", defaultValue = "false") final boolean flashcardsOnly, - @RequestParam(value = "preparationquestionsonly", defaultValue = "false") final boolean preparationContentsOnly, - @RequestParam(value = "requestImageData", defaultValue = "false") final boolean requestImageData, + @RequestParam(value = "lecturequestionsonly", defaultValue = "false") boolean lectureContentsOnly, + @RequestParam(value = "flashcardsonly", defaultValue = "false") boolean flashcardsOnly, + @RequestParam(value = "preparationquestionsonly", defaultValue = "false") boolean preparationContentsOnly, + @RequestParam(value = "requestImageData", defaultValue = "false") boolean requestImageData, final HttpServletResponse response ) { String roomId = roomService.getIdByShortId(roomShortId); List<de.thm.arsnova.entities.Content> contents; + /* FIXME: Content variant is ignored for now */ + lectureContentsOnly = preparationContentsOnly = flashcardsOnly = false; if (lectureContentsOnly) { contents = contentService.getLectureContents(roomId); } else if (flashcardsOnly) { @@ -331,12 +336,14 @@ public class ContentController extends PaginationController { @RequestMapping(value = { "/" }, method = RequestMethod.DELETE) public void deleteContents( @RequestParam(value = "sessionkey") final String roomShortId, - @RequestParam(value = "lecturequestionsonly", defaultValue = "false") final boolean lectureContentsOnly, - @RequestParam(value = "flashcardsonly", defaultValue = "false") final boolean flashcardsOnly, - @RequestParam(value = "preparationquestionsonly", defaultValue = "false") final boolean preparationContentsOnly, + @RequestParam(value = "lecturequestionsonly", defaultValue = "false") boolean lectureContentsOnly, + @RequestParam(value = "flashcardsonly", defaultValue = "false") boolean flashcardsOnly, + @RequestParam(value = "preparationquestionsonly", defaultValue = "false") boolean preparationContentsOnly, final HttpServletResponse response ) { String roomId = roomService.getIdByShortId(roomShortId); + /* FIXME: Content variant is ignored for now */ + lectureContentsOnly = preparationContentsOnly = flashcardsOnly = false; if (lectureContentsOnly) { contentService.deleteLectureContents(roomId); } else if (preparationContentsOnly) { @@ -355,12 +362,14 @@ public class ContentController extends PaginationController { @RequestMapping(value = "/count", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) public String getContentCount( @RequestParam(value = "sessionkey") final String roomShortId, - @RequestParam(value = "lecturequestionsonly", defaultValue = "false") final boolean lectureContentsOnly, - @RequestParam(value = "flashcardsonly", defaultValue = "false") final boolean flashcardsOnly, - @RequestParam(value = "preparationquestionsonly", defaultValue = "false") final boolean preparationContentsOnly + @RequestParam(value = "lecturequestionsonly", defaultValue = "false") boolean lectureContentsOnly, + @RequestParam(value = "flashcardsonly", defaultValue = "false") boolean flashcardsOnly, + @RequestParam(value = "preparationquestionsonly", defaultValue = "false") boolean preparationContentsOnly ) { String roomId = roomService.getIdByShortId(roomShortId); int count = 0; + /* FIXME: Content variant is ignored for now */ + lectureContentsOnly = preparationContentsOnly = flashcardsOnly = false; if (lectureContentsOnly) { count = contentService.countLectureContents(roomId); } else if (preparationContentsOnly) { @@ -390,11 +399,13 @@ public class ContentController extends PaginationController { @RequestMapping(value = "/unanswered", method = RequestMethod.GET) public List<String> getUnAnsweredContentIds( @RequestParam(value = "sessionkey") final String roomShortId, - @RequestParam(value = "lecturequestionsonly", defaultValue = "false") final boolean lectureContentsOnly, - @RequestParam(value = "preparationquestionsonly", defaultValue = "false") final boolean preparationContentsOnly + @RequestParam(value = "lecturequestionsonly", defaultValue = "false") boolean lectureContentsOnly, + @RequestParam(value = "preparationquestionsonly", defaultValue = "false") boolean preparationContentsOnly ) { String roomId = roomService.getIdByShortId(roomShortId); List<String> answers; + /* FIXME: Content variant is ignored for now */ + lectureContentsOnly = preparationContentsOnly = false; if (lectureContentsOnly) { answers = contentService.getUnAnsweredLectureContentIds(roomId); } else if (preparationContentsOnly) { @@ -570,11 +581,13 @@ public class ContentController extends PaginationController { @RequestMapping(value = "/answers", method = RequestMethod.DELETE) public void deleteAllContentsAnswers( @RequestParam(value = "sessionkey") final String roomShortId, - @RequestParam(value = "lecturequestionsonly", defaultValue = "false") final boolean lectureContentsOnly, - @RequestParam(value = "preparationquestionsonly", defaultValue = "false") final boolean preparationContentsOnly, + @RequestParam(value = "lecturequestionsonly", defaultValue = "false") boolean lectureContentsOnly, + @RequestParam(value = "preparationquestionsonly", defaultValue = "false") boolean preparationContentsOnly, final HttpServletResponse response ) { String roomId = roomService.getIdByShortId(roomShortId); + /* FIXME: Content variant is ignored for now */ + lectureContentsOnly = preparationContentsOnly = false; if (lectureContentsOnly) { contentService.deleteAllLectureAnswers(roomId); } else if (preparationContentsOnly) { @@ -658,11 +671,13 @@ public class ContentController extends PaginationController { @RequestMapping(value = "/answercount", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) public String getTotalAnswerCount( @RequestParam(value = "sessionkey") final String roomShortId, - @RequestParam(value = "lecturequestionsonly", defaultValue = "false") final boolean lectureContentsOnly, - @RequestParam(value = "preparationquestionsonly", defaultValue = "false") final boolean preparationContentsOnly + @RequestParam(value = "lecturequestionsonly", defaultValue = "false") boolean lectureContentsOnly, + @RequestParam(value = "preparationquestionsonly", defaultValue = "false") boolean preparationContentsOnly ) { String roomId = roomService.getIdByShortId(roomShortId); int count = 0; + /* FIXME: Content variant is ignored for now */ + lectureContentsOnly = preparationContentsOnly = false; if (lectureContentsOnly) { count = contentService.countLectureContentAnswers(roomId); } else if (preparationContentsOnly) { diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java index cd2902c42..706744fdd 100644 --- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java @@ -136,8 +136,8 @@ public class CouchDbAnswerRepository extends CouchDbCrudRepository<Answer> imple .skip(qSkip) .limit(qLimit) //.includeDocs(true) - .startKey(ComplexKey.of(contentId)) - .endKey(ComplexKey.of(contentId, ComplexKey.emptyObject())) + .startKey(ComplexKey.of(contentId, ComplexKey.emptyObject())) + .endKey(ComplexKey.of(contentId)) .descending(true), type); diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java index bf49803be..0659b789d 100644 --- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java @@ -46,16 +46,17 @@ public class CouchDbContentRepository extends CouchDbCrudRepository<Content> imp @Override public List<Content> findByRoomIdForSpeaker(final String roomId) { - return findByRoomIdAndVariantAndActive(new Object[] {roomId}, roomId); + return findByRoomIdAndVariantAndActive(roomId); } @Override public int countByRoomId(final String roomId) { final ViewResult result = db.queryView(createQuery("by_roomid_group_locked") .startKey(ComplexKey.of(roomId)) - .endKey(ComplexKey.of(roomId, ComplexKey.emptyObject()))); + .endKey(ComplexKey.of(roomId, ComplexKey.emptyObject())) + .reduce(true)); - return result.getSize(); + return result.isEmpty() ? 0 : result.getRows().get(0).getValueAsInt(); } @Override diff --git a/src/main/java/de/thm/arsnova/services/ContentService.java b/src/main/java/de/thm/arsnova/services/ContentService.java index 066fbe87a..5ef3c54a8 100644 --- a/src/main/java/de/thm/arsnova/services/ContentService.java +++ b/src/main/java/de/thm/arsnova/services/ContentService.java @@ -23,6 +23,7 @@ import de.thm.arsnova.entities.Content; import de.thm.arsnova.entities.TextAnswer; import de.thm.arsnova.entities.UserAuthentication; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -137,6 +138,4 @@ public interface ContentService extends EntityService<Content> { void setVotingAdmission(String contentId, boolean disableVoting); void setVotingAdmissions(String roomId, boolean disableVoting, List<Content> contents); - - void setVotingAdmissionForAllContents(String roomId, boolean disableVoting); } diff --git a/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java b/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java index 4bf4beefc..6916a1587 100644 --- a/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java +++ b/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java @@ -47,6 +47,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; +import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -124,7 +125,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem public Content get(final String id) { try { final Content content = super.get(id); - if (!"freetext".equals(content.getFormat()) && 0 == content.getState().getRound()) { + if (content.getFormat() != Content.Format.TEXT && 0 == content.getState().getRound()) { /* needed for legacy questions whose piRound property has not been set */ content.getState().setRound(1); } @@ -140,9 +141,9 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem @Override @Caching(evict = {@CacheEvict(value = "contentlists", key = "#roomId"), - @CacheEvict(value = "lecturecontentlists", key = "#roomId", condition = "#content.getGroup().equals('lecture')"), - @CacheEvict(value = "preparationcontentlists", key = "#roomId", condition = "#content.getGroup().equals('preparation')"), - @CacheEvict(value = "flashcardcontentlists", key = "#roomId", condition = "#content.getGroup().equals('flashcard')") }, + @CacheEvict(value = "lecturecontentlists", key = "#roomId", condition = "'lecture'.equals(#content.getGroup())"), + @CacheEvict(value = "preparationcontentlists", key = "#roomId", condition = "'preparation'.equals(#content.getGroup())"), + @CacheEvict(value = "flashcardcontentlists", key = "#roomId", condition = "'flashcard'.equals(#content.getGroup())") }, put = {@CachePut(value = "contents", key = "#content.id")}) public Content save(final String roomId, final Content content) { content.setRoomId(roomId); @@ -161,9 +162,9 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem @PreAuthorize("isAuthenticated()") @Caching(evict = { @CacheEvict(value = "contentlists", allEntries = true), - @CacheEvict(value = "lecturecontentlists", allEntries = true, condition = "#content.getGroup().equals('lecture')"), - @CacheEvict(value = "preparationcontentlists", allEntries = true, condition = "#content.getGroup().equals('preparation')"), - @CacheEvict(value = "flashcardcontentlists", allEntries = true, condition = "#content.getGroup().equals('flashcard')") }, + @CacheEvict(value = "lecturecontentlists", allEntries = true, condition = "'lecture'.equals(#content.getGroup())"), + @CacheEvict(value = "preparationcontentlists", allEntries = true, condition = "'preparation'.equals(#content.getGroup())"), + @CacheEvict(value = "flashcardcontentlists", allEntries = true, condition = "'flashcard'.equals(#content.getGroup())") }, put = {@CachePut(value = "contents", key = "#content.id")}) public Content update(final Content content) { final UserAuthentication user = userService.getCurrentUser(); @@ -177,7 +178,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem throw new UnauthorizedException(); } - if ("freetext".equals(content.getFormat())) { + if (content.getFormat() == Content.Format.TEXT) { content.getState().setRound(0); } else if (content.getState().getRound() < 1 || content.getState().getRound() > 2) { content.getState().setRound(oldContent.getState().getRound() > 0 ? oldContent.getState().getRound() : 1); @@ -223,7 +224,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem final Room room = roomRepository.findOne(content.getRoomId()); content.setTimestamp(new Date()); - if ("freetext".equals(content.getFormat())) { + if (content.getFormat() == Content.Format.TEXT) { content.getState().setRound(0); } else if (content.getState().getRound() < 1 || content.getState().getRound() > 2) { content.getState().setRound(1); @@ -256,9 +257,9 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem @CacheEvict("answerlists"), @CacheEvict(value = "contents", key = "#contentId"), @CacheEvict(value = "contentlists", allEntries = true), - @CacheEvict(value = "lecturecontentlists", allEntries = true /*, condition = "#content.getGroup().equals('lecture')"*/), - @CacheEvict(value = "preparationcontentlists", allEntries = true /*, condition = "#content.getGroup().equals('preparation')"*/), - @CacheEvict(value = "flashcardcontentlists", allEntries = true /*, condition = "#content.getGroup().equals('flashcard')"*/) }) + @CacheEvict(value = "lecturecontentlists", allEntries = true /*, condition = "'lecture'.equals(#content.getGroup())"*/), + @CacheEvict(value = "preparationcontentlists", allEntries = true /*, condition = "'preparation'.equals(#content.getGroup())"*/), + @CacheEvict(value = "flashcardcontentlists", allEntries = true /*, condition = "'flashcard'.equals(#content.getGroup())"*/) }) public void delete(final String contentId) { final Content content = contentRepository.findOne(contentId); if (content == null) { @@ -369,30 +370,22 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem if (!room.getOwnerId().equals(user.getId())) { throw new UnauthorizedException(); } - for (final Content q : contents) { - if (!"flashcard".equals(q.getRoomId())) { - q.getState().setResponsesEnabled(!disableVoting); + /* FIXME: Filter flashcards - flashcard format not yet implemented */ + //contents.stream().filter(c -> c.getFormat() != Format.?).collect(Collectors.toList()); + final Map<String, Object> patches = new HashMap<>(); + patches.put("responsesEnabled", !disableVoting); + try { + patch(contents, patches, Content::getState); + ArsnovaEvent event; + if (disableVoting) { + event = new LockVotesEvent(this, room, contents); + } else { + event = new UnlockVotesEvent(this, room, contents); } + this.publisher.publishEvent(event); + } catch (IOException e) { + logger.error("Patching of contents failed", e); } - ArsnovaEvent event; - if (disableVoting) { - event = new LockVotesEvent(this, room, contents); - } else { - event = new UnlockVotesEvent(this, room, contents); - } - this.publisher.publishEvent(event); - } - - @Override - @PreAuthorize("isAuthenticated()") - public void setVotingAdmissionForAllContents(final String roomId, final boolean disableVoting) { - final UserAuthentication user = getCurrentUser(); - final Room room = roomRepository.findOne(roomId); - if (!room.getOwnerId().equals(user.getId())) { - throw new UnauthorizedException(); - } - final List<Content> contents = contentRepository.findByRoomId(room.getId()); - setVotingAdmissionForAllContents(room.getId(), disableVoting); } private Room getRoomWithAuthCheck(final String roomId) { @@ -529,7 +522,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem return 0; } - if ("freetext".equals(content.getFormat())) { + if (content.getFormat() == Content.Format.TEXT) { return answerRepository.countByContentId(content.getId()); } else { return answerRepository.countByContentIdRound(content.getId(), content.getState().getRound()); @@ -600,7 +593,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem // Room's creator. Locked Questions do not appear in this list. continue; } - if (0 == answer.getRound() && !"freetext".equals(content.getFormat())) { + if (0 == answer.getRound() && content.getFormat() != Content.Format.TEXT) { answer.setRound(1); } @@ -638,7 +631,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem answer.setQuestionValue(content.calculateValue(answer)); */ - if ("freetext".equals(content.getFormat())) { + if (content.getFormat() == Content.Format.TEXT) { answer.setRound(0); /* FIXME: migrate imageUtils.generateThumbnailImage(answer); @@ -673,7 +666,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem final Content content = get(answer.getContentId()); /* FIXME: migrate - if ("freetext".equals(content.getFormat())) { + if (content.getFormat() == Content.Format.TEXT) { imageUtils.generateThumbnailImage(realAnswer); content.checkTextStrictOptions(realAnswer); } -- GitLab