diff --git a/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/DefaultSchemaService.java b/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/DefaultSchemaService.java index 2d6055267373..aced7e59ed57 100644 --- a/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/DefaultSchemaService.java +++ b/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/DefaultSchemaService.java @@ -118,7 +118,6 @@ import org.hisp.dhis.schema.descriptors.LegendSchemaDescriptor; import org.hisp.dhis.schema.descriptors.LegendSetSchemaDescriptor; import org.hisp.dhis.schema.descriptors.MapSchemaDescriptor; -import org.hisp.dhis.schema.descriptors.MapViewSchemaDescriptor; import org.hisp.dhis.schema.descriptors.MessageConversationSchemaDescriptor; import org.hisp.dhis.schema.descriptors.MetadataVersionSchemaDescriptor; import org.hisp.dhis.schema.descriptors.MinMaxDataElementSchemaDescriptor; @@ -251,7 +250,6 @@ private void init() { register(new LegendSetSchemaDescriptor()); register(new ExternalMapLayerSchemaDescriptor()); register(new MapSchemaDescriptor()); - register(new MapViewSchemaDescriptor()); register(new MessageConversationSchemaDescriptor()); register(new MetadataVersionSchemaDescriptor()); register(new OAuth2ClientSchemaDescriptor()); diff --git a/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java b/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java index c5cf1c4ec0a9..ff5a041f52e1 100644 --- a/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java +++ b/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java @@ -2995,7 +2995,7 @@ public static User createRandomAdminUserWithEntityManager(EntityManager entityMa entityManager.persist(role); User user = new User(); - user.setUid("A_" + CodeGenerator.generateUid().substring(2)); + user.setUid(CodeGenerator.generateUid()); user.setFirstName("Admin"); user.setSurname("User"); user.setUsername(DEFAULT_USERNAME + "_test_" + CodeGenerator.generateUid()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/metadata/export/MetadataExportWithDependenciesTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/metadata/export/MetadataExportWithDependenciesTest.java index 9a4258b8b393..95e987366e1f 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/metadata/export/MetadataExportWithDependenciesTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/metadata/export/MetadataExportWithDependenciesTest.java @@ -28,21 +28,33 @@ package org.hisp.dhis.metadata.export; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.List; import java.util.Map; import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.hisp.dhis.common.IdentifiableObject; +import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.common.ValueType; import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.dxf2.metadata.MetadataExportParams; import org.hisp.dhis.dxf2.metadata.MetadataExportService; +import org.hisp.dhis.dxf2.metadata.MetadataImportService; +import org.hisp.dhis.mapping.MapView; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramSection; import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.program.ProgramStageDataElement; import org.hisp.dhis.program.ProgramTrackedEntityAttribute; +import org.hisp.dhis.render.RenderFormat; +import org.hisp.dhis.render.RenderService; import org.hisp.dhis.test.integration.SingleSetupIntegrationTestBase; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.junit.jupiter.api.DisplayName; @@ -54,6 +66,14 @@ class MetadataExportWithDependenciesTest extends SingleSetupIntegrationTestBase @PersistenceContext private EntityManager entityManager; @Autowired private MetadataExportService metadataExportService; + @Autowired private MetadataImportService metadataImportService; + + @Autowired private IdentifiableObjectManager manager; + + @Autowired private RenderService renderService; + + @Autowired private ObjectMapper jsonMapper; + @Test void testExportProgramWithProgramSection() { Program program = createProgram('A'); @@ -117,4 +137,28 @@ private Program setUpProgramAndDependencies() { entityManager.merge(programStage); return program; } + + @Test + @DisplayName("MapView should not be exported at root level when exporting Map with dependencies") + void exportMetadataShouldNotContainMapView() throws IOException { + MapView mapView = createMapView("A"); + org.hisp.dhis.mapping.Map map = new org.hisp.dhis.mapping.Map(); + map.setName("MapA"); + map.setMapViews(List.of(mapView)); + map.setAutoFields(); + manager.save(map); + + MetadataExportParams exportParams = new MetadataExportParams(); + exportParams.addClass(org.hisp.dhis.mapping.Map.class); + exportParams.addClass(MapView.class); + ObjectNode exported = metadataExportService.getMetadataAsObjectNode(exportParams); + + Map, List> metadata = + renderService.fromMetadata( + new ByteArrayInputStream(jsonMapper.writeValueAsBytes(exported)), RenderFormat.JSON); + assertNull(metadata.get(org.hisp.dhis.mapping.MapView.class)); + org.hisp.dhis.mapping.Map exportMap = + (org.hisp.dhis.mapping.Map) metadata.get(org.hisp.dhis.mapping.Map.class).get(0); + assertNotNull(exportMap.getMapViews()); + } } diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/ProgramControllerTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/ProgramControllerTest.java index 011a141c8ebd..91d67e587bc2 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/ProgramControllerTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/ProgramControllerTest.java @@ -366,13 +366,17 @@ void testCopyProgramWithNoPublicSharing() { @Test void testDeleteWithMapView() { - String mapViewJson = + + String mapJson = """ + { + "name": "test map", + "id": "mAPVRd23Jm9", + "mapViews": [ { "name": "test mapview", "id": "mVIVRd23Jm9", "organisationUnitLevels": [], - "maps": [], "layer": "event", "program": { "id": "PrZMWi7rBga" @@ -381,11 +385,15 @@ void testDeleteWithMapView() { "id": "PSzMWi7rBga" } } - """; - POST("/mapViews", mapViewJson).content(HttpStatus.CREATED); + ] + } + """; + POST("/maps", mapJson).content(HttpStatus.CREATED); + assertStatus(HttpStatus.OK, DELETE("/programs/%s".formatted(PROGRAM_UID))); assertStatus(HttpStatus.NOT_FOUND, GET("/programs/%s".formatted(PROGRAM_UID))); JsonMixed mapview = GET("/mapViews/mVIVRd23Jm9").content().as(JsonMixed.class); assertFalse(mapview.has("program")); + assertFalse(mapview.has("programStage")); } } diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/mapping/MapViewController.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/mapping/MapViewController.java index e6990b453f31..9ef68a5a886a 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/mapping/MapViewController.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/mapping/MapViewController.java @@ -46,8 +46,7 @@ import org.hisp.dhis.query.Order; import org.hisp.dhis.query.Query; import org.hisp.dhis.query.QueryParserException; -import org.hisp.dhis.schema.descriptors.MapViewSchemaDescriptor; -import org.hisp.dhis.webapi.controller.AbstractCrudController; +import org.hisp.dhis.webapi.controller.AbstractFullReadOnlyController; import org.hisp.dhis.webapi.utils.ContextUtils; import org.hisp.dhis.webapi.webdomain.WebMetadata; import org.hisp.dhis.webapi.webdomain.WebOptions; @@ -64,8 +63,8 @@ */ @OpenApi.Tags("metadata") @Controller -@RequestMapping(value = MapViewSchemaDescriptor.API_ENDPOINT) -public class MapViewController extends AbstractCrudController { +@RequestMapping("/mapViews") +public class MapViewController extends AbstractFullReadOnlyController { @Autowired private MappingService mappingService; @Autowired private OrganisationUnitService organisationUnitService;