Skip to content

Commit

Permalink
Merge pull request #19 from FINTLabs/FFS-128-prov-igjen-knappen-i-fro…
Browse files Browse the repository at this point in the history
…ntend-skal-kun-vaere-tilgjengelig-om-instansen-fortsatt-eksisterer

Ffs 128 prov igjen knappen i frontend skal kun vaere tilgjengelig om instansen fortsatt eksisterer
  • Loading branch information
Battlestad authored Oct 2, 2024
2 parents 3f582a1 + c8eeb12 commit 62343d4
Show file tree
Hide file tree
Showing 10 changed files with 259 additions and 57 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package no.fintlabs;

public class EventTopicNames {
public class EventNames {

private EventTopicNames() {
private EventNames() {
}

public static String INSTANCE_RECEIVED = "instance-received";
Expand Down
147 changes: 147 additions & 0 deletions src/main/java/no/fintlabs/EventService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
package no.fintlabs;

import lombok.AllArgsConstructor;
import no.fintlabs.model.Event;
import no.fintlabs.model.EventDto;
import no.fintlabs.model.ManualEventDto;
import no.fintlabs.repositories.EventRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import static no.fintlabs.EventNames.INSTANCE_DELETED;

@Service
@AllArgsConstructor
public class EventService {

private final EventRepository eventRepository;

public void save(Event event) {
eventRepository.save(event);
}

public Page<EventDto> findAll(Pageable pageable) {
return convertPageOfEventIntoPageOfEventDto(eventRepository.findAll(pageable));
}

public Page<EventDto> getMergedLatestEvents(Pageable pageable) {
List<Event> latestEvents = eventRepository
.findLatestEventPerSourceApplicationInstanceId(pageable).getContent();

List<Event> latestNonDeletedEvents = eventRepository
.findLatestEventNotDeletedPerSourceApplicationInstanceId(pageable).getContent();

return getEventDtos(pageable, latestNonDeletedEvents, latestEvents);
}

public Page<EventDto> getMergedLatestEventsWhereSourceApplicationIdIn(
List<Long> sourceApplicationIds,
Pageable pageable
) {
List<Event> latestEvents = eventRepository
.findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn(
sourceApplicationIds,
pageable
).getContent();

List<Event> latestNonDeletedEvents = eventRepository
.findLatestEventNotDeletedPerSourceApplicationInstanceIdAndSourceApplicationIdIn(
sourceApplicationIds,
pageable
).getContent();

return getEventDtos(pageable, latestNonDeletedEvents, latestEvents);
}

private PageImpl<EventDto> getEventDtos(Pageable pageable, List<Event> latestNonDeletedEvents, List<Event> latestEvents) {
Map<String, Event> nonDeletedEventMap = latestNonDeletedEvents.stream()
.collect(
Collectors.toMap(
event -> event.getInstanceFlowHeaders().getSourceApplicationInstanceId(),
event -> event
)
);

List<EventDto> mergedEvents = new ArrayList<>();

for (Event latestEvent : latestEvents) {
if (INSTANCE_DELETED.equals(latestEvent.getName())) {
Event nonDeletedEvent = nonDeletedEventMap
.get(latestEvent.getInstanceFlowHeaders().getSourceApplicationInstanceId());
if (nonDeletedEvent != null) {
EventDto updatedEventDto = EventToEventDto(nonDeletedEvent);
updatedEventDto.setStatus(INSTANCE_DELETED);
mergedEvents.add(updatedEventDto);
}
} else {
EventDto eventDto = EventToEventDto(latestEvent);
mergedEvents.add(eventDto);
}
}

int start = (int) pageable.getOffset();
int end = Math.min((start + pageable.getPageSize()), mergedEvents.size());

List<EventDto> paginatedList = mergedEvents.subList(start, end);

return new PageImpl<>(paginatedList, pageable, mergedEvents.size());
}

public Optional<Event> findFirstByInstanceFlowHeadersSourceApplicationIdAndInstanceFlowHeadersSourceApplicationInstanceIdAndInstanceFlowHeadersSourceApplicationIntegrationIdOrderByTimestampDesc(
ManualEventDto manualEventDto
) {
return eventRepository.
findFirstByInstanceFlowHeadersSourceApplicationIdAndInstanceFlowHeadersSourceApplicationInstanceIdAndInstanceFlowHeadersSourceApplicationIntegrationIdOrderByTimestampDesc(
manualEventDto.getSourceApplicationId(),
manualEventDto.getSourceApplicationInstanceId(),
manualEventDto.getSourceApplicationIntegrationId()
);
}

public Page<EventDto> findAllByInstanceFlowHeadersSourceApplicationIdAndInstanceFlowHeadersSourceApplicationInstanceId(
Long sourceApplicationId,
String sourceApplicationInstanceId,
Pageable pageable
) {
return convertPageOfEventIntoPageOfEventDto(
eventRepository.findAllByInstanceFlowHeadersSourceApplicationIdAndInstanceFlowHeadersSourceApplicationInstanceId(
sourceApplicationId, sourceApplicationInstanceId, pageable
)
);
}

public Page<EventDto> findAllByInstanceFlowHeadersSourceApplicationIdIn(
List<Long> sourceApplicationIds,
Pageable pageable
) {
return convertPageOfEventIntoPageOfEventDto(
eventRepository.findAllByInstanceFlowHeadersSourceApplicationIdIn(
sourceApplicationIds,
pageable
)
);
}

private Page<EventDto> convertPageOfEventIntoPageOfEventDto(Page<Event> events) {
return events.map(this::EventToEventDto);
}

private EventDto EventToEventDto(Event event) {
return EventDto.builder()
.instanceFlowHeaders(event.getInstanceFlowHeaders())
.name(event.getName())
.timestamp(event.getTimestamp())
.type(event.getType())
.applicationId(event.getApplicationId())
.errors(event.getErrors())
.build();
}
}
49 changes: 24 additions & 25 deletions src/main/java/no/fintlabs/HistoryController.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package no.fintlabs;

import no.fintlabs.model.*;
import no.fintlabs.repositories.EventRepository;
import no.fintlabs.resourceserver.security.user.UserAuthorizationUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
Expand All @@ -28,18 +27,21 @@
@RequestMapping(INTERNAL_API + "/historikk")
public class HistoryController {

private final EventRepository eventRepository;
private final EventService eventService;
private final StatisticsService statisticsService;
@Value("${fint.flyt.resource-server.user-permissions-consumer.enabled:false}")
private boolean userPermissionsConsumerEnabled;

public HistoryController(EventRepository eventRepository, StatisticsService statisticsService) {
this.eventRepository = eventRepository;
public HistoryController(
EventService eventService,
StatisticsService statisticsService
) {
this.eventService = eventService;
this.statisticsService = statisticsService;
}

@GetMapping("hendelser")
public ResponseEntity<Page<Event>> getEvents(
public ResponseEntity<Page<EventDto>> getEvents(
@AuthenticationPrincipal Authentication authentication,
@RequestParam(name = "side") int page,
@RequestParam(name = "antall") int size,
Expand All @@ -54,7 +56,7 @@ public ResponseEntity<Page<Event>> getEvents(
return getResponseEntityEvents(authentication, pageRequest, onlyLatestPerInstance);
}

private ResponseEntity<Page<Event>> getResponseEntityEvents(
private ResponseEntity<Page<EventDto>> getResponseEntityEvents(
Authentication authentication,
Pageable pageable,
Optional<Boolean> onlyLatestPerInstance
Expand All @@ -65,22 +67,22 @@ private ResponseEntity<Page<Event>> getResponseEntityEvents(

return ResponseEntity.ok(
onlyLatestPerInstance.orElse(false)
? eventRepository
.findLatestEventPerSourceApplicationInstanceIdAndSourceApplicationIdIn(
? eventService
.getMergedLatestEventsWhereSourceApplicationIdIn(
sourceApplicationIds,
pageable
)
: eventRepository.findAllByInstanceFlowHeadersSourceApplicationIdIn(sourceApplicationIds, pageable));
: eventService.findAllByInstanceFlowHeadersSourceApplicationIdIn(sourceApplicationIds, pageable));
}
return ResponseEntity.ok(
onlyLatestPerInstance.orElse(false)
? eventRepository.findLatestEventPerSourceApplicationInstanceId(pageable)
: eventRepository.findAll(pageable)
? eventService.getMergedLatestEvents(pageable)
: eventService.findAll(pageable)
);
}

@GetMapping(path = "hendelser", params = {"kildeapplikasjonId", "kildeapplikasjonInstansId"})
public ResponseEntity<Page<Event>> getEventsWithInstanceId(
public ResponseEntity<Page<EventDto>> getEventsWithInstanceId(
@AuthenticationPrincipal Authentication authentication,
@RequestParam(name = "side") int page,
@RequestParam(name = "antall") int size,
Expand All @@ -97,7 +99,7 @@ public ResponseEntity<Page<Event>> getEventsWithInstanceId(
.withSort(sortDirection, sortProperty);

return ResponseEntity.ok(
eventRepository
eventService
.findAllByInstanceFlowHeadersSourceApplicationIdAndInstanceFlowHeadersSourceApplicationInstanceId(
sourceApplicationId,
sourceApplicationInstanceId,
Expand All @@ -114,9 +116,9 @@ public ResponseEntity<?> setManuallyProcessed(
if (userPermissionsConsumerEnabled) {
UserAuthorizationUtil.checkIfUserHasAccessToSourceApplication(authentication, manuallyProcessedEventDto.getSourceApplicationId());
}
return storeManualEvent(
return this.storeManualEvent(
manuallyProcessedEventDto,
existingEvent -> createManualEvent(
existingEvent -> this.createManualEvent(
existingEvent,
"instance-manually-processed",
manuallyProcessedEventDto.getArchiveInstanceId()
Expand All @@ -132,22 +134,20 @@ public ResponseEntity<?> setManuallyRejected(
if (userPermissionsConsumerEnabled) {
UserAuthorizationUtil.checkIfUserHasAccessToSourceApplication(authentication, manuallyRejectedEventDto.getSourceApplicationId());
}
return storeManualEvent(
return this.storeManualEvent(
manuallyRejectedEventDto,
existingEvent -> createManualEvent(
existingEvent -> this.createManualEvent(
existingEvent,
"instance-manually-rejected",
null
)
);
}

private ResponseEntity<?> storeManualEvent(ManualEventDto manualEventDto, Function<Event, Event> existingToNewEvent) {
Optional<Event> optionalEvent = eventRepository.
public ResponseEntity<?> storeManualEvent(ManualEventDto manualEventDto, Function<Event, Event> existingToNewEvent) {
Optional<Event> optionalEvent = eventService.
findFirstByInstanceFlowHeadersSourceApplicationIdAndInstanceFlowHeadersSourceApplicationInstanceIdAndInstanceFlowHeadersSourceApplicationIntegrationIdOrderByTimestampDesc(
manualEventDto.getSourceApplicationId(),
manualEventDto.getSourceApplicationInstanceId(),
manualEventDto.getSourceApplicationIntegrationId()
manualEventDto
);

if (optionalEvent.isEmpty()) {
Expand All @@ -162,13 +162,12 @@ private ResponseEntity<?> storeManualEvent(ManualEventDto manualEventDto, Functi

Event newEvent = existingToNewEvent.apply(event);

eventRepository.save(newEvent);
eventService.save(newEvent);

return ResponseEntity.ok(newEvent);
}

private Event createManualEvent(Event event, String name, String archiveId) {

public Event createManualEvent(Event event, String name, String archiveId) {
InstanceFlowHeadersEmbeddable.InstanceFlowHeadersEmbeddableBuilder headersEmbeddableBuilder =
event.getInstanceFlowHeaders()
.toBuilder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import java.util.Collection;
import java.util.stream.Collectors;

import static no.fintlabs.EventTopicNames.*;
import static no.fintlabs.EventNames.*;

@Configuration
public class ErrorEventConsumerConfiguration {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import java.time.Instant;
import java.time.ZoneOffset;

import static no.fintlabs.EventTopicNames.*;
import static no.fintlabs.EventNames.*;

@Configuration
public class InfoEventConsumerConfiguration {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.listener.ConcurrentMessageListenerContainer;

import static no.fintlabs.EventTopicNames.INSTANCE_REGISTERED;
import static no.fintlabs.EventNames.INSTANCE_REGISTERED;

@Configuration
public class InstanceFlowHeadersForRegisteredInstanceRequestConsumerConfiguration {
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/no/fintlabs/model/EventDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package no.fintlabs.model;

import lombok.*;

import java.time.OffsetDateTime;
import java.util.Collection;

@Getter
@Setter
@Builder(toBuilder = true)
@AllArgsConstructor
public class EventDto {
private InstanceFlowHeadersEmbeddable instanceFlowHeaders;
private String name;
private OffsetDateTime timestamp;
private EventType type;
private String applicationId;
private Collection<Error> errors;
private String status;

public EventDto() {
}
}
Loading

0 comments on commit 62343d4

Please sign in to comment.