diff --git a/CHANGELOG b/CHANGELOG index cc4952f8ab3dba8946a7ffb678c701bc488e0ad8..ac3fc2b5e6a5d7046dd7f24f8cb3c2a4fd757706 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ minerva (14.0.0~beta.2) unstable; urgency=low * Small improvement: info window contains information about overlay No (#919) * Bug fix: exported SBML passes online validation (#831) + * Bug fix: changing owner of data overlay should change order index (#945) * Bug fix: allow user to remove own comments (#931) * Bug fix: validation of project name length is provided (#950) * Bug fix: after reducing privileges on himself interface is refreshed (#948) 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 323678e9977a20d4374f59498a57112474b5d0ab..7d616e6bfdeb4e41f34a9ab72e4ea05b08d44ca0 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 @@ -181,6 +181,7 @@ public class OverlayRestImpl extends BaseRestImpl { if (overlayData == null) { throw new QueryException("overlay field cannot be undefined"); } + List<User> reorderUsers = new ArrayList<>(); try { Layout layout = getOverlay(projectId, overlayId); for (String key : overlayData.keySet()) { @@ -202,8 +203,17 @@ public class OverlayRestImpl extends BaseRestImpl { layout.setGoogleLicenseConsent((Boolean) overlayData.get("googleLicenseConsent")); } else if (key.equalsIgnoreCase("creator")) { if ("".equals(value)) { + if (layout.getCreator() != null) { + reorderUsers.add(layout.getCreator()); + } layout.setCreator(null); } else { + if (layout.getCreator() == null) { + reorderUsers.add(getUserService().getUserByLogin((String) value)); + } else if (!layout.getCreator().getLogin().equals(value)) { + reorderUsers.add(getUserService().getUserByLogin((String) value)); + reorderUsers.add(layout.getCreator()); + } layout.setCreator(getUserService().getUserByLogin((String) value)); } } else { @@ -211,6 +221,9 @@ public class OverlayRestImpl extends BaseRestImpl { } } layoutDao.update(layout); + for (User user : reorderUsers) { + reorderOverlays(user, layout.getProject()); + } return getOverlayById(layout.getProject().getProjectId(), overlayId); } catch (NumberFormatException e) { throw new QueryException("invliad overlay id", e); @@ -231,7 +244,12 @@ public class OverlayRestImpl extends BaseRestImpl { User owner = layout.getCreator(); Project project = layout.getProject(); layoutService.removeLayout(layout, null); - + + reorderOverlays(owner, project); + return okStatus(); + } + + private void reorderOverlays(User owner, Project project) { List<Layout> overlays = layoutService.getLayoutsByProject(project).stream() .filter(lay -> lay.getCreator() == owner).collect(Collectors.toList()); @@ -243,7 +261,6 @@ public class OverlayRestImpl extends BaseRestImpl { layoutService.updateLayout(overlay); } } - return okStatus(); } public Map<String, Object> addOverlay(String projectId, String name, String description, String content, diff --git a/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java b/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java index 361eb53d13da65e701bc768e2c24145b4894ead0..67b26e67e10ca3c106a840394bbe09ca7370cb36 100644 --- a/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java +++ b/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java @@ -1,6 +1,7 @@ package lcsb.mapviewer.web; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -101,7 +102,7 @@ public class OverlayControllerIntegrationTest extends ControllerIntegrationTest @Test public void testListPublicOverlaysOverlaysWhenCreatorEmpty() throws Exception { - Layout layout= createOverlay(project, null); + Layout layout = createOverlay(project, null); layout.setPublicLayout(true); layoutDao.add(layout); @@ -122,7 +123,7 @@ public class OverlayControllerIntegrationTest extends ControllerIntegrationTest @Test public void testListNonPublicOverlaysOverlaysWhenCreatorEmpty() throws Exception { - Layout layout= createOverlay(project, null); + Layout layout = createOverlay(project, null); layout.setPublicLayout(true); layoutDao.add(layout); @@ -1169,7 +1170,7 @@ public class OverlayControllerIntegrationTest extends ControllerIntegrationTest overlay2.setOrderIndex(2); Layout overlay3 = createOverlay(user); overlay3.setOrderIndex(3); - + layoutDao.update(overlay1); layoutDao.update(overlay2); layoutDao.update(overlay3); @@ -1194,7 +1195,7 @@ public class OverlayControllerIntegrationTest extends ControllerIntegrationTest overlay2.setOrderIndex(2); Layout overlay3 = createOverlay(null); overlay3.setOrderIndex(3); - + layoutDao.update(overlay1); layoutDao.update(overlay2); layoutDao.update(overlay3); @@ -1211,5 +1212,38 @@ public class OverlayControllerIntegrationTest extends ControllerIntegrationTest assertEquals(2, overlay3.getOrderIndex()); } + @Test + public void testChangeOrderAfterChaningOwner() throws Exception { + User user = createUser(TEST_USER_LOGIN, TEST_USER_PASSWORD); + User admin = userService.getUserByLogin(BUILT_IN_TEST_ADMIN_LOGIN); + + Layout overlay1 = createOverlay(user); + overlay1.setOrderIndex(1); + Layout overlay2 = createOverlay(user); + overlay2.setOrderIndex(2); + + Layout overlay3 = createOverlay(admin); + overlay3.setOrderIndex(1); + Layout overlay4 = createOverlay(admin); + overlay4.setOrderIndex(2); + + String body = "{\"overlay\":{\"creator\":\"" + admin.getLogin() + "\"}}"; + + MockHttpSession session = createSession(BUILT_IN_TEST_ADMIN_LOGIN, BUILT_IN_TEST_ADMIN_PASSWORD); + + RequestBuilder request = patch("/projects/" + TEST_PROJECT + "/overlays/" + overlay1.getId()) + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .content(body) + .session(session); + + mockMvc.perform(request) + .andExpect(status().is2xxSuccessful()); + + assertEquals("Order of overlays wasn't updated for original owner of overlay", 1, overlay2.getOrderIndex()); + + assertTrue(overlay1.getOrderIndex() == 1 || overlay3.getOrderIndex() == 1); + assertTrue(overlay1.getOrderIndex() == 2 || overlay3.getOrderIndex() == 2); + assertEquals(3, overlay4.getOrderIndex()); + } }