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 ad1ea3d6f758ae7a00babbdc5b71806fc8d0a08c..2b3e0bb4296557b8f9e6f10013b349b9c2ede63a 100644 --- a/src/main/java/de/thm/arsnova/controller/v2/ContentController.java +++ b/src/main/java/de/thm/arsnova/controller/v2/ContentController.java @@ -529,6 +529,9 @@ public class ContentController extends PaginationController { final HttpServletResponse response) { final de.thm.arsnova.model.Content content = contentService.get(contentId); final de.thm.arsnova.model.Answer answerV3 = fromV2Migrator.migrate(answer, content); + if (answerV3.getContentId() == null) { + answerV3.setContentId(contentId); + } if (!contentId.equals(answerV3.getContentId())) { throw new BadRequestException("Mismatching content IDs."); } diff --git a/src/main/java/de/thm/arsnova/model/Answer.java b/src/main/java/de/thm/arsnova/model/Answer.java index a6e26ecca2b70e87f3a72aae376e5cb288dd76f0..32b85a392911930c409523bffe6463df56b58e3d 100644 --- a/src/main/java/de/thm/arsnova/model/Answer.java +++ b/src/main/java/de/thm/arsnova/model/Answer.java @@ -52,7 +52,7 @@ public class Answer extends Entity { private Content.Format format; @Positive - private int round; + private int round = 1; private Map<String, Map<String, ?>> extensions; diff --git a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbAnswerRepository.java b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbAnswerRepository.java index 17773478d87ee9ed30bc75c97a0a9dff6e743071..07a02e9afa631026c4b3767d80dd06b3eca93636 100644 --- a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbAnswerRepository.java +++ b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbAnswerRepository.java @@ -64,12 +64,12 @@ public class CouchDbAnswerRepository extends CouchDbCrudRepository<Answer> @Override public Iterable<Answer> findStubsByContentId(final String contentId) { - return createEntityStubs(db.queryView(createQuery("by_contentid").key(contentId))); + return createEntityStubs(db.queryView(createQuery("by_contentid").reduce(false).key(contentId))); } @Override public Iterable<Answer> findStubsByContentIds(final Collection<String> contentIds) { - return createEntityStubs(db.queryView(createQuery("by_contentid").keys(contentIds))); + return createEntityStubs(db.queryView(createQuery("by_contentid").reduce(false).keys(contentIds))); } @Override @@ -152,7 +152,9 @@ public class CouchDbAnswerRepository extends CouchDbCrudRepository<Answer> .group(true) .keys(contentIds)); - return result.isEmpty() ? 0 : result.getRows().get(0).getValueAsInt(); + return result.isEmpty() ? 0 : result.getRows().stream() + .map(ViewResult.Row::getValueAsInt) + .reduce(0, (a, b) -> a + b); } @Override diff --git a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbContentRepository.java b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbContentRepository.java index 0fea9e85652fa848940b0edff2b4df2225234856..3a356afdf9edbcad83db92f167d910e48d4ad85c 100644 --- a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbContentRepository.java +++ b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbContentRepository.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; import org.ektorp.ComplexKey; import org.ektorp.CouchDbConnector; import org.ektorp.ViewResult; @@ -82,9 +83,9 @@ public class CouchDbContentRepository extends CouchDbCrudRepository<Content> imp @Override public Iterable<Content> findStubsByIds(final Set<String> ids) { - return createEntityStubs(db.queryView(createQuery("by_id") + return super.createEntityStubs(db.queryView(createQuery("by_id") .keys(ids) - .reduce(false))); + .reduce(false)), (a, b) -> {}); } @Override diff --git a/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java b/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java index db181211c9e33a55eb2b44505ad58671097d9f59..dedcb67de246a7df2bc25e5ffec855eb344bcd3c 100644 --- a/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java +++ b/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java @@ -122,7 +122,9 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer> implemen content.resetState(); /* FIXME: cancel timer */ contentService.update(content); - delete(answerRepository.findStubsByContentId(content.getId())); + final Iterable<Answer> answers = answerRepository.findStubsByContentId(content.getId()); + answers.forEach(a -> a.setRoomId(content.getRoomId())); + delete(answers); } @Override @@ -323,7 +325,9 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer> implemen @Override @PreAuthorize("isAuthenticated() && hasPermission(#answer, 'create')") public Answer create(final Answer answer) { - this.answerQueue.offer(answer); + prepareCreate(answer); + answerQueue.offer(answer); + finalizeCreate(answer); return answer; } @@ -438,6 +442,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer> implemen @Secured({"ROLE_USER", "RUN_AS_SYSTEM"}) public void handleContentDeletion(final BeforeDeletionEvent<Content> event) { final Iterable<Answer> answers = answerRepository.findStubsByContentId(event.getEntity().getId()); + answers.forEach(a -> a.setRoomId(event.getEntity().getRoomId())); delete(answers); } } diff --git a/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java b/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java index 898cc636cbe03196912339f59a260d666b1fe67e..6d10774703c7b7099e90e287c4aaa502b25a76c2 100644 --- a/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java +++ b/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -240,12 +241,13 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem @PreAuthorize("isAuthenticated()") private void deleteByRoomAndGroupName(final Room room, final String groupName) { - final Iterable<Content> contents; if ("all".equals(groupName)) { delete(contentRepository.findStubsByRoomId(room.getId())); } else { final Set<String> ids = contentGroupService.getByRoomIdAndName(room.getId(), groupName).getContentIds(); - delete(contentRepository.findStubsByIds(ids)); + final Iterable<Content> contents = contentRepository.findStubsByIds(ids); + contents.forEach(c -> c.setRoomId(room.getId())); + delete(contents); } }