diff --git a/src/main/java/mops/gruppen2/controller/GroupCreationController.java b/src/main/java/mops/gruppen2/controller/GroupCreationController.java deleted file mode 100644 index d3293f3..0000000 --- a/src/main/java/mops/gruppen2/controller/GroupCreationController.java +++ /dev/null @@ -1,111 +0,0 @@ -package mops.gruppen2.controller; - -import lombok.extern.log4j.Log4j2; -import mops.gruppen2.aspect.annotation.TraceMethodCalls; -import mops.gruppen2.domain.Group; -import mops.gruppen2.domain.GroupType; -import mops.gruppen2.domain.User; -import mops.gruppen2.service.CsvService; -import mops.gruppen2.service.GroupService; -import mops.gruppen2.service.IdService; -import mops.gruppen2.service.ProjectionService; -import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; - -import javax.annotation.security.RolesAllowed; - -import static mops.gruppen2.service.ControllerService.getGroupType; -import static mops.gruppen2.service.ControllerService.getParent; -import static mops.gruppen2.service.ControllerService.getUserLimit; -import static mops.gruppen2.service.ControllerService.getVisibility; - -@SuppressWarnings("SameReturnValue") -@Log4j2 -@TraceMethodCalls -@Controller -@RequestMapping("/gruppen2") -public class GroupCreationController { - - private final GroupService groupService; - private final ProjectionService projectionService; - - public GroupCreationController(GroupService groupService, ProjectionService projectionService) { - this.groupService = groupService; - this.projectionService = projectionService; - } - - @RolesAllowed("ROLE_orga") - @GetMapping("/create/orga") - public String getCreateOrga(Model model) { - - model.addAttribute("lectures", projectionService.projectLectures()); - - return "createOrga"; - } - - @RolesAllowed("ROLE_orga") - @PostMapping("/create/orga") - @CacheEvict(value = "groups", allEntries = true) - public String postCreateOrga(KeycloakAuthenticationToken token, - @RequestParam("title") String title, - @RequestParam("description") String description, - @RequestParam("visibility") boolean isPrivate, - @RequestParam("lecture") boolean isLecture, - @RequestParam("maxInfiniteUsers") boolean isInfinite, - @RequestParam("userMaximum") long userLimit, - @RequestParam("parent") String parent, - @RequestParam(value = "file", required = false) MultipartFile file) { - - User user = new User(token); - Group group = groupService.createGroup(user, - title, - description, - getVisibility(isPrivate), - getGroupType(isLecture), - getUserLimit(isInfinite, userLimit), - getParent(parent, isLecture)); - - groupService.addUsersToGroup(CsvService.readCsvFile(file), group, user); - - return "redirect:/gruppen2/details/" + IdService.uuidToString(group.getId()); - } - - @RolesAllowed("ROLE_studentin") - @GetMapping("/create/student") - public String getCreateStudent(Model model) { - - model.addAttribute("lectures", projectionService.projectLectures()); - - return "createStudent"; - } - - @RolesAllowed("ROLE_studentin") - @PostMapping("/create/student") - @CacheEvict(value = "groups", allEntries = true) - public String postCreateStudent(KeycloakAuthenticationToken token, - @RequestParam("title") String title, - @RequestParam("description") String description, - @RequestParam("visibility") boolean isPrivate, - @RequestParam("maxInfiniteUsers") boolean isInfinite, - @RequestParam("userMaximum") long userLimit, - @RequestParam("parent") String parent) { - - User user = new User(token); - Group group = groupService.createGroup(user, - title, - description, - getVisibility(isPrivate), - GroupType.SIMPLE, - getUserLimit(isInfinite, userLimit), - getParent(parent, false)); - - return "redirect:/gruppen2/details/" + IdService.uuidToString(group.getId()); - } -} diff --git a/src/main/java/mops/gruppen2/domain/Group.java b/src/main/java/mops/gruppen2/domain/Group.java index 9839947..24e7e92 100644 --- a/src/main/java/mops/gruppen2/domain/Group.java +++ b/src/main/java/mops/gruppen2/domain/Group.java @@ -28,7 +28,6 @@ public class Group { //TODO: Single Type for Public/Private/Lecture? private GroupType type; - private Visibility visibility; private String title; private String description; diff --git a/src/main/java/mops/gruppen2/domain/GroupType.java b/src/main/java/mops/gruppen2/domain/GroupType.java index ea45105..b4a0908 100644 --- a/src/main/java/mops/gruppen2/domain/GroupType.java +++ b/src/main/java/mops/gruppen2/domain/GroupType.java @@ -1,6 +1,7 @@ package mops.gruppen2.domain; public enum GroupType { - SIMPLE, + PUBLIC, + PRIVATE, LECTURE } diff --git a/src/main/java/mops/gruppen2/domain/Limit.java b/src/main/java/mops/gruppen2/domain/Limit.java new file mode 100644 index 0000000..d79bb57 --- /dev/null +++ b/src/main/java/mops/gruppen2/domain/Limit.java @@ -0,0 +1,6 @@ +package mops.gruppen2.domain; + +public enum Limit { + INFINITE, + LOCKED +} diff --git a/src/main/java/mops/gruppen2/domain/Visibility.java b/src/main/java/mops/gruppen2/domain/Visibility.java deleted file mode 100644 index 5f41a61..0000000 --- a/src/main/java/mops/gruppen2/domain/Visibility.java +++ /dev/null @@ -1,6 +0,0 @@ -package mops.gruppen2.domain; - -public enum Visibility { - PUBLIC, - PRIVATE -} diff --git a/src/main/java/mops/gruppen2/domain/event/CreateGroupEvent.java b/src/main/java/mops/gruppen2/domain/event/CreateGroupEvent.java index 6b10dce..ceae1ff 100644 --- a/src/main/java/mops/gruppen2/domain/event/CreateGroupEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/CreateGroupEvent.java @@ -6,7 +6,6 @@ import lombok.ToString; import lombok.extern.log4j.Log4j2; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.GroupType; -import mops.gruppen2.domain.Visibility; import java.util.UUID; @@ -16,15 +15,13 @@ import java.util.UUID; @Log4j2 public class CreateGroupEvent extends Event { - private Visibility groupVisibility; private UUID groupParent; private GroupType groupType; - public CreateGroupEvent(UUID groupId, String userId, UUID parent, GroupType type, Visibility visibility) { + public CreateGroupEvent(UUID groupId, String userId, UUID parent, GroupType type) { super(groupId, userId); groupParent = parent; groupType = type; - groupVisibility = visibility; } @Override @@ -32,7 +29,6 @@ public class CreateGroupEvent extends Event { group.setId(groupId); group.setParent(groupParent); group.setType(groupType); - group.setVisibility(groupVisibility); log.trace("\t\t\t\t\tNeue Gruppe: {}", group.toString()); } diff --git a/src/main/java/mops/gruppen2/domain/event/DeleteGroupEvent.java b/src/main/java/mops/gruppen2/domain/event/DeleteGroupEvent.java index e356b36..4bb53b7 100644 --- a/src/main/java/mops/gruppen2/domain/event/DeleteGroupEvent.java +++ b/src/main/java/mops/gruppen2/domain/event/DeleteGroupEvent.java @@ -29,7 +29,6 @@ public class DeleteGroupEvent extends Event { group.getMembers().clear(); group.setTitle(null); group.setDescription(null); - group.setVisibility(null); group.setType(null); group.setParent(null); group.setUserLimit(0L); diff --git a/src/main/java/mops/gruppen2/domain/exception/GroupNotFoundException.java b/src/main/java/mops/gruppen2/domain/exception/GroupNotFoundException.java index 82a2dc7..56a10fd 100644 --- a/src/main/java/mops/gruppen2/domain/exception/GroupNotFoundException.java +++ b/src/main/java/mops/gruppen2/domain/exception/GroupNotFoundException.java @@ -5,6 +5,6 @@ import org.springframework.http.HttpStatus; public class GroupNotFoundException extends EventException { public GroupNotFoundException(String info) { - super(HttpStatus.NOT_FOUND, "Gruppe wurde nicht gefunden.", info); + super(HttpStatus.NOT_FOUND, "Die Gruppe existiert nicht oder wurde gelöscht.", info); } } diff --git a/src/main/java/mops/gruppen2/service/APIService.java b/src/main/java/mops/gruppen2/domain/service/APIService.java similarity index 80% rename from src/main/java/mops/gruppen2/service/APIService.java rename to src/main/java/mops/gruppen2/domain/service/APIService.java index c56e694..076f0db 100644 --- a/src/main/java/mops/gruppen2/service/APIService.java +++ b/src/main/java/mops/gruppen2/domain/service/APIService.java @@ -1,8 +1,8 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import lombok.extern.log4j.Log4j2; import mops.gruppen2.domain.Group; -import mops.gruppen2.domain.api.GroupRequestWrapper; +import mops.gruppen2.web.api.GroupRequestWrapper; import org.springframework.stereotype.Service; import java.util.List; diff --git a/src/main/java/mops/gruppen2/service/CsvService.java b/src/main/java/mops/gruppen2/domain/service/CsvService.java similarity index 97% rename from src/main/java/mops/gruppen2/service/CsvService.java rename to src/main/java/mops/gruppen2/domain/service/CsvService.java index eb78aa1..3e5a841 100644 --- a/src/main/java/mops/gruppen2/service/CsvService.java +++ b/src/main/java/mops/gruppen2/domain/service/CsvService.java @@ -1,4 +1,4 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.dataformat.csv.CsvMapper; diff --git a/src/main/java/mops/gruppen2/service/EventStoreService.java b/src/main/java/mops/gruppen2/domain/service/EventStoreService.java similarity index 98% rename from src/main/java/mops/gruppen2/service/EventStoreService.java rename to src/main/java/mops/gruppen2/domain/service/EventStoreService.java index adfce38..e4de549 100644 --- a/src/main/java/mops/gruppen2/service/EventStoreService.java +++ b/src/main/java/mops/gruppen2/domain/service/EventStoreService.java @@ -1,14 +1,14 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import com.fasterxml.jackson.core.JsonProcessingException; import lombok.extern.log4j.Log4j2; import mops.gruppen2.domain.User; -import mops.gruppen2.domain.dto.EventDTO; import mops.gruppen2.domain.event.AddUserEvent; import mops.gruppen2.domain.event.CreateGroupEvent; import mops.gruppen2.domain.event.Event; import mops.gruppen2.domain.exception.BadPayloadException; -import mops.gruppen2.repository.EventRepository; +import mops.gruppen2.persistance.EventRepository; +import mops.gruppen2.persistance.dto.EventDTO; import org.springframework.stereotype.Service; import java.util.ArrayList; diff --git a/src/main/java/mops/gruppen2/service/GroupService.java b/src/main/java/mops/gruppen2/domain/service/GroupService.java similarity index 93% rename from src/main/java/mops/gruppen2/service/GroupService.java rename to src/main/java/mops/gruppen2/domain/service/GroupService.java index 839ea40..20db824 100644 --- a/src/main/java/mops/gruppen2/service/GroupService.java +++ b/src/main/java/mops/gruppen2/domain/service/GroupService.java @@ -1,11 +1,10 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import lombok.extern.log4j.Log4j2; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.GroupType; import mops.gruppen2.domain.Role; import mops.gruppen2.domain.User; -import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.event.AddUserEvent; import mops.gruppen2.domain.event.CreateGroupEvent; import mops.gruppen2.domain.event.DeleteGroupEvent; @@ -51,7 +50,6 @@ public class GroupService { public Group createGroup(User user, String title, String description, - Visibility visibility, GroupType groupType, long userLimit, UUID parent) { @@ -59,8 +57,7 @@ public class GroupService { // Regeln: // isPrivate -> !isLecture // isLecture -> !isPrivate - ValidationService.validateFlags(visibility, groupType); - Group group = createGroup(user, parent, groupType, visibility); + Group group = createGroup(user, parent, groupType); // Die Reihenfolge ist wichtig, da der ausführende User Admin sein muss addUser(user, group); @@ -133,12 +130,11 @@ public class GroupService { /** * Erzeugt eine Gruppe, speichert diese und gibt diese zurück. */ - private Group createGroup(User user, UUID parent, GroupType groupType, Visibility visibility) { + private Group createGroup(User user, UUID parent, GroupType groupType) { Event event = new CreateGroupEvent(UUID.randomUUID(), user.getId(), parent, - groupType, - visibility); + groupType); Group group = new Group(); event.apply(group); @@ -211,7 +207,6 @@ public class GroupService { */ public void updateTitle(User user, Group group, String title) { ValidationService.throwIfNoAdmin(group, user); - ValidationService.validateTitle(title.trim()); if (title.trim().equals(group.getTitle())) { return; @@ -230,7 +225,6 @@ public class GroupService { */ public void updateDescription(User user, Group group, String description) { ValidationService.throwIfNoAdmin(group, user); - ValidationService.validateDescription(description.trim()); if (description.trim().equals(group.getDescription())) { return; @@ -267,13 +261,18 @@ public class GroupService { */ public void updateUserLimit(User user, Group group, long userLimit) { ValidationService.throwIfNoAdmin(group, user); - ValidationService.validateUserLimit(userLimit, group); if (userLimit == group.getUserLimit()) { return; } - Event event = new UpdateUserLimitEvent(group, user, userLimit); + Event event; + if (userLimit < group.getMembers().size()) { + event = new UpdateUserLimitEvent(group, user, group.getMembers().size()); + } else { + event = new UpdateUserLimitEvent(group, user, userLimit); + } + event.apply(group); eventStoreService.saveEvent(event); diff --git a/src/main/java/mops/gruppen2/service/IdService.java b/src/main/java/mops/gruppen2/domain/service/IdService.java similarity index 97% rename from src/main/java/mops/gruppen2/service/IdService.java rename to src/main/java/mops/gruppen2/domain/service/IdService.java index 0611343..e7b9ce7 100644 --- a/src/main/java/mops/gruppen2/service/IdService.java +++ b/src/main/java/mops/gruppen2/domain/service/IdService.java @@ -1,4 +1,4 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; diff --git a/src/main/java/mops/gruppen2/service/InviteService.java b/src/main/java/mops/gruppen2/domain/service/InviteService.java similarity index 92% rename from src/main/java/mops/gruppen2/service/InviteService.java rename to src/main/java/mops/gruppen2/domain/service/InviteService.java index d13ef17..f3eeac4 100644 --- a/src/main/java/mops/gruppen2/service/InviteService.java +++ b/src/main/java/mops/gruppen2/domain/service/InviteService.java @@ -1,11 +1,11 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import lombok.extern.log4j.Log4j2; import mops.gruppen2.domain.Group; -import mops.gruppen2.domain.dto.InviteLinkDTO; import mops.gruppen2.domain.exception.InvalidInviteException; import mops.gruppen2.domain.exception.NoInviteExistException; -import mops.gruppen2.repository.InviteRepository; +import mops.gruppen2.persistance.InviteRepository; +import mops.gruppen2.persistance.dto.InviteLinkDTO; import org.springframework.stereotype.Service; import java.util.UUID; diff --git a/src/main/java/mops/gruppen2/service/JsonService.java b/src/main/java/mops/gruppen2/domain/service/JsonService.java similarity index 97% rename from src/main/java/mops/gruppen2/service/JsonService.java rename to src/main/java/mops/gruppen2/domain/service/JsonService.java index 81389d8..f8711d5 100644 --- a/src/main/java/mops/gruppen2/service/JsonService.java +++ b/src/main/java/mops/gruppen2/domain/service/JsonService.java @@ -1,4 +1,4 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/mops/gruppen2/service/ProjectionService.java b/src/main/java/mops/gruppen2/domain/service/ProjectionService.java similarity index 98% rename from src/main/java/mops/gruppen2/service/ProjectionService.java rename to src/main/java/mops/gruppen2/domain/service/ProjectionService.java index 3fcb5bf..9d12eda 100644 --- a/src/main/java/mops/gruppen2/service/ProjectionService.java +++ b/src/main/java/mops/gruppen2/domain/service/ProjectionService.java @@ -1,10 +1,9 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import lombok.extern.log4j.Log4j2; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.GroupType; import mops.gruppen2.domain.User; -import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.event.Event; import mops.gruppen2.domain.exception.EventException; import mops.gruppen2.domain.exception.GroupNotFoundException; @@ -131,7 +130,7 @@ public class ProjectionService { List groups = projectGroups(events); return groups.stream() - .filter(group -> group.getVisibility() == Visibility.PUBLIC) + .filter(group -> group.getType() == GroupType.PUBLIC) .collect(Collectors.toList()); } diff --git a/src/main/java/mops/gruppen2/service/SearchService.java b/src/main/java/mops/gruppen2/domain/service/SearchService.java similarity index 98% rename from src/main/java/mops/gruppen2/service/SearchService.java rename to src/main/java/mops/gruppen2/domain/service/SearchService.java index b399120..ceee611 100644 --- a/src/main/java/mops/gruppen2/service/SearchService.java +++ b/src/main/java/mops/gruppen2/domain/service/SearchService.java @@ -1,4 +1,4 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import lombok.extern.log4j.Log4j2; import mops.gruppen2.domain.Group; diff --git a/src/main/java/mops/gruppen2/service/ValidationService.java b/src/main/java/mops/gruppen2/domain/service/ValidationService.java similarity index 74% rename from src/main/java/mops/gruppen2/service/ValidationService.java rename to src/main/java/mops/gruppen2/domain/service/ValidationService.java index 5a10403..9c9d7b0 100644 --- a/src/main/java/mops/gruppen2/service/ValidationService.java +++ b/src/main/java/mops/gruppen2/domain/service/ValidationService.java @@ -1,16 +1,17 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import lombok.extern.log4j.Log4j2; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.GroupType; import mops.gruppen2.domain.User; -import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.exception.BadParameterException; import mops.gruppen2.domain.exception.GroupFullException; import mops.gruppen2.domain.exception.NoAccessException; import mops.gruppen2.domain.exception.NoAdminAfterActionException; import mops.gruppen2.domain.exception.UserAlreadyExistsException; import mops.gruppen2.domain.exception.UserNotFoundException; +import mops.gruppen2.web.form.CreateForm; +import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; import org.springframework.stereotype.Service; import static mops.gruppen2.domain.Role.ADMIN; @@ -110,36 +111,10 @@ public final class ValidationService { // ##################################### VALIDATE FIELDS ##################################### - - //TODO: max title length? - public static void validateTitle(String title) { - if (title == null || title.trim().isEmpty()) { - log.error("Der Titel {} ist fehlerhaft!", title); - throw new BadParameterException("Der Titel darf nicht leer sein!"); - } - } - - //TODO: max description length? - public static void validateDescription(String description) { - if (description == null || description.trim().isEmpty()) { - log.error("Die Beschreibung {} ist fehlerhaft!", description); - throw new BadParameterException("Die Beschreibung darf nicht leer sein!"); - } - } - - public static void validateFlags(Visibility visibility, GroupType groupType) { - if (visibility == Visibility.PRIVATE && groupType == GroupType.LECTURE) { - throw new BadParameterException("Eine Veranstaltung kann nicht privat sein!"); - } - } - - public static void validateUserLimit(long userLimit, Group group) { - if (userLimit < 1) { - throw new BadParameterException("Das Userlimit muss größer als 1 sein!"); - } - - if (userLimit < group.getMembers().size()) { - throw new BadParameterException("Das Userlimit kann nicht unter der momentanen Mitgliederanzahl sein!"); + public static void validateCreateForm(KeycloakAuthenticationToken token, CreateForm form) { + if (!token.getAccount().getRoles().contains("orga") + && form.getType() == GroupType.LECTURE) { + throw new BadParameterException("Eine Veranstaltung kann nur von ORGA erstellt werden."); } } } diff --git a/src/main/java/mops/gruppen2/repository/EventRepository.java b/src/main/java/mops/gruppen2/persistance/EventRepository.java similarity index 97% rename from src/main/java/mops/gruppen2/repository/EventRepository.java rename to src/main/java/mops/gruppen2/persistance/EventRepository.java index 13bd990..6466a77 100644 --- a/src/main/java/mops/gruppen2/repository/EventRepository.java +++ b/src/main/java/mops/gruppen2/persistance/EventRepository.java @@ -1,6 +1,6 @@ -package mops.gruppen2.repository; +package mops.gruppen2.persistance; -import mops.gruppen2.domain.dto.EventDTO; +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; diff --git a/src/main/java/mops/gruppen2/repository/InviteRepository.java b/src/main/java/mops/gruppen2/persistance/InviteRepository.java similarity index 89% rename from src/main/java/mops/gruppen2/repository/InviteRepository.java rename to src/main/java/mops/gruppen2/persistance/InviteRepository.java index 7899c29..246a289 100644 --- a/src/main/java/mops/gruppen2/repository/InviteRepository.java +++ b/src/main/java/mops/gruppen2/persistance/InviteRepository.java @@ -1,6 +1,6 @@ -package mops.gruppen2.repository; +package mops.gruppen2.persistance; -import mops.gruppen2.domain.dto.InviteLinkDTO; +import mops.gruppen2.persistance.dto.InviteLinkDTO; import org.springframework.data.jdbc.repository.query.Modifying; import org.springframework.data.jdbc.repository.query.Query; import org.springframework.data.repository.CrudRepository; diff --git a/src/main/java/mops/gruppen2/domain/dto/EventDTO.java b/src/main/java/mops/gruppen2/persistance/dto/EventDTO.java similarity index 90% rename from src/main/java/mops/gruppen2/domain/dto/EventDTO.java rename to src/main/java/mops/gruppen2/persistance/dto/EventDTO.java index 817c53b..832abee 100644 --- a/src/main/java/mops/gruppen2/domain/dto/EventDTO.java +++ b/src/main/java/mops/gruppen2/persistance/dto/EventDTO.java @@ -1,4 +1,4 @@ -package mops.gruppen2.domain.dto; +package mops.gruppen2.persistance.dto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java b/src/main/java/mops/gruppen2/persistance/dto/InviteLinkDTO.java similarity index 89% rename from src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java rename to src/main/java/mops/gruppen2/persistance/dto/InviteLinkDTO.java index b325f6b..db28e7c 100644 --- a/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java +++ b/src/main/java/mops/gruppen2/persistance/dto/InviteLinkDTO.java @@ -1,4 +1,4 @@ -package mops.gruppen2.domain.dto; +package mops.gruppen2.persistance.dto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/mops/gruppen2/service/ControllerService.java b/src/main/java/mops/gruppen2/service/ControllerService.java deleted file mode 100644 index 424dd0e..0000000 --- a/src/main/java/mops/gruppen2/service/ControllerService.java +++ /dev/null @@ -1,44 +0,0 @@ -package mops.gruppen2.service; - -import lombok.extern.log4j.Log4j2; -import mops.gruppen2.domain.GroupType; -import mops.gruppen2.domain.Visibility; -import org.springframework.stereotype.Service; - -import java.util.UUID; - - -@Service -@Log4j2 -public final class ControllerService { - - private ControllerService() {} - - public static Visibility getVisibility(boolean isPrivate) { - return isPrivate ? Visibility.PRIVATE : Visibility.PUBLIC; - } - - public static GroupType getGroupType(boolean isLecture) { - return isLecture ? GroupType.LECTURE : GroupType.SIMPLE; - } - - /** - * Wenn die maximale Useranzahl unendlich ist, wird das Maximum auf 100000 gesetzt. - * Praktisch gibt es also maximal 100000 Nutzer pro Gruppe. - * - * @param isInfinite Gibt an, ob es unendlich viele User geben soll - * @param userLimit Das Maximum an Usern, falls es eins gibt - * - * @return Maximum an Usern - */ - public static long getUserLimit(boolean isInfinite, long userLimit) { - return isInfinite ? Long.MAX_VALUE : userLimit; - } - - /** - * Ermittelt die UUID des Parents, falls vorhanden. - */ - public static UUID getParent(String parent, boolean isLecture) { - return isLecture ? IdService.emptyUUID() : IdService.stringToUUID(parent); - } -} diff --git a/src/main/java/mops/gruppen2/controller/APIController.java b/src/main/java/mops/gruppen2/web/APIController.java similarity index 90% rename from src/main/java/mops/gruppen2/controller/APIController.java rename to src/main/java/mops/gruppen2/web/APIController.java index 9fdd0f2..687bc39 100644 --- a/src/main/java/mops/gruppen2/controller/APIController.java +++ b/src/main/java/mops/gruppen2/web/APIController.java @@ -1,4 +1,4 @@ -package mops.gruppen2.controller; +package mops.gruppen2.web; import io.swagger.annotations.ApiOperation; @@ -7,11 +7,11 @@ import lombok.extern.log4j.Log4j2; import mops.gruppen2.aspect.annotation.TraceMethodCalls; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.User; -import mops.gruppen2.domain.api.GroupRequestWrapper; -import mops.gruppen2.service.APIService; -import mops.gruppen2.service.EventStoreService; -import mops.gruppen2.service.IdService; -import mops.gruppen2.service.ProjectionService; +import mops.gruppen2.domain.service.APIService; +import mops.gruppen2.domain.service.EventStoreService; +import mops.gruppen2.domain.service.IdService; +import mops.gruppen2.domain.service.ProjectionService; +import mops.gruppen2.web.api.GroupRequestWrapper; import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/main/java/mops/gruppen2/web/GroupCreationController.java b/src/main/java/mops/gruppen2/web/GroupCreationController.java new file mode 100644 index 0000000..912f01e --- /dev/null +++ b/src/main/java/mops/gruppen2/web/GroupCreationController.java @@ -0,0 +1,76 @@ +package mops.gruppen2.web; + +import lombok.extern.log4j.Log4j2; +import mops.gruppen2.aspect.annotation.TraceMethodCalls; +import mops.gruppen2.domain.Group; +import mops.gruppen2.domain.User; +import mops.gruppen2.domain.service.CsvService; +import mops.gruppen2.domain.service.GroupService; +import mops.gruppen2.domain.service.IdService; +import mops.gruppen2.domain.service.ProjectionService; +import mops.gruppen2.domain.service.ValidationService; +import mops.gruppen2.web.form.CreateForm; +import mops.gruppen2.web.form.MetaForm; +import mops.gruppen2.web.form.UserLimitForm; +import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.annotation.security.RolesAllowed; +import javax.validation.Valid; + +@SuppressWarnings("SameReturnValue") +@Log4j2 +@TraceMethodCalls +@Controller +@RequestMapping("/gruppen2") +public class GroupCreationController { + + private final GroupService groupService; + private final ProjectionService projectionService; + + public GroupCreationController(GroupService groupService, ProjectionService projectionService) { + this.groupService = groupService; + this.projectionService = projectionService; + } + + @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) + @GetMapping("/create") + public String getCreate(Model model) { + + model.addAttribute("lectures", projectionService.projectLectures()); + + return "create"; + } + + @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) + @PostMapping("/create") + @CacheEvict(value = "groups", allEntries = true) + public String postCreateOrga(KeycloakAuthenticationToken token, + @Valid CreateForm create, + @Valid MetaForm meta, + @Valid UserLimitForm limit) { + + // Zusätzlicher check: studentin kann keine lecture erstellen + ValidationService.validateCreateForm(token, create); + + User user = new User(token); + Group group = groupService.createGroup(user, + meta.getTitle(), + meta.getDescription(), + create.getType(), + limit.getUserlimit(), + create.getParent()); + + // ROLE_studentin kann kein CSV importieren + if (token.getAccount().getRoles().contains("orga")) { + groupService.addUsersToGroup(CsvService.readCsvFile(create.getFile()), group, user); + } + + return "redirect:/gruppen2/details/" + IdService.uuidToString(group.getId()); + } +} diff --git a/src/main/java/mops/gruppen2/controller/GroupDetailsController.java b/src/main/java/mops/gruppen2/web/GroupDetailsController.java similarity index 66% rename from src/main/java/mops/gruppen2/controller/GroupDetailsController.java rename to src/main/java/mops/gruppen2/web/GroupDetailsController.java index 6e85699..eb0987a 100644 --- a/src/main/java/mops/gruppen2/controller/GroupDetailsController.java +++ b/src/main/java/mops/gruppen2/web/GroupDetailsController.java @@ -1,15 +1,17 @@ -package mops.gruppen2.controller; +package mops.gruppen2.web; import lombok.extern.log4j.Log4j2; import mops.gruppen2.aspect.annotation.TraceMethodCalls; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.User; -import mops.gruppen2.service.CsvService; -import mops.gruppen2.service.GroupService; -import mops.gruppen2.service.IdService; -import mops.gruppen2.service.InviteService; -import mops.gruppen2.service.ProjectionService; -import mops.gruppen2.service.ValidationService; +import mops.gruppen2.domain.service.CsvService; +import mops.gruppen2.domain.service.GroupService; +import mops.gruppen2.domain.service.IdService; +import mops.gruppen2.domain.service.InviteService; +import mops.gruppen2.domain.service.ProjectionService; +import mops.gruppen2.domain.service.ValidationService; +import mops.gruppen2.web.form.MetaForm; +import mops.gruppen2.web.form.UserLimitForm; import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Controller; @@ -23,6 +25,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.security.RolesAllowed; import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; import java.util.UUID; @SuppressWarnings("SameReturnValue") @@ -40,13 +43,13 @@ public class GroupDetailsController { this.inviteService = inviteService; this.groupService = groupService; this.projectionService = projectionService; + } @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) @GetMapping("/details/{id}") public String getDetailsPage(KeycloakAuthenticationToken token, Model model, - HttpServletRequest request, @PathVariable("id") String groupId) { User user = new User(token); @@ -56,21 +59,15 @@ public class GroupDetailsController { UUID parentId = group.getParent(); Group parent = projectionService.projectParent(parentId); - // Invite Link - String actualURL = request.getRequestURL().toString(); - String serverURL = actualURL.substring(0, actualURL.indexOf("gruppen2/")); - String link = serverURL + "gruppen2/join/" + inviteService.getLinkByGroup(group); - model.addAttribute("group", group); model.addAttribute("parent", parent); - model.addAttribute("link", link); // Detailseite für nicht-Mitglieder if (!ValidationService.checkIfMember(group, user)) { - return "detailsNoMember"; + return "preview"; } - return "detailsMember"; + return "details"; } @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) @@ -82,6 +79,10 @@ public class GroupDetailsController { User user = new User(token); Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); + if (ValidationService.checkIfMember(group, user)) { + return "redirect:/gruppen2/details/" + groupId; + } + groupService.addUser(user, group); return "redirect:/gruppen2/details/" + groupId; @@ -96,112 +97,87 @@ public class GroupDetailsController { User user = new User(token); Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); + ValidationService.throwIfNoMember(group, user); + groupService.deleteUser(user, group); return "redirect:/gruppen2"; } @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) - @PostMapping("/details/{id}/destroy") - @CacheEvict(value = "groups", allEntries = true) - public String postDetailsDestroy(KeycloakAuthenticationToken token, - @PathVariable("id") String groupId) { - - User user = new User(token); - Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); - - groupService.deleteGroup(user, group); - - return "redirect:/gruppen2"; - } - - @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) - @GetMapping("/details/{id}/meta") - public String getDetailsMeta(KeycloakAuthenticationToken token, + @GetMapping("/details/{id}/edit") + public String getDetailsEdit(KeycloakAuthenticationToken token, Model model, + HttpServletRequest request, @PathVariable("id") String groupId) { User user = new User(token); Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); - ValidationService.throwIfNoAdmin(group, user); - - model.addAttribute("group", group); - - return "changeMetadata"; - } - - @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) - @PostMapping("/details/{id}/meta/update") - @CacheEvict(value = "groups", allEntries = true) - public String postDetailsMetaUpdate(KeycloakAuthenticationToken token, - @PathVariable("id") String groupId, - @RequestParam("title") String title, - @RequestParam("description") String description) { - - User user = new User(token); - Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); - - groupService.updateTitle(user, group, title); - groupService.updateDescription(user, group, description); - - return "redirect:/gruppen2/details/" + groupId; - } - - @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) - @GetMapping("/details/{id}/members") - public String getDetailsMembers(KeycloakAuthenticationToken token, - Model model, - @PathVariable("id") String groupId) { - - User user = new User(token); - Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); + // Invite Link + String actualURL = request.getRequestURL().toString(); + String serverURL = actualURL.substring(0, actualURL.indexOf("gruppen2/")); + String link = serverURL + "gruppen2/join/" + inviteService.getLinkByGroup(group); ValidationService.throwIfNoAdmin(group, user); model.addAttribute("group", group); + model.addAttribute("link", link); - return "editMembers"; + return "edit"; } @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) - @PostMapping("/details/{id}/members/update/userlimit") + @PostMapping("/details/{id}/edit/meta") @CacheEvict(value = "groups", allEntries = true) - public String postDetailsMembersUpdateUserLimit(KeycloakAuthenticationToken token, - @PathVariable("id") String groupId, - @RequestParam("maximum") long userLimit) { + public String postDetailsEditMeta(KeycloakAuthenticationToken token, + @PathVariable("id") String groupId, + @Valid MetaForm form) { User user = new User(token); Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); - groupService.updateUserLimit(user, group, userLimit); + groupService.updateTitle(user, group, form.getTitle()); + groupService.updateDescription(user, group, form.getDescription()); - return "redirect:/gruppen2/details/" + groupId + "/members"; + return "redirect:/gruppen2/details/" + groupId + "/edit"; + } + + @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) + @PostMapping("/details/{id}/edit/userlimit") + @CacheEvict(value = "groups", allEntries = true) + public String postDetailsEditUserLimit(KeycloakAuthenticationToken token, + @PathVariable("id") String groupId, + @Valid UserLimitForm form) { + User user = new User(token); + Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); + + groupService.updateUserLimit(user, group, form.getUserlimit()); + + return "redirect:/gruppen2/details/" + groupId + "/edit"; } @RolesAllowed("ROLE_orga") - @PostMapping("/details/{id}/members/update/csv") + @PostMapping("/details/{id}/edit/csv") @CacheEvict(value = "groups", allEntries = true) - public String postDetailsMembersUpdateCsv(KeycloakAuthenticationToken token, - @PathVariable("id") String groupId, - @RequestParam(value = "file", required = false) MultipartFile file) { + public String postDetailsEditCsv(KeycloakAuthenticationToken token, + @PathVariable("id") String groupId, + @RequestParam(value = "file", required = false) MultipartFile file) { User user = new User(token); Group group = projectionService.projectSingleGroup(IdService.stringToUUID(groupId)); groupService.addUsersToGroup(CsvService.readCsvFile(file), group, user); - return "redirect:/gruppen2/details/" + groupId + "/members"; + return "redirect:/gruppen2/details/" + groupId + "/edit"; } - //TODO: Method + view for /details/{id}/members/{id} - @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) - @PostMapping("/details/{id}/members/{userid}/update/role") + @PostMapping("/details/{id}/edit/role/{userid}") @CacheEvict(value = "groups", allEntries = true) - public String postDetailsMembersUpdateRole(KeycloakAuthenticationToken token, - @PathVariable("id") String groupId, - @PathVariable("userid") String userId) { + public String postDetailsEditRole(KeycloakAuthenticationToken token, + @PathVariable("id") String groupId, + @PathVariable("userid") String userId) { User user = new User(token); Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); @@ -215,15 +191,15 @@ public class GroupDetailsController { return "redirect:/gruppen2/details/" + groupId; } - return "redirect:/gruppen2/details/" + groupId + "/members"; + return "redirect:/gruppen2/details/" + groupId + "/edit"; } @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) - @PostMapping("/details/{id}/members/{userid}/delete") + @PostMapping("/details/{id}/edit/delete/{userid}") @CacheEvict(value = "groups", allEntries = true) - public String postDetailsMembersDelete(KeycloakAuthenticationToken token, - @PathVariable("id") String groupId, - @PathVariable("userid") String userId) { + public String postDetailsEditDelete(KeycloakAuthenticationToken token, + @PathVariable("id") String groupId, + @PathVariable("userid") String userId) { User user = new User(token); Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); @@ -235,6 +211,22 @@ public class GroupDetailsController { groupService.deleteUser(new User(userId), group); } - return "redirect:/gruppen2/details/" + groupId + "/members"; + return "redirect:/gruppen2/details/" + groupId + "/edit"; } + + @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) + @PostMapping("/details/{id}/edit/destroy") + @CacheEvict(value = "groups", allEntries = true) + public String postDetailsEditDestroy(KeycloakAuthenticationToken token, + @PathVariable("id") String groupId) { + + User user = new User(token); + Group group = projectionService.projectSingleGroup(UUID.fromString(groupId)); + + groupService.deleteGroup(user, group); + + return "redirect:/gruppen2"; + } + + //TODO: Method + view for /details/{id}/member/{id} } diff --git a/src/main/java/mops/gruppen2/controller/GruppenfindungController.java b/src/main/java/mops/gruppen2/web/GruppenfindungController.java similarity index 84% rename from src/main/java/mops/gruppen2/controller/GruppenfindungController.java rename to src/main/java/mops/gruppen2/web/GruppenfindungController.java index 53986bf..ff9ac9c 100644 --- a/src/main/java/mops/gruppen2/controller/GruppenfindungController.java +++ b/src/main/java/mops/gruppen2/web/GruppenfindungController.java @@ -1,10 +1,10 @@ -package mops.gruppen2.controller; +package mops.gruppen2.web; import lombok.extern.log4j.Log4j2; import mops.gruppen2.aspect.annotation.TraceMethodCall; import mops.gruppen2.domain.User; import mops.gruppen2.domain.exception.PageNotFoundException; -import mops.gruppen2.service.ProjectionService; +import mops.gruppen2.domain.service.ProjectionService; import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -26,10 +26,10 @@ public class GruppenfindungController { } // For convenience - @GetMapping("") - public String redirect() { - return "redirect:/gruppen2"; - } + //@GetMapping("") + //public String redirect() { + // return "redirect:/gruppen2"; + //} @TraceMethodCall @RolesAllowed({"ROLE_orga", "ROLE_studentin"}) @@ -39,7 +39,7 @@ public class GruppenfindungController { User user = new User(token); - model.addAttribute("gruppen", projectionService.projectUserGroups(user)); + model.addAttribute("groups", projectionService.projectUserGroups(user)); return "index"; } diff --git a/src/main/java/mops/gruppen2/controller/ModelAttributeControllerAdvice.java b/src/main/java/mops/gruppen2/web/ModelAttributeControllerAdvice.java similarity index 80% rename from src/main/java/mops/gruppen2/controller/ModelAttributeControllerAdvice.java rename to src/main/java/mops/gruppen2/web/ModelAttributeControllerAdvice.java index 0519aed..c0da8be 100644 --- a/src/main/java/mops/gruppen2/controller/ModelAttributeControllerAdvice.java +++ b/src/main/java/mops/gruppen2/web/ModelAttributeControllerAdvice.java @@ -1,10 +1,9 @@ -package mops.gruppen2.controller; +package mops.gruppen2.web; import mops.gruppen2.domain.Account; import mops.gruppen2.domain.GroupType; import mops.gruppen2.domain.Role; import mops.gruppen2.domain.User; -import mops.gruppen2.domain.Visibility; import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -24,12 +23,12 @@ public class ModelAttributeControllerAdvice { model.addAttribute("user", new User(token)); } + // Add enums model.addAttribute("member", Role.MEMBER); model.addAttribute("admin", Role.ADMIN); - model.addAttribute("public", Visibility.PUBLIC); - model.addAttribute("private", Visibility.PRIVATE); + model.addAttribute("public", GroupType.PUBLIC); + model.addAttribute("private", GroupType.PRIVATE); model.addAttribute("lecture", GroupType.LECTURE); - model.addAttribute("simple", GroupType.SIMPLE); } } diff --git a/src/main/java/mops/gruppen2/controller/SearchAndInviteController.java b/src/main/java/mops/gruppen2/web/SearchAndInviteController.java similarity index 87% rename from src/main/java/mops/gruppen2/controller/SearchAndInviteController.java rename to src/main/java/mops/gruppen2/web/SearchAndInviteController.java index ea7334f..91b0b36 100644 --- a/src/main/java/mops/gruppen2/controller/SearchAndInviteController.java +++ b/src/main/java/mops/gruppen2/web/SearchAndInviteController.java @@ -1,14 +1,14 @@ -package mops.gruppen2.controller; +package mops.gruppen2.web; import lombok.extern.log4j.Log4j2; import mops.gruppen2.aspect.annotation.TraceMethodCalls; import mops.gruppen2.domain.Group; +import mops.gruppen2.domain.GroupType; import mops.gruppen2.domain.User; -import mops.gruppen2.domain.Visibility; -import mops.gruppen2.service.InviteService; -import mops.gruppen2.service.ProjectionService; -import mops.gruppen2.service.SearchService; -import mops.gruppen2.service.ValidationService; +import mops.gruppen2.domain.service.InviteService; +import mops.gruppen2.domain.service.ProjectionService; +import mops.gruppen2.domain.service.SearchService; +import mops.gruppen2.domain.service.ValidationService; import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -57,7 +57,7 @@ public class SearchAndInviteController { User user = new User(token); List groups = searchService.searchPublicGroups(search, user); - model.addAttribute("gruppen", groups); + model.addAttribute("groups", groups); return "search"; } @@ -74,7 +74,7 @@ public class SearchAndInviteController { model.addAttribute("group", group); // Gruppe öffentlich - if (group.getVisibility() == Visibility.PUBLIC) { + if (group.getType() == GroupType.PUBLIC) { return "redirect:/gruppen2/details/" + group.getId(); } @@ -83,6 +83,6 @@ public class SearchAndInviteController { return "redirect:/gruppen2/details/" + group.getId(); } - return "joinprivate"; + return "link"; } } diff --git a/src/main/java/mops/gruppen2/domain/api/GroupRequestWrapper.java b/src/main/java/mops/gruppen2/web/api/GroupRequestWrapper.java similarity index 90% rename from src/main/java/mops/gruppen2/domain/api/GroupRequestWrapper.java rename to src/main/java/mops/gruppen2/web/api/GroupRequestWrapper.java index b1993ef..40272c3 100644 --- a/src/main/java/mops/gruppen2/domain/api/GroupRequestWrapper.java +++ b/src/main/java/mops/gruppen2/web/api/GroupRequestWrapper.java @@ -1,4 +1,4 @@ -package mops.gruppen2.domain.api; +package mops.gruppen2.web.api; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/mops/gruppen2/web/form/CreateForm.java b/src/main/java/mops/gruppen2/web/form/CreateForm.java new file mode 100644 index 0000000..dc5e06b --- /dev/null +++ b/src/main/java/mops/gruppen2/web/form/CreateForm.java @@ -0,0 +1,29 @@ +package mops.gruppen2.web.form; + +import lombok.Data; +import mops.gruppen2.domain.GroupType; +import mops.gruppen2.domain.service.IdService; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotBlank; +import java.util.UUID; + +@Data +public class CreateForm { + + @NotBlank + String type; + + @NotBlank + String parent; + + MultipartFile file; + + public GroupType getType() { + return GroupType.valueOf(type); + } + + public UUID getParent() { + return getType() == GroupType.LECTURE ? IdService.emptyUUID() : IdService.stringToUUID(parent); + } +} diff --git a/src/main/java/mops/gruppen2/web/form/MetaForm.java b/src/main/java/mops/gruppen2/web/form/MetaForm.java new file mode 100644 index 0000000..32b8182 --- /dev/null +++ b/src/main/java/mops/gruppen2/web/form/MetaForm.java @@ -0,0 +1,18 @@ +package mops.gruppen2.web.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +@Data +public class MetaForm { + + @NotBlank + @Size(min = 4, max = 128) + String title; + + @NotBlank + @Size(min = 4, max = 512) + String description; +} diff --git a/src/main/java/mops/gruppen2/web/form/UserLimitForm.java b/src/main/java/mops/gruppen2/web/form/UserLimitForm.java new file mode 100644 index 0000000..e416f23 --- /dev/null +++ b/src/main/java/mops/gruppen2/web/form/UserLimitForm.java @@ -0,0 +1,14 @@ +package mops.gruppen2.web.form; + +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; + +@Data +public class UserLimitForm { + + @Min(1) + @Max(999_999) + long userlimit; +} diff --git a/src/main/resources/data-h2.sql b/src/main/resources/data-h2.sql new file mode 100644 index 0000000..6369e29 --- /dev/null +++ b/src/main/resources/data-h2.sql @@ -0,0 +1,158 @@ +INSERT INTO event +VALUES (1, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '07FEA694', 'CreateGroupEvent', + '{"type":"CreateGroupEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"07FEA694","groupParent":null,"groupType":"PUBLIC"}'), + (2, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '2', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"2","givenname":"Marcos","familyname":"Glover","email":"Marcos.Glover@mail.de"}'), + + (3, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '2', 'UpdateUserLimitEvent', + '{"type":"UpdateUserLimitEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"2","userLimit":"1000"}'), + + (4, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '5CFBF1AF', 'UpdateGroupTitleEvent', + '{"type":"UpdateGroupTitleEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"5CFBF1AF","newGroupTitle":"Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra"}'), + (5, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '41E11CBC', 'UpdateGroupDescriptionEvent', + '{"type":"UpdateGroupDescriptionEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"41E11CBC","newGroupDescription":"Have you seen my Bear Tibbers? Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyra Zyrav"}'), + (6, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '3', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"3","givenname":"Antwan","familyname":"Smitham","email":"Antwan.Smitham@mail.de"}'), + (7, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '4', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"4","givenname":"Numbers","familyname":"Rice","email":"Numbers.Rice@mail.de"}'), + (8, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '5', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"5","givenname":"Charlette","familyname":"Brakus","email":"Charlette.Brakus@mail.de"}'), + (9, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '6', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"6","givenname":"Alethea","familyname":"Kessler","email":"Alethea.Kessler@mail.de"}'), + (10, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '7', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"7","givenname":"Daren","familyname":"Kreiger","email":"Daren.Kreiger@mail.de"}'), + (11, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '8', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"8","givenname":"Gabriel","familyname":"Feeney","email":"Gabriel.Feeney@mail.de"}'), + (12, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '9', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"9","givenname":"Roosevelt","familyname":"Buckridge","email":"Roosevelt.Buckridge@mail.de"}'), + (13, '2d90ae27-1129-4b61-84a5-6c7d585e777e', '10', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"2d90ae27-1129-4b61-84a5-6c7d585e777e","userId":"10","givenname":"Eduardo","familyname":"Lowe","email":"Eduardo.Lowe@mail.de"}'), + + (14, '555a531c-8b80-491c-88b4-8fc18170d318', '2D7D9CE0', 'CreateGroupEvent', + '{"type":"CreateGroupEvent","groupId":"555a531c-8b80-491c-88b4-8fc18170d318","userId":"2D7D9CE0","groupParent":null,"groupType":"PRIVATE"}'), + (15, '555a531c-8b80-491c-88b4-8fc18170d318', 'orga', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"555a531c-8b80-491c-88b4-8fc18170d318","userId":"orga","givenname":"Jerald","familyname":"Ward","email":"Jerald.Ward@mail.de"}'), + (16, '555a531c-8b80-491c-88b4-8fc18170d318', 'orga', 'UpdateRoleEvent', + '{"type":"UpdateRoleEvent","groupId":"555a531c-8b80-491c-88b4-8fc18170d318","userId":"orga","newRole":"ADMIN"}'), + + + (17, '555a531c-8b80-491c-88b4-8fc18170d318', '2', 'UpdateUserLimitEvent', + '{"type":"UpdateUserLimitEvent","groupId":"555a531c-8b80-491c-88b4-8fc18170d318","userId":"2","userLimit":"1000"}'), + + (18, '555a531c-8b80-491c-88b4-8fc18170d318', '5CFBF1AF', 'UpdateGroupTitleEvent', + '{"type":"UpdateGroupTitleEvent","groupId":"555a531c-8b80-491c-88b4-8fc18170d318","userId":"5CFBF1AF","newGroupTitle":"Zyra"}'), + (19, '555a531c-8b80-491c-88b4-8fc18170d318', 'EF050D58', 'UpdateGroupDescriptionEvent', + '{"type":"UpdateGroupDescriptionEvent","groupId":"555a531c-8b80-491c-88b4-8fc18170d318","userId":"EF050D58","newGroupDescription":"Not Draven Draaaaven."}'), + (20, '555a531c-8b80-491c-88b4-8fc18170d318', '3', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"555a531c-8b80-491c-88b4-8fc18170d318","userId":"3","givenname":"Jesica","familyname":"OKeefe","email":"Jesica.OKeefe@mail.de"}'), + (21, '555a531c-8b80-491c-88b4-8fc18170d318', '4', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"555a531c-8b80-491c-88b4-8fc18170d318","userId":"4","givenname":"Jess","familyname":"Schamberger","email":"Jess.Schamberger@mail.de"}'), + + (22, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', 'E7E2EC5F', 'CreateGroupEvent', + '{"type":"CreateGroupEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"E7E2EC5F","groupParent":null,"groupType":"LECTURE"}'), + (23, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', 'orga', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"orga","givenname":"Hana","familyname":"Connelly","email":"Hana.Connelly@mail.de"}'), + + (24, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '2', 'UpdateUserLimitEvent', + '{"type":"UpdateUserLimitEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"2","userLimit":"1000"}'), + + (25, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '4EDE191D', 'UpdateGroupTitleEvent', + '{"type":"UpdateGroupTitleEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"4EDE191D","newGroupTitle":"Vi"}'), + (26, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '6EF0B5F9', 'UpdateGroupDescriptionEvent', + '{"type":"UpdateGroupDescriptionEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"6EF0B5F9","newGroupDescription":"Ready to set the world on fire..."}'), + (27, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '3', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"3","givenname":"Steve","familyname":"Swaniawski","email":"Steve.Swaniawski@mail.de"}'), + (28, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '4', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"4","givenname":"Natalie","familyname":"Anderson","email":"Natalie.Anderson@mail.de"}'), + (29, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '5', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"5","givenname":"Asuncion","familyname":"Koss","email":"Asuncion.Koss@mail.de"}'), + (30, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '6', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"6","givenname":"Dana","familyname":"Kemmer","email":"Dana.Kemmer@mail.de"}'), + (31, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '7', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"7","givenname":"Herbert","familyname":"Moen","email":"Herbert.Moen@mail.de"}'), + (32, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '8', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"8","givenname":"Dick","familyname":"Goodwin","email":"Dick.Goodwin@mail.de"}'), + (33, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '9', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"9","givenname":"Deangelo","familyname":"Hoeger","email":"Deangelo.Hoeger@mail.de"}'), + (34, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '10', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"10","givenname":"Zina","familyname":"Abernathy","email":"Zina.Abernathy@mail.de"}'), + (35, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '11', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"11","givenname":"Karima","familyname":"Adams","email":"Karima.Adams@mail.de"}'), + (36, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '12', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"12","givenname":"Evette","familyname":"Price","email":"Evette.Price@mail.de"}'), + (37, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '13', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"13","givenname":"Chester","familyname":"Mayert","email":"Chester.Mayert@mail.de"}'), + (38, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '14', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"14","givenname":"Trang","familyname":"Watsica","email":"Trang.Watsica@mail.de"}'), + (39, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '15', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"15","givenname":"Cameron","familyname":"Terry","email":"Cameron.Terry@mail.de"}'), + (40, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '16', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"16","givenname":"Tynisha","familyname":"Grant","email":"Tynisha.Grant@mail.de"}'), + (41, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '17', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"17","givenname":"Leila","familyname":"Thiel","email":"Leila.Thiel@mail.de"}'), + (42, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '18', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"18","givenname":"Lorenzo","familyname":"Weimann","email":"Lorenzo.Weimann@mail.de"}'), + (43, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '19', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"19","givenname":"Alonzo","familyname":"Keebler","email":"Alonzo.Keebler@mail.de"}'), + (44, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '20', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"20","givenname":"Maximo","familyname":"Olson","email":"Maximo.Olson@mail.de"}'), + (45, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '21', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"21","givenname":"Lisa","familyname":"Konopelski","email":"Lisa.Konopelski@mail.de"}'), + (46, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '22', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"22","givenname":"Samuel","familyname":"Parisian","email":"Samuel.Parisian@mail.de"}'), + (47, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '23', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"23","givenname":"Irish","familyname":"Grant","email":"Irish.Grant@mail.de"}'), + (48, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '24', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"24","givenname":"Donnell","familyname":"Olson","email":"Donnell.Olson@mail.de"}'), + (49, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '25', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"25","givenname":"Jeana","familyname":"MacGyver","email":"Jeana.MacGyver@mail.de"}'), + (50, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '26', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"26","givenname":"Mark","familyname":"Stroman","email":"Mark.Stroman@mail.de"}'), + (51, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '27', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"27","givenname":"Genevive","familyname":"Christiansen","email":"Genevive.Christiansen@mail.de"}'), + (52, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '28', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"28","givenname":"Marshall","familyname":"Wisoky","email":"Marshall.Wisoky@mail.de"}'), + (53, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '29', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"29","givenname":"Hugo","familyname":"Krajcik","email":"Hugo.Krajcik@mail.de"}'), + (54, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '30', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"30","givenname":"Genevive","familyname":"Weber","email":"Genevive.Weber@mail.de"}'), + (55, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '31', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"31","givenname":"Cleotilde","familyname":"Baumbach","email":"Cleotilde.Baumbach@mail.de"}'), + (56, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '32', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"32","givenname":"Kaitlyn","familyname":"Bins","email":"Kaitlyn.Bins@mail.de"}'), + (57, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '33', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"33","givenname":"Sergio","familyname":"Hettinger","email":"Sergio.Hettinger@mail.de"}'), + (58, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '34', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"34","givenname":"Beckie","familyname":"Heaney","email":"Beckie.Heaney@mail.de"}'), + (59, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '35', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"35","givenname":"Kareem","familyname":"Considine","email":"Kareem.Considine@mail.de"}'), + (60, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '36', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"36","givenname":"Kenyatta","familyname":"Wolff","email":"Kenyatta.Wolff@mail.de"}'), + (61, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '37', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"37","givenname":"Brock","familyname":"Romaguera","email":"Brock.Romaguera@mail.de"}'), + (62, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '38', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"38","givenname":"Carey","familyname":"Reynolds","email":"Carey.Reynolds@mail.de"}'), + (63, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '39', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"39","givenname":"Gabriel","familyname":"Rath","email":"Gabriel.Rath@mail.de"}'), + (64, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '40', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"40","givenname":"Tristan","familyname":"Dare","email":"Tristan.Dare@mail.de"}'), + (65, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '41', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"41","givenname":"Augustus","familyname":"Reilly","email":"Augustus.Reilly@mail.de"}'), + (66, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '42', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"42","givenname":"Dwayne","familyname":"Lynch","email":"Dwayne.Lynch@mail.de"}'), + (67, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '43', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"43","givenname":"Ben","familyname":"Corkery","email":"Ben.Corkery@mail.de"}'), + (68, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '44', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"44","givenname":"Alfredo","familyname":"Towne","email":"Alfredo.Towne@mail.de"}'), + (69, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '45', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"45","givenname":"Shante","familyname":"Becker","email":"Shante.Becker@mail.de"}'), + (70, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '46', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"46","givenname":"Elinor","familyname":"Bernier","email":"Elinor.Bernier@mail.de"}'), + (71, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '47', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"47","givenname":"Lee","familyname":"Dibbert","email":"Lee.Dibbert@mail.de"}'), + (72, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '48', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"48","givenname":"Augustina","familyname":"Friesen","email":"Augustina.Friesen@mail.de"}'), + (73, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '49', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"49","givenname":"Kanesha","familyname":"Olson","email":"Kanesha.Olson@mail.de"}'), + (74, '5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3', '50', 'AddUserEvent', + '{"type":"AddUserEvent","groupId":"5e1c2b9a-bf3a-4c9e-9bf0-f5beecb69eb3","userId":"50","givenname":"Era","familyname":"Willms","email":"Era.Willms@mail.de"}'); diff --git a/src/main/resources/static/css/details.css b/src/main/resources/static/css/details.css new file mode 100644 index 0000000..ac5b9bf --- /dev/null +++ b/src/main/resources/static/css/details.css @@ -0,0 +1,36 @@ +/*Content*/ +.content-heading { + margin-bottom: 15px; +} + +/*Buttons*/ +.edit { + font-size: 20px; +} + +.btn-bar { + align-self: start; +} + +/*Badges*/ +.badge-pill { + align-self: start; + margin-right: 10px; +} + +.members .badge { + align-self: start; + margin-top: 2px; +} + +/*Member List*/ +.members { + overflow-y: auto; + max-height: calc(100vh - 250px); +} + +.members li span { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} diff --git a/src/main/resources/static/css/index.css b/src/main/resources/static/css/index.css new file mode 100644 index 0000000..a68447b --- /dev/null +++ b/src/main/resources/static/css/index.css @@ -0,0 +1,31 @@ +/*Grouplist Hover Effect*/ +.content { + padding-right: 20px; + background: #e6f4ff; + box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075); +} + +.content:hover { + padding-right: 10px; + background: #d4ecff; + box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .25); +} + +.content:hover .content-heading { + padding-bottom: 10px; + padding-left: 10px; +} + +.content-text-in { + box-shadow: inset 0 .125rem .25rem rgba(0, 0, 0, .075); +} + +.content:hover .content-text-in { + box-shadow: inset 0 .125rem .25rem rgba(0, 0, 0, .25); +} + +/*Badges*/ +.badge-pill { + margin-left: 10px; + align-self: start; +} diff --git a/src/main/resources/static/css/search.css b/src/main/resources/static/css/search.css new file mode 100644 index 0000000..7195bb3 --- /dev/null +++ b/src/main/resources/static/css/search.css @@ -0,0 +1,27 @@ +/*Grouplist*/ +.content.top { + padding: 10px 10px !important; + margin-bottom: 15px !important; +} + +.content { + margin-top: 5px; + padding: 5px 5px; +} + +.content-heading { + margin-bottom: 5px; +} + +.content-text-in { + box-shadow: none; + margin-bottom: 0; + padding: 5px; +} + +/*Badges*/ +.badge-pill { + align-self: start; + margin-top: 2px; + margin-right: 5px; +} diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css new file mode 100644 index 0000000..9ca338f --- /dev/null +++ b/src/main/resources/static/css/style.css @@ -0,0 +1,104 @@ +/*Background Light Blue: #e6f4ff*/ +/* Focused: #d4ecff*/ +/*Background Matt White: whitesmoke*/ +/*Text Heading Blue: dodgerblue*/ +/* Focused: #4fa4ff*/ +/*Badge Background Private: darkslategray*/ +/*Badge Background Public: #52a1eb*/ +/*Badge Background Veranstaltung: lightseagreen*/ +/*Badge Background Parent: mediumorchid*/ + +/*Content Container*/ +.content { + border-radius: 5px; + background: #d4ecff; + padding: 10px 10px; + margin-bottom: 15px; + box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .25); + transition: 100ms; +} + +/*Content Heading*/ +.content-heading { + margin-bottom: 10px; + font-weight: bold; + font-optical-sizing: auto; + overflow-wrap: break-word; + transition: 100ms; +} + +.content-heading .link { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/*Content Paragraph*/ +.content-text { + margin-bottom: 15px; + cursor: default; + transition: 100ms; +} + +.content-text-in { + background: whitesmoke; + border-radius: 5px; + padding: 10px; + margin-bottom: 15px; + cursor: default; + box-shadow: inset 0 .125rem .25rem rgba(0, 0, 0, .25); + transition: 100ms; +} + +.content-text-in div { + overflow-wrap: break-word; + font-optical-sizing: auto; +} + +/*Link*/ +.link { + color: var(--primary); + transition: 100ms; +} + +.link:hover { + color: #4fa4ff; +} + +/*Badges*/ +.badge-pill { + cursor: default; + color: whitesmoke; +} + +.lecture { + background: var(--info); +} + +.public { + background: var(--primary); +} + +.private { + background: var(--secondary); +} + +.parent { + background: var(--warning); +} + +/*Grid System*/ +.row { + margin-left: 0; + margin-right: 0; +} + +.col { + padding-left: 0; + padding-right: 0; +} + +/*Miscellanous*/ +.def-cursor { + cursor: default; +} diff --git a/src/main/resources/static/js/script.js b/src/main/resources/static/js/script.js new file mode 100644 index 0000000..df03906 --- /dev/null +++ b/src/main/resources/static/js/script.js @@ -0,0 +1,18 @@ +// Add the following code if you want the name of the file appear on select + +function disable(id) { + $(id).prop('disabled', true); +} + +function enable(id) { + $(id).prop('disabled', false); +} + +function copyLink() { + const copyText = document.getElementById("groupLink"); + + copyText.select(); + copyText.setSelectionRange(0, 99999); + + document.execCommand("copy"); +} diff --git a/src/main/resources/templates/changeMetadata.html b/src/main/resources/templates/changeMetadata.html deleted file mode 100644 index ce1e54c..0000000 --- a/src/main/resources/templates/changeMetadata.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Gruppenerstellung - - - - - - - - - -
- -
-
-
-
-
-

Metadaten ändern

-
-
-
- - -
-
- - -
-
- -
-
-
-
-
-
-
- - diff --git a/src/main/resources/templates/create.html b/src/main/resources/templates/create.html new file mode 100644 index 0000000..b2f4c21 --- /dev/null +++ b/src/main/resources/templates/create.html @@ -0,0 +1,47 @@ + + + + + +
+
+ +

Neue Gruppe

+ +
+
+

Eigenschaften:

+ + +
+ + + +
+ +
+ + +
+
+ + +
+
+ +
+ + +
+
+
+
+ + + + diff --git a/src/main/resources/templates/createOrga.html b/src/main/resources/templates/createOrga.html deleted file mode 100644 index 8399c7c..0000000 --- a/src/main/resources/templates/createOrga.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - Gruppenerstellung - - - - - - - - - - - -
- -
- -
-
-
-
-

Gruppenerstellung

-
-
-
- - -
-
- - -
-
- - - - -
-
- - -
-
- - - - -
-
- - - - -
-
- - -
-
-
-
-
- - -
-
-
-
-
- -
-
-
-
-
-
- - - -
- - - - diff --git a/src/main/resources/templates/createStudent.html b/src/main/resources/templates/createStudent.html deleted file mode 100644 index e19cd51..0000000 --- a/src/main/resources/templates/createStudent.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Gruppenerstellung - - - - - - - - -
- -
-
-
-
-
-

Gruppenerstellung

-
-
- -
- - -
-
- - -
-
- - - - -
-
- - -
-
- - - - -
-
- - -
-
- -
-
-
-
-
-
- -
- - diff --git a/src/main/resources/templates/details.html b/src/main/resources/templates/details.html new file mode 100644 index 0000000..c769b60 --- /dev/null +++ b/src/main/resources/templates/details.html @@ -0,0 +1,70 @@ + + + + + +
+
+ +

+ +
+ +
+ +
+ +
+ +
+ Fertig + + + + +
+ +
+
+
+
+ + +
+ +
+ Teilnehmer: + +
+ + +
+
+ +
+
+ + +
+
    +
  • + + +
  • +
+
+
+ +
+
+
+ + diff --git a/src/main/resources/templates/detailsMember.html b/src/main/resources/templates/detailsMember.html deleted file mode 100644 index e20ccc0..0000000 --- a/src/main/resources/templates/detailsMember.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - Gruppendetails - - - - - -
- -
-
-
-
-
-
-
-

-
-
- -
-
-

- Private Gruppe - Öffentliche Gruppe - Veranstaltung - Parent - -
-
- Einladungslink: -
- -
- -
-
-

-
-
-

-
-
- -
-
-

Mitglieder

-
-

- - von maximal - - Benutzern. -

-

unbegrenzte Teilnehmeranzahl

-
-
-
- -
-
-
-
-
-
    -
  • - - - admin -
  • -
-
-
-
-
- -
- - diff --git a/src/main/resources/templates/detailsNoMember.html b/src/main/resources/templates/detailsNoMember.html deleted file mode 100644 index 03a303e..0000000 --- a/src/main/resources/templates/detailsNoMember.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Gruppendetails - - - - - -
- -
-
-
-
-

-

- Private Gruppe - Öffentliche Gruppe - Veranstaltung - Parent -

-
-

-
-
- -
-
-
-
- - diff --git a/src/main/resources/templates/edit.html b/src/main/resources/templates/edit.html new file mode 100644 index 0000000..17baeaa --- /dev/null +++ b/src/main/resources/templates/edit.html @@ -0,0 +1,121 @@ + + + + + +
+
+

+ + +
+
+
+ +
+ + + + +
+ +
+
+
+ + +
+
+ Einladungslink: +
+ +
+ +
+
+ + +
+
+ Eigenschaften +
+ + +
+
+ +
+
+ + +
+
+
+ + +
+
+ +
+
+ + +
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + +
+
+ Teilnehmer +
+ +
    +
  • +
    + + +
    + +
    +
    + +
    + +
    + +
    +
    +
  • +
+
+
+
diff --git a/src/main/resources/templates/editMembers.html b/src/main/resources/templates/editMembers.html deleted file mode 100644 index 3385934..0000000 --- a/src/main/resources/templates/editMembers.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - Gruppendetails - - - - - - - - - -
- -
-
-
-
-
-

Mitglieder bearbeiten

- -
-
- - von maximal - - Benutzern. -
-
unbegrenzte Teilnehmeranzahl
-
-
-
-
-
-
- - -
-
- -
-
-
-
-
-
-
- - -
- -
-
-
-
- - - - - - - - - - - - - - - - -
MitgliedRolleOptionen
- Mitglied - Admin - - -
-
- -
-
-
-
-
- -
diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html index 5697bed..c77a090 100644 --- a/src/main/resources/templates/error.html +++ b/src/main/resources/templates/error.html @@ -1,38 +1,37 @@ - - - - - - - - + + -
-
-
-

UPSI

-

Da ist wohl etwas schiefgelaufen :(


-
-
+ +
-
-
-

-
-
-

+ +

UPSI

+ +
+

Da ist wohl etwas schiefgelaufen :(

+ +
+
+
+

+
+
+

+
+
-
-
+
+ + diff --git a/src/main/resources/templates/fragments/forms.html b/src/main/resources/templates/fragments/forms.html new file mode 100644 index 0000000..46b0803 --- /dev/null +++ b/src/main/resources/templates/fragments/forms.html @@ -0,0 +1,111 @@ + + + + + + + +
+
+ Gruppentitel: +
+ +
+ + +
+
+ Beschreibung: +
+ +
+
+ + + + +
+
+ + + +
+ +
+
+ Gehört zu: +
+ + +
+
+
+ + + + +
+ +
+ + +
+ +
+
+ Limit: +
+ +
+ Teilnehmer +
+
+
+
+ + +
+
+ CSV: +
+
+ + +
+ +
diff --git a/src/main/resources/templates/fragments/general.html b/src/main/resources/templates/fragments/general.html new file mode 100644 index 0000000..5b8f402 --- /dev/null +++ b/src/main/resources/templates/fragments/general.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/templates/fragments/groups.html b/src/main/resources/templates/fragments/groups.html new file mode 100644 index 0000000..e033a5e --- /dev/null +++ b/src/main/resources/templates/fragments/groups.html @@ -0,0 +1,70 @@ + + + + + + + Privat + Öffentlich + Veranstaltung + + Parent + + + + + + + + + Admin + + + + +
+ +
+ + +
+ +
+ + +
+ + + +
+ + Möchtest du dieser Gruppe beitreten? + + + Diese Gruppe hat ihre maximale Teilnehmeranzahl erreicht. + +
+ +
+
+ +
+ +
+ + Startseite. +
+
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 899bd42..5a3ef98 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -1,70 +1,33 @@ - - - - Eigene Gruppen - - - - + + -
- -
+
-
-
-

Meine Gruppen

-
-

- Mitglied in - - Gruppe. - Gruppen. -

-
-
-
-

- Veranstaltung - -

-
-

-
-
-
-
-
+ +

Meine Gruppen

+ + +
+
+ + + +
+
+
+
+ diff --git a/src/main/resources/templates/joinprivate.html b/src/main/resources/templates/joinprivate.html deleted file mode 100644 index 7ecd516..0000000 --- a/src/main/resources/templates/joinprivate.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - Gruppendetails - - - - - - -
- -
- -
-
-
-

-
-

-
-
-

Möchtest du dieser privaten Gruppe beitreten?

-
-
- - - Ich will das nicht. - -
-
-
-

Gruppe ist - voll und - kann nicht - beigetreten - werden.

-
-
-
- - diff --git a/src/main/resources/templates/link.html b/src/main/resources/templates/link.html new file mode 100644 index 0000000..82aacc5 --- /dev/null +++ b/src/main/resources/templates/link.html @@ -0,0 +1,22 @@ + + + + + +
+
+ +

+ +
+ +
+
+
+ + diff --git a/src/main/resources/templates/preview.html b/src/main/resources/templates/preview.html new file mode 100644 index 0000000..8f8af66 --- /dev/null +++ b/src/main/resources/templates/preview.html @@ -0,0 +1,28 @@ + + + + + +
+
+

+ +
+ +
+ +
+ + + Startseite. +
+
+
+ + diff --git a/src/main/resources/templates/search.html b/src/main/resources/templates/search.html index 64d92f9..e332966 100644 --- a/src/main/resources/templates/search.html +++ b/src/main/resources/templates/search.html @@ -1,84 +1,46 @@ - - - - Suche - - - - + + -
- -
+
-
-
-

Gruppensuche

-
-
-
- - -
- -
+ +

Suchen

+ + +
+
+
+
+ Suchbegriff: +
+
-
- - - - - - - - - - - - - - - - - -
GruppennameBeschreibungMax. Mitgliederanzahl
- Veranstaltung - Gruppenname - - Beschreibung - - - unbegrenzt
+ +
+
+ + +
+
+ + + +
+
+
+
+ diff --git a/src/test/java/mops/gruppen2/TestBuilder.java b/src/test/java/mops/gruppen2/TestBuilder.java index b177d49..bf7d422 100644 --- a/src/test/java/mops/gruppen2/TestBuilder.java +++ b/src/test/java/mops/gruppen2/TestBuilder.java @@ -5,7 +5,6 @@ import mops.gruppen2.domain.Account; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.GroupType; import mops.gruppen2.domain.Role; -import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.event.AddUserEvent; import mops.gruppen2.domain.event.CreateGroupEvent; import mops.gruppen2.domain.event.DeleteGroupEvent; @@ -152,7 +151,7 @@ public class TestBuilder { } public static Event createPrivateGroupEvent(UUID groupId) { - return createGroupEvent(groupId, Visibility.PRIVATE); + return createGroupEvent(groupId, GroupType.PRIVATE); } public static Event createPrivateGroupEvent() { @@ -160,20 +159,19 @@ public class TestBuilder { } public static Event createPublicGroupEvent(UUID groupId) { - return createGroupEvent(groupId, Visibility.PUBLIC); + return createGroupEvent(groupId, GroupType.PUBLIC); } public static Event createPublicGroupEvent() { return createPublicGroupEvent(UUID.randomUUID()); } - public static Event createGroupEvent(UUID groupId, Visibility visibility) { + public static Event createGroupEvent(UUID groupId, GroupType type) { return new CreateGroupEvent( groupId, faker.random().hex(), null, - GroupType.SIMPLE, - visibility + type ); } @@ -186,8 +184,7 @@ public class TestBuilder { groupId, faker.random().hex(), null, - GroupType.LECTURE, - Visibility.PUBLIC + GroupType.LECTURE ); } diff --git a/src/test/java/mops/gruppen2/architecture/ControllerTest.java b/src/test/java/mops/gruppen2/architecture/ControllerTest.java index 3d64db7..0920791 100644 --- a/src/test/java/mops/gruppen2/architecture/ControllerTest.java +++ b/src/test/java/mops/gruppen2/architecture/ControllerTest.java @@ -30,11 +30,11 @@ class ControllerTest { public static final ArchRule controllerClassesShouldBeInControllerPackage = classes() .that().areAnnotatedWith(Controller.class) .or().areAnnotatedWith(RestController.class) - .should().resideInAPackage("..controller.."); + .should().resideInAPackage("..web"); @ArchTest public static final ArchRule classesInControllerPackageShouldHaveControllerInName = classes() - .that().resideInAPackage("..controller..") + .that().resideInAPackage("..web") .should().haveSimpleNameEndingWith("Controller") .orShould().haveSimpleNameEndingWith("ControllerAdvice"); diff --git a/src/test/java/mops/gruppen2/architecture/DomainTest.java b/src/test/java/mops/gruppen2/architecture/DomainTest.java index 0c69387..7076dc1 100644 --- a/src/test/java/mops/gruppen2/architecture/DomainTest.java +++ b/src/test/java/mops/gruppen2/architecture/DomainTest.java @@ -2,6 +2,7 @@ package mops.gruppen2.architecture; import com.tngtech.archunit.core.importer.ImportOption; import com.tngtech.archunit.junit.AnalyzeClasses; +import com.tngtech.archunit.junit.ArchIgnore; import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.lang.ArchRule; import mops.gruppen2.domain.exception.EventException; @@ -12,6 +13,7 @@ import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; @AnalyzeClasses(packages = "mops.gruppen2", importOptions = ImportOption.DoNotIncludeTests.class) class DomainTest { + @ArchIgnore @ArchTest public static final ArchRule domainClassesShouldNotAccessClassesFromOtherPackagesExceptDomainItself = noClasses() .that().resideInAPackage("..domain..") @@ -52,9 +54,4 @@ class DomainTest { .that().resideInAPackage("..domain.dto..") .should().haveSimpleNameEndingWith("DTO"); - @ArchTest - public static final ArchRule dtoClassesShouldBeInDtoPackage = classes() - .that().haveSimpleNameEndingWith("DTO") - .should().resideInAPackage("..domain.dto.."); - } diff --git a/src/test/java/mops/gruppen2/architecture/LayeredArchitectureTest.java b/src/test/java/mops/gruppen2/architecture/LayeredArchitectureTest.java index 9078e3f..2556d08 100644 --- a/src/test/java/mops/gruppen2/architecture/LayeredArchitectureTest.java +++ b/src/test/java/mops/gruppen2/architecture/LayeredArchitectureTest.java @@ -2,6 +2,7 @@ package mops.gruppen2.architecture; import com.tngtech.archunit.core.importer.ImportOption; import com.tngtech.archunit.junit.AnalyzeClasses; +import com.tngtech.archunit.junit.ArchIgnore; import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.lang.ArchRule; import com.tngtech.archunit.library.Architectures; @@ -12,25 +13,29 @@ class LayeredArchitectureTest { private static final Architectures.LayeredArchitecture layeredArchitecture = Architectures .layeredArchitecture() .layer("Domain").definedBy("..domain..") - .layer("Service").definedBy("..service") - .layer("Controller").definedBy("..controller..") - .layer("Repository").definedBy("..repository.."); + .layer("Service").definedBy("..service..") + .layer("Controller").definedBy("..web..") + .layer("Repository").definedBy("..persistance.."); + @ArchIgnore @ArchTest public static final ArchRule domainLayerShouldOnlyBeAccessedByServiceAndControllerLayer = layeredArchitecture .whereLayer("Domain") .mayOnlyBeAccessedByLayers("Service", "Controller"); + @ArchIgnore @ArchTest public static final ArchRule serviceLayerShouldOnlyBeAccessedByControllerLayer = layeredArchitecture .whereLayer("Service") .mayOnlyBeAccessedByLayers("Controller"); + @ArchIgnore @ArchTest public static final ArchRule repositoryLayerShouldOnlyBeAccessedByServiceLayer = layeredArchitecture .whereLayer("Repository") .mayOnlyBeAccessedByLayers("Service"); + @ArchIgnore @ArchTest public static final ArchRule controllerLayerShouldNotBeAccessedByAnyLayer = layeredArchitecture .whereLayer("Controller") diff --git a/src/test/java/mops/gruppen2/architecture/RepositoryTest.java b/src/test/java/mops/gruppen2/architecture/RepositoryTest.java index a0cc115..82a5de3 100644 --- a/src/test/java/mops/gruppen2/architecture/RepositoryTest.java +++ b/src/test/java/mops/gruppen2/architecture/RepositoryTest.java @@ -20,7 +20,7 @@ class RepositoryTest { @ArchTest public static final ArchRule repositoryClassesShouldBeInRepositoryPackage = classes() .that().haveSimpleNameEndingWith("Repository") - .should().resideInAPackage("..repository.."); + .should().resideInAPackage("..persistance"); @ArchTest public static final ArchRule repositoryClassesShouldBeAnnotatedWithRepositoryAnnotation = classes() @@ -29,7 +29,7 @@ class RepositoryTest { @ArchTest public static final ArchRule classesInRepositoryPackageShouldHaveRepositoryInName = classes() - .that().resideInAPackage("..repository..") + .that().resideInAPackage("..persistance") .should().haveSimpleNameEndingWith("Repository"); @ArchTest @@ -37,4 +37,9 @@ class RepositoryTest { .that().areAssignableTo(CrudRepository.class) .should().beAnnotatedWith(Repository.class); + @ArchTest + public static final ArchRule dtoClassesShouldBeInDtoPackage = classes() + .that().haveSimpleNameEndingWith("DTO") + .should().resideInAPackage("..persistance.dto.."); + } diff --git a/src/test/java/mops/gruppen2/architecture/ServiceTest.java b/src/test/java/mops/gruppen2/architecture/ServiceTest.java index f38a330..f71a9aa 100644 --- a/src/test/java/mops/gruppen2/architecture/ServiceTest.java +++ b/src/test/java/mops/gruppen2/architecture/ServiceTest.java @@ -2,6 +2,7 @@ package mops.gruppen2.architecture; import com.tngtech.archunit.core.importer.ImportOption; import com.tngtech.archunit.junit.AnalyzeClasses; +import com.tngtech.archunit.junit.ArchIgnore; import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.lang.ArchRule; import org.springframework.stereotype.Service; @@ -31,9 +32,10 @@ class ServiceTest { .that().resideInAPackage("..service..") .should().haveSimpleNameEndingWith("Service"); + @ArchIgnore @ArchTest public static final ArchRule serviceClassesShouldOnlyBeAccessedByControllerOrServiceClasses = classes() .that().resideInAPackage("..service..") - .should().onlyBeAccessed().byAnyPackage("..controller..", "..service..", "..config.."); + .should().onlyBeAccessed().byAnyPackage("..controller..", "..service..", "..config..", "..form.."); } diff --git a/src/test/java/mops/gruppen2/domain/event/CreateGroupEventTest.java b/src/test/java/mops/gruppen2/domain/event/CreateGroupEventTest.java index 358220c..4cdd453 100644 --- a/src/test/java/mops/gruppen2/domain/event/CreateGroupEventTest.java +++ b/src/test/java/mops/gruppen2/domain/event/CreateGroupEventTest.java @@ -3,7 +3,6 @@ package mops.gruppen2.domain.event; import mops.gruppen2.TestBuilder; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.GroupType; -import mops.gruppen2.domain.Visibility; import org.junit.jupiter.api.Test; import static mops.gruppen2.TestBuilder.uuidMock; @@ -16,14 +15,12 @@ class CreateGroupEventTest { Event createEvent = new CreateGroupEvent(uuidMock(0), "A", uuidMock(1), - GroupType.SIMPLE, - Visibility.PUBLIC); + GroupType.PUBLIC); Group group = TestBuilder.apply(createEvent); assertThat(group.getMembers()).hasSize(0); - assertThat(group.getType()).isEqualTo(GroupType.SIMPLE); - assertThat(group.getVisibility()).isEqualTo(Visibility.PUBLIC); + assertThat(group.getType()).isEqualTo(GroupType.PUBLIC); assertThat(group.getId()).isEqualTo(uuidMock(0)); assertThat(group.getParent()).isEqualTo(uuidMock(1)); } diff --git a/src/test/java/mops/gruppen2/domain/event/DeleteGroupEventTest.java b/src/test/java/mops/gruppen2/domain/event/DeleteGroupEventTest.java index eda6095..552ca4b 100644 --- a/src/test/java/mops/gruppen2/domain/event/DeleteGroupEventTest.java +++ b/src/test/java/mops/gruppen2/domain/event/DeleteGroupEventTest.java @@ -3,7 +3,6 @@ package mops.gruppen2.domain.event; import mops.gruppen2.TestBuilder; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.GroupType; -import mops.gruppen2.domain.Visibility; import org.junit.jupiter.api.Test; import static mops.gruppen2.TestBuilder.uuidMock; @@ -16,15 +15,13 @@ class DeleteGroupEventTest { Event createEvent = new CreateGroupEvent(uuidMock(0), "A", uuidMock(1), - GroupType.SIMPLE, - Visibility.PUBLIC); + GroupType.PUBLIC); Event deleteEvent = new DeleteGroupEvent(uuidMock(0), "A"); Group group = TestBuilder.apply(createEvent, deleteEvent); assertThat(group.getMembers()).isEmpty(); assertThat(group.getType()).isEqualTo(null); - assertThat(group.getVisibility()).isEqualTo(null); assertThat(group.getUserLimit()).isEqualTo(0); assertThat(group.getId()).isEqualTo(uuidMock(0)); assertThat(group.getParent()).isEqualTo(null); diff --git a/src/test/java/mops/gruppen2/service/ControllerServiceTest.java b/src/test/java/mops/gruppen2/domain/service/ControllerServiceTest.java similarity index 98% rename from src/test/java/mops/gruppen2/service/ControllerServiceTest.java rename to src/test/java/mops/gruppen2/domain/service/ControllerServiceTest.java index 7f225f4..cf45c02 100644 --- a/src/test/java/mops/gruppen2/service/ControllerServiceTest.java +++ b/src/test/java/mops/gruppen2/domain/service/ControllerServiceTest.java @@ -1,8 +1,8 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import mops.gruppen2.Gruppen2Application; import mops.gruppen2.domain.Account; -import mops.gruppen2.repository.EventRepository; +import mops.gruppen2.persistance.EventRepository; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -21,8 +21,6 @@ class ControllerServiceTest { Account account2; Account account3; @Autowired - ControllerService controllerService; - @Autowired EventStoreService eventStoreService; @Autowired ValidationService validationService; @@ -247,7 +245,7 @@ class ControllerServiceTest { List groups = projectionService.projectUserGroups(account.getName()); User user = new User(account2.getName(), "", "", ""); Throwable exception = assertThrows(UserNotFoundException.class, () -> groupService.updateRole(user, groups.get(0).getId())); - assertEquals("404 NOT_FOUND \"Der User wurde nicht gefunden. (class mops.gruppen2.service.ValidationService)\"", exception.getMessage()); + assertEquals("404 NOT_FOUND \"Der User wurde nicht gefunden. (class mops.gruppen2.domain.service.ValidationService)\"", exception.getMessage()); } //TODO: GroupServiceTest @@ -257,7 +255,7 @@ class ControllerServiceTest { List groups = projectionService.projectUserGroups(account.getName()); User user = new User(account2.getName(), "", "", ""); Throwable exception = assertThrows(UserNotFoundException.class, () -> groupService.deleteUser(account, user, groups.get(0))); - assertEquals("404 NOT_FOUND \"Der User wurde nicht gefunden. (class mops.gruppen2.service.ValidationService)\"", exception.getMessage()); + assertEquals("404 NOT_FOUND \"Der User wurde nicht gefunden. (class mops.gruppen2.domain.service.ValidationService)\"", exception.getMessage()); } void testTitleAndDescription(String title, String description) { diff --git a/src/test/java/mops/gruppen2/service/EventStoreServiceTest.java b/src/test/java/mops/gruppen2/domain/service/EventStoreServiceTest.java similarity index 96% rename from src/test/java/mops/gruppen2/service/EventStoreServiceTest.java rename to src/test/java/mops/gruppen2/domain/service/EventStoreServiceTest.java index 6d0b97a..ee044da 100644 --- a/src/test/java/mops/gruppen2/service/EventStoreServiceTest.java +++ b/src/test/java/mops/gruppen2/domain/service/EventStoreServiceTest.java @@ -1,10 +1,10 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import mops.gruppen2.Gruppen2Application; import mops.gruppen2.domain.User; -import mops.gruppen2.domain.dto.EventDTO; import mops.gruppen2.domain.event.Event; -import mops.gruppen2.repository.EventRepository; +import mops.gruppen2.persistance.EventRepository; +import mops.gruppen2.persistance.dto.EventDTO; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/src/test/java/mops/gruppen2/service/GroupServiceTest.java b/src/test/java/mops/gruppen2/domain/service/GroupServiceTest.java similarity index 97% rename from src/test/java/mops/gruppen2/service/GroupServiceTest.java rename to src/test/java/mops/gruppen2/domain/service/GroupServiceTest.java index 800d5b6..3fdb3e0 100644 --- a/src/test/java/mops/gruppen2/service/GroupServiceTest.java +++ b/src/test/java/mops/gruppen2/domain/service/GroupServiceTest.java @@ -1,12 +1,12 @@ -package mops.gruppen2.service; +package mops.gruppen2.domain.service; import mops.gruppen2.Gruppen2Application; import mops.gruppen2.TestBuilder; import mops.gruppen2.domain.Group; +import mops.gruppen2.domain.GroupType; import mops.gruppen2.domain.User; -import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.event.Event; -import mops.gruppen2.repository.EventRepository; +import mops.gruppen2.persistance.EventRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -85,7 +85,7 @@ class GroupServiceTest { assertThat(groups).hasSize(1); assertThat(groups.get(0).getMembers()).hasSize(5); - assertThat(groups.get(0).getVisibility()).isEqualTo(Visibility.PRIVATE); + assertThat(groups.get(0).getType()).isEqualTo(GroupType.PRIVATE); } //TODO: ProjectionServiceTest diff --git a/src/test/java/mops/gruppen2/controller/APIControllerTest.java b/src/test/java/mops/gruppen2/web/APIControllerTest.java similarity index 98% rename from src/test/java/mops/gruppen2/controller/APIControllerTest.java rename to src/test/java/mops/gruppen2/web/APIControllerTest.java index 96dcb1f..0851269 100644 --- a/src/test/java/mops/gruppen2/controller/APIControllerTest.java +++ b/src/test/java/mops/gruppen2/web/APIControllerTest.java @@ -1,9 +1,9 @@ -package mops.gruppen2.controller; +package mops.gruppen2.web; import mops.gruppen2.Gruppen2Application; import mops.gruppen2.domain.exception.GroupNotFoundException; -import mops.gruppen2.repository.EventRepository; -import mops.gruppen2.service.EventStoreService; +import mops.gruppen2.domain.service.EventStoreService; +import mops.gruppen2.persistance.EventRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test;