initial group log
This commit is contained in:
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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<Event> findAllEvents() {
|
||||
return getEventsFromDTOs(eventStore.findAllEvents());
|
||||
}
|
||||
|
||||
public List<Event> findGroupEvents(String groupId) {
|
||||
return getEventsFromDTOs(eventStore.findGroupEvents(groupId));
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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<EventDTO, Long> {
|
||||
|
||||
@Query("SELECT * FROM event")
|
||||
List<EventDTO> findAllEvents();
|
||||
|
||||
@Query("SELECT * FROM event WHERE group_id = :groupid")
|
||||
List<EventDTO> findGroupEvents(@Param("groupid") String groupId);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
);
|
||||
|
@ -36,8 +36,7 @@
|
||||
</div>
|
||||
<input class="form-control" id="linkview" readonly th:value="${link}" type="text">
|
||||
<div class="input-group-append">
|
||||
<button type="button" class="btn btn-secondary"
|
||||
onclick="copyLink()">Link kopieren
|
||||
<button type="button" class="btn btn-secondary" onclick="copyLink()">Link kopieren
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@ -89,6 +88,18 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
<div class="content-heading">
|
||||
<span>Event-Historie</span>
|
||||
</div>
|
||||
<div class="row">
|
||||
<!--Spacer-->
|
||||
<span class="col"></span>
|
||||
|
||||
<a class="btn btn-primary btn-bar" th:href="@{/gruppen2/details/{id}/history(id=${group.getId()})}">Event-Log</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--Teilnehmerliste-->
|
||||
<div class="content members">
|
||||
<div class="content-heading">
|
||||
|
37
src/main/resources/templates/history.html
Normal file
37
src/main/resources/templates/history.html
Normal file
@ -0,0 +1,37 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" xmlns:th="http://www.thymeleaf.org" th:replace="~{mopslayout :: html(
|
||||
name='Gruppenfindung',
|
||||
title='Event-Log',
|
||||
headcontent=~{fragments/general :: headcontent('none')},
|
||||
navigation=~{fragments/general :: nav('none')},
|
||||
bodycontent=~{:: bodycontent})}">
|
||||
|
||||
<body>
|
||||
|
||||
<main th:fragment="bodycontent">
|
||||
<div class="container-fluid">
|
||||
|
||||
<h1 class="def-cursor">Event-Log</h1>
|
||||
|
||||
<div class="content" th:each="event : ${events}">
|
||||
<div class="content-heading row">
|
||||
<span th:text="${event.type()}"></span>
|
||||
|
||||
<span class="col"></span>
|
||||
|
||||
<span>Datum: </span>
|
||||
<span th:text="${event.getDate()}"></span>
|
||||
</div>
|
||||
|
||||
<div class="content-text-in">
|
||||
<span th:text="${'User:' + event.getExec()}"></span>
|
||||
|
||||
<span th:text="${'>>>' + event.format()}"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
</body>
|
||||
</html>
|
Reference in New Issue
Block a user