Commit 39460a9e authored by Noel Alonso's avatar Noel Alonso
Browse files

Añade método para filtrar datos a posteriori

De esta manera, en get y mget donde no se puede filtar antes, se procesa
los datos para descartar aquellos que no cumplen con la lógica
establecido.
parent 9fd5d879
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.bedatadriven.jackson.datatype.jts.JtsModule;
@@ -59,6 +60,7 @@ import io.micrometer.core.instrument.MeterRegistry;
@SpringBootApplication(exclude = { MongoAutoConfiguration.class, ElasticsearchAutoConfiguration.class })
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan({ "es.redmic.api", "es.redmic.es", "es.redmic.databaselib", "es.redmic.db", "es.redmic.mediastorage",
		"es.redmic.utils" })
@EnableJpaRepositories(basePackages = { "es.redmic.db",
+28 −0
Original line number Diff line number Diff line
@@ -36,8 +36,11 @@ import es.redmic.api.common.controller.RWController;
import es.redmic.db.administrative.model.Document;
import es.redmic.db.administrative.service.DocumentService;
import es.redmic.es.administrative.service.DocumentESService;
import es.redmic.exception.common.NotFoundException;
import es.redmic.exception.data.ItemNotFoundException;
import es.redmic.models.es.administrative.dto.DocumentDTO;
import es.redmic.models.es.common.dto.ElasticSearchDTO;
import es.redmic.models.es.common.dto.JSONCollectionDTO;
import es.redmic.models.es.common.dto.SuperDTO;
import es.redmic.models.es.common.query.dto.MetadataQueryDTO;

@@ -83,4 +86,29 @@ public class DocumentController extends

		return new ElasticSearchDTO(serviceES.getActivities(convertToDataQuery(queryDTO), id));
	}

	@Override
	protected JSONCollectionDTO postFilter(JSONCollectionDTO jsonCollectionDTO) {

		List<String> roles = userService.getUserRole();

		if (jsonCollectionDTO.getTotal() > 0) {
			List<DocumentDTO> result = jsonCollectionDTO.getData();
			result.removeIf(tdto -> !roles.contains("ROLE_ADMINISTRATOR") && Boolean.FALSE.equals(tdto.getEnabled()));
			jsonCollectionDTO.setData(result);
		}
		return jsonCollectionDTO;
	}

	@Override
	protected DocumentDTO postFilter(DocumentDTO tdto) throws NotFoundException {

		List<String> roles = userService.getUserRole();

		if (!roles.contains("ROLE_ADMINISTRATOR") && Boolean.FALSE.equals(tdto.getEnabled())) {
			throw new  ItemNotFoundException("id", tdto.getId().toString());
		}

		return tdto;
	}
}
+11 −2
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import es.redmic.es.data.common.service.RDataESService;
import es.redmic.exception.common.NotFoundException;
import es.redmic.exception.databinding.DTONotValidException;
import es.redmic.models.es.common.dto.BaseDTO;
import es.redmic.models.es.common.dto.ElasticSearchDTO;
@@ -87,7 +88,7 @@ public abstract class RController<TModel extends BaseES<?>, TDTO extends BaseDTO
		if (errorDto.hasErrors())
			throw new DTONotValidException(errorDto);

		JSONCollectionDTO result = ESService.mget(dto);
		JSONCollectionDTO result = postFilter(ESService.mget(dto));
		return new ElasticSearchDTO(result, result.getTotal());
	}

@@ -95,7 +96,7 @@ public abstract class RController<TModel extends BaseES<?>, TDTO extends BaseDTO
	@ResponseBody
	public SuperDTO _get(@PathVariable("id") Long id) {

		TDTO response = ESService.get(id.toString());
		TDTO response = postFilter(ESService.get(id.toString()));
		return new ElasticSearchDTO(response, response == null ? 0 : 1);
	}

