Commit 3ccc443e authored by Noel Alonso's avatar Noel Alonso
Browse files

Añade comprobación al borrar categorías + tests

Si una categoría tiene un hijo no se puede borrar
parent 6e554f32
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ public class CategoryController extends DataController<Category, CategoryDTO, Si
		try {
			result = service.save(mapper.getMapperFacade().map(event.getCategory(), Category.class));
		} catch (Exception e) {
			e.printStackTrace();
			publishFailedEvent(CategoryEventFactory.getEvent(event, CategoryEventTypes.CREATE_FAILED,
					ExceptionType.INTERNAL_EXCEPTION.name(), null), category_topic);
			return;
@@ -91,6 +92,7 @@ public class CategoryController extends DataController<Category, CategoryDTO, Si
		try {
			result = service.update(mapper.getMapperFacade().map(event.getCategory(), Category.class));
		} catch (Exception e) {
			e.printStackTrace();
			publishFailedEvent(CategoryEventFactory.getEvent(event, CategoryEventTypes.UPDATE_FAILED,
					ExceptionType.INTERNAL_EXCEPTION.name(), null), category_topic);
			return;
@@ -112,6 +114,7 @@ public class CategoryController extends DataController<Category, CategoryDTO, Si
		try {
			result = service.delete(event.getAggregateId());
		} catch (Exception e) {
			e.printStackTrace();
			publishFailedEvent(CategoryEventFactory.getEvent(event, CategoryEventTypes.DELETE_FAILED,
					ExceptionType.INTERNAL_EXCEPTION.name(), null), category_topic);
			return;
+33 −1
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.join.query.HasChildQueryBuilder;
import org.elasticsearch.join.query.JoinQueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Repository;
@@ -139,7 +140,38 @@ public class CategoryESRepository extends RWDataESRepository<Category, SimpleQue
	@Override
	protected EventApplicationResult checkDeleteConstraintsFulfilled(String modelToIndexId) {

		// TODO: mirar si tiene hijos
		HasChildQueryBuilder hasChildTerm = JoinQueryBuilders.hasChildQuery(Layer.JOIN_INDEX_NAME,
				QueryBuilders.matchAllQuery(), ScoreMode.None);

		MultiSearchRequest request = new MultiSearchRequest();

		SearchSourceBuilder requestBuilderHasChild = new SearchSourceBuilder().query(hasChildTerm).size(1);

		request.add(new SearchRequest().indices(getIndex()).source(requestBuilderHasChild));

		// @formatter:on

		MultiSearchResponse sr;
		try {
			sr = ESProvider.getClient().msearch(request, RequestOptions.DEFAULT);
		} catch (IOException e) {
			e.printStackTrace();
			throw new ESQueryException();
		}

		Map<String, String> arguments = new HashMap<>();

		Item[] responses = sr.getResponses();

		if (responses != null && responses[0].getResponse().getHits().getTotalHits() > 0) {
			arguments.put(ID_PROPERTY, modelToIndexId);
		}

		if (arguments.size() > 0) {
			// TODO: crear excepción propia
			return new EventApplicationResult(ExceptionType.ES_UPDATE_DOCUMENT.toString(), arguments);
		}

		return new EventApplicationResult(true);
	}

+29 −3
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ package es.redmic.test.atlasview.integration.handler;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.Map;
import java.util.UUID;
@@ -64,12 +63,15 @@ import es.redmic.atlaslib.events.category.update.UpdateCategoryEvent;
import es.redmic.atlaslib.events.category.update.UpdateCategoryFailedEvent;
import es.redmic.atlasview.AtlasViewApplication;
import es.redmic.atlasview.model.category.Category;
import es.redmic.atlasview.model.layer.Layer;
import es.redmic.atlasview.repository.category.CategoryESRepository;
import es.redmic.atlasview.repository.layer.LayerESRepository;
import es.redmic.brokerlib.avro.common.Event;
import es.redmic.brokerlib.listener.SendListener;
import es.redmic.exception.data.ItemNotFoundException;
import es.redmic.models.es.data.common.model.DataHitWrapper;
import es.redmic.testutils.documentation.DocumentationViewBaseTest;
import es.redmic.testutils.utils.JsonToBeanTestUtil;
import es.redmic.viewlib.config.MapperScanBeanItfc;

@SpringBootTest(classes = { AtlasViewApplication.class })
@@ -88,6 +90,9 @@ public class CategoryEventHandlerTest extends DocumentationViewBaseTest {
	@Autowired
	CategoryESRepository repository;

	@Autowired
	LayerESRepository layerRepository;

	protected static BlockingQueue<Object> blockingQueue;

	@Autowired
@@ -259,8 +264,29 @@ public class CategoryEventHandlerTest extends DocumentationViewBaseTest {
	@Test
	public void sendCategoryDeleteEvent_PublishDeleteCategoryFailedEvent_IfNoConstraintsFulfilled() throws Exception {

		// TODO: Implementar cuando se metan las referencias en la vista.
		assertTrue(true);
		CategoryDTO category = getCategory();

		// Guarda el que se va a borrar
		repository.save(mapper.getMapperFacade().map(category, Category.class));

		Layer layer = (Layer) JsonToBeanTestUtil.getBean("/data/model/layer/layer.json", Layer.class);
		layer.getJoinIndex().setParent(category.getId());

		// guarda un hijo
		layerRepository.save(layer, category.getId());

		DeleteCategoryEvent event = getDeleteCategoryEvent();

		ListenableFuture<SendResult<String, Event>> future = kafkaTemplate.send(CATEGORY_TOPIC, event.getAggregateId(),
				event);
		future.addCallback(new SendListener());

		Event failed = (Event) blockingQueue.poll(50, TimeUnit.SECONDS);
		assertNotNull(failed);
		assertEquals(CategoryEventTypes.DELETE_FAILED.toString(), failed.getType());

		layerRepository.delete(layer.getId(), category.getId());
		repository.delete(category.getId());
	}

	@KafkaHandler