diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java index 30a6c2cc6e82b316891b5b3d9ad2417b97553321..7c6db97fc3face2f4cee0d538b200c282383dc4b 100644 --- a/src/main/java/de/thm/arsnova/controller/SessionController.java +++ b/src/main/java/de/thm/arsnova/controller/SessionController.java @@ -158,10 +158,25 @@ public class SessionController extends PaginationController { @ApiParam(value = "ownedOnly", required = true) @RequestParam(value = "ownedonly", defaultValue = "false") final boolean ownedOnly, @ApiParam(value = "visitedOnly", required = true) @RequestParam(value = "visitedonly", defaultValue = "false") final boolean visitedOnly, @ApiParam(value = "sortby", required = true) @RequestParam(value = "sortby", defaultValue = "name") final String sortby, + @ApiParam(value = "for a given username. admin rights needed", required = false) @RequestParam(value = + "username", defaultValue = "") final String username, final HttpServletResponse response ) { List<Session> sessions = null; + if (username.equals("")) try { + if (ownedOnly && !visitedOnly) { + sessions = sessionService.getUserSessions(username); + } else if (visitedOnly && !ownedOnly) { + sessions = sessionService.getUserVisitedSessions(username); + } else { + response.setStatus(HttpStatus.NOT_IMPLEMENTED.value()); + return null; + } + } catch (final AccessDeniedException e) { + throw new UnauthorizedException(); + } + /* TODO implement all parameter combinations, implement use of user parameter */ try { if (ownedOnly && !visitedOnly) { diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 22577c326b22d35e904b1f64d02e5ba8f6e1378a..aa427a0bc1be072c4afc1551d64af22f66e5d479 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -153,6 +153,11 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public List<Session> getMySessions(final User user, final int start, final int limit) { + return this.getDatabaseDao().getSessionsForUsername(user.getUsername(), start, limit); + } + + @Override + public List<Session> getSessionsForUsername(String username, final int start, final int limit) { final NovaView view = new NovaView("session/by_creator"); if (start > 0) { view.setSkip(start); @@ -160,8 +165,8 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware if (limit > 0) { view.setLimit(limit); } - view.setStartKeyArray(user.getUsername()); - view.setEndKeyArray(user.getUsername(), "{}"); + view.setStartKeyArray(username); + view.setEndKeyArray(username, "{}"); final Results<Session> results = getDatabase().queryView(view, Session.class); @@ -1349,8 +1354,8 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware if (d.getJSONObject().optJSONArray("value") != null) { @SuppressWarnings("unchecked") final Collection<Session> visitedSessions = JSONArray.toCollection( - d.getJSONObject().getJSONArray("value"), - Session.class + d.getJSONObject().getJSONArray("value"), + Session.class ); allSessions.addAll(visitedSessions); } @@ -1398,6 +1403,72 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return result; } + @Override + public List<Session> getVisitedSessionsForUsername(String username, final int start, final int limit) { + final NovaView view = new NovaView("logged_in/visited_sessions_by_user"); + if (start > 0) { + view.setSkip(start); + } + if (limit > 0) { + view.setLimit(limit); + } + view.setKey(username); + final ViewResults sessions = getDatabase().view(view); + final List<Session> allSessions = new ArrayList<Session>(); + for (final Document d : sessions.getResults()) { + // Not all users have visited sessions + if (d.getJSONObject().optJSONArray("value") != null) { + @SuppressWarnings("unchecked") + final Collection<Session> visitedSessions = JSONArray.toCollection( + d.getJSONObject().getJSONArray("value"), + Session.class + ); + allSessions.addAll(visitedSessions); + } + } + // Filter sessions that don't exist anymore, also filter my own sessions + final List<Session> result = new ArrayList<Session>(); + final List<Session> filteredSessions = new ArrayList<Session>(); + for (final Session s : allSessions) { + try { + final Session session = getDatabaseDao().getSessionFromKeyword(s.getKeyword()); + if (session != null && !(session.getCreator().equals(username))) { + result.add(session); + } else { + filteredSessions.add(s); + } + } catch (final NotFoundException e) { + filteredSessions.add(s); + } + } + if (filteredSessions.isEmpty()) { + return result; + } + // Update document to remove sessions that don't exist anymore + try { + List<VisitedSession> visitedSessions = new ArrayList<VisitedSession>(); + for (final Session s : result) { + visitedSessions.add(new VisitedSession(s)); + } + final LoggedIn loggedIn = new LoggedIn(); + final Document loggedInDocument = getDatabase().getDocument(sessions.getResults().get(0).getString("id")); + loggedIn.setSessionId(loggedInDocument.getString("sessionId")); + loggedIn.setUser(username); + loggedIn.setTimestamp(loggedInDocument.getLong("timestamp")); + loggedIn.setType(loggedInDocument.getString("type")); + loggedIn.setVisitedSessions(visitedSessions); + loggedIn.set_id(loggedInDocument.getId()); + loggedIn.set_rev(loggedInDocument.getRev()); + + final JSONObject json = JSONObject.fromObject(loggedIn); + final Document doc = new Document(json); + getDatabase().saveDocument(doc); + } catch (IOException e) { + LOGGER.error("Could not clean up logged_in document of {}", username); + } + return result; + } + @Override public List<SessionInfo> getMyVisitedSessionsInfo(final User user, final int start, final int limit) { List<Session> sessions = this.getMyVisitedSessions(user, start, limit); diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index b7a6331940d0b87f77c2c75611d16006a274cf9d..1a77eb8893a864194b2ab9cf6f74d867aa2fe5f2 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -44,6 +44,8 @@ public interface IDatabaseDao { List<Session> getMySessions(User user, final int start, final int limit); + List<Session> getSessionsForUsername(String username, final int start, final int limit); + List<Session> getPublicPoolSessions(); List<Session> getMyPublicPoolSessions(User user); @@ -121,6 +123,8 @@ public interface IDatabaseDao { List<Session> getMyVisitedSessions(User user, final int start, final int limit); + List<Session> getVisitedSessionsForUsername(String username, final int start, final int limit); + Question updateQuestion(Question question); void deleteAnswers(Question question); diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java index d984c3ae5c568861657697712f7f4826e4be62fd..0a1ce00fe9c17f2e6902e870bf30baece64873cb 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -44,6 +44,10 @@ public interface ISessionService { String generateKeyword(); + List<Session> getUserSessions(String username); + + List<Session> getUserVisitedSessions(String username); + List<Session> getMySessions(int offset, int limit); List<Session> getMyVisitedSessions(int offset, int limit); diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index 8cbb6f79921340b95a6555e447fd8480197fd93e..323f90feb810b2d58e648729f90356fdb6c51680 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -195,6 +195,12 @@ public class SessionService implements ISessionService, ApplicationEventPublishe return session; } + @Override + @PreAuthorize("isAuthenticated() and hasPermission(#sessionkey, 'session', 'owner')") + public List<Session> getUserSessions(String username) { + return databaseDao.getSessionsForUsername(username, 0, 0); + } + @Override @PreAuthorize("isAuthenticated()") public List<Session> getMySessions(final int offset, final int limit) { @@ -226,6 +232,12 @@ public class SessionService implements ISessionService, ApplicationEventPublishe return databaseDao.getMyVisitedSessions(userService.getCurrentUser(), offset, limit); } + @Override + @PreAuthorize("isAuthenticated() and hasPermission(#sessionkey, 'session', 'owner')") + public List<Session> getUserVisitedSessions(String username) { + return databaseDao.getVisitedSessionsForUsername(username, 0, 0); + } + @Override @PreAuthorize("isAuthenticated()") public List<SessionInfo> getMyVisitedSessionsInfo(final int offset, final int limit) {