Skip to content

Commit

Permalink
schedule als eventlog events
Browse files Browse the repository at this point in the history
  • Loading branch information
Marc Gorzala committed Dec 27, 2023
1 parent 19004e3 commit e3ed39c
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
package net.dancier.dancer.core.events;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import net.dancier.dancer.core.ScheduleMessagePort;
import net.dancier.dancer.eventlog.service.EventlogService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContextException;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

Expand All @@ -20,7 +17,7 @@ public class ApplicationEventListener {

public static final Logger log = LoggerFactory.getLogger(ApplicationEventListener.class);

private static final URI FRONTEND_SOURCE = URI.create("http://dancier.net");
public static final URI FRONTEND_SOURCE = URI.create("http://dancier.net");
private static final URI BACKEND_SOURCE = URI.create("http://dancer.dancier.net");

private final EventlogService eventlogService;
Expand All @@ -29,8 +26,6 @@ public class ApplicationEventListener {

private final ScheduleMessagePort scheduleMessagePort;

private final ObjectMapper objectMapper;

@EventListener
@Transactional
public void handle(ProfileUpdatedEvent profileUpdatedEvent) {
Expand All @@ -44,7 +39,5 @@ public void handle(ProfileUpdatedEvent profileUpdatedEvent) {
profileUpdatedEvent.getDancer().getId().toString(),
BACKEND_SOURCE,
"profile-updated");

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.dancier.dancer.authentication.model.Role;
import net.dancier.dancer.core.ScheduleMessagePort;
import net.dancier.dancer.core.exception.ApplicationException;
import net.dancier.dancer.core.exception.BusinessException;
import net.dancier.dancer.eventlog.model.Eventlog;
import net.dancier.dancer.eventlog.repository.EventlogDAO;
import org.slf4j.Logger;
Expand All @@ -16,6 +18,9 @@
import java.time.Instant;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;

import static net.dancier.dancer.core.events.ApplicationEventListener.FRONTEND_SOURCE;

@Service
@RequiredArgsConstructor
Expand All @@ -25,6 +30,7 @@ public class EventlogService {

private final EventlogDAO eventlogDAO;

private final ScheduleMessagePort scheduleMessagePort;
private final static Set<String> DEFAULT_AUTHENTICATED = Set.of("ROLE_USER", "ROLE_ADMIN");
private final static Set<String> AT_LEAST_HUMAN = Set.of("ROLE_HUMAN", "ROLE_USER", "ROLE_ADMIN");
private final static Set<String> NO_SPECIAL_ROLE_NEEDED = Set.of();
Expand All @@ -33,7 +39,7 @@ public class EventlogService {
EventlogConfig.of("navigated_to_page", NO_SPECIAL_ROLE_NEEDED),
EventlogConfig.of("human_session_created", AT_LEAST_HUMAN),
EventlogConfig.of("contact_message_sent", AT_LEAST_HUMAN),
EventlogConfig.of("profile_updated", DEFAULT_AUTHENTICATED) // will not go over the eventlog stuff in the future...
EventlogConfig.of("profile-updated", DEFAULT_AUTHENTICATED) // will not go over the eventlog stuff in the future...
);

public void appendNew(Eventlog eventlog) {
Expand All @@ -46,15 +52,37 @@ public void appendNew(Eventlog eventlog) {
} catch (SQLException sqlException) {
throw new ApplicationException("Unable to create new Eventlog-Entry.", sqlException);
}
scheduleMessagePort.schedule(
eventlog,
eventlog.getId().toString(),
FRONTEND_SOURCE,
eventlog.getTopic());
}

private void validateTopic(Eventlog eventlog) {
String topic = eventlog.getTopic();
log.info("Validating Topic: {}", eventlog.getTopic());
if (!allowedEvents.stream()
.map(EventlogConfig::getName)
.collect(Collectors.toSet())
.contains(topic)) {
throw new BusinessException("this eventlog topic is not allowed at all: " + topic);
}

}
private void authorize(Eventlog eventlog) {
String topic = eventlog.getTopic();
Set<String> usedRoles = eventlog.getRoles();
Set<String> neededRoles = allowedEvents
.stream()
.filter(eventlogConfig -> eventlogConfig.name.equals(topic))
.flatMap(eventlogConfig -> eventlogConfig.neededRoles.stream())
.collect(Collectors.toSet());
log.info("Authorizing eventlog request: {}", topic);
Boolean authorized = usedRoles.stream().anyMatch(usedRole -> neededRoles.contains(usedRole));
if (!authorized) {
throw new BusinessException("We got this roles: " + usedRoles + " but needed this:" + neededRoles);
}
}

@AllArgsConstructor(access = AccessLevel.PRIVATE)
Expand Down

0 comments on commit e3ed39c

Please sign in to comment.