diff --git a/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/controller/BlocklistedWordsController.java b/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/controller/BlocklistedWordsController.java index 3af4cb8225d..428b340ea8a 100644 --- a/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/controller/BlocklistedWordsController.java +++ b/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/controller/BlocklistedWordsController.java @@ -1,5 +1,6 @@ package io.mosip.kernel.masterdata.controller; +import io.mosip.kernel.masterdata.dto.BlockListedWordStatusUpdateDto; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; @@ -278,15 +279,14 @@ public ResponseWrapper blockListedWordsFilterValues( @PreAuthorize("hasAnyRole(@authorizedRoles.getPatchblocklistedwords())") @PatchMapping @ApiOperation(value = "update the blocklisted word") - public ResponseWrapper updateBlockListedWordStatus(@RequestParam boolean isActive, - @RequestParam String word) { + public ResponseWrapper updateBlockListedWordStatus(@RequestBody @Valid RequestWrapper requestWrapper) { auditUtil.auditRequest( MasterDataConstant.STATUS_API_IS_CALLED + BlockListedWordsUpdateDto.class.getCanonicalName(), MasterDataConstant.AUDIT_SYSTEM, MasterDataConstant.STATUS_API_IS_CALLED + BlockListedWordsUpdateDto.class.getCanonicalName(), "ADM-552"); ResponseWrapper responseWrapper = new ResponseWrapper<>(); - responseWrapper.setResponse(blocklistedWordsService.updateBlockListedWordStatus(word, isActive)); + responseWrapper.setResponse(blocklistedWordsService.updateBlockListedWordStatus(requestWrapper.getRequest())); auditUtil.auditRequest( MasterDataConstant.STATUS_UPDATED_SUCCESS + BlockListedWordsUpdateDto.class.getCanonicalName(), MasterDataConstant.AUDIT_SYSTEM, diff --git a/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/BlockListedWordStatusUpdateDto.java b/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/BlockListedWordStatusUpdateDto.java new file mode 100644 index 00000000000..add6c7916a8 --- /dev/null +++ b/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/BlockListedWordStatusUpdateDto.java @@ -0,0 +1,20 @@ +package io.mosip.kernel.masterdata.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.mosip.kernel.masterdata.validator.AlphabeticValidator; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class BlockListedWordStatusUpdateDto { + + @NotNull + @Size(min = 1, max = 128) + @AlphabeticValidator(message = "Blocklisted word cannot contain numbers and special characters") + private String word; + + @NotNull + private Boolean isActive; +} diff --git a/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/BlocklistedWordsService.java b/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/BlocklistedWordsService.java index 0cc085afb3b..1d8feac6486 100644 --- a/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/BlocklistedWordsService.java +++ b/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/BlocklistedWordsService.java @@ -1,7 +1,6 @@ package io.mosip.kernel.masterdata.service; -import java.util.List; - +import io.mosip.kernel.masterdata.dto.BlockListedWordStatusUpdateDto; import io.mosip.kernel.masterdata.dto.BlockListedWordsUpdateDto; import io.mosip.kernel.masterdata.dto.BlocklistedWordsDto; import io.mosip.kernel.masterdata.dto.getresponse.BlocklistedWordsResponseDto; @@ -14,6 +13,8 @@ import io.mosip.kernel.masterdata.dto.response.PageResponseDto; import io.mosip.kernel.masterdata.entity.id.WordAndLanguageCodeID; +import java.util.List; + /** * blocklisted words service * @@ -95,6 +96,6 @@ public PageDto getBlockListedWords(int pageNumber, int */ public FilterResponseDto blockListedWordsFilterValues(FilterValueDto filterValueDto); - public StatusResponseDto updateBlockListedWordStatus(String word, boolean isActive); + public StatusResponseDto updateBlockListedWordStatus(BlockListedWordStatusUpdateDto requestDto); } diff --git a/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/impl/BlocklistedWordsServiceImpl.java b/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/impl/BlocklistedWordsServiceImpl.java index 80fece768dc..da129005336 100644 --- a/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/impl/BlocklistedWordsServiceImpl.java +++ b/admin/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/impl/BlocklistedWordsServiceImpl.java @@ -2,23 +2,15 @@ import io.mosip.kernel.core.dataaccess.exception.DataAccessLayerException; import io.mosip.kernel.core.datamapper.spi.DataMapper; -import io.mosip.kernel.masterdata.constant.BlocklistedWordsErrorCode; -import io.mosip.kernel.masterdata.constant.LanguageErrorCode; -import io.mosip.kernel.masterdata.constant.MachineErrorCode; -import io.mosip.kernel.masterdata.constant.MasterDataConstant; -import io.mosip.kernel.masterdata.constant.UpdateQueryConstants; +import io.mosip.kernel.masterdata.constant.*; +import io.mosip.kernel.masterdata.dto.BlockListedWordStatusUpdateDto; import io.mosip.kernel.masterdata.dto.BlockListedWordsUpdateDto; import io.mosip.kernel.masterdata.dto.BlocklistedWordsDto; import io.mosip.kernel.masterdata.dto.getresponse.BlocklistedWordsResponseDto; import io.mosip.kernel.masterdata.dto.getresponse.PageDto; import io.mosip.kernel.masterdata.dto.getresponse.StatusResponseDto; import io.mosip.kernel.masterdata.dto.getresponse.extn.BlocklistedWordsExtnDto; -import io.mosip.kernel.masterdata.dto.request.FilterDto; -import io.mosip.kernel.masterdata.dto.request.FilterValueDto; -import io.mosip.kernel.masterdata.dto.request.Pagination; -import io.mosip.kernel.masterdata.dto.request.SearchDto; -import io.mosip.kernel.masterdata.dto.request.SearchFilter; -import io.mosip.kernel.masterdata.dto.request.SearchSort; +import io.mosip.kernel.masterdata.dto.request.*; import io.mosip.kernel.masterdata.dto.response.ColumnValue; import io.mosip.kernel.masterdata.dto.response.FilterResponseDto; import io.mosip.kernel.masterdata.dto.response.FilterResult; @@ -30,14 +22,7 @@ import io.mosip.kernel.masterdata.exception.RequestException; import io.mosip.kernel.masterdata.repository.BlocklistedWordsRepository; import io.mosip.kernel.masterdata.service.BlocklistedWordsService; -import io.mosip.kernel.masterdata.utils.AuditUtil; -import io.mosip.kernel.masterdata.utils.ExceptionUtils; -import io.mosip.kernel.masterdata.utils.MapperUtils; -import io.mosip.kernel.masterdata.utils.MasterDataFilterHelper; -import io.mosip.kernel.masterdata.utils.MasterdataCreationUtil; -import io.mosip.kernel.masterdata.utils.MasterdataSearchHelper; -import io.mosip.kernel.masterdata.utils.MetaDataUtils; -import io.mosip.kernel.masterdata.utils.PageUtils; +import io.mosip.kernel.masterdata.utils.*; import io.mosip.kernel.masterdata.validator.FilterColumnValidator; import io.mosip.kernel.masterdata.validator.FilterTypeValidator; import jakarta.persistence.EntityManager; @@ -58,14 +43,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.ArrayList; -import java.util.Map; -import java.util.HashMap; -import java.util.Collections; +import java.util.*; /** * Service implementation class for {@link BlocklistedWordsService}. @@ -455,13 +433,23 @@ public FilterResponseDto blockListedWordsFilterValues(FilterValueDto filterValue @CacheEvict(value = "blocklisted-words", allEntries = true) @Override - public StatusResponseDto updateBlockListedWordStatus(String word, boolean isActive) { + public StatusResponseDto updateBlockListedWordStatus(BlockListedWordStatusUpdateDto requestDto) { // TODO Auto-generated method stub StatusResponseDto response = new StatusResponseDto(); + if (requestDto == null || requestDto.getWord() == null || requestDto.getWord().isBlank()) { + throw new IllegalArgumentException("Word cannot be null or empty"); + } + String normalizedWord = requestDto.getWord().trim().toLowerCase(); + + Boolean isActive = requestDto.getIsActive(); + if (requestDto.getIsActive() == null) { + throw new IllegalArgumentException("isActive field cannot be null"); + } + List wordEntity = null; try { - wordEntity = blocklistedWordsRepository.findtoUpdateBlocklistedWordByWord(word); + wordEntity = blocklistedWordsRepository.findtoUpdateBlocklistedWordByWord(normalizedWord); } catch (DataAccessException | DataAccessLayerException accessException) { auditUtil.auditRequest( String.format(MasterDataConstant.FAILURE_UPDATE, BlockListedWordsUpdateDto.class.getSimpleName()), @@ -477,7 +465,7 @@ public StatusResponseDto updateBlockListedWordStatus(String word, boolean isActi } if (wordEntity != null && !wordEntity.isEmpty()) { - masterdataCreationUtil.updateMasterDataStatus(BlocklistedWords.class, word, isActive, "word"); + masterdataCreationUtil.updateMasterDataStatus(BlocklistedWords.class, normalizedWord, isActive, "word"); } else { auditUtil.auditRequest( String.format(MasterDataConstant.FAILURE_UPDATE, BlockListedWordsUpdateDto.class.getSimpleName()), diff --git a/admin/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/controller/MasterdataControllerTest.java b/admin/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/controller/MasterdataControllerTest.java index 0ded7a3bdbf..4623eb00962 100644 --- a/admin/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/controller/MasterdataControllerTest.java +++ b/admin/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/controller/MasterdataControllerTest.java @@ -1,79 +1,15 @@ package io.mosip.kernel.masterdata.test.controller; -import static org.hamcrest.CoreMatchers.is; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doNothing; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.Month; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; - -import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithUserDetails; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.RequestBuilder; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; -import org.springframework.web.client.RestTemplate; - import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - import io.mosip.kernel.core.http.RequestWrapper; import io.mosip.kernel.core.websub.model.EventModel; import io.mosip.kernel.core.websub.spi.PublisherClient; import io.mosip.kernel.masterdata.constant.BlocklistedWordsErrorCode; import io.mosip.kernel.masterdata.constant.LocationErrorCode; -import io.mosip.kernel.masterdata.dto.ApplicationDto; -import io.mosip.kernel.masterdata.dto.BiometricAttributeDto; -import io.mosip.kernel.masterdata.dto.BiometricTypeDto; -import io.mosip.kernel.masterdata.dto.BlockListedWordsRequest; -import io.mosip.kernel.masterdata.dto.BlocklistedWordListRequestDto; -import io.mosip.kernel.masterdata.dto.BlocklistedWordsDto; -import io.mosip.kernel.masterdata.dto.DocumentCategoryDto; -import io.mosip.kernel.masterdata.dto.DocumentTypeDto; -import io.mosip.kernel.masterdata.dto.ExceptionalHolidayDto; -import io.mosip.kernel.masterdata.dto.LanguageDto; -import io.mosip.kernel.masterdata.dto.LocationDto; -import io.mosip.kernel.masterdata.dto.LocationHierarchyLevelDto; -import io.mosip.kernel.masterdata.dto.LocationHierarchyLevelResponseDto; -import io.mosip.kernel.masterdata.dto.TemplateDto; -import io.mosip.kernel.masterdata.dto.WeekDaysResponseDto; -import io.mosip.kernel.masterdata.dto.WorkingDaysResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.ApplicationResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.BiometricAttributeResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.BiometricTypeResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.BlockListedWordsResponse; -import io.mosip.kernel.masterdata.dto.getresponse.DocumentCategoryResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.ExceptionalHolidayResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.LanguageResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.LocationHierarchyDto; -import io.mosip.kernel.masterdata.dto.getresponse.LocationHierarchyResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.LocationResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.ResgistrationCenterStatusResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.StatusResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.TemplateResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.ValidDocumentTypeResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.WeekDaysDto; +import io.mosip.kernel.masterdata.dto.*; +import io.mosip.kernel.masterdata.dto.getresponse.*; import io.mosip.kernel.masterdata.dto.postresponse.CodeResponseDto; import io.mosip.kernel.masterdata.dto.postresponse.PostLocationCodeResponseDto; import io.mosip.kernel.masterdata.dto.request.FilterDto; @@ -93,33 +29,43 @@ import io.mosip.kernel.masterdata.repository.HolidayRepository; import io.mosip.kernel.masterdata.repository.IdTypeRepository; import io.mosip.kernel.masterdata.repository.RegistrationCenterRepository; -import io.mosip.kernel.masterdata.service.ApplicationService; -import io.mosip.kernel.masterdata.service.BiometricAttributeService; -import io.mosip.kernel.masterdata.service.BiometricTypeService; -import io.mosip.kernel.masterdata.service.BlocklistedWordsService; -import io.mosip.kernel.masterdata.service.DeviceService; -import io.mosip.kernel.masterdata.service.DeviceSpecificationService; -import io.mosip.kernel.masterdata.service.DeviceTypeService; -import io.mosip.kernel.masterdata.service.DocumentCategoryService; -import io.mosip.kernel.masterdata.service.DocumentTypeService; -import io.mosip.kernel.masterdata.service.DynamicFieldService; -import io.mosip.kernel.masterdata.service.ExceptionalHolidayService; -import io.mosip.kernel.masterdata.service.HolidayService; -import io.mosip.kernel.masterdata.service.LanguageService; -import io.mosip.kernel.masterdata.service.LocationHierarchyService; -import io.mosip.kernel.masterdata.service.LocationService; -import io.mosip.kernel.masterdata.service.MachineService; -import io.mosip.kernel.masterdata.service.MachineSpecificationService; -import io.mosip.kernel.masterdata.service.MachineTypeService; -import io.mosip.kernel.masterdata.service.RegWorkingNonWorkingService; -import io.mosip.kernel.masterdata.service.RegistrationCenterService; -import io.mosip.kernel.masterdata.service.RegistrationCenterTypeService; -import io.mosip.kernel.masterdata.service.TemplateFileFormatService; -import io.mosip.kernel.masterdata.service.TemplateService; -import io.mosip.kernel.masterdata.service.ZoneService; +import io.mosip.kernel.masterdata.service.*; import io.mosip.kernel.masterdata.test.TestBootApplication; import io.mosip.kernel.masterdata.utils.AuditUtil; import io.mosip.kernel.masterdata.utils.LocalDateTimeUtil; +import org.hamcrest.Matchers; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.RequestBuilder; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.web.client.RestTemplate; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.Month; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doNothing; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringRunner.class) @SpringBootTest(classes = TestBootApplication.class) @@ -1262,13 +1208,22 @@ public void updateBlockListedWordStatusTest() throws Exception { StatusResponseDto dto = new StatusResponseDto(); dto.setStatus("Status updated successfully for BlocklistedWords"); - Mockito.when(blocklistedWordsService.updateBlockListedWordStatus(Mockito.anyString(), Mockito.anyBoolean())) + Mockito.when(blocklistedWordsService.updateBlockListedWordStatus(Mockito.any(BlockListedWordStatusUpdateDto.class))) .thenReturn(dto); - RequestBuilder requestBuilder = MockMvcRequestBuilders.patch("/blocklistedwords").characterEncoding("UTF-8") - .accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON).param("word", "ABC") - .param("isActive", "true"); - mockMvc.perform(requestBuilder).andExpect(status().isOk()); + BlockListedWordStatusUpdateDto requestDto = new BlockListedWordStatusUpdateDto(); + requestDto.setWord("ABC"); + requestDto.setIsActive(true); + + ObjectMapper objectMapper = new ObjectMapper(); + String requestBody = objectMapper.writeValueAsString(requestDto); + + mockMvc.perform(MockMvcRequestBuilders.patch("/blocklistedwords") + .characterEncoding("UTF-8") + .accept(MediaType.APPLICATION_JSON_VALUE) + .contentType(MediaType.APPLICATION_JSON) + .content(requestBody)) + .andExpect(status().isOk()); } @Test diff --git a/admin/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/service/MasterDataServiceTest.java b/admin/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/service/MasterDataServiceTest.java index 075d71a979a..733f10ef8d4 100644 --- a/admin/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/service/MasterDataServiceTest.java +++ b/admin/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/service/MasterDataServiceTest.java @@ -1586,7 +1586,12 @@ public void updateBlockListedWordStatusSuccessTest() { when(wordsRepository.findtoUpdateBlocklistedWordByWord(Mockito.anyString())).thenReturn(words); when(masterdataCreationUtil.updateMasterDataStatus(Mockito.eq(BlocklistedWords.class), Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString())).thenReturn(1); - StatusResponseDto actual = blocklistedWordsService.updateBlockListedWordStatus("abc", false); + + BlockListedWordStatusUpdateDto requestDto = new BlockListedWordStatusUpdateDto(); + requestDto.setWord("abc"); + requestDto.setIsActive(false); + + StatusResponseDto actual = blocklistedWordsService.updateBlockListedWordStatus(requestDto); Assert.assertEquals(dto, actual); } @@ -1594,13 +1599,23 @@ public void updateBlockListedWordStatusSuccessTest() { public void updateBlockListedWordStatusFailureTest() { when(wordsRepository.findtoUpdateBlocklistedWordByWord(Mockito.anyString())) .thenThrow(MasterDataServiceException.class); - blocklistedWordsService.updateBlockListedWordStatus("abc", false); + + BlockListedWordStatusUpdateDto requestDto = new BlockListedWordStatusUpdateDto(); + requestDto.setWord("abc"); + requestDto.setIsActive(false); + + blocklistedWordsService.updateBlockListedWordStatus(requestDto); } @Test(expected = DataNotFoundException.class) public void updateBlockListedWordStatusFailureDataNotFoundTest() { when(wordsRepository.findtoUpdateBlocklistedWordByWord(Mockito.anyString())).thenReturn(null); - blocklistedWordsService.updateBlockListedWordStatus("abc", false); + + BlockListedWordStatusUpdateDto requestDto = new BlockListedWordStatusUpdateDto(); + requestDto.setWord("abc"); + requestDto.setIsActive(false); + + blocklistedWordsService.updateBlockListedWordStatus(requestDto); } // ------------------ DeviceSpecificationServiceTest -----------------//