Commit 1df81393 authored by Noel Alonso's avatar Noel Alonso
Browse files

Añade componentes para edición parcial + tests

De esta manera se podrá editar el vesselType de un vessel sin
enviar todo el documento
parent ce0cd6f2
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -16,9 +16,11 @@ import es.redmic.vesselslib.events.vessel.create.CreateVesselConfirmedEvent;
import es.redmic.vesselslib.events.vessel.create.CreateVesselEvent;
import es.redmic.vesselslib.events.vessel.delete.DeleteVesselConfirmedEvent;
import es.redmic.vesselslib.events.vessel.delete.DeleteVesselEvent;
import es.redmic.vesselslib.events.vessel.partialupdate.vesseltype.UpdateVesselTypeInVesselEvent;
import es.redmic.vesselslib.events.vessel.update.UpdateVesselConfirmedEvent;
import es.redmic.vesselslib.events.vessel.update.UpdateVesselEvent;
import es.redmic.vesselsview.model.Vessel;
import es.redmic.vesselsview.model.VesselType;
import es.redmic.vesselsview.service.VesselESService;
import es.redmic.vesselsview.utils.VesselEventFactory;
import es.redmic.viewlib.common.controller.RWController;
@@ -94,6 +96,31 @@ public class VesselController extends RWController<Vessel, VesselDTO, MetadataQu
		}
	}

	@KafkaHandler
	public void listen(UpdateVesselTypeInVesselEvent event) {

		logger.info("Modificar vesseltype en vessel");

		EventApplicationResult result = null;

		try {
			result = service.updateVesselTypeInVessel(event.getAggregateId(),
					mapper.getMapperFacade().map(event.getVesselType(), VesselType.class));
		} catch (Exception e) {
			publishFailedEvent(
					VesselEventFactory.getUpdateVesselFailedEvent(event, ExceptionType.INTERNAL_EXCEPTION.name(), null),
					vessel_topic);
		}

		if (result.isSuccess()) {
			logger.info("Vessel modificado en la vista");
			publishConfirmedEvent(new UpdateVesselConfirmedEvent().buildFrom(event), vessel_topic);
		} else {
			publishFailedEvent(VesselEventFactory.getUpdateVesselFailedEvent(event, result.getExeptionType(),
					result.getExceptionArguments()), vessel_topic);
		}
	}

	@KafkaHandler
	public void listen(DeleteVesselEvent event) {

+21 −0
Original line number Diff line number Diff line
package es.redmic.vesselsview.repository;

import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@@ -7,6 +10,7 @@ import org.elasticsearch.action.search.MultiSearchRequestBuilder;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.MultiSearchResponse.Item;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
@@ -17,6 +21,7 @@ import es.redmic.exception.common.ExceptionType;
import es.redmic.models.es.common.dto.EventApplicationResult;
import es.redmic.models.es.common.query.dto.MetadataQueryDTO;
import es.redmic.vesselsview.model.Vessel;
import es.redmic.vesselsview.model.VesselType;
import es.redmic.viewlib.data.repository.IDataRepository;

@Repository
@@ -37,6 +42,22 @@ public class VesselESRepository extends RWDataESRepository<Vessel, MetadataQuery
		super(INDEX, TYPE);
	}

	@SuppressWarnings("unchecked")
	public EventApplicationResult updateVesselTypeInVessel(String vesselId, VesselType vesselType) {

		XContentBuilder doc;

		try {
			doc = jsonBuilder().startObject().field("type", objectMapper.convertValue(vesselType, Map.class))
					.endObject();
		} catch (IllegalArgumentException | IOException e1) {
			LOGGER.debug("Error modificando el item con id " + vesselId + " en " + getIndex()[0] + " " + getType()[0]);
			return new EventApplicationResult(ExceptionType.ES_UPDATE_DOCUMENT.toString());
		}

		return update(vesselId, doc);
	}

	@Override
	protected EventApplicationResult checkInsertConstraintsFulfilled(Vessel modelToIndex) {

+9 −0
Original line number Diff line number Diff line
@@ -3,17 +3,26 @@ package es.redmic.vesselsview.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import es.redmic.models.es.common.dto.EventApplicationResult;
import es.redmic.models.es.common.query.dto.MetadataQueryDTO;
import es.redmic.vesselslib.dto.VesselDTO;
import es.redmic.vesselsview.model.Vessel;
import es.redmic.vesselsview.model.VesselType;
import es.redmic.vesselsview.repository.VesselESRepository;
import es.redmic.viewlib.data.service.RWDataService;

@Service
public class VesselESService extends RWDataService<Vessel, VesselDTO, MetadataQueryDTO> {

	VesselESRepository repository;

	@Autowired
	public VesselESService(VesselESRepository repository) {
		super(repository);
		this.repository = repository;
	}

	public EventApplicationResult updateVesselTypeInVessel(String vesselId, VesselType model) {
		return repository.updateVesselTypeInVessel(vesselId, model);
	}
}
+47 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import es.redmic.vesselslib.events.vessel.create.CreateVesselFailedEvent;
import es.redmic.vesselslib.events.vessel.delete.DeleteVesselConfirmedEvent;
import es.redmic.vesselslib.events.vessel.delete.DeleteVesselEvent;
import es.redmic.vesselslib.events.vessel.delete.DeleteVesselFailedEvent;
import es.redmic.vesselslib.events.vessel.partialupdate.vesseltype.UpdateVesselTypeInVesselEvent;
import es.redmic.vesselslib.events.vessel.update.UpdateVesselConfirmedEvent;
import es.redmic.vesselslib.events.vessel.update.UpdateVesselEvent;
import es.redmic.vesselslib.events.vessel.update.UpdateVesselFailedEvent;
@@ -155,6 +156,37 @@ public class VesselEventHandlerTest extends DocumentationViewBaseTest {
		assertEquals(vessel.getName(), event.getVessel().getName());
	}

	@Test
	public void sendUpdateVesselTypeInVesselEvent_UpdateItem_IfEventIsOk() throws Exception {

		UpdateVesselEvent event = getUpdateVesselEvent();

		repository.save(mapper.getMapperFacade().map(event.getVessel(), Vessel.class));

		UpdateVesselTypeInVesselEvent updateEvent = getUpdateVesselTypeInVesselEvent();

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

		Event confirm = (Event) blockingQueue.poll(50, TimeUnit.SECONDS);

		DataHitWrapper<?> item = repository.findById(event.getAggregateId());
		assertNotNull(item.get_source());

		// Se restablece el estado de la vista
		repository.delete(event.getVessel().getId());

		assertNotNull(confirm);
		assertEquals(VesselEventTypes.UPDATE_CONFIRMED.toString(), confirm.getType());

		Vessel vessel = (Vessel) item.get_source();
		assertEquals(vessel.getId(), event.getAggregateId());
		assertEquals(vessel.getMmsi(), event.getVessel().getMmsi());
		assertEquals(vessel.getName(), event.getVessel().getName());
		assertEquals(vessel.getType().getName(), updateEvent.getVesselType().getName());
	}

	@Test(expected = ItemNotFoundException.class)
	public void sendVesselDeleteEvent_DeleteItem_IfEventIsOk() throws Exception {

@@ -353,6 +385,21 @@ public class VesselEventHandlerTest extends DocumentationViewBaseTest {
		return updatedEvent;
	}

	protected UpdateVesselTypeInVesselEvent getUpdateVesselTypeInVesselEvent() {

		UpdateVesselTypeInVesselEvent event = new UpdateVesselTypeInVesselEvent().buildFrom(getUpdateVesselEvent());

		VesselDTO vessel = getVessel();
		vessel.getType().setName("Nombre cambiado");
		event.setVesselType(vessel.getType());
		event.setAggregateId(vessel.getId());
		event.setVersion(3);
		event.setSessionId(UUID.randomUUID().toString());
		event.setUserId(USER_ID);

		return event;
	}

	protected DeleteVesselEvent getDeleteVesselEvent() {

		DeleteVesselEvent deletedEvent = new DeleteVesselEvent();