diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApi.java b/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApi.java index 380afa76449809e13532ca81a60a794e04fb1925..22247ebee7a5ee356e41f540e63c2a56bcab5963 100644 --- a/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApi.java +++ b/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApi.java @@ -41,7 +41,7 @@ public interface GeographicSiteManagementApi { return getRequest().map(r -> r.getHeader("Accept")); } - @Operation(summary = "Creates a 'GeographicSite'", operationId = "createGeographicSite", description = "", tags={ "geographicSite", }) + @Operation(summary = "Creates a 'GeographicSite '", operationId = "createGeographicSite", description = "", tags={ "geographicSite", }) @ApiResponses(value = { @ApiResponse(responseCode = "400", description = "Created" ), @ApiResponse(responseCode = "400", description = "Bad Request" ), @@ -59,7 +59,7 @@ public interface GeographicSiteManagementApi { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } - @Operation(summary = "Deletes a 'GeographicSite' by Id", operationId = "deleteGeographicSite", description = "", tags={ "GeographicSite", }) + @Operation(summary = "Deletes a GeographicSite by Id", operationId = "deleteGeographicSite", description = "", tags={ "GeographicSite", }) @ApiResponses(value = { @ApiResponse(responseCode = "204", description = "Deleted" ), @ApiResponse(responseCode = "400", description = "Bad Request" ), @@ -109,7 +109,7 @@ public interface GeographicSiteManagementApi { produces = { "application/json" }, consumes = { "application/json" }, method = RequestMethod.PATCH) - default ResponseEntity patchGeographicalSite(@Parameter(description = "Identifier of the Geographic site",required=true) @PathVariable("id") String id,@Parameter(description = "The Service Level Specification to be updated" ,required=true ) @Valid @RequestBody GeographicSite geographicSite) { + default ResponseEntity patchGeographicalSite(Principal principal,@Parameter(description = "Identifier of the Geographic site",required=true) @PathVariable("id") String id,@Parameter(description = "The Service Level Specification to be updated" ,required=true ) @Valid @RequestBody GeographicSite geographicSite) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -127,7 +127,7 @@ public interface GeographicSiteManagementApi { @RequestMapping(value = "/geographicSite/{id}", produces = { "application/json" }, method = RequestMethod.GET) - default ResponseEntity retrieveGeographicSite(@Parameter(description = "Identifier of the Geographic site",required=true) @PathVariable("id") String id) { + default ResponseEntity retrieveGeographicSite(Principal principal,@Parameter(description = "Identifier of the Geographic site",required=true) @PathVariable("id") String id) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApiController.java b/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApiController.java index 475eaede144dd839288630f5c63daf275e08769e..208a655a14085851374295fd30f6847052cc5b09 100644 --- a/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApiController.java +++ b/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApiController.java @@ -2,17 +2,28 @@ package org.etsi.osl.tmf.gsm674.api; import io.swagger.v3.oas.annotations.Parameter; import jakarta.validation.Valid; +import org.etsi.osl.model.nfv.UserRoleType; +import org.etsi.osl.tmf.gsm674.model.GeographicAddressValue; import org.etsi.osl.tmf.gsm674.model.GeographicSite; +import org.etsi.osl.tmf.gsm674.model.GeographicSubAddressValue; +import org.etsi.osl.tmf.gsm674.model.PlaceRefOrValue; import org.etsi.osl.tmf.gsm674.reposervices.GeographicSiteManagementService; +import org.etsi.osl.tmf.pm632.model.Individual; +import org.etsi.osl.tmf.pm632.reposervices.IndividualRepoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import java.security.Principal; +import java.util.ArrayList; import java.util.List; @Controller @@ -22,9 +33,12 @@ public class GeographicSiteManagementApiController implements GeographicSiteMana private static final String COULD_NOT_SERIALIZE="Couldn't serialize response for content type application/json"; private final GeographicSiteManagementService geographicSiteManagementService; + private final IndividualRepoService individualRepoService; + @Autowired - public GeographicSiteManagementApiController(GeographicSiteManagementService geographicSiteManagementService) { + public GeographicSiteManagementApiController(GeographicSiteManagementService geographicSiteManagementService, IndividualRepoService individualRepoService) { this.geographicSiteManagementService = geographicSiteManagementService; + this.individualRepoService = individualRepoService; } @PreAuthorize("hasAnyAuthority('ROLE_USER')" ) @@ -41,13 +55,23 @@ public class GeographicSiteManagementApiController implements GeographicSiteMana } } - @PreAuthorize("hasAnyAuthority('ROLE_USER')" ) + @PreAuthorize("hasAnyAuthority('ROLE_USER', 'ROLE_TESTBED_PROVIDER')") @Override - public ResponseEntity retrieveGeographicSite(@PathVariable("id") String id) { - + public ResponseEntity retrieveGeographicSite(Principal principal, @PathVariable("id") String id) { try { - return new ResponseEntity<>(geographicSiteManagementService.findGeographicSiteByUUID(id), HttpStatus.OK); + GeographicSite gs= geographicSiteManagementService.findGeographicSiteByRelatedPartyId(id); + if (gs==null) { + gs =new GeographicSite(); + GeographicSubAddressValue geographicSubAddressValue=new GeographicSubAddressValue(); + GeographicAddressValue geographicAddressValue=new GeographicAddressValue(); + geographicAddressValue.setGeographicSubAddress(geographicSubAddressValue); + PlaceRefOrValue placeRefOrValue=new PlaceRefOrValue(geographicAddressValue); + List placeRefOrValues=new ArrayList<>(); + placeRefOrValues.add(placeRefOrValue); + gs.setPlace(placeRefOrValues); + } + return new ResponseEntity(gs,HttpStatus.OK); } catch (Exception e) { log.error(COULD_NOT_SERIALIZE, e); @@ -55,7 +79,7 @@ public class GeographicSiteManagementApiController implements GeographicSiteMana } } - @PreAuthorize("hasAnyAuthority('ROLE_USER')" ) + @PreAuthorize("hasAnyAuthority('ROLE_USER','ROLE_TESTBED_PROVIDER')" ) @Override public ResponseEntity createGeographicSite( @Parameter(description = "The geographic site to be created", required = true) @Valid @RequestBody GeographicSite geographicSite @@ -74,7 +98,7 @@ public class GeographicSiteManagementApiController implements GeographicSiteMana } } - @PreAuthorize("hasAnyAuthority('ROLE_USER')" ) + @PreAuthorize("hasAnyAuthority('ROLE_USER','ROLE_TESTBED_PROVIDER')" ) @Override public ResponseEntity deleteGeographicSite( @Parameter(description = "Identifier of the geographic site", required = true) @PathVariable("id") String id) { @@ -89,15 +113,16 @@ public class GeographicSiteManagementApiController implements GeographicSiteMana } - @PreAuthorize("hasAnyAuthority('ROLE_USER')" ) + @PreAuthorize("hasAnyAuthority('ROLE_USER','ROLE_TESTBED_PROVIDER')" ) @Override - public ResponseEntity patchGeographicalSite( + public ResponseEntity patchGeographicalSite(Principal principal, @Parameter(description = "Identifier of the ServiceOrder", required = true) @PathVariable("id") String id, @Parameter(description = "The ServiceOrder to be updated", required = true) @Valid @RequestBody GeographicSite geographicSite) { try{ - GeographicSite c = geographicSiteManagementService.updateGeographicSite(id, geographicSite); + GeographicSite c=geographicSiteManagementService.findGeographicSiteByRelatedPartyId(id); + c = geographicSiteManagementService.updateGeographicSite(c.getUuid(), geographicSite); + return new ResponseEntity<>(c, HttpStatus.OK); - return new ResponseEntity<>(c, HttpStatus.OK); }catch (Exception e){ log.error(COULD_NOT_SERIALIZE, e); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/repo/GeographicSiteManagementRepository.java b/src/main/java/org/etsi/osl/tmf/gsm674/repo/GeographicSiteManagementRepository.java index c65f209878f0d4524667bea677006f0b61eba100..81d306839bf0033d09fa56e4bc34496142e52117 100644 --- a/src/main/java/org/etsi/osl/tmf/gsm674/repo/GeographicSiteManagementRepository.java +++ b/src/main/java/org/etsi/osl/tmf/gsm674/repo/GeographicSiteManagementRepository.java @@ -4,11 +4,16 @@ import org.etsi.osl.tmf.gsm674.model.GeographicSite; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.stereotype.Repository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.Optional; +import java.util.UUID; @Repository public interface GeographicSiteManagementRepository extends CrudRepository, PagingAndSortingRepository { Optional findByUuid(String id); + @Query("SELECT gs FROM GeographicSite gs JOIN gs.relatedParty rp WHERE rp.id = :relatedPartyId") + Optional findByRelatedPartyId(@Param("relatedPartyId") String relatedPartyId); } diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/reposervices/GeographicSiteManagementService.java b/src/main/java/org/etsi/osl/tmf/gsm674/reposervices/GeographicSiteManagementService.java index 1206d8201224198c4ff587db4ef8940ce4b2ecfc..607e1cab4cfb7d3d1eeb26a6009fda6a455abd13 100644 --- a/src/main/java/org/etsi/osl/tmf/gsm674/reposervices/GeographicSiteManagementService.java +++ b/src/main/java/org/etsi/osl/tmf/gsm674/reposervices/GeographicSiteManagementService.java @@ -37,6 +37,17 @@ public class GeographicSiteManagementService { } + public GeographicSite findGeographicSiteByRelatedPartyId(String uuid){ + Optional gs=geographicSiteManagementRepository.findByRelatedPartyId(uuid); + try { + log.info("Found geographic site from related party:{} , geographic site info: {}", uuid, gs.orElse(null).toString()); + }catch(Exception e){ + log.error("Error during fetch of geographic site info: {}", e.getMessage()); + } + return gs.orElse(null); + + } + public GeographicSite createGeographicSite(GeographicSite geographicSite){ log.info("Add another geographic site: {}",geographicSite); return geographicSiteManagementRepository.save(geographicSite); diff --git a/src/test/java/org/etsi/osl/services/api/gsm674/GeographicSiteManagementApiControllerTest.java b/src/test/java/org/etsi/osl/services/api/gsm674/GeographicSiteManagementApiControllerTest.java index 04878fd10c9dfdf92a02d8e22c5b999a523214bd..4c070ed5105de68bb853ba614bd9cd926ade06f0 100644 --- a/src/test/java/org/etsi/osl/services/api/gsm674/GeographicSiteManagementApiControllerTest.java +++ b/src/test/java/org/etsi/osl/services/api/gsm674/GeographicSiteManagementApiControllerTest.java @@ -1,10 +1,16 @@ package org.etsi.osl.services.api.gsm674; import org.etsi.osl.tmf.gsm674.api.GeographicSiteManagementApiController; +import org.etsi.osl.tmf.gsm674.model.GeographicAddressValue; import org.etsi.osl.tmf.gsm674.model.GeographicSite; +import org.etsi.osl.tmf.gsm674.model.GeographicSubAddressValue; +import org.etsi.osl.tmf.gsm674.model.PlaceRefOrValue; import org.etsi.osl.tmf.gsm674.reposervices.GeographicSiteManagementService; import org.junit.jupiter.api.BeforeEach; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.test.context.ActiveProfiles; import org.junit.jupiter.api.Test; @@ -14,9 +20,13 @@ import org.mockito.MockitoAnnotations; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import java.security.Principal; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -24,8 +34,11 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; - +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; @AutoConfigureMockMvc @ActiveProfiles("testing") class GeographicSiteManagementApiControllerTest { @@ -56,10 +69,26 @@ class GeographicSiteManagementApiControllerTest { @Test void testFetchGeographicSite() { GeographicSite site = new GeographicSite(); + GeographicSubAddressValue geographicSubAddressValue=new GeographicSubAddressValue(); + GeographicAddressValue geographicAddressValue=new GeographicAddressValue(); + geographicAddressValue.setGeographicSubAddress(geographicSubAddressValue); + PlaceRefOrValue placeRefOrValue=new PlaceRefOrValue(geographicAddressValue); + List placeRefOrValues=new ArrayList<>(); + placeRefOrValues.add(placeRefOrValue); + site.setPlace(placeRefOrValues); // Add test data to sites list when(service.findGeographicSiteByUUID("123")).thenReturn(site); +// Mock SecurityContext and Authentication + SecurityContext securityContext = mock(SecurityContext.class); + Set authorities = new HashSet<>(); + authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN")); + Authentication authentication = new UsernamePasswordAuthenticationToken("user", "password", authorities); + + SecurityContextHolder.setContext(securityContext); + + when(securityContext.getAuthentication()).thenReturn(authentication); - ResponseEntity response = controller.retrieveGeographicSite("123"); + ResponseEntity response = controller.retrieveGeographicSite(null,"123"); assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(site, response.getBody()); @@ -108,12 +137,16 @@ class GeographicSiteManagementApiControllerTest { @Test void testPatchGeographicalSite() { + String relatedPartyUuid = "relatedPartyUuid"; String siteId = "siteId"; + GeographicSite oldSite = new GeographicSite(); + oldSite.setUuid(relatedPartyUuid); GeographicSite updatedSite = new GeographicSite(); // Set up mock service behavior + when(service.findGeographicSiteByRelatedPartyId(any())).thenReturn(oldSite); when(service.updateGeographicSite(anyString(), any())).thenReturn(updatedSite); - ResponseEntity response = controller.patchGeographicalSite(siteId, updatedSite); + ResponseEntity response = controller.patchGeographicalSite(null,siteId, updatedSite); assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(updatedSite, response.getBody()); @@ -126,7 +159,7 @@ class GeographicSiteManagementApiControllerTest { // Set up mock service behavior when(service.updateGeographicSite(anyString(), any())).thenThrow(RuntimeException.class); - ResponseEntity response = controller.patchGeographicalSite(siteId, updatedSite); + ResponseEntity response = controller.patchGeographicalSite(null,siteId, updatedSite); assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); }