From f7f62ea968a51e61c7080342a3b610b574da9406 Mon Sep 17 00:00:00 2001 From: Daniel Gerhardt <code@dgerhardt.net> Date: Fri, 9 Feb 2018 15:35:39 +0100 Subject: [PATCH] Fix RoomHistory for /v2 Additionally, remove obsolete VisitedRoom repository and renamed VisitedRoom references to RoomHistory. --- .../thm/arsnova/config/PersistanceConfig.java | 5 -- .../arsnova/controller/v2/RoomController.java | 6 +- .../arsnova/persistance/RoomRepository.java | 2 +- .../persistance/VisitedSessionRepository.java | 5 -- .../couchdb/CouchDbRoomRepository.java | 10 +-- .../CouchDbVisitedSessionRepository.java | 70 ------------------- .../de/thm/arsnova/services/RoomService.java | 8 +-- .../thm/arsnova/services/RoomServiceImpl.java | 31 +++----- .../arsnova/config/TestPersistanceConfig.java | 5 -- 9 files changed, 20 insertions(+), 122 deletions(-) delete mode 100644 src/main/java/de/thm/arsnova/persistance/VisitedSessionRepository.java delete mode 100644 src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java diff --git a/src/main/java/de/thm/arsnova/config/PersistanceConfig.java b/src/main/java/de/thm/arsnova/config/PersistanceConfig.java index 34bf32e53..dd1b1e21e 100644 --- a/src/main/java/de/thm/arsnova/config/PersistanceConfig.java +++ b/src/main/java/de/thm/arsnova/config/PersistanceConfig.java @@ -95,11 +95,6 @@ public class PersistanceConfig { return new CouchDbMotdRepository(couchDbConnector(), false); } - @Bean - public VisitedSessionRepository visitedSessionRepository() throws Exception { - return new CouchDbVisitedSessionRepository(couchDbConnector(), false); - } - @Bean public StatisticsRepository statisticsRepository() throws Exception { return new CouchDbStatisticsRepository(couchDbConnector(), false); diff --git a/src/main/java/de/thm/arsnova/controller/v2/RoomController.java b/src/main/java/de/thm/arsnova/controller/v2/RoomController.java index 51d766efe..de51c43be 100644 --- a/src/main/java/de/thm/arsnova/controller/v2/RoomController.java +++ b/src/main/java/de/thm/arsnova/controller/v2/RoomController.java @@ -176,7 +176,7 @@ public class RoomController extends PaginationController { if (ownedOnly && !visitedOnly) { rooms = roomService.getUserRooms(userId); } else if (visitedOnly && !ownedOnly) { - rooms = roomService.getUserVisitedRooms(username); + rooms = roomService.getUserRoomHistory(username); } else { response.setStatus(HttpStatus.NOT_IMPLEMENTED.value()); return null; @@ -190,7 +190,7 @@ public class RoomController extends PaginationController { if (ownedOnly && !visitedOnly) { rooms = roomService.getMyRooms(offset, limit); } else if (visitedOnly && !ownedOnly) { - rooms = roomService.getMyVisitedRooms(offset, limit); + rooms = roomService.getMyRoomHistory(offset, limit); } else { response.setStatus(HttpStatus.NOT_IMPLEMENTED.value()); return null; @@ -233,7 +233,7 @@ public class RoomController extends PaginationController { if (!visitedOnly) { rooms = roomService.getMyRoomsInfo(offset, limit); } else { - rooms = roomService.getMyVisitedRoomsInfo(offset, limit); + rooms = roomService.getMyRoomHistoryInfo(offset, limit); } if (rooms == null || rooms.isEmpty()) { diff --git a/src/main/java/de/thm/arsnova/persistance/RoomRepository.java b/src/main/java/de/thm/arsnova/persistance/RoomRepository.java index ae77422a4..c1defdf98 100644 --- a/src/main/java/de/thm/arsnova/persistance/RoomRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/RoomRepository.java @@ -34,7 +34,7 @@ public interface RoomRepository extends CrudRepository<Room, String> { List<Room> findAllForPublicPool(); List<Room> findForPublicPoolByOwner(UserAuthentication owner); List<Room> getRoomsWithStatsForOwner(UserAuthentication owner, int start, int limit); - List<Room> getVisitedRoomsWithStatsForOwner(List<Room> rooms, UserAuthentication owner); + List<Room> getRoomHistoryWithStatsForUser(List<Room> rooms, UserAuthentication owner); List<Room> findInfosForPublicPool(); List<Room> findInfosForPublicPoolByOwner(UserAuthentication owner); List<Room> findRoomsByCourses(List<Course> courses); diff --git a/src/main/java/de/thm/arsnova/persistance/VisitedSessionRepository.java b/src/main/java/de/thm/arsnova/persistance/VisitedSessionRepository.java deleted file mode 100644 index ce0b23581..000000000 --- a/src/main/java/de/thm/arsnova/persistance/VisitedSessionRepository.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.thm.arsnova.persistance; - -public interface VisitedSessionRepository { - int deleteInactiveGuestVisitedSessionLists(long lastActivityBefore); -} diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java index 899984966..1578d7706 100644 --- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java @@ -347,17 +347,17 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement } /* TODO: Move to service layer. */ - public List<Room> getVisitedRoomsWithStatsForOwner(final List<Room> rooms, final UserAuthentication owner) { + public List<Room> getRoomHistoryWithStatsForUser(final List<Room> rooms, final UserAuthentication user) { final ViewQuery answeredQuestionsView = createQuery("by_creatorid_roomid").designDocId("_design/Answer") - .keys(rooms.stream().map(room -> ComplexKey.of(owner.getUsername(), room.getId())).collect(Collectors.toList())); + .reduce(false).keys(rooms.stream().map(room -> ComplexKey.of(user.getId(), room.getId())).collect(Collectors.toList())); final ViewQuery contentIdsView = createQuery("by_roomid").designDocId("_design/Content") - .keys(rooms.stream().map(Room::getId).collect(Collectors.toList())); + .reduce(false).keys(rooms.stream().map(Room::getId).collect(Collectors.toList())); - return attachVisitedRoomStats(rooms, answeredQuestionsView, contentIdsView); + return attachRoomHistoryStats(rooms, answeredQuestionsView, contentIdsView); } /* TODO: Move to service layer. */ - private List<Room> attachVisitedRoomStats( + private List<Room> attachRoomHistoryStats( final List<Room> rooms, final ViewQuery answeredQuestionsView, final ViewQuery contentIdsView) { diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java deleted file mode 100644 index 9d8a256f4..000000000 --- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.thm.arsnova.persistance.couchdb; - -import com.google.common.collect.Lists; -import de.thm.arsnova.entities.migration.v2.VisitedRoom; -import de.thm.arsnova.persistance.LogEntryRepository; -import de.thm.arsnova.persistance.VisitedSessionRepository; -import org.ektorp.BulkDeleteDocument; -import org.ektorp.CouchDbConnector; -import org.ektorp.DbAccessException; -import org.ektorp.DocumentOperationResult; -import org.ektorp.ViewResult; -import org.ektorp.support.CouchDbRepositorySupport; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.List; - -public class CouchDbVisitedSessionRepository extends CouchDbRepositorySupport<VisitedRoom> implements VisitedSessionRepository { - private static final int BULK_PARTITION_SIZE = 500; - - private static final Logger logger = LoggerFactory.getLogger(CouchDbVisitedSessionRepository.class); - - @Autowired - private LogEntryRepository dbLogger; - - public CouchDbVisitedSessionRepository(final CouchDbConnector db, final boolean createIfNotExists) { - super(VisitedRoom.class, db, createIfNotExists); - } - - @Override - public int deleteInactiveGuestVisitedSessionLists(final long lastActivityBefore) { - try { - final ViewResult result = db.queryView(createQuery("by_last_activity_for_guests").endKey(lastActivityBefore)); - - int count = 0; - final List<List<ViewResult.Row>> partitions = Lists.partition(result.getRows(), BULK_PARTITION_SIZE); - for (final List<ViewResult.Row> partition: partitions) { - final List<BulkDeleteDocument> newDocs = new ArrayList<>(); - for (final ViewResult.Row oldDoc : partition) { - final BulkDeleteDocument newDoc = new BulkDeleteDocument(oldDoc.getId(), oldDoc.getValueAsNode().get("_rev").asText()); - newDocs.add(newDoc); - logger.debug("Marked logged_in document {} for deletion.", oldDoc.getId()); - /* Use log type 'user' since effectively the user is deleted in case of guests */ - dbLogger.log("delete", "type", "user", "id", oldDoc.getId()); - } - - if (!newDocs.isEmpty()) { - final List<DocumentOperationResult> results = db.executeBulk(newDocs); - count += newDocs.size() - results.size(); - if (!results.isEmpty()) { - logger.error("Could not bulk delete some visited session lists."); - } - } - } - - if (count > 0) { - logger.info("Deleted {} visited session lists of inactive users.", count); - dbLogger.log("cleanup", "type", "visitedsessions", "count", count); - } - - return count; - } catch (final DbAccessException e) { - logger.error("Could not delete visited session lists of inactive users.", e); - } - - return 0; - } -} diff --git a/src/main/java/de/thm/arsnova/services/RoomService.java b/src/main/java/de/thm/arsnova/services/RoomService.java index 2ed5a90b5..e0dd3de7c 100644 --- a/src/main/java/de/thm/arsnova/services/RoomService.java +++ b/src/main/java/de/thm/arsnova/services/RoomService.java @@ -44,11 +44,11 @@ public interface RoomService extends EntityService<Room> { List<Room> getUserRooms(String userId); - List<Room> getUserVisitedRooms(String username); + List<Room> getUserRoomHistory(String userId); List<Room> getMyRooms(int offset, int limit); - List<Room> getMyVisitedRooms(int offset, int limit); + List<Room> getMyRoomHistory(int offset, int limit); int countRoomsByCourses(List<Course> courses); @@ -76,7 +76,7 @@ public interface RoomService extends EntityService<Room> { List<Room> getMyPublicPoolRoomsInfo(); - List<Room> getMyVisitedRoomsInfo(int offset, int limit); + List<Room> getMyRoomHistoryInfo(int offset, int limit); Room importRooms(ImportExportContainer importExportRoom); @@ -93,6 +93,4 @@ public interface RoomService extends EntityService<Room> { boolean flipFlashcards(String shortId, Boolean flip); void deleteInactiveRooms(); - - void deleteInactiveVisitedRoomLists(); } diff --git a/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java b/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java index 0d55ecfd3..1f610087d 100644 --- a/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java +++ b/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java @@ -37,7 +37,6 @@ import de.thm.arsnova.persistance.CommentRepository; import de.thm.arsnova.persistance.ContentRepository; import de.thm.arsnova.persistance.LogEntryRepository; import de.thm.arsnova.persistance.RoomRepository; -import de.thm.arsnova.persistance.VisitedSessionRepository; import de.thm.arsnova.services.score.ScoreCalculator; import de.thm.arsnova.services.score.ScoreCalculatorFactory; import org.slf4j.Logger; @@ -82,8 +81,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R private CommentRepository commentRepository; - private VisitedSessionRepository visitedSessionRepository; - private UserService userService; private FeedbackService feedbackService; @@ -105,7 +102,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R ContentRepository contentRepository, AnswerRepository answerRepository, CommentRepository commentRepository, - VisitedSessionRepository visitedSessionRepository, LogEntryRepository dbLogger, UserService userService, FeedbackService feedbackService, @@ -116,7 +112,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R this.contentRepository = contentRepository; this.answerRepository = answerRepository; this.commentRepository = commentRepository; - this.visitedSessionRepository = visitedSessionRepository; this.dbLogger = dbLogger; this.userService = userService; this.feedbackService = feedbackService; @@ -172,16 +167,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R } } - @Scheduled(fixedDelay = ROOM_INACTIVITY_CHECK_INTERVAL_MS) - public void deleteInactiveVisitedRoomLists() { - if (guestRoomInactivityThresholdDays > 0) { - logger.info("Delete lists of visited session for inactive users."); - long unixTime = System.currentTimeMillis(); - long lastActivityBefore = unixTime - guestRoomInactivityThresholdDays * 24 * 60 * 60 * 1000L; - visitedSessionRepository.deleteInactiveGuestVisitedSessionLists(lastActivityBefore); - } - } - @Override public Room join(final String shortId, final UUID socketId) { /* Socket.IO solution */ @@ -282,15 +267,15 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R @Override @PreAuthorize("isAuthenticated()") - public List<Room> getMyVisitedRooms(final int offset, final int limit) { + public List<Room> getMyRoomHistory(final int offset, final int limit) { /* TODO: implement pagination */ - return getUserVisitedRooms(userService.getCurrentUser().getUsername()); + return getUserRoomHistory(userService.getCurrentUser().getId()); } @Override - @PreAuthorize("hasPermission('', 'motd', 'admin')") - public List<Room> getUserVisitedRooms(String username) { - UserProfile profile = userService.getByUsername(username); + @PreAuthorize("hasPermission(#userId, 'userprofile', 'read')") + public List<Room> getUserRoomHistory(final String userId) { + UserProfile profile = userService.get(userId); List<String> roomIds = profile.getRoomHistory().stream().map(entry -> entry.getRoomId()).collect(Collectors.toList()); roomRepository.findAll(roomIds); List<Room> rooms = new ArrayList<>(); @@ -301,9 +286,9 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R @Override @PreAuthorize("isAuthenticated()") - public List<Room> getMyVisitedRoomsInfo(final int offset, final int limit) { - List<Room> rooms = getMyVisitedRooms(0, 0); - roomRepository.getVisitedRoomsWithStatsForOwner(rooms, userService.getCurrentUser()); + public List<Room> getMyRoomHistoryInfo(final int offset, final int limit) { + List<Room> rooms = getMyRoomHistory(0, 0); + roomRepository.getRoomHistoryWithStatsForUser(rooms, userService.getCurrentUser()); return rooms; } diff --git a/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java b/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java index 78f1a311e..f602e80d4 100644 --- a/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java +++ b/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java @@ -49,11 +49,6 @@ public class TestPersistanceConfig { return Mockito.mock(MotdRepository.class); } - @Bean - public VisitedSessionRepository visitedSessionRepository() { - return Mockito.mock(VisitedSessionRepository.class); - } - @Bean public StatisticsRepository statisticsRepository() { return Mockito.mock(StatisticsRepository.class); -- GitLab