@@ -119,4 +120,12 @@ public abstract class RController<TModel extends BaseES<?>, TDTO extends BaseDTO
		List<String> response = ESService.suggest(convertToDataQuery((TQueryDTO) queryDTO));
		return new ElasticSearchDTO(response, response.size());
	}

	protected JSONCollectionDTO postFilter(JSONCollectionDTO jsonCollectionDTO) {
		return jsonCollectionDTO;
	}

	protected TDTO postFilter(TDTO tdto) throws NotFoundException {
		return tdto;
	}
}
+70 −0
Original line number Diff line number Diff line
@@ -21,8 +21,12 @@ package es.redmic.test.integration.administrative;
 */

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import java.util.ArrayList;
import java.util.List;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
@@ -57,6 +61,7 @@ import es.redmic.es.administrative.repository.DocumentESRepository;
import es.redmic.models.es.administrative.model.Document;
import es.redmic.models.es.common.model.DomainES;
import es.redmic.models.es.common.query.dto.MetadataQueryDTO;
import es.redmic.models.es.common.query.dto.MgetDTO;
import es.redmic.test.integration.common.IntegrationTestBase;

@RunWith(SpringJUnit4ClassRunner.class)
@@ -194,4 +199,69 @@ public class DocumentControllerTest extends IntegrationTestBase {
		result.andExpect(status().is2xxSuccessful());
		result.andExpect(jsonPath("$.body.data[0]", notNullValue()));
	}

	@Test
	public void checkDocumentController_NoReturnResult_IfMgetDocumentAsUserAndDocumentIsDisabled() throws Exception {

		MgetDTO query = new MgetDTO();
		List<String> ids = new ArrayList<>();
		ids.add(modelToIndex.getId().toString());
		query.setIds(ids);

		modelToIndex.setEnabled(false);
		modelToIndex = repository.save(modelToIndex);

		ResultActions result = this.mockMvc
			.perform(post(CONTROLLER_DOCUMENT + "/_mget").content(mapper.writeValueAsString(query))
				.contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).header("Authorization", "Bearer " + getTokenUser()));

		result.andExpect(status().is2xxSuccessful());
		result.andExpect(jsonPath("$.body.data.length()", is(0)));
	}

	@Test
	public void checkDocumentController_ReturnResult_IfMgetDocumentAsAdministratorAndDocumentIsDisabled() throws Exception {

		MgetDTO query = new MgetDTO();
		List<String> ids = new ArrayList<>();
		ids.add(modelToIndex.getId().toString());
		query.setIds(ids);

		modelToIndex.setEnabled(false);
		modelToIndex = repository.save(modelToIndex);

		ResultActions result = this.mockMvc
			.perform(post(CONTROLLER_DOCUMENT + "/_mget").content(mapper.writeValueAsString(query))
				.contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).header("Authorization", "Bearer " + getTokenAdministratorUser()));

		result.andExpect(status().is2xxSuccessful());
		result.andExpect(jsonPath("$.body.data[0]", notNullValue()));
	}

	@Test
	public void checkDocumentController_ThrowException_IfGetDocumentAsUserAndDocumentIsDisabled() throws Exception {

		modelToIndex.setEnabled(false);
		modelToIndex = repository.save(modelToIndex);

		ResultActions result = this.mockMvc
			.perform(get(CONTROLLER_DOCUMENT + "/" + modelToIndex.getId())
				.accept(MediaType.APPLICATION_JSON).header("Authorization", "Bearer " + getTokenUser()));

		result.andExpect(status().is4xxClientError());
	}

	@Test
	public void checkDocumentController_ReturnResult_IfGetDocumentAsAdministratorAndDocumentIsDisabled() throws Exception {

		modelToIndex.setEnabled(false);
		modelToIndex = repository.save(modelToIndex);

		ResultActions result = this.mockMvc
			.perform(get(CONTROLLER_DOCUMENT + "/" + modelToIndex.getId())
				.accept(MediaType.APPLICATION_JSON).header("Authorization", "Bearer " + getTokenAdministratorUser()));

		result.andExpect(status().is2xxSuccessful());
		result.andExpect(jsonPath("$.body.id", is(33)));
	}
}