1

remove obsolete code + fix copylink

This commit is contained in:
Christoph
2020-04-16 16:00:35 +02:00
parent 319b073e66
commit 4bc29b616c
19 changed files with 45 additions and 113 deletions

View File

@ -36,7 +36,7 @@ public abstract class Event {
protected UUID groupid; protected UUID groupid;
@JsonProperty("version") @JsonProperty("version")
protected long version; protected long version; // Group-Version
@JsonProperty("exec") @JsonProperty("exec")
protected String exec; protected String exec;
@ -68,8 +68,8 @@ public abstract class Event {
} }
checkGroupIdMatch(group.getId()); checkGroupIdMatch(group.getId());
group.updateVersion(version);
updateCache(cache, group); updateCache(cache, group);
group.updateVersion(version);
applyEvent(group); applyEvent(group);
} }

View File

@ -1,7 +1,9 @@
package mops.gruppen2.domain.model.group; package mops.gruppen2.domain.model.group;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import mops.gruppen2.domain.exception.BadArgumentException; import mops.gruppen2.domain.exception.BadArgumentException;
import mops.gruppen2.domain.exception.GroupFullException; import mops.gruppen2.domain.exception.GroupFullException;
@ -35,6 +37,7 @@ import java.util.stream.Collectors;
* Muss beim Start gesetzt werden: groupid, meta * Muss beim Start gesetzt werden: groupid, meta
*/ */
@Log4j2 @Log4j2
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@EqualsAndHashCode(onlyExplicitlyIncluded = true) @EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Group { public class Group {
@ -55,9 +58,6 @@ public class Group {
private GroupOptions options = GroupOptions.DEFAULT(); private GroupOptions options = GroupOptions.DEFAULT();
//@ToString.Exclude
//private LocalDateTime age;
// Inhalt // Inhalt
private Title title = Title.EMPTY(); private Title title = Title.EMPTY();
@ -112,6 +112,12 @@ public class Group {
memberships.remove(target); 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 { public void memberPutRole(String target, Role role) throws UserNotFoundException, LastAdminException {
ValidationHelper.throwIfNoMember(this, target); ValidationHelper.throwIfNoMember(this, target);
if (role == Role.REGULAR) { if (role == Role.REGULAR) {
@ -121,12 +127,6 @@ public class Group {
memberships.put(target, memberships.get(target).setRole(role)); 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) { public boolean isMember(String target) {
return memberships.containsKey(target); return memberships.containsKey(target);
} }

View File

@ -11,13 +11,13 @@ import java.time.LocalDateTime;
@Log4j2 @Log4j2
@Value @Value
@ToString @ToString
public class GroupMeta { class GroupMeta {
long version; long version;
String creator; String creator;
LocalDateTime creationDate; LocalDateTime creationDate;
public GroupMeta setVersion(long version) throws IdMismatchException { GroupMeta setVersion(long version) throws IdMismatchException {
if (this.version >= version) { if (this.version >= version) {
throw new IdMismatchException("Die Gruppe ist bereits auf einem neueren Stand."); throw new IdMismatchException("Die Gruppe ist bereits auf einem neueren Stand.");
} }
@ -25,7 +25,7 @@ public class GroupMeta {
return new GroupMeta(version, creator, creationDate); return new GroupMeta(version, creator, creationDate);
} }
public GroupMeta setCreator(String userid) throws BadArgumentException { GroupMeta setCreator(String userid) throws BadArgumentException {
if (creator != null) { if (creator != null) {
throw new BadArgumentException("Gruppe hat schon einen Ersteller."); throw new BadArgumentException("Gruppe hat schon einen Ersteller.");
} }
@ -33,7 +33,7 @@ public class GroupMeta {
return new GroupMeta(version, userid, creationDate); return new GroupMeta(version, userid, creationDate);
} }
public GroupMeta setCreationDate(LocalDateTime date) throws BadArgumentException { GroupMeta setCreationDate(LocalDateTime date) throws BadArgumentException {
if (creationDate != null) { if (creationDate != null) {
throw new BadArgumentException("Gruppe hat schon ein Erstellungsdatum."); throw new BadArgumentException("Gruppe hat schon ein Erstellungsdatum.");
} }
@ -41,7 +41,7 @@ public class GroupMeta {
return new GroupMeta(version, creator, date); return new GroupMeta(version, creator, date);
} }
public static GroupMeta EMPTY() { static GroupMeta EMPTY() {
return new GroupMeta(0, null, null); return new GroupMeta(0, null, null);
} }
} }

View File

@ -22,6 +22,14 @@ public final class SortHelper {
return 1; return 1;
} }
if (g1.getType() == Type.PUBLIC) {
return -1;
}
if (g2.getType() == Type.PUBLIC) {
return 1;
}
return 0; return 0;
}); });
} }

View File

@ -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<Event>... events) {
for (List<Event> eventlist : events) {
for (Event event : eventlist) {
eventStore.save(getDTOFromEvent(event));
}
}
}
//########################################### DTOs ########################################### //########################################### DTOs ###########################################
@ -105,7 +91,7 @@ public class EventStoreService {
// #################################### SIMPLE QUERIES ####################################### // #################################### SIMPLE QUERIES #######################################
public List<Event> findAllEvents() { public List<Event> findAllEvents() {
return getEventsFromDTOs(eventStore.findAllEvents()); return getEventsFromDTOs(eventStore.findAllEvents());
} }

View File

@ -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.Link;
import mops.gruppen2.domain.model.group.wrapper.Parent; import mops.gruppen2.domain.model.group.wrapper.Parent;
import mops.gruppen2.domain.model.group.wrapper.Title; import mops.gruppen2.domain.model.group.wrapper.Title;
import mops.gruppen2.domain.service.helper.ValidationHelper;
import mops.gruppen2.infrastructure.GroupCache; import mops.gruppen2.infrastructure.GroupCache;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -139,7 +138,7 @@ public class GroupService {
Event event = new CreateGroupEvent(groupid, Event event = new CreateGroupEvent(groupid,
exec, exec,
date); date);
Group group = new Group(); Group group = Group.EMPTY();
applyAndSave(group, event); applyAndSave(group, event);
return group; return group;
@ -171,7 +170,7 @@ public class GroupService {
public void kickMember(Group group, String exec, String target) { public void kickMember(Group group, String exec, String target) {
applyAndSave(group, new KickMemberEvent(group.getId(), exec, target)); applyAndSave(group, new KickMemberEvent(group.getId(), exec, target));
if (ValidationHelper.checkIfGroupEmpty(group)) { if (group.isEmpty()) {
deleteGroup(group, exec); deleteGroup(group, exec);
} }
} }

View File

@ -3,17 +3,13 @@ package mops.gruppen2.domain.service.helper;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2; 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 //TODO: sinnvolles format
@Log4j2 @Log4j2
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class APIHelper { public final class APIHelper {
public static GroupRequestWrapper wrap(long status, List<Group> groupList) { /*public static GroupRequestWrapper wrap(long status, List<Group> groupList) {
return new GroupRequestWrapper(status, groupList); return new GroupRequestWrapper(status, groupList);
} }*/
} }

View File

@ -3,39 +3,14 @@ package mops.gruppen2.domain.service.helper;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import mops.gruppen2.domain.event.EventType;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
@Log4j2 @Log4j2
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class CommonHelper { 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<String> uuidsToString(List<UUID> ids) {
return ids.stream()
.map(UUID::toString)
.collect(Collectors.toList());
}
public static boolean uuidIsEmpty(UUID uuid) { public static boolean uuidIsEmpty(UUID uuid) {
return "00000000-0000-0000-0000-000000000000".equals(uuid.toString()); return "00000000-0000-0000-0000-000000000000".equals(uuid.toString());
} }
public static List<UUID> stringsToUUID(List<String> groupids) {
return groupids.stream()
.map(UUID::fromString)
.collect(Collectors.toList());
}
} }

View File

@ -41,7 +41,7 @@ public final class ProjectionHelper {
*/ */
private static Group getOrCreateGroup(Map<UUID, Group> groups, UUID groupId) { private static Group getOrCreateGroup(Map<UUID, Group> groups, UUID groupId) {
if (!groups.containsKey(groupId)) { if (!groups.containsKey(groupId)) {
groups.put(groupId, new Group()); groups.put(groupId, Group.EMPTY());
} }
return groups.get(groupId); return groups.get(groupId);

View File

@ -17,36 +17,15 @@ import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class ValidationHelper { 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) { public static boolean checkIfLastMember(Group group, String userid) {
return checkIfMember(group, userid) && group.size() == 1; return group.isMember(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();
} }
/** /**
* Überprüft, ob ein User in einer Gruppe Admin ist. * Überprüft, ob ein User in einer Gruppe Admin ist.
*/ */
public static boolean checkIfAdmin(Group group, String userid) { public static boolean checkIfAdmin(Group group, String userid) {
if (checkIfMember(group, userid)) { if (group.isMember(userid)) {
return group.isAdmin(userid); return group.isAdmin(userid);
} }
return false; return false;
@ -61,14 +40,14 @@ public final class ValidationHelper {
public static void throwIfMember(Group group, String userid) throws UserAlreadyExistsException { 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); log.error("Benutzer {} ist schon in Gruppe {}", userid, group);
throw new UserAlreadyExistsException(userid); throw new UserAlreadyExistsException(userid);
} }
} }
public static void throwIfNoMember(Group group, String userid) throws UserNotFoundException { 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); log.error("Benutzer {} ist nicht in Gruppe {}!", userid, group);
throw new UserNotFoundException(userid); throw new UserNotFoundException(userid);
} }
@ -91,7 +70,7 @@ public final class ValidationHelper {
} }
public static void throwIfGroupFull(Group group) throws GroupFullException { public static void throwIfGroupFull(Group group) throws GroupFullException {
if (checkIfGroupFull(group)) { if (group.isFull()) {
log.error("Die Gruppe {} ist voll!", group); log.error("Die Gruppe {} ist voll!", group);
throw new GroupFullException(group.getId().toString()); throw new GroupFullException(group.getId().toString());
} }

View File

@ -35,7 +35,7 @@ public class GroupCache {
// ######################################## CACHE ########################################### // ######################################## CACHE ###########################################
public void init() { void init() {
ProjectionHelper.project(groups, eventStoreService.findAllEvents(), this); ProjectionHelper.project(groups, eventStoreService.findAllEvents(), this);
} }

View File

@ -14,8 +14,6 @@ import org.springframework.web.bind.annotation.ModelAttribute;
@ControllerAdvice @ControllerAdvice
public class ModelAttributeControllerAdvice { public class ModelAttributeControllerAdvice {
private final GroupCache groupCache;
// Add modelAttributes before each @RequestMapping // Add modelAttributes before each @RequestMapping
@ModelAttribute @ModelAttribute
public void modelAttributes(KeycloakAuthenticationToken token, public void modelAttributes(KeycloakAuthenticationToken token,

View File

@ -1,8 +1,6 @@
package mops.gruppen2.infrastructure.api; package mops.gruppen2.infrastructure.api;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter;
import mops.gruppen2.domain.model.group.Group;
import java.util.List; import java.util.List;
@ -10,9 +8,8 @@ import java.util.List;
* Kombiniert den Status und die Gruppenliste zur ausgabe über die API. * Kombiniert den Status und die Gruppenliste zur ausgabe über die API.
*/ */
@AllArgsConstructor @AllArgsConstructor
@Getter
public class GroupRequestWrapper { public class GroupRequestWrapper {
private final long status; private final long version;
private final List<Group> groupList; private final List<GroupWrapper> groups;
} }

View File

@ -57,7 +57,7 @@ public class GroupDetailsController {
model.addAttribute("parent", parent); model.addAttribute("parent", parent);
// Detailseite für nicht-Mitglieder // Detailseite für nicht-Mitglieder
if (!ValidationHelper.checkIfMember(group, principal)) { if (!group.isMember(principal)) {
return "preview"; return "preview";
} }
@ -72,7 +72,7 @@ public class GroupDetailsController {
String principal = token.getName(); String principal = token.getName();
Group group = groupCache.group(UUID.fromString(groupId)); Group group = groupCache.group(UUID.fromString(groupId));
if (ValidationHelper.checkIfMember(group, principal)) { if (group.isMember(principal)) {
return "redirect:/gruppen2/details/" + groupId; return "redirect:/gruppen2/details/" + groupId;
} }

View File

@ -28,11 +28,6 @@ public class GruppenfindungController {
return "redirect:/gruppen2"; return "redirect:/gruppen2";
} }
@GetMapping("/login")
public String login() {
return "redirect:/gruppen2";
}
@TraceMethodCall @TraceMethodCall
@RolesAllowed({"ROLE_orga", "ROLE_studentin"}) @RolesAllowed({"ROLE_orga", "ROLE_studentin"})
@GetMapping("/gruppen2") @GetMapping("/gruppen2")

View File

@ -6,7 +6,6 @@ import mops.gruppen2.aspect.annotation.TraceMethodCalls;
import mops.gruppen2.domain.model.group.Group; import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.model.group.Type; import mops.gruppen2.domain.model.group.Type;
import mops.gruppen2.domain.service.SearchService; import mops.gruppen2.domain.service.SearchService;
import mops.gruppen2.domain.service.helper.ValidationHelper;
import mops.gruppen2.infrastructure.GroupCache; import mops.gruppen2.infrastructure.GroupCache;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
@ -72,7 +71,7 @@ public class SearchAndInviteController {
} }
// Bereits Mitglied // Bereits Mitglied
if (ValidationHelper.checkIfMember(group, principal)) { if (group.isMember(principal)) {
return "redirect:/gruppen2/details/" + group.getId(); return "redirect:/gruppen2/details/" + group.getId();
} }

View File

@ -11,10 +11,10 @@ import org.springframework.data.relational.core.mapping.Table;
public class EventDTO { public class EventDTO {
@Id @Id
Long event_id; Long event_id; // Cache-Version
String group_id; String group_id;
long group_version; long group_version; // Group-Version
String exec_id; String exec_id;
String target_id; String target_id;

View File

@ -9,7 +9,7 @@ function enable(id) {
} }
function copyLink() { function copyLink() {
const copyText = document.getElementById("groupLink"); const copyText = document.getElementById("linkview");
copyText.select(); copyText.select();
copyText.setSelectionRange(0, 99999); copyText.setSelectionRange(0, 99999);

View File

@ -34,7 +34,7 @@
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text">Einladungslink:</span> <span class="input-group-text">Einladungslink:</span>
</div> </div>
<input class="form-control" readonly th:value="${link}" type="text"> <input class="form-control" id="linkview" readonly th:value="${link}" type="text">
<div class="input-group-append"> <div class="input-group-append">
<button type="button" class="btn btn-secondary" <button type="button" class="btn btn-secondary"
onclick="copyLink()">Link kopieren onclick="copyLink()">Link kopieren