From 0bb0b4594fbb6f137bd4d78e19dafe6efd99965a Mon Sep 17 00:00:00 2001 From: Christoph Date: Fri, 17 Apr 2020 14:55:43 +0200 Subject: [PATCH] initial group log --- .../mops/gruppen2/config/KeycloakConfig.java | 4 +- .../gruppen2/domain/event/AddMemberEvent.java | 5 +++ .../domain/event/CreateGroupEvent.java | 5 +++ .../domain/event/DestroyGroupEvent.java | 5 +++ .../mops/gruppen2/domain/event/Event.java | 7 ++++ .../domain/event/KickMemberEvent.java | 5 +++ .../domain/event/SetDescriptionEvent.java | 5 +++ .../domain/event/SetInviteLinkEvent.java | 5 +++ .../gruppen2/domain/event/SetLimitEvent.java | 5 +++ .../gruppen2/domain/event/SetParentEvent.java | 5 +++ .../gruppen2/domain/event/SetTitleEvent.java | 5 +++ .../gruppen2/domain/event/SetTypeEvent.java | 5 +++ .../domain/event/UpdateRoleEvent.java | 5 +++ .../domain/service/EventStoreService.java | 8 +++- .../controller/GroupDetailsController.java | 15 +++++++- .../gruppen2/persistance/EventRepository.java | 4 ++ .../gruppen2/persistance/dto/EventDTO.java | 4 ++ src/main/resources/application.properties | 8 ++-- src/main/resources/schema-h2.sql | 1 + src/main/resources/templates/edit.html | 15 +++++++- src/main/resources/templates/history.html | 37 +++++++++++++++++++ 21 files changed, 147 insertions(+), 11 deletions(-) create mode 100644 src/main/resources/templates/history.html diff --git a/src/main/java/mops/gruppen2/config/KeycloakConfig.java b/src/main/java/mops/gruppen2/config/KeycloakConfig.java index 0f7ba62..74e607d 100644 --- a/src/main/java/mops/gruppen2/config/KeycloakConfig.java +++ b/src/main/java/mops/gruppen2/config/KeycloakConfig.java @@ -22,10 +22,10 @@ public class KeycloakConfig { @Value("${keycloak.resource}") private String clientId; - @Value("9f8d3616-60d3-48ea-9d14-06ae9eeee5cb") + @Value("2e2e5770-c454-4d31-be99-9d8c34c93089") private String clientSecret; - @Value("https://gruppenkeycloak.herokuapp.com/auth/realms/Gruppen/protocol/openid-connect/token") + @Value("https://churl-keycloak.herokuapp.com/auth/realms/Gruppen/protocol/openid-connect/token") private String tokenUri; @Bean diff --git a/src/main/java/mops/gruppen2/domain/event/AddMemberEvent.java b/src/main/java/mops/gruppen2/domain/event/AddMemberEvent.java index e294cc1..d638ca2 100644 --- a/src/main/java/mops/gruppen2/domain/event/AddMemberEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/AddMemberEvent.java @@ -45,6 +45,11 @@ public class AddMemberEvent extends Event { log.trace("\t\t\t\t\tNeue Members: {}", group.getMembers()); } + @Override + public String format() { + return "Benutzer hinzugefügt: " + target + "."; + } + @Override public String type() { return EventType.ADDMEMBER.toString(); diff --git a/src/main/java/mops/gruppen2/domain/event/CreateGroupEvent.java b/src/main/java/mops/gruppen2/domain/event/CreateGroupEvent.java index c3457cb..8e55353 100644 --- a/src/main/java/mops/gruppen2/domain/event/CreateGroupEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/CreateGroupEvent.java @@ -39,6 +39,11 @@ public class CreateGroupEvent extends Event { log.trace("\t\t\t\t\tNeue Gruppe: {}", group.toString()); } + @Override + public String format() { + return "Gruppe erstellt."; + } + @Override public String type() { return EventType.CREATEGROUP.toString(); diff --git a/src/main/java/mops/gruppen2/domain/event/DestroyGroupEvent.java b/src/main/java/mops/gruppen2/domain/event/DestroyGroupEvent.java index 432c174..989db37 100644 --- a/src/main/java/mops/gruppen2/domain/event/DestroyGroupEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/DestroyGroupEvent.java @@ -30,6 +30,11 @@ public class DestroyGroupEvent extends Event { log.trace("\t\t\t\t\tGelöschte Gruppe: {}", group.toString()); } + @Override + public String format() { + return "Gruppe gelöscht."; + } + @Override public String type() { return EventType.DESTROYGROUP.toString(); diff --git a/src/main/java/mops/gruppen2/domain/event/Event.java b/src/main/java/mops/gruppen2/domain/event/Event.java index 7ef6a92..d1b484b 100644 --- a/src/main/java/mops/gruppen2/domain/event/Event.java +++ b/src/main/java/mops/gruppen2/domain/event/Event.java @@ -13,6 +13,7 @@ import mops.gruppen2.domain.exception.IdMismatchException; import mops.gruppen2.domain.model.group.Group; import mops.gruppen2.infrastructure.GroupCache; +import java.time.LocalDateTime; import java.util.UUID; @Log4j2 @@ -44,6 +45,9 @@ public abstract class Event { @JsonProperty("target") protected String target; + @JsonProperty("date") + protected LocalDateTime date; + public Event(UUID groupid, String exec, String target) { this.groupid = groupid; this.exec = exec; @@ -54,6 +58,7 @@ public abstract class Event { if (this.version != 0) { throw new BadArgumentException("Event wurde schon initialisiert. (" + type() + ")"); } + date = LocalDateTime.now(); log.trace("Event wurde initialisiert. (" + type() + "," + version + ")"); @@ -88,6 +93,8 @@ public abstract class Event { protected abstract void applyEvent(Group group) throws EventException; + public abstract String format(); + @JsonIgnore public abstract String type(); } diff --git a/src/main/java/mops/gruppen2/domain/event/KickMemberEvent.java b/src/main/java/mops/gruppen2/domain/event/KickMemberEvent.java index d5341d0..8d9a080 100644 --- a/src/main/java/mops/gruppen2/domain/event/KickMemberEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/KickMemberEvent.java @@ -34,6 +34,11 @@ public class KickMemberEvent extends Event { log.trace("\t\t\t\t\tNeue Members: {}", group.getMembers()); } + @Override + public String format() { + return "Mitglied entfernt: " + target + "."; + } + @Override public String type() { return EventType.KICKMEMBER.toString(); diff --git a/src/main/java/mops/gruppen2/domain/event/SetDescriptionEvent.java b/src/main/java/mops/gruppen2/domain/event/SetDescriptionEvent.java index f400d98..5ad51dd 100644 --- a/src/main/java/mops/gruppen2/domain/event/SetDescriptionEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/SetDescriptionEvent.java @@ -38,6 +38,11 @@ public class SetDescriptionEvent extends Event { log.trace("\t\t\t\t\tNeue Beschreibung: {}", group.getDescription()); } + @Override + public String format() { + return "Beschreibung gesetzt: " + description + "."; + } + @Override public String type() { return EventType.SETDESCRIPTION.toString(); diff --git a/src/main/java/mops/gruppen2/domain/event/SetInviteLinkEvent.java b/src/main/java/mops/gruppen2/domain/event/SetInviteLinkEvent.java index 72979c4..30c19e7 100644 --- a/src/main/java/mops/gruppen2/domain/event/SetInviteLinkEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/SetInviteLinkEvent.java @@ -38,6 +38,11 @@ public class SetInviteLinkEvent extends Event { log.trace("\t\t\t\t\tNeuer Link: {}", group.getLink()); } + @Override + public String format() { + return "Einladungslink gesetzt: " + link + "."; + } + @Override public String type() { return EventType.SETLINK.toString(); diff --git a/src/main/java/mops/gruppen2/domain/event/SetLimitEvent.java b/src/main/java/mops/gruppen2/domain/event/SetLimitEvent.java index f1b06eb..e69576b 100644 --- a/src/main/java/mops/gruppen2/domain/event/SetLimitEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/SetLimitEvent.java @@ -36,6 +36,11 @@ public class SetLimitEvent extends Event { log.trace("\t\t\t\t\tNeues UserLimit: {}", group.getLimit()); } + @Override + public String format() { + return "Benutzerlimit gesetzt: " + limit + "."; + } + @Override public String type() { return EventType.SETLIMIT.toString(); diff --git a/src/main/java/mops/gruppen2/domain/event/SetParentEvent.java b/src/main/java/mops/gruppen2/domain/event/SetParentEvent.java index 98f5fe9..2de2b60 100644 --- a/src/main/java/mops/gruppen2/domain/event/SetParentEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/SetParentEvent.java @@ -35,6 +35,11 @@ public class SetParentEvent extends Event { log.trace("\t\t\t\t\tNeues Parent: {}", group.getParent()); } + @Override + public String format() { + return "Veranstaltungszugehörigkeit gesetzt: " + parent.getValue() + "."; + } + @Override public String type() { return EventType.SETPARENT.toString(); diff --git a/src/main/java/mops/gruppen2/domain/event/SetTitleEvent.java b/src/main/java/mops/gruppen2/domain/event/SetTitleEvent.java index 1a5acd6..bdfa3d1 100644 --- a/src/main/java/mops/gruppen2/domain/event/SetTitleEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/SetTitleEvent.java @@ -38,6 +38,11 @@ public class SetTitleEvent extends Event { log.trace("\t\t\t\t\tNeuer Titel: {}", group.getTitle()); } + @Override + public String format() { + return "Titel gesetzt: " + title + "."; + } + @Override public String type() { return EventType.SETTITLE.toString(); diff --git a/src/main/java/mops/gruppen2/domain/event/SetTypeEvent.java b/src/main/java/mops/gruppen2/domain/event/SetTypeEvent.java index b62e09d..6b0af22 100644 --- a/src/main/java/mops/gruppen2/domain/event/SetTypeEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/SetTypeEvent.java @@ -37,6 +37,11 @@ public class SetTypeEvent extends Event { group.setType(exec, type); } + @Override + public String format() { + return "Gruppentype gesetzt: " + type + "."; + } + @Override public String type() { return EventType.SETTYPE.toString(); diff --git a/src/main/java/mops/gruppen2/domain/event/UpdateRoleEvent.java b/src/main/java/mops/gruppen2/domain/event/UpdateRoleEvent.java index 4df2fc8..e5f16fb 100644 --- a/src/main/java/mops/gruppen2/domain/event/UpdateRoleEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/UpdateRoleEvent.java @@ -38,6 +38,11 @@ public class UpdateRoleEvent extends Event { log.trace("\t\t\t\t\tNeue Admin: {}", group.getAdmins()); } + @Override + public String format() { + return "Mitgliedsrolle gesetzt: " + target + ": " + role + "."; + } + @Override public String type() { return EventType.UPDATEROLE.toString(); diff --git a/src/main/java/mops/gruppen2/domain/service/EventStoreService.java b/src/main/java/mops/gruppen2/domain/service/EventStoreService.java index a7cd712..84e1912 100644 --- a/src/main/java/mops/gruppen2/domain/service/EventStoreService.java +++ b/src/main/java/mops/gruppen2/domain/service/EventStoreService.java @@ -10,6 +10,7 @@ import mops.gruppen2.persistance.EventRepository; import mops.gruppen2.persistance.dto.EventDTO; import org.springframework.stereotype.Service; +import java.sql.Timestamp; import java.util.List; import java.util.stream.Collectors; @@ -59,7 +60,8 @@ public class EventStoreService { event.getExec(), event.getTarget(), event.type(), - payload); + payload, + Timestamp.valueOf(event.getDate())); } catch (JsonProcessingException e) { log.error("Event ({}) konnte nicht serialisiert werden!", event, e); throw new BadPayloadException(EventStoreService.class.toString()); @@ -95,4 +97,8 @@ public class EventStoreService { public List findAllEvents() { return getEventsFromDTOs(eventStore.findAllEvents()); } + + public List findGroupEvents(String groupId) { + return getEventsFromDTOs(eventStore.findGroupEvents(groupId)); + } } diff --git a/src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java b/src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java index 5fffd22..e3f412d 100644 --- a/src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java +++ b/src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java @@ -8,6 +8,7 @@ import mops.gruppen2.domain.model.group.User; import mops.gruppen2.domain.model.group.wrapper.Description; import mops.gruppen2.domain.model.group.wrapper.Limit; import mops.gruppen2.domain.model.group.wrapper.Title; +import mops.gruppen2.domain.service.EventStoreService; import mops.gruppen2.domain.service.GroupService; import mops.gruppen2.domain.service.helper.CsvHelper; import mops.gruppen2.domain.service.helper.ValidationHelper; @@ -37,6 +38,7 @@ public class GroupDetailsController { private final GroupCache groupCache; private final GroupService groupService; + private final EventStoreService eventStoreService; @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) @GetMapping("/details/{id}") @@ -94,6 +96,17 @@ public class GroupDetailsController { return "redirect:/gruppen2"; } + @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) + @GetMapping("details/{id}/history") + public String getDetailsHistory(KeycloakAuthenticationToken token, + Model model, + @PathVariable("id") String groupId) { + + model.addAttribute("events", eventStoreService.findGroupEvents(groupId)); + + return "history"; + } + @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) @GetMapping("/details/{id}/edit") public String getDetailsEdit(KeycloakAuthenticationToken token, @@ -127,8 +140,6 @@ public class GroupDetailsController { String principal = token.getName(); Group group = groupCache.group(UUID.fromString(groupId)); - System.out.println(group); - groupService.setTitle(group, principal, title); groupService.setDescription(group, principal, description); diff --git a/src/main/java/mops/gruppen2/persistance/EventRepository.java b/src/main/java/mops/gruppen2/persistance/EventRepository.java index 26a94bb..7abe489 100644 --- a/src/main/java/mops/gruppen2/persistance/EventRepository.java +++ b/src/main/java/mops/gruppen2/persistance/EventRepository.java @@ -3,6 +3,7 @@ package mops.gruppen2.persistance; import mops.gruppen2.persistance.dto.EventDTO; import org.springframework.data.jdbc.repository.query.Query; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -16,4 +17,7 @@ public interface EventRepository extends CrudRepository { @Query("SELECT * FROM event") List findAllEvents(); + + @Query("SELECT * FROM event WHERE group_id = :groupid") + List findGroupEvents(@Param("groupid") String groupId); } diff --git a/src/main/java/mops/gruppen2/persistance/dto/EventDTO.java b/src/main/java/mops/gruppen2/persistance/dto/EventDTO.java index d0c326f..1032027 100644 --- a/src/main/java/mops/gruppen2/persistance/dto/EventDTO.java +++ b/src/main/java/mops/gruppen2/persistance/dto/EventDTO.java @@ -5,6 +5,8 @@ import lombok.Getter; import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Table; +import java.sql.Timestamp; + @Table("event") @Getter @AllArgsConstructor @@ -21,4 +23,6 @@ public class EventDTO { String event_type; String event_payload; + + Timestamp timestamp; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c5dcd39..be154ec 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -11,12 +11,12 @@ spring.profiles.active = dev #keycloak.use-resource-role-mappings = true #keycloak.autodetect-bearer-only = true #keycloak.confidential-port = 443 -keycloak.auth-server-url = https://gruppenkeycloak.herokuapp.com/auth -hhu_keycloak.token-uri = https://gruppenkeycloak.herokuapp.com/auth/realms/Gruppen/protocol/openid-connect/token +keycloak.auth-server-url = https://churl-keycloak.herokuapp.com/auth +hhu_keycloak.token-uri = https://churl-keycloak.herokuapp.com/auth/realms/gruppen/protocol/openid-connect/token keycloak.principal-attribute = preferred_username -keycloak.realm = Gruppen +keycloak.realm = gruppen keycloak.resource = gruppen-app -keycloak.credentials.secret = 9f8d3616-60d3-48ea-9d14-06ae9eeee5cb +keycloak.credentials.secret = 2e2e5770-c454-4d31-be99-9d8c34c93089 keycloak.verify-token-audience = true keycloak.use-resource-role-mappings = true keycloak.autodetect-bearer-only = true diff --git a/src/main/resources/schema-h2.sql b/src/main/resources/schema-h2.sql index 46b52a7..8cc499d 100644 --- a/src/main/resources/schema-h2.sql +++ b/src/main/resources/schema-h2.sql @@ -8,5 +8,6 @@ CREATE TABLE event exec_id VARCHAR(50) NOT NULL, target_id VARCHAR(50), event_type VARCHAR(32) NOT NULL, + timestamp DATETIME NOT NULL, event_payload VARCHAR(2500) NOT NULL ); diff --git a/src/main/resources/templates/edit.html b/src/main/resources/templates/edit.html index e65cbdb..c2da10b 100644 --- a/src/main/resources/templates/edit.html +++ b/src/main/resources/templates/edit.html @@ -36,8 +36,7 @@
-
@@ -89,6 +88,18 @@ +
+
+ Event-Historie +
+
+ + + + Event-Log +
+
+
diff --git a/src/main/resources/templates/history.html b/src/main/resources/templates/history.html new file mode 100644 index 0000000..a472a0c --- /dev/null +++ b/src/main/resources/templates/history.html @@ -0,0 +1,37 @@ + + + + + +
+
+ +

Event-Log

+ +
+
+ + + + + Datum: + +
+ +
+ + + +
+
+ +
+
+ + +