From d74cef9766dce84199310ef191c90f41dce4d696 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Mon, 14 Aug 2017 17:00:44 +0200 Subject: [PATCH] overlay api contains additional filters (by creator and public) --- frontend-js/src/main/js/ServerConnector.js | 20 +++++++++++--- .../src/main/js/gui/leftPanel/OverlayPanel.js | 5 +++- ...&publicOverlay=false&token=MOCK_TOKEN_ID&} | 0 ...&publicOverlay=false&token=MOCK_TOKEN_ID&} | 0 ...&publicOverlay=false&token=MOCK_TOKEN_ID&} | 0 ...&publicOverlay=false&token=MOCK_TOKEN_ID&} | 0 ...&publicOverlay=false&token=MOCK_TOKEN_ID&} | 0 .../projects/overlays/OverlayController.java | 6 +++-- .../projects/overlays/OverlayRestImpl.java | 17 +++++++++--- .../services/impl/LayoutService.java | 23 ++++++++++++---- .../mapviewer/services/impl/ModelService.java | 4 +-- .../mapviewer/services/impl/UserService.java | 13 ++++++++++ .../services/interfaces/ILayoutService.java | 4 +-- .../services/interfaces/IUserService.java | 2 ++ .../services/impl/LayoutServiceTest.java | 26 +++++++++---------- .../java/lcsb/mapviewer/bean/LayoutBean.java | 2 +- .../lcsb/mapviewer/bean/LayoutBeanTest.java | 2 +- 17 files changed, 90 insertions(+), 34 deletions(-) rename frontend-js/testFiles/apiCalls/projects/complex_model_with_images/overlays/{token=MOCK_TOKEN_ID& => creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&} (100%) rename frontend-js/testFiles/apiCalls/projects/complex_model_with_submaps/overlays/{token=MOCK_TOKEN_ID& => creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&} (100%) rename frontend-js/testFiles/apiCalls/projects/drug_target_sample/overlays/{token=MOCK_TOKEN_ID& => creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&} (100%) rename frontend-js/testFiles/apiCalls/projects/empty/overlays/{token=MOCK_TOKEN_ID& => creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&} (100%) rename frontend-js/testFiles/apiCalls/projects/sample/overlays/{token=MOCK_TOKEN_ID& => creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID&} (100%) diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index 19c3339fd9..0943224d38 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -600,7 +600,13 @@ ServerConnector.getProject = function(projectId) { return self.getModels(projectId); }).then(function(models) { project.setModel(models[0]); - return self.getOverlays(projectId); + return self.getLoggedUser(); + }).then(function(user) { + return self.getOverlays({ + projectId : projectId, + creator : user.getLogin(), + publicOverlay : false, + }); }).then(function(overlays) { project.getModel().addLayouts(overlays); return project; @@ -726,12 +732,18 @@ ServerConnector.getUser = function(login) { }); }; -ServerConnector.getOverlays = function(projectId) { +ServerConnector.getOverlays = function(params) { var self = this; + if (params === undefined) { + params = {}; + } var queryParams = {}; - var filterParams = {}; + var filterParams = { + creator : params.creator, + publicOverlay : params.publicOverlay, + }; return new Promise(function(resolve, reject) { - self.getProjectId(projectId).then(function(result) { + self.getProjectId(params.projectId).then(function(result) { queryParams.projectId = result; return self.sendGetRequest(self.getOverlaysUrl(queryParams, filterParams)); }).then(function(content) { diff --git a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js index 750b0204fb..f7a8eb9669 100644 --- a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js +++ b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js @@ -284,7 +284,10 @@ OverlayPanel.prototype.refresh = function() { selectedOverlay[visibleDataOverlays[j].getId()] = true; } - return ServerConnector.getOverlays(); + return ServerConnector.getOverlays({ + publicOverlay : false, + creator : user.getLogin(), + }); }).then( function(customOverlays) { diff --git a/frontend-js/testFiles/apiCalls/projects/complex_model_with_images/overlays/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/complex_model_with_images/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/projects/complex_model_with_images/overlays/token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/projects/complex_model_with_images/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID& diff --git a/frontend-js/testFiles/apiCalls/projects/complex_model_with_submaps/overlays/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/complex_model_with_submaps/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/projects/complex_model_with_submaps/overlays/token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/projects/complex_model_with_submaps/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID& diff --git a/frontend-js/testFiles/apiCalls/projects/drug_target_sample/overlays/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/drug_target_sample/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/projects/drug_target_sample/overlays/token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/projects/drug_target_sample/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID& diff --git a/frontend-js/testFiles/apiCalls/projects/empty/overlays/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/empty/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/projects/empty/overlays/token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/projects/empty/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID& diff --git a/frontend-js/testFiles/apiCalls/projects/sample/overlays/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/projects/sample/overlays/token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/projects/sample/overlays/creator=anonymous&publicOverlay=false&token=MOCK_TOKEN_ID& diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java index c2ac91b71f..5fdd11869d 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java @@ -41,9 +41,11 @@ public class OverlayController extends BaseController { @RequestMapping(value = "/projects/{projectId}/overlays/", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) public List<LayoutView> getOverlayList(// @CookieValue(value = Configuration.AUTH_TOKEN) String token, // - @PathVariable(value = "projectId") String projectId // + @PathVariable(value = "projectId") String projectId, // + @RequestParam(value = "creator", defaultValue = "") String creator, // + @RequestParam(value = "publicOverlay", defaultValue = "") String publicOverlay // ) throws SecurityException, QueryException { - return overlayRestImp.getOverlayList(token, projectId); + return overlayRestImp.getOverlayList(token, projectId, creator, publicOverlay); } @RequestMapping(value = "/projects/{projectId}/overlays/{overlayId}/", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java index aaa01d3ccd..b6bc43c0ba 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java @@ -51,13 +51,24 @@ public class OverlayRestImpl extends BaseRestImpl { @Autowired private LayoutDao layoutDao; - public List<LayoutView> getOverlayList(String token, String projectId) throws SecurityException, QueryException { + public List<LayoutView> getOverlayList(String token, String projectId, String creatorLogin, String publicOverlay) throws SecurityException, QueryException { AuthenticationToken authenticationToken = getUserService().getToken(token); Model model = getModelService().getLastModelByProjectId(projectId, authenticationToken); if (model == null) { - throw new QueryException("Project with given id doesn't exist"); + throw new ObjectNotFoundException("Project with given id doesn't exist"); + } + User creator = null; + if (creatorLogin != null && !creatorLogin.isEmpty()) { + creator = getUserService().getUserByLogin(creatorLogin); + if (creator == null) { + throw new ObjectNotFoundException("User with given id doesn't exist: " + creatorLogin); + } + } + Boolean publicData = null; + if (publicOverlay != null && !publicOverlay.isEmpty()) { + publicData = publicOverlay.equalsIgnoreCase("true"); } - return layoutService.getCustomLayouts(model, token); + return layoutService.getCustomLayouts(model, token, publicData, creator); } /** diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java index d59ddfb6dc..a53089ee5c 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java @@ -170,14 +170,27 @@ public class LayoutService implements ILayoutService { } @Override - public List<LayoutView> getCustomLayouts(Model model, User user) { - List<LayoutView> result = new ArrayList<LayoutView>(); + public List<LayoutView> getCustomLayouts(Model model, User user, Boolean publicOverlay, User creator) { + List<LayoutView> result = new ArrayList<>(); if (model == null || user == null) { return result; } List<Layout> layouts = layoutDao.getLayoutsByModel(model); for (Layout layout : layouts) { - if (!layout.isPublicLayout() && layout.getCreator() != null) { + boolean toAdd = true; + if (creator != null) { + if (layout.getCreator() == null) { + toAdd = false; + } else if (!layout.getCreator().getId().equals(creator.getId())) { + toAdd = false; + } + } + if (publicOverlay != null) { + if (!publicOverlay.equals(layout.isPublicLayout())) { + toAdd = false; + } + } + if (toAdd) { if (userCanViewOverlay(layout, user)) { result.add(layoutViewFactory.create(layout)); } @@ -1034,8 +1047,8 @@ public class LayoutService implements ILayoutService { } @Override - public List<LayoutView> getCustomLayouts(Model model, String token) throws SecurityException { - return this.getCustomLayouts(model, userService.getUserByToken(token)); + public List<LayoutView> getCustomLayouts(Model model, String token, Boolean publicOverlay, User creator) throws SecurityException { + return this.getCustomLayouts(model, userService.getUserByToken(token), publicOverlay, creator); } @Override diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ModelService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ModelService.java index b419e81a7e..4d7a63ac46 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/ModelService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/ModelService.java @@ -380,9 +380,9 @@ public class ModelService implements IModelService { public ModelView getModelView(Model model, User user) { ModelView result = modelViewFactory.create(model); if (user != null) { - result.setCustomLayouts(layoutService.getCustomLayouts(model, user)); + result.setCustomLayouts(layoutService.getCustomLayouts(model, user, true, user)); for (ModelView view : result.getSubmodels()) { - view.setCustomLayouts(layoutService.getCustomLayouts(model.getSubmodelById(view.getIdObject()), user)); + view.setCustomLayouts(layoutService.getCustomLayouts(model.getSubmodelById(view.getIdObject()), user, true, user)); } } return result; diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java index 25fa736447..bf663ae19f 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java @@ -568,4 +568,17 @@ public class UserService implements IUserService { public boolean userHasPrivilege(AuthenticationToken token, PrivilegeType type) { return userHasPrivilege(getUserByToken(token), type); } + + @Override + public User getUserById(String creatorId, AuthenticationToken authenticationToken) throws SecurityException { + User user = getUserByToken(authenticationToken); + Integer id = Integer.parseInt(creatorId); + if (user.getId().equals(id)) { + return user; + } else if (userHasPrivilege(authenticationToken, PrivilegeType.USER_MANAGEMENT)) { + return getUserById(id); + } else { + throw new SecurityException("You cannot access data of other users"); + } + } } diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java index cec9c0ac8c..35e662b923 100644 --- a/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java +++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java @@ -320,7 +320,7 @@ public interface ILayoutService { * user who asks for the layouts * @return list of custom layouts */ - List<LayoutView> getCustomLayouts(Model model, User user); + List<LayoutView> getCustomLayouts(Model model, User user, Boolean publicOverlay, User creator); /** * Returns list of general publically available layouts. @@ -521,7 +521,7 @@ public interface ILayoutService { */ void setEmailSender(EmailSender emailSender); - List<LayoutView> getCustomLayouts(Model model, String token) throws SecurityException; + List<LayoutView> getCustomLayouts(Model model, String token, Boolean publicOverlay, User creator) throws SecurityException; LayoutView getLayoutById(Model model, int overlayId, AuthenticationToken token) throws SecurityException; diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java index bc59fb9104..ad4c6dd627 100644 --- a/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java +++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java @@ -254,4 +254,6 @@ public interface IUserService { void logout(AuthenticationToken token); boolean userHasPrivilege(AuthenticationToken token, PrivilegeType addMap); + + User getUserById(String creatorId, AuthenticationToken authenticationToken) throws SecurityException; } diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java index 4978e489de..29acf5879a 100644 --- a/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java +++ b/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java @@ -192,7 +192,7 @@ public class LayoutServiceTest extends ServiceTestFunctions { @Test public void testGetCustomLayouts() throws Exception { try { - List<LayoutView> layouts = layoutService.getCustomLayouts(model, user); + List<LayoutView> layouts = layoutService.getCustomLayouts(model, user, true, user); assertNotNull(layouts); assertEquals(0, layouts.size()); @@ -208,24 +208,24 @@ public class LayoutServiceTest extends ServiceTestFunctions { assertNotNull(row); assertNotNull(row.getIdObject()); - layouts = layoutService.getCustomLayouts(model, user); + layouts = layoutService.getCustomLayouts(model, user, true, user); assertEquals(1, layouts.size()); - layouts = layoutService.getCustomLayouts(model, user2); + layouts = layoutService.getCustomLayouts(model, user2, true, user2); assertEquals(0, layouts.size()); layoutService.addViewPrivilegeToLayout(row, user2); - layouts = layoutService.getCustomLayouts(model, user2); + layouts = layoutService.getCustomLayouts(model, user2, true, user2); assertEquals(1, layouts.size()); layoutService.dropViewPrivilegeFromLayout(row, user2); - layouts = layoutService.getCustomLayouts(model, user2); + layouts = layoutService.getCustomLayouts(model, user2, true, user2); assertEquals(0, layouts.size()); // null user shouldn't have acces to custom layouts - layouts = layoutService.getCustomLayouts(model, (User) null); + layouts = layoutService.getCustomLayouts(model, (User) null, true, null); assertEquals(0, layouts.size()); layoutService.removeLayout(row, null); @@ -265,7 +265,7 @@ public class LayoutServiceTest extends ServiceTestFunctions { @Test public void testUpdateLayout() throws Exception { try { - List<LayoutView> layouts = layoutService.getCustomLayouts(model, user); + List<LayoutView> layouts = layoutService.getCustomLayouts(model, user, true, user); assertNotNull(layouts); assertEquals(0, layouts.size()); @@ -278,7 +278,7 @@ public class LayoutServiceTest extends ServiceTestFunctions { user(user); LayoutView row = layoutService.createLayout(params); - layouts = layoutService.getCustomLayouts(model, user); + layouts = layoutService.getCustomLayouts(model, user, true, user); assertEquals(1, layouts.size()); assertEquals("Test", layouts.get(0).getName()); @@ -286,7 +286,7 @@ public class LayoutServiceTest extends ServiceTestFunctions { layoutService.updateLayout(row); - layouts = layoutService.getCustomLayouts(model, user); + layouts = layoutService.getCustomLayouts(model, user, true, user); assertEquals(1, layouts.size()); assertEquals("New name", layouts.get(0).getName()); @@ -301,7 +301,7 @@ public class LayoutServiceTest extends ServiceTestFunctions { @Test(timeout = 15000) public void testCreateAsyncLayout() throws Exception { try { - List<LayoutView> layouts = layoutService.getCustomLayouts(model, user); + List<LayoutView> layouts = layoutService.getCustomLayouts(model, user, true, user); assertNotNull(layouts); assertEquals(0, layouts.size()); @@ -325,7 +325,7 @@ public class LayoutServiceTest extends ServiceTestFunctions { layoutDao.refresh(layoutDb); } while (layoutDb.getStatus() != LayoutStatus.OK); - layouts = layoutService.getCustomLayouts(model, user); + layouts = layoutService.getCustomLayouts(model, user, true, user); assertEquals(1, layouts.size()); long logCounter2 = logDao.getCount(); @@ -403,7 +403,7 @@ public class LayoutServiceTest extends ServiceTestFunctions { @Test public void testInputDataInLayout() throws Exception { try { - List<LayoutView> layouts = layoutService.getCustomLayouts(model, user); + List<LayoutView> layouts = layoutService.getCustomLayouts(model, user, true, user); assertNotNull(layouts); assertEquals(0, layouts.size()); @@ -438,7 +438,7 @@ public class LayoutServiceTest extends ServiceTestFunctions { @Test public void testGetLayoutAliases() throws Exception { try { - List<LayoutView> layouts = layoutService.getCustomLayouts(model, user); + List<LayoutView> layouts = layoutService.getCustomLayouts(model, user, true, user); assertNotNull(layouts); assertEquals(0, layouts.size()); diff --git a/web/src/main/java/lcsb/mapviewer/bean/LayoutBean.java b/web/src/main/java/lcsb/mapviewer/bean/LayoutBean.java index 6ade0bf8dc..2c866c3884 100644 --- a/web/src/main/java/lcsb/mapviewer/bean/LayoutBean.java +++ b/web/src/main/java/lcsb/mapviewer/bean/LayoutBean.java @@ -255,7 +255,7 @@ public class LayoutBean extends AbstractManagedBean implements Serializable { public void refreshCustomLayouts(final ActionEvent actionEvent) { User user = userBean.getLoggedUser(); Model model = getCurrentTopModel(); - customLayouts = layoutService.getCustomLayouts(model, user); + customLayouts = layoutService.getCustomLayouts(model, user, true, user); generalLayouts = layoutService.getGeneralLayouts(model); } diff --git a/web/src/test/java/lcsb/mapviewer/bean/LayoutBeanTest.java b/web/src/test/java/lcsb/mapviewer/bean/LayoutBeanTest.java index cd7db2f4b9..d6295ff11d 100644 --- a/web/src/test/java/lcsb/mapviewer/bean/LayoutBeanTest.java +++ b/web/src/test/java/lcsb/mapviewer/bean/LayoutBeanTest.java @@ -183,7 +183,7 @@ public class LayoutBeanTest extends WebTestFunctions { layoutBean.addLayout(null); // wait until layout is generated - Integer id = Integer.valueOf(layoutService.getCustomLayouts(model, user).get(0).getIdObject()); + Integer id = Integer.valueOf(layoutService.getCustomLayouts(model, user, true, user).get(0).getIdObject()); Layout l = layoutDao.getById(id); do { Thread.sleep(200); -- GitLab