diff --git a/src/main/java/mops/gruppen2/domain/event/Event.java b/src/main/java/mops/gruppen2/domain/event/Event.java index af53a7e..7ef6a92 100644 --- a/src/main/java/mops/gruppen2/domain/event/Event.java +++ b/src/main/java/mops/gruppen2/domain/event/Event.java @@ -36,7 +36,7 @@ public abstract class Event { protected UUID groupid; @JsonProperty("version") - protected long version; + protected long version; // Group-Version @JsonProperty("exec") protected String exec; @@ -68,8 +68,8 @@ public abstract class Event { } checkGroupIdMatch(group.getId()); - group.updateVersion(version); updateCache(cache, group); + group.updateVersion(version); applyEvent(group); } diff --git a/src/main/java/mops/gruppen2/domain/model/group/Group.java b/src/main/java/mops/gruppen2/domain/model/group/Group.java index b26fae3..c081f45 100644 --- a/src/main/java/mops/gruppen2/domain/model/group/Group.java +++ b/src/main/java/mops/gruppen2/domain/model/group/Group.java @@ -1,7 +1,9 @@ package mops.gruppen2.domain.model.group; +import lombok.AccessLevel; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.extern.log4j.Log4j2; import mops.gruppen2.domain.exception.BadArgumentException; import mops.gruppen2.domain.exception.GroupFullException; @@ -35,6 +37,7 @@ import java.util.stream.Collectors; * Muss beim Start gesetzt werden: groupid, meta */ @Log4j2 +@NoArgsConstructor(access = AccessLevel.PRIVATE) @EqualsAndHashCode(onlyExplicitlyIncluded = true) public class Group { @@ -55,9 +58,6 @@ public class Group { private GroupOptions options = GroupOptions.DEFAULT(); - //@ToString.Exclude - //private LocalDateTime age; - // Inhalt private Title title = Title.EMPTY(); @@ -112,6 +112,12 @@ public class Group { memberships.remove(target); } + public boolean memberHasRole(String target, Role role) { + ValidationHelper.throwIfNoMember(this, target); + + return memberships.get(target).getRole() == role; + } + public void memberPutRole(String target, Role role) throws UserNotFoundException, LastAdminException { ValidationHelper.throwIfNoMember(this, target); if (role == Role.REGULAR) { @@ -121,12 +127,6 @@ public class Group { memberships.put(target, memberships.get(target).setRole(role)); } - public boolean memberHasRole(String target, Role role) { - ValidationHelper.throwIfNoMember(this, target); - - return memberships.get(target).getRole() == role; - } - public boolean isMember(String target) { return memberships.containsKey(target); } diff --git a/src/main/java/mops/gruppen2/domain/model/group/GroupMeta.java b/src/main/java/mops/gruppen2/domain/model/group/GroupMeta.java index de60300..60372dd 100644 --- a/src/main/java/mops/gruppen2/domain/model/group/GroupMeta.java +++ b/src/main/java/mops/gruppen2/domain/model/group/GroupMeta.java @@ -11,13 +11,13 @@ import java.time.LocalDateTime; @Log4j2 @Value @ToString -public class GroupMeta { +class GroupMeta { long version; String creator; LocalDateTime creationDate; - public GroupMeta setVersion(long version) throws IdMismatchException { + GroupMeta setVersion(long version) throws IdMismatchException { if (this.version >= version) { throw new IdMismatchException("Die Gruppe ist bereits auf einem neueren Stand."); } @@ -25,7 +25,7 @@ public class GroupMeta { return new GroupMeta(version, creator, creationDate); } - public GroupMeta setCreator(String userid) throws BadArgumentException { + GroupMeta setCreator(String userid) throws BadArgumentException { if (creator != null) { throw new BadArgumentException("Gruppe hat schon einen Ersteller."); } @@ -33,7 +33,7 @@ public class GroupMeta { return new GroupMeta(version, userid, creationDate); } - public GroupMeta setCreationDate(LocalDateTime date) throws BadArgumentException { + GroupMeta setCreationDate(LocalDateTime date) throws BadArgumentException { if (creationDate != null) { throw new BadArgumentException("Gruppe hat schon ein Erstellungsdatum."); } @@ -41,7 +41,7 @@ public class GroupMeta { return new GroupMeta(version, creator, date); } - public static GroupMeta EMPTY() { + static GroupMeta EMPTY() { return new GroupMeta(0, null, null); } } diff --git a/src/main/java/mops/gruppen2/domain/model/group/SortHelper.java b/src/main/java/mops/gruppen2/domain/model/group/SortHelper.java index 808f12c..0dbf19d 100644 --- a/src/main/java/mops/gruppen2/domain/model/group/SortHelper.java +++ b/src/main/java/mops/gruppen2/domain/model/group/SortHelper.java @@ -22,6 +22,14 @@ public final class SortHelper { return 1; } + if (g1.getType() == Type.PUBLIC) { + return -1; + } + + if (g2.getType() == Type.PUBLIC) { + return 1; + } + return 0; }); } diff --git a/src/main/java/mops/gruppen2/domain/service/EventStoreService.java b/src/main/java/mops/gruppen2/domain/service/EventStoreService.java index e9ebe7d..a7cd712 100644 --- a/src/main/java/mops/gruppen2/domain/service/EventStoreService.java +++ b/src/main/java/mops/gruppen2/domain/service/EventStoreService.java @@ -39,20 +39,6 @@ public class EventStoreService { } } - /** - * Speichert alle Events aus der übergebenen Liste in der DB. - * - * @param events Liste an Events die gespeichert werden soll - */ - @SafeVarargs - public final void saveAll(List... events) { - for (List eventlist : events) { - for (Event event : eventlist) { - eventStore.save(getDTOFromEvent(event)); - } - } - } - //########################################### DTOs ########################################### @@ -105,7 +91,7 @@ public class EventStoreService { // #################################### SIMPLE QUERIES ####################################### - + public List findAllEvents() { return getEventsFromDTOs(eventStore.findAllEvents()); } diff --git a/src/main/java/mops/gruppen2/domain/service/GroupService.java b/src/main/java/mops/gruppen2/domain/service/GroupService.java index 612e627..1522394 100644 --- a/src/main/java/mops/gruppen2/domain/service/GroupService.java +++ b/src/main/java/mops/gruppen2/domain/service/GroupService.java @@ -24,7 +24,6 @@ import mops.gruppen2.domain.model.group.wrapper.Limit; import mops.gruppen2.domain.model.group.wrapper.Link; import mops.gruppen2.domain.model.group.wrapper.Parent; import mops.gruppen2.domain.model.group.wrapper.Title; -import mops.gruppen2.domain.service.helper.ValidationHelper; import mops.gruppen2.infrastructure.GroupCache; import org.springframework.stereotype.Service; @@ -139,7 +138,7 @@ public class GroupService { Event event = new CreateGroupEvent(groupid, exec, date); - Group group = new Group(); + Group group = Group.EMPTY(); applyAndSave(group, event); return group; @@ -171,7 +170,7 @@ public class GroupService { public void kickMember(Group group, String exec, String target) { applyAndSave(group, new KickMemberEvent(group.getId(), exec, target)); - if (ValidationHelper.checkIfGroupEmpty(group)) { + if (group.isEmpty()) { deleteGroup(group, exec); } } diff --git a/src/main/java/mops/gruppen2/domain/service/helper/APIHelper.java b/src/main/java/mops/gruppen2/domain/service/helper/APIHelper.java index 39e7569..906d979 100644 --- a/src/main/java/mops/gruppen2/domain/service/helper/APIHelper.java +++ b/src/main/java/mops/gruppen2/domain/service/helper/APIHelper.java @@ -3,17 +3,13 @@ package mops.gruppen2.domain.service.helper; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.log4j.Log4j2; -import mops.gruppen2.domain.model.group.Group; -import mops.gruppen2.infrastructure.api.GroupRequestWrapper; - -import java.util.List; //TODO: sinnvolles format @Log4j2 @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class APIHelper { - public static GroupRequestWrapper wrap(long status, List groupList) { + /*public static GroupRequestWrapper wrap(long status, List groupList) { return new GroupRequestWrapper(status, groupList); - } + }*/ } diff --git a/src/main/java/mops/gruppen2/domain/service/helper/CommonHelper.java b/src/main/java/mops/gruppen2/domain/service/helper/CommonHelper.java index 5ac0ed1..4694501 100644 --- a/src/main/java/mops/gruppen2/domain/service/helper/CommonHelper.java +++ b/src/main/java/mops/gruppen2/domain/service/helper/CommonHelper.java @@ -3,39 +3,14 @@ package mops.gruppen2.domain.service.helper; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.log4j.Log4j2; -import mops.gruppen2.domain.event.EventType; -import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; @Log4j2 @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class CommonHelper { - public static String[] eventTypesToString(EventType... types) { - String[] stringtypes = new String[types.length]; - - for (int i = 0; i < types.length; i++) { - stringtypes[i] = types[i].toString(); - } - - return stringtypes; - } - - public static List uuidsToString(List ids) { - return ids.stream() - .map(UUID::toString) - .collect(Collectors.toList()); - } - public static boolean uuidIsEmpty(UUID uuid) { return "00000000-0000-0000-0000-000000000000".equals(uuid.toString()); } - - public static List stringsToUUID(List groupids) { - return groupids.stream() - .map(UUID::fromString) - .collect(Collectors.toList()); - } } diff --git a/src/main/java/mops/gruppen2/domain/service/helper/ProjectionHelper.java b/src/main/java/mops/gruppen2/domain/service/helper/ProjectionHelper.java index b01b1aa..f4f9011 100644 --- a/src/main/java/mops/gruppen2/domain/service/helper/ProjectionHelper.java +++ b/src/main/java/mops/gruppen2/domain/service/helper/ProjectionHelper.java @@ -41,7 +41,7 @@ public final class ProjectionHelper { */ private static Group getOrCreateGroup(Map groups, UUID groupId) { if (!groups.containsKey(groupId)) { - groups.put(groupId, new Group()); + groups.put(groupId, Group.EMPTY()); } return groups.get(groupId); diff --git a/src/main/java/mops/gruppen2/domain/service/helper/ValidationHelper.java b/src/main/java/mops/gruppen2/domain/service/helper/ValidationHelper.java index 22942bd..4e3ddd5 100644 --- a/src/main/java/mops/gruppen2/domain/service/helper/ValidationHelper.java +++ b/src/main/java/mops/gruppen2/domain/service/helper/ValidationHelper.java @@ -17,36 +17,15 @@ import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ValidationHelper { - /** - * Überprüft, ob ein User in einer Gruppe teilnimmt. - */ - public static boolean checkIfMember(Group group, String userid) { - return group.isMember(userid); - } - public static boolean checkIfLastMember(Group group, String userid) { - return checkIfMember(group, userid) && group.size() == 1; - } - - /** - * Überprüft, ob eine Gruppe voll ist. - */ - public static boolean checkIfGroupFull(Group group) { - return group.isFull(); - } - - /** - * Überprüft, ob eine Gruppe leer ist. - */ - public static boolean checkIfGroupEmpty(Group group) { - return group.isEmpty(); + return group.isMember(userid) && group.size() == 1; } /** * Überprüft, ob ein User in einer Gruppe Admin ist. */ public static boolean checkIfAdmin(Group group, String userid) { - if (checkIfMember(group, userid)) { + if (group.isMember(userid)) { return group.isAdmin(userid); } return false; @@ -61,14 +40,14 @@ public final class ValidationHelper { public static void throwIfMember(Group group, String userid) throws UserAlreadyExistsException { - if (checkIfMember(group, userid)) { + if (group.isMember(userid)) { log.error("Benutzer {} ist schon in Gruppe {}", userid, group); throw new UserAlreadyExistsException(userid); } } public static void throwIfNoMember(Group group, String userid) throws UserNotFoundException { - if (!checkIfMember(group, userid)) { + if (!group.isMember(userid)) { log.error("Benutzer {} ist nicht in Gruppe {}!", userid, group); throw new UserNotFoundException(userid); } @@ -91,7 +70,7 @@ public final class ValidationHelper { } public static void throwIfGroupFull(Group group) throws GroupFullException { - if (checkIfGroupFull(group)) { + if (group.isFull()) { log.error("Die Gruppe {} ist voll!", group); throw new GroupFullException(group.getId().toString()); } diff --git a/src/main/java/mops/gruppen2/infrastructure/GroupCache.java b/src/main/java/mops/gruppen2/infrastructure/GroupCache.java index ef23274..d3999fd 100644 --- a/src/main/java/mops/gruppen2/infrastructure/GroupCache.java +++ b/src/main/java/mops/gruppen2/infrastructure/GroupCache.java @@ -35,7 +35,7 @@ public class GroupCache { // ######################################## CACHE ########################################### - public void init() { + void init() { ProjectionHelper.project(groups, eventStoreService.findAllEvents(), this); } diff --git a/src/main/java/mops/gruppen2/infrastructure/ModelAttributeControllerAdvice.java b/src/main/java/mops/gruppen2/infrastructure/ModelAttributeControllerAdvice.java index 17b81ed..5ebfa79 100644 --- a/src/main/java/mops/gruppen2/infrastructure/ModelAttributeControllerAdvice.java +++ b/src/main/java/mops/gruppen2/infrastructure/ModelAttributeControllerAdvice.java @@ -14,8 +14,6 @@ import org.springframework.web.bind.annotation.ModelAttribute; @ControllerAdvice public class ModelAttributeControllerAdvice { - private final GroupCache groupCache; - // Add modelAttributes before each @RequestMapping @ModelAttribute public void modelAttributes(KeycloakAuthenticationToken token, diff --git a/src/main/java/mops/gruppen2/infrastructure/api/GroupRequestWrapper.java b/src/main/java/mops/gruppen2/infrastructure/api/GroupRequestWrapper.java index e4d32a2..93a0c20 100644 --- a/src/main/java/mops/gruppen2/infrastructure/api/GroupRequestWrapper.java +++ b/src/main/java/mops/gruppen2/infrastructure/api/GroupRequestWrapper.java @@ -1,8 +1,6 @@ package mops.gruppen2.infrastructure.api; import lombok.AllArgsConstructor; -import lombok.Getter; -import mops.gruppen2.domain.model.group.Group; import java.util.List; @@ -10,9 +8,8 @@ import java.util.List; * Kombiniert den Status und die Gruppenliste zur ausgabe über die API. */ @AllArgsConstructor -@Getter public class GroupRequestWrapper { - private final long status; - private final List groupList; + private final long version; + private final List groups; } diff --git a/src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java b/src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java index 7aa5879..5fffd22 100644 --- a/src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java +++ b/src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java @@ -57,7 +57,7 @@ public class GroupDetailsController { model.addAttribute("parent", parent); // Detailseite für nicht-Mitglieder - if (!ValidationHelper.checkIfMember(group, principal)) { + if (!group.isMember(principal)) { return "preview"; } @@ -72,7 +72,7 @@ public class GroupDetailsController { String principal = token.getName(); Group group = groupCache.group(UUID.fromString(groupId)); - if (ValidationHelper.checkIfMember(group, principal)) { + if (group.isMember(principal)) { return "redirect:/gruppen2/details/" + groupId; } diff --git a/src/main/java/mops/gruppen2/infrastructure/controller/GruppenfindungController.java b/src/main/java/mops/gruppen2/infrastructure/controller/GruppenfindungController.java index 15e1953..4d09bdb 100644 --- a/src/main/java/mops/gruppen2/infrastructure/controller/GruppenfindungController.java +++ b/src/main/java/mops/gruppen2/infrastructure/controller/GruppenfindungController.java @@ -28,11 +28,6 @@ public class GruppenfindungController { return "redirect:/gruppen2"; } - @GetMapping("/login") - public String login() { - return "redirect:/gruppen2"; - } - @TraceMethodCall @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) @GetMapping("/gruppen2") diff --git a/src/main/java/mops/gruppen2/infrastructure/controller/SearchAndInviteController.java b/src/main/java/mops/gruppen2/infrastructure/controller/SearchAndInviteController.java index 6a8b90e..1c96f01 100644 --- a/src/main/java/mops/gruppen2/infrastructure/controller/SearchAndInviteController.java +++ b/src/main/java/mops/gruppen2/infrastructure/controller/SearchAndInviteController.java @@ -6,7 +6,6 @@ import mops.gruppen2.aspect.annotation.TraceMethodCalls; import mops.gruppen2.domain.model.group.Group; import mops.gruppen2.domain.model.group.Type; import mops.gruppen2.domain.service.SearchService; -import mops.gruppen2.domain.service.helper.ValidationHelper; import mops.gruppen2.infrastructure.GroupCache; import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; import org.springframework.stereotype.Controller; @@ -72,7 +71,7 @@ public class SearchAndInviteController { } // Bereits Mitglied - if (ValidationHelper.checkIfMember(group, principal)) { + if (group.isMember(principal)) { return "redirect:/gruppen2/details/" + group.getId(); } diff --git a/src/main/java/mops/gruppen2/persistance/dto/EventDTO.java b/src/main/java/mops/gruppen2/persistance/dto/EventDTO.java index 88d4272..d0c326f 100644 --- a/src/main/java/mops/gruppen2/persistance/dto/EventDTO.java +++ b/src/main/java/mops/gruppen2/persistance/dto/EventDTO.java @@ -11,10 +11,10 @@ import org.springframework.data.relational.core.mapping.Table; public class EventDTO { @Id - Long event_id; + Long event_id; // Cache-Version String group_id; - long group_version; + long group_version; // Group-Version String exec_id; String target_id; diff --git a/src/main/resources/static/js/script.js b/src/main/resources/static/js/script.js index df03906..138e079 100644 --- a/src/main/resources/static/js/script.js +++ b/src/main/resources/static/js/script.js @@ -9,7 +9,7 @@ function enable(id) { } function copyLink() { - const copyText = document.getElementById("groupLink"); + const copyText = document.getElementById("linkview"); copyText.select(); copyText.setSelectionRange(0, 99999); diff --git a/src/main/resources/templates/edit.html b/src/main/resources/templates/edit.html index a710baf..e65cbdb 100644 --- a/src/main/resources/templates/edit.html +++ b/src/main/resources/templates/edit.html @@ -34,7 +34,7 @@
Einladungslink:
- +