renaming + better use of wrappers
This commit is contained in:
@ -1,5 +1,7 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import mops.gruppen2.domain.exception.EventException;
|
import mops.gruppen2.domain.exception.EventException;
|
||||||
@ -14,14 +16,20 @@ import mops.gruppen2.domain.model.User;
|
|||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Value
|
@Value
|
||||||
|
@AllArgsConstructor
|
||||||
public class AddUserEvent extends Event {
|
public class AddUserEvent extends Event {
|
||||||
|
|
||||||
|
@JsonProperty("givenname")
|
||||||
String givenname;
|
String givenname;
|
||||||
|
|
||||||
|
@JsonProperty("familyname")
|
||||||
String familyname;
|
String familyname;
|
||||||
|
|
||||||
|
@JsonProperty("email")
|
||||||
String email;
|
String email;
|
||||||
|
|
||||||
public AddUserEvent(Group group, User user) {
|
public AddUserEvent(Group group, User user) {
|
||||||
super(group.getId(), user.getId());
|
super(group.getGroupid(), user.getUserid());
|
||||||
givenname = user.getGivenname();
|
givenname = user.getGivenname();
|
||||||
familyname = user.getFamilyname();
|
familyname = user.getFamilyname();
|
||||||
email = user.getEmail();
|
email = user.getEmail();
|
||||||
@ -29,11 +37,11 @@ public class AddUserEvent extends Event {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void applyEvent(Group group) throws EventException {
|
protected void applyEvent(Group group) throws EventException {
|
||||||
ValidationHelper.throwIfMember(group, new User(userId));
|
ValidationHelper.throwIfMember(group, new User(userid));
|
||||||
ValidationHelper.throwIfGroupFull(group);
|
ValidationHelper.throwIfGroupFull(group);
|
||||||
|
|
||||||
group.getMembers().put(userId, new User(userId, givenname, familyname, email));
|
group.getMembers().put(userid, new User(userid, givenname, familyname, email));
|
||||||
group.getRoles().put(userId, Role.MEMBER);
|
group.getRoles().put(userid, Role.MEMBER);
|
||||||
|
|
||||||
log.trace("\t\t\t\t\tNeue Members: {}", group.getMembers());
|
log.trace("\t\t\t\t\tNeue Members: {}", group.getMembers());
|
||||||
log.trace("\t\t\t\t\tNeue Rollen: {}", group.getRoles());
|
log.trace("\t\t\t\t\tNeue Rollen: {}", group.getRoles());
|
||||||
|
@ -1,29 +1,36 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import mops.gruppen2.domain.model.Group;
|
import mops.gruppen2.domain.model.Group;
|
||||||
import mops.gruppen2.domain.model.Type;
|
import mops.gruppen2.domain.model.Type;
|
||||||
|
import mops.gruppen2.domain.model.User;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Value
|
@Value
|
||||||
|
@AllArgsConstructor// Value generiert den allArgsConstrucot nur, wenn keiner explizit angegeben ist
|
||||||
public class CreateGroupEvent extends Event {
|
public class CreateGroupEvent extends Event {
|
||||||
|
|
||||||
UUID groupParent;
|
@JsonProperty("parent")
|
||||||
|
UUID parent;
|
||||||
|
|
||||||
|
@JsonProperty("type")
|
||||||
Type type;
|
Type type;
|
||||||
|
|
||||||
public CreateGroupEvent(UUID groupId, String userId, UUID parent, Type type) {
|
public CreateGroupEvent(UUID groupId, User user, UUID parent, Type type) {
|
||||||
super(groupId, userId);
|
super(groupId, user.getUserid());
|
||||||
groupParent = parent;
|
this.parent = parent;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void applyEvent(Group group) {
|
protected void applyEvent(Group group) {
|
||||||
group.setId(groupId);
|
group.setGroupid(groupid);
|
||||||
group.setParent(groupParent);
|
group.setParent(parent);
|
||||||
group.setType(type);
|
group.setType(type);
|
||||||
|
|
||||||
log.trace("\t\t\t\t\tNeue Gruppe: {}", group.toString());
|
log.trace("\t\t\t\t\tNeue Gruppe: {}", group.toString());
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import mops.gruppen2.domain.model.Group;
|
import mops.gruppen2.domain.model.Group;
|
||||||
@ -7,10 +8,11 @@ import mops.gruppen2.domain.model.User;
|
|||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Value
|
@Value
|
||||||
|
@AllArgsConstructor
|
||||||
public class DeleteGroupEvent extends Event {
|
public class DeleteGroupEvent extends Event {
|
||||||
|
|
||||||
public DeleteGroupEvent(Group group, User user) {
|
public DeleteGroupEvent(Group group, User user) {
|
||||||
super(group.getId(), user.getId());
|
super(group.getGroupid(), user.getUserid());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -21,7 +23,7 @@ public class DeleteGroupEvent extends Event {
|
|||||||
group.setDescription(null);
|
group.setDescription(null);
|
||||||
group.setType(null);
|
group.setType(null);
|
||||||
group.setParent(null);
|
group.setParent(null);
|
||||||
group.setUserLimit(null);
|
group.setLimit(null);
|
||||||
|
|
||||||
log.trace("\t\t\t\t\tGelöschte Gruppe: {}", group);
|
log.trace("\t\t\t\t\tGelöschte Gruppe: {}", group);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import mops.gruppen2.domain.exception.EventException;
|
import mops.gruppen2.domain.exception.EventException;
|
||||||
@ -12,18 +13,19 @@ import mops.gruppen2.domain.model.User;
|
|||||||
*/
|
*/
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Value
|
@Value
|
||||||
|
@AllArgsConstructor
|
||||||
public class DeleteUserEvent extends Event {
|
public class DeleteUserEvent extends Event {
|
||||||
|
|
||||||
public DeleteUserEvent(Group group, User user) {
|
public DeleteUserEvent(Group group, User user) {
|
||||||
super(group.getId(), user.getId());
|
super(group.getGroupid(), user.getUserid());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void applyEvent(Group group) throws EventException {
|
protected void applyEvent(Group group) throws EventException {
|
||||||
ValidationHelper.throwIfNoMember(group, new User(userId));
|
ValidationHelper.throwIfNoMember(group, new User(userid));
|
||||||
|
|
||||||
group.getMembers().remove(userId);
|
group.getMembers().remove(userid);
|
||||||
group.getRoles().remove(userId);
|
group.getRoles().remove(userid);
|
||||||
|
|
||||||
log.trace("\t\t\t\t\tNeue Members: {}", group.getMembers());
|
log.trace("\t\t\t\t\tNeue Members: {}", group.getMembers());
|
||||||
log.trace("\t\t\t\t\tNeue Rollen: {}", group.getRoles());
|
log.trace("\t\t\t\t\tNeue Rollen: {}", group.getRoles());
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@ -12,32 +13,29 @@ import mops.gruppen2.domain.model.Group;
|
|||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@JsonTypeInfo(
|
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
|
||||||
use = JsonTypeInfo.Id.NAME,
|
@JsonSubTypes({@JsonSubTypes.Type(value = AddUserEvent.class, name = "AddUserEvent"),
|
||||||
property = "type"
|
@JsonSubTypes.Type(value = CreateGroupEvent.class, name = "CreateGroupEvent"),
|
||||||
)
|
@JsonSubTypes.Type(value = DeleteUserEvent.class, name = "DeleteUserEvent"),
|
||||||
@JsonSubTypes({
|
@JsonSubTypes.Type(value = UpdateGroupDescriptionEvent.class, name = "UpdateGroupDescriptionEvent"),
|
||||||
@JsonSubTypes.Type(value = AddUserEvent.class, name = "AddUserEvent"),
|
@JsonSubTypes.Type(value = UpdateGroupTitleEvent.class, name = "UpdateGroupTitleEvent"),
|
||||||
@JsonSubTypes.Type(value = CreateGroupEvent.class, name = "CreateGroupEvent"),
|
@JsonSubTypes.Type(value = UpdateRoleEvent.class, name = "UpdateRoleEvent"),
|
||||||
@JsonSubTypes.Type(value = DeleteUserEvent.class, name = "DeleteUserEvent"),
|
@JsonSubTypes.Type(value = DeleteGroupEvent.class, name = "DeleteGroupEvent"),
|
||||||
@JsonSubTypes.Type(value = UpdateGroupDescriptionEvent.class, name = "UpdateGroupDescriptionEvent"),
|
@JsonSubTypes.Type(value = UpdateUserLimitEvent.class, name = "UpdateUserLimitEvent")})
|
||||||
@JsonSubTypes.Type(value = UpdateGroupTitleEvent.class, name = "UpdateGroupTitleEvent"),
|
|
||||||
@JsonSubTypes.Type(value = UpdateRoleEvent.class, name = "UpdateRoleEvent"),
|
|
||||||
@JsonSubTypes.Type(value = DeleteGroupEvent.class, name = "DeleteGroupEvent"),
|
|
||||||
@JsonSubTypes.Type(value = UpdateUserLimitEvent.class, name = "UpdateUserLimitEvent")
|
|
||||||
})
|
|
||||||
@Getter
|
@Getter
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor // Lombok needs a default constructor in the base class
|
||||||
public abstract class Event {
|
public abstract class Event {
|
||||||
|
|
||||||
protected UUID groupId;
|
@JsonProperty("groupid")
|
||||||
protected String userId;
|
protected UUID groupid;
|
||||||
|
|
||||||
|
@JsonProperty("userid")
|
||||||
|
protected String userid;
|
||||||
|
|
||||||
public Group apply(Group group) throws EventException {
|
public Group apply(Group group) throws EventException {
|
||||||
checkGroupIdMatch(group.getId());
|
checkGroupIdMatch(group.getGroupid());
|
||||||
|
|
||||||
log.trace("Event angewendet:\t{}", this);
|
log.trace("Event angewendet:\t{}", this);
|
||||||
|
|
||||||
@ -52,7 +50,7 @@ public abstract class Event {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.groupId.equals(groupId)) {
|
if (!groupid.equals(groupId)) {
|
||||||
throw new GroupIdMismatchException(getClass().toString());
|
throw new GroupIdMismatchException(getClass().toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import mops.gruppen2.domain.model.Description;
|
import mops.gruppen2.domain.model.Description;
|
||||||
@ -11,18 +13,20 @@ import mops.gruppen2.domain.model.User;
|
|||||||
*/
|
*/
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Value
|
@Value
|
||||||
|
@AllArgsConstructor
|
||||||
public class UpdateGroupDescriptionEvent extends Event {
|
public class UpdateGroupDescriptionEvent extends Event {
|
||||||
|
|
||||||
Description groupDescription;
|
@JsonProperty("desc")
|
||||||
|
Description description;
|
||||||
|
|
||||||
public UpdateGroupDescriptionEvent(Group group, User user, Description groupDescription) {
|
public UpdateGroupDescriptionEvent(Group group, User user, Description description) {
|
||||||
super(group.getId(), user.getId());
|
super(group.getGroupid(), user.getUserid());
|
||||||
this.groupDescription = groupDescription;
|
this.description = description;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void applyEvent(Group group) {
|
protected void applyEvent(Group group) {
|
||||||
group.setDescription(groupDescription);
|
group.setDescription(description);
|
||||||
|
|
||||||
log.trace("\t\t\t\t\tNeue Beschreibung: {}", group.getDescription());
|
log.trace("\t\t\t\t\tNeue Beschreibung: {}", group.getDescription());
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import mops.gruppen2.domain.model.Group;
|
import mops.gruppen2.domain.model.Group;
|
||||||
@ -11,18 +13,20 @@ import mops.gruppen2.domain.model.User;
|
|||||||
*/
|
*/
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Value
|
@Value
|
||||||
|
@AllArgsConstructor
|
||||||
public class UpdateGroupTitleEvent extends Event {
|
public class UpdateGroupTitleEvent extends Event {
|
||||||
|
|
||||||
Title newGroupTitle;
|
@JsonProperty("title")
|
||||||
|
Title title;
|
||||||
|
|
||||||
public UpdateGroupTitleEvent(Group group, User user, Title newGroupTitle) {
|
public UpdateGroupTitleEvent(Group group, User user, Title title) {
|
||||||
super(group.getId(), user.getId());
|
super(group.getGroupid(), user.getUserid());
|
||||||
this.newGroupTitle = newGroupTitle;
|
this.title = title;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void applyEvent(Group group) {
|
protected void applyEvent(Group group) {
|
||||||
group.setTitle(newGroupTitle);
|
group.setTitle(title);
|
||||||
|
|
||||||
log.trace("\t\t\t\t\tNeuer Titel: {}", group.getTitle());
|
log.trace("\t\t\t\t\tNeuer Titel: {}", group.getTitle());
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import mops.gruppen2.domain.exception.UserNotFoundException;
|
import mops.gruppen2.domain.exception.UserNotFoundException;
|
||||||
@ -8,32 +10,27 @@ import mops.gruppen2.domain.model.Group;
|
|||||||
import mops.gruppen2.domain.model.Role;
|
import mops.gruppen2.domain.model.Role;
|
||||||
import mops.gruppen2.domain.model.User;
|
import mops.gruppen2.domain.model.User;
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Aktualisiert die Gruppenrolle eines Teilnehmers.
|
* Aktualisiert die Gruppenrolle eines Teilnehmers.
|
||||||
*/
|
*/
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Value
|
@Value
|
||||||
|
@AllArgsConstructor
|
||||||
public class UpdateRoleEvent extends Event {
|
public class UpdateRoleEvent extends Event {
|
||||||
|
|
||||||
Role newRole;
|
@JsonProperty("role")
|
||||||
|
Role role;
|
||||||
|
|
||||||
public UpdateRoleEvent(UUID groupId, String userId, Role newRole) {
|
public UpdateRoleEvent(Group group, User user, Role tole) {
|
||||||
super(groupId, userId);
|
super(group.getGroupid(), user.getUserid());
|
||||||
this.newRole = newRole;
|
role = tole;
|
||||||
}
|
|
||||||
|
|
||||||
public UpdateRoleEvent(Group group, User user, Role newRole) {
|
|
||||||
super(group.getId(), user.getId());
|
|
||||||
this.newRole = newRole;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void applyEvent(Group group) throws UserNotFoundException {
|
protected void applyEvent(Group group) throws UserNotFoundException {
|
||||||
ValidationHelper.throwIfNoMember(group, new User(userId));
|
ValidationHelper.throwIfNoMember(group, new User(userid));
|
||||||
|
|
||||||
group.getRoles().put(userId, newRole);
|
group.getRoles().put(userid, role);
|
||||||
|
|
||||||
log.trace("\t\t\t\t\tNeue Rollen: {}", group.getRoles());
|
log.trace("\t\t\t\t\tNeue Rollen: {}", group.getRoles());
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import mops.gruppen2.domain.exception.BadParameterException;
|
import mops.gruppen2.domain.exception.BadParameterException;
|
||||||
@ -10,23 +12,25 @@ import mops.gruppen2.domain.model.User;
|
|||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Value
|
@Value
|
||||||
|
@AllArgsConstructor
|
||||||
public class UpdateUserLimitEvent extends Event {
|
public class UpdateUserLimitEvent extends Event {
|
||||||
|
|
||||||
Limit userLimit;
|
@JsonProperty("limit")
|
||||||
|
Limit limit;
|
||||||
|
|
||||||
public UpdateUserLimitEvent(Group group, User user, Limit userLimit) {
|
public UpdateUserLimitEvent(Group group, User user, Limit limit) {
|
||||||
super(group.getId(), user.getId());
|
super(group.getGroupid(), user.getUserid());
|
||||||
this.userLimit = userLimit;
|
this.limit = limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void applyEvent(Group group) throws EventException {
|
protected void applyEvent(Group group) throws EventException {
|
||||||
if (userLimit.getUserLimit() < group.getMembers().size()) {
|
if (limit.getUserLimit() < group.getMembers().size()) {
|
||||||
throw new BadParameterException("Teilnehmerlimit zu klein.");
|
throw new BadParameterException("Teilnehmerlimit zu klein.");
|
||||||
}
|
}
|
||||||
|
|
||||||
group.setUserLimit(userLimit);
|
group.setLimit(limit);
|
||||||
|
|
||||||
log.trace("\t\t\t\t\tNeues UserLimit: {}", group.getUserLimit());
|
log.trace("\t\t\t\t\tNeues UserLimit: {}", group.getLimit());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,9 @@ public final class JsonHelper {
|
|||||||
|
|
||||||
public static String serializeEvent(Event event) throws JsonProcessingException {
|
public static String serializeEvent(Event event) throws JsonProcessingException {
|
||||||
ObjectMapper mapper = new ObjectMapper();
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
return mapper.writeValueAsString(event);
|
String payload = mapper.writeValueAsString(event);
|
||||||
|
log.trace(payload);
|
||||||
|
return payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,7 +28,7 @@ public final class ValidationHelper {
|
|||||||
* Überprüft, ob ein User in einer Gruppe teilnimmt.
|
* Überprüft, ob ein User in einer Gruppe teilnimmt.
|
||||||
*/
|
*/
|
||||||
public static boolean checkIfMember(Group group, User user) {
|
public static boolean checkIfMember(Group group, User user) {
|
||||||
return group.getMembers().containsKey(user.getId());
|
return group.getMembers().containsKey(user.getUserid());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean checkIfLastMember(User user, Group group) {
|
public static boolean checkIfLastMember(User user, Group group) {
|
||||||
@ -39,7 +39,7 @@ public final class ValidationHelper {
|
|||||||
* Überprüft, ob eine Gruppe voll ist.
|
* Überprüft, ob eine Gruppe voll ist.
|
||||||
*/
|
*/
|
||||||
public static boolean checkIfGroupFull(Group group) {
|
public static boolean checkIfGroupFull(Group group) {
|
||||||
return group.getMembers().size() >= group.getUserLimit().getUserLimit();
|
return group.getMembers().size() >= group.getLimit().getUserLimit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,7 +54,7 @@ public final class ValidationHelper {
|
|||||||
*/
|
*/
|
||||||
public static boolean checkIfAdmin(Group group, User user) {
|
public static boolean checkIfAdmin(Group group, User user) {
|
||||||
if (checkIfMember(group, user)) {
|
if (checkIfMember(group, user)) {
|
||||||
return group.getRoles().get(user.getId()) == ADMIN;
|
return group.getRoles().get(user.getUserid()) == ADMIN;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,21 @@
|
|||||||
package mops.gruppen2.domain.model;
|
package mops.gruppen2.domain.model;
|
||||||
|
|
||||||
import lombok.Getter;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
|
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
import javax.validation.constraints.Size;
|
import javax.validation.constraints.Size;
|
||||||
|
|
||||||
@Value
|
@Value
|
||||||
@Getter
|
|
||||||
//@AllArgsConstructor
|
|
||||||
//@NoArgsConstructor
|
|
||||||
public class Description {
|
public class Description {
|
||||||
|
|
||||||
//private Description() {}
|
|
||||||
|
|
||||||
@NotBlank
|
@NotBlank
|
||||||
@Size(min = 4, max = 512)
|
@Size(min = 4, max = 512)
|
||||||
|
@JsonProperty("desc")
|
||||||
String groupDescription;
|
String groupDescription;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return groupDescription;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ import java.util.UUID;
|
|||||||
public class Group {
|
public class Group {
|
||||||
|
|
||||||
@EqualsAndHashCode.Include
|
@EqualsAndHashCode.Include
|
||||||
private UUID id;
|
private UUID groupid;
|
||||||
|
|
||||||
@ToString.Exclude
|
@ToString.Exclude
|
||||||
private UUID parent;
|
private UUID parent;
|
||||||
@ -30,7 +30,7 @@ public class Group {
|
|||||||
private Description description;
|
private Description description;
|
||||||
|
|
||||||
@ToString.Exclude
|
@ToString.Exclude
|
||||||
private Limit userLimit = new Limit(1); // Add initial user
|
private Limit limit = new Limit(1); // Add initial user
|
||||||
|
|
||||||
@ToString.Exclude
|
@ToString.Exclude
|
||||||
private final Map<String, User> members = new HashMap<>();
|
private final Map<String, User> members = new HashMap<>();
|
||||||
|
@ -1,19 +1,21 @@
|
|||||||
package mops.gruppen2.domain.model;
|
package mops.gruppen2.domain.model;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
|
|
||||||
import javax.validation.constraints.Max;
|
import javax.validation.constraints.Max;
|
||||||
import javax.validation.constraints.Min;
|
import javax.validation.constraints.Min;
|
||||||
|
|
||||||
@Value
|
@Value
|
||||||
//@Getter
|
|
||||||
//@AllArgsConstructor
|
|
||||||
//@NoArgsConstructor
|
|
||||||
public class Limit {
|
public class Limit {
|
||||||
|
|
||||||
//private Limit() {}
|
|
||||||
|
|
||||||
@Min(1)
|
@Min(1)
|
||||||
@Max(999_999)
|
@Max(999_999)
|
||||||
|
@JsonProperty("limit")
|
||||||
long userLimit;
|
long userLimit;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.valueOf(userLimit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,21 @@
|
|||||||
package mops.gruppen2.domain.model;
|
package mops.gruppen2.domain.model;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
|
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
import javax.validation.constraints.Size;
|
import javax.validation.constraints.Size;
|
||||||
|
|
||||||
@Value
|
@Value
|
||||||
//@Getter
|
|
||||||
//@AllArgsConstructor
|
|
||||||
//@NoArgsConstructor
|
|
||||||
public class Title {
|
public class Title {
|
||||||
|
|
||||||
//private Title() {}
|
|
||||||
|
|
||||||
@NotBlank
|
@NotBlank
|
||||||
@Size(min = 4, max = 128)
|
@Size(min = 4, max = 128)
|
||||||
|
@JsonProperty("title")
|
||||||
String groupTitle;
|
String groupTitle;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return groupTitle;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,31 +2,30 @@ package mops.gruppen2.domain.model;
|
|||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
import lombok.Value;
|
||||||
import org.keycloak.KeycloakPrincipal;
|
import org.keycloak.KeycloakPrincipal;
|
||||||
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
|
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
|
||||||
|
|
||||||
@Getter
|
@Value
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor // Für Jackson: CSV-Import
|
|
||||||
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
|
|
||||||
@ToString
|
@ToString
|
||||||
public class User {
|
public class User {
|
||||||
|
|
||||||
@EqualsAndHashCode.Include
|
@EqualsAndHashCode.Include
|
||||||
private String id;
|
String userid;
|
||||||
|
|
||||||
|
String givenname;
|
||||||
|
|
||||||
private String givenname;
|
|
||||||
@ToString.Exclude
|
@ToString.Exclude
|
||||||
private String familyname;
|
String familyname;
|
||||||
|
|
||||||
@ToString.Exclude
|
@ToString.Exclude
|
||||||
private String email;
|
String email;
|
||||||
|
|
||||||
public User(KeycloakAuthenticationToken token) {
|
public User(KeycloakAuthenticationToken token) {
|
||||||
KeycloakPrincipal principal = (KeycloakPrincipal) token.getPrincipal();
|
KeycloakPrincipal principal = (KeycloakPrincipal) token.getPrincipal();
|
||||||
id = principal.getName();
|
userid = principal.getName();
|
||||||
givenname = principal.getKeycloakSecurityContext().getIdToken().getGivenName();
|
givenname = principal.getKeycloakSecurityContext().getIdToken().getGivenName();
|
||||||
familyname = principal.getKeycloakSecurityContext().getIdToken().getFamilyName();
|
familyname = principal.getKeycloakSecurityContext().getIdToken().getFamilyName();
|
||||||
email = principal.getKeycloakSecurityContext().getIdToken().getEmail();
|
email = principal.getKeycloakSecurityContext().getIdToken().getEmail();
|
||||||
@ -35,10 +34,10 @@ public class User {
|
|||||||
/**
|
/**
|
||||||
* User identifizieren sich über die Id, mehr wird also manchmal nicht benötigt.
|
* User identifizieren sich über die Id, mehr wird also manchmal nicht benötigt.
|
||||||
*
|
*
|
||||||
* @param userId Die User Id
|
* @param userid Die User Id
|
||||||
*/
|
*/
|
||||||
public User(String userId) {
|
public User(String userid) {
|
||||||
id = userId;
|
this.userid = userid;
|
||||||
givenname = "";
|
givenname = "";
|
||||||
familyname = "";
|
familyname = "";
|
||||||
email = "";
|
email = "";
|
||||||
|
@ -84,8 +84,8 @@ public class EventStoreService {
|
|||||||
try {
|
try {
|
||||||
String payload = JsonHelper.serializeEvent(event);
|
String payload = JsonHelper.serializeEvent(event);
|
||||||
return new EventDTO(null,
|
return new EventDTO(null,
|
||||||
event.getGroupId().toString(),
|
event.getGroupid().toString(),
|
||||||
event.getUserId(),
|
event.getUserid(),
|
||||||
getEventType(event),
|
getEventType(event),
|
||||||
payload);
|
payload);
|
||||||
} catch (JsonProcessingException e) {
|
} catch (JsonProcessingException e) {
|
||||||
@ -181,7 +181,7 @@ public class EventStoreService {
|
|||||||
|
|
||||||
return createEvents.stream()
|
return createEvents.stream()
|
||||||
.filter(event -> event instanceof CreateGroupEvent)
|
.filter(event -> event instanceof CreateGroupEvent)
|
||||||
.map(Event::getGroupId)
|
.map(Event::getGroupid)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,14 +194,14 @@ public class EventStoreService {
|
|||||||
List<Event> userEvents = findLatestEventsFromGroupsByUser(user);
|
List<Event> userEvents = findLatestEventsFromGroupsByUser(user);
|
||||||
List<UUID> deletedIds = findLatestEventsFromGroupsByType("DeleteGroupEvent")
|
List<UUID> deletedIds = findLatestEventsFromGroupsByType("DeleteGroupEvent")
|
||||||
.stream()
|
.stream()
|
||||||
.map(Event::getGroupId)
|
.map(Event::getGroupid)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
userEvents.removeIf(event -> deletedIds.contains(event.getGroupId()));
|
userEvents.removeIf(event -> deletedIds.contains(event.getGroupid()));
|
||||||
|
|
||||||
return userEvents.stream()
|
return userEvents.stream()
|
||||||
.filter(event -> event instanceof AddUserEvent)
|
.filter(event -> event instanceof AddUserEvent)
|
||||||
.map(Event::getGroupId)
|
.map(Event::getGroupid)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,7 +244,7 @@ public class EventStoreService {
|
|||||||
* @return Eine Liste von einem Add- oder DeleteUserEvent pro Gruppe
|
* @return Eine Liste von einem Add- oder DeleteUserEvent pro Gruppe
|
||||||
*/
|
*/
|
||||||
private List<Event> findLatestEventsFromGroupsByUser(User user) {
|
private List<Event> findLatestEventsFromGroupsByUser(User user) {
|
||||||
return getEventsFromDTOs(eventStore.findLatestEventDTOsPartitionedByGroupByUser(user.getId()));
|
return getEventsFromDTOs(eventStore.findLatestEventDTOsPartitionedByGroupByUser(user.getUserid()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ public class GroupService {
|
|||||||
* @return Das neue Teilnehmermaximum
|
* @return Das neue Teilnehmermaximum
|
||||||
*/
|
*/
|
||||||
private static Limit getAdjustedUserLimit(List<User> newUsers, Group group) {
|
private static Limit getAdjustedUserLimit(List<User> newUsers, Group group) {
|
||||||
return new Limit(Math.max((long) group.getMembers().size() + newUsers.size(), group.getUserLimit().getUserLimit()));
|
return new Limit(Math.max((long) group.getMembers().size() + newUsers.size(), group.getLimit().getUserLimit()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -122,7 +122,7 @@ public class GroupService {
|
|||||||
ValidationHelper.throwIfNoMember(group, user);
|
ValidationHelper.throwIfNoMember(group, user);
|
||||||
ValidationHelper.throwIfLastAdmin(user, group);
|
ValidationHelper.throwIfLastAdmin(user, group);
|
||||||
|
|
||||||
Role role = group.getRoles().get(user.getId());
|
Role role = group.getRoles().get(user.getUserid());
|
||||||
updateRole(user, group, role.toggle());
|
updateRole(user, group, role.toggle());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,7 +136,7 @@ public class GroupService {
|
|||||||
*/
|
*/
|
||||||
private Group createGroup(User user, UUID parent, Type type) {
|
private Group createGroup(User user, UUID parent, Type type) {
|
||||||
Event event = new CreateGroupEvent(UUID.randomUUID(),
|
Event event = new CreateGroupEvent(UUID.randomUUID(),
|
||||||
user.getId(),
|
user,
|
||||||
parent,
|
parent,
|
||||||
type);
|
type);
|
||||||
Group group = new Group();
|
Group group = new Group();
|
||||||
@ -248,7 +248,7 @@ public class GroupService {
|
|||||||
private void updateRole(User user, Group group, Role role) {
|
private void updateRole(User user, Group group, Role role) {
|
||||||
ValidationHelper.throwIfNoMember(group, user);
|
ValidationHelper.throwIfNoMember(group, user);
|
||||||
|
|
||||||
if (role == group.getRoles().get(user.getId())) {
|
if (role == group.getRoles().get(user.getUserid())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,7 +266,7 @@ public class GroupService {
|
|||||||
public void updateUserLimit(User user, Group group, Limit userLimit) {
|
public void updateUserLimit(User user, Group group, Limit userLimit) {
|
||||||
ValidationHelper.throwIfNoAdmin(group, user);
|
ValidationHelper.throwIfNoAdmin(group, user);
|
||||||
|
|
||||||
if (userLimit == group.getUserLimit()) {
|
if (userLimit == group.getLimit()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,16 +22,16 @@ public class InviteService {
|
|||||||
|
|
||||||
void createLink(Group group) {
|
void createLink(Group group) {
|
||||||
inviteRepository.save(new InviteLinkDTO(null,
|
inviteRepository.save(new InviteLinkDTO(null,
|
||||||
group.getId().toString(),
|
group.getGroupid().toString(),
|
||||||
UUID.randomUUID().toString()));
|
UUID.randomUUID().toString()));
|
||||||
|
|
||||||
log.debug("Link wurde erzeugt! (Gruppe: {})", group.getId());
|
log.debug("Link wurde erzeugt! (Gruppe: {})", group.getGroupid());
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyLink(Group group) {
|
void destroyLink(Group group) {
|
||||||
inviteRepository.deleteLinkOfGroup(group.getId().toString());
|
inviteRepository.deleteLinkOfGroup(group.getGroupid().toString());
|
||||||
|
|
||||||
log.debug("Link wurde zerstört! (Gruppe: {})", group.getId());
|
log.debug("Link wurde zerstört! (Gruppe: {})", group.getGroupid());
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID getGroupIdFromLink(String link) {
|
public UUID getGroupIdFromLink(String link) {
|
||||||
@ -45,10 +45,10 @@ public class InviteService {
|
|||||||
|
|
||||||
public String getLinkByGroup(Group group) {
|
public String getLinkByGroup(Group group) {
|
||||||
try {
|
try {
|
||||||
return inviteRepository.findLinkByGroupId(group.getId().toString());
|
return inviteRepository.findLinkByGroupId(group.getGroupid().toString());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("Link zu Gruppe ({}) konnte nicht gefunden werden!", group.getId(), e);
|
log.error("Link zu Gruppe ({}) konnte nicht gefunden werden!", group.getGroupid(), e);
|
||||||
throw new NoInviteExistException(group.getId().toString());
|
throw new NoInviteExistException(group.getGroupid().toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ public class ProjectionService {
|
|||||||
static List<Group> projectGroups(List<Event> events) throws EventException {
|
static List<Group> projectGroups(List<Event> events) throws EventException {
|
||||||
Map<UUID, Group> groupMap = new HashMap<>();
|
Map<UUID, Group> groupMap = new HashMap<>();
|
||||||
|
|
||||||
events.forEach(event -> event.apply(getOrCreateGroup(groupMap, event.getGroupId())));
|
events.forEach(event -> event.apply(getOrCreateGroup(groupMap, event.getGroupid())));
|
||||||
|
|
||||||
return new ArrayList<>(groupMap.values());
|
return new ArrayList<>(groupMap.values());
|
||||||
}
|
}
|
||||||
@ -119,7 +119,6 @@ public class ProjectionService {
|
|||||||
* @throws EventException Projektionsfehler
|
* @throws EventException Projektionsfehler
|
||||||
*/
|
*/
|
||||||
@Cacheable("groups")
|
@Cacheable("groups")
|
||||||
//TODO: remove userID param
|
|
||||||
public List<Group> projectPublicGroups() throws EventException {
|
public List<Group> projectPublicGroups() throws EventException {
|
||||||
List<UUID> groupIds = eventStoreService.findExistingGroupIds();
|
List<UUID> groupIds = eventStoreService.findExistingGroupIds();
|
||||||
List<Event> events = eventStoreService.findEventsByGroupAndType(groupIds,
|
List<Event> events = eventStoreService.findEventsByGroupAndType(groupIds,
|
||||||
@ -219,7 +218,7 @@ public class ProjectionService {
|
|||||||
void removeUserGroups(List<Group> groups, User user) {
|
void removeUserGroups(List<Group> groups, User user) {
|
||||||
List<UUID> userGroups = eventStoreService.findExistingUserGroups(user);
|
List<UUID> userGroups = eventStoreService.findExistingUserGroups(user);
|
||||||
|
|
||||||
groups.removeIf(group -> userGroups.contains(group.getId()));
|
groups.removeIf(group -> userGroups.contains(group.getGroupid()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,6 +70,6 @@ public class GroupCreationController {
|
|||||||
groupService.addUsersToGroup(CsvHelper.readCsvFile(create.getFile()), group, user);
|
groupService.addUsersToGroup(CsvHelper.readCsvFile(create.getFile()), group, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
return "redirect:/gruppen2/details/" + IdHelper.uuidToString(group.getId());
|
return "redirect:/gruppen2/details/" + IdHelper.uuidToString(group.getGroupid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -204,7 +204,7 @@ public class GroupDetailsController {
|
|||||||
ValidationHelper.throwIfNoAdmin(group, user);
|
ValidationHelper.throwIfNoAdmin(group, user);
|
||||||
|
|
||||||
// Der eingeloggte User kann sich nicht selbst entfernen (er kann aber verlassen)
|
// Der eingeloggte User kann sich nicht selbst entfernen (er kann aber verlassen)
|
||||||
if (!userId.equals(user.getId())) {
|
if (!userId.equals(user.getUserid())) {
|
||||||
groupService.deleteUser(new User(userId), group);
|
groupService.deleteUser(new User(userId), group);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,12 +71,12 @@ public class SearchAndInviteController {
|
|||||||
|
|
||||||
// Gruppe öffentlich
|
// Gruppe öffentlich
|
||||||
if (group.getType() == Type.PUBLIC) {
|
if (group.getType() == Type.PUBLIC) {
|
||||||
return "redirect:/gruppen2/details/" + group.getId();
|
return "redirect:/gruppen2/details/" + group.getGroupid();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bereits Mitglied
|
// Bereits Mitglied
|
||||||
if (ValidationHelper.checkIfMember(group, user)) {
|
if (ValidationHelper.checkIfMember(group, user)) {
|
||||||
return "redirect:/gruppen2/details/" + group.getId();
|
return "redirect:/gruppen2/details/" + group.getGroupid();
|
||||||
}
|
}
|
||||||
|
|
||||||
return "link";
|
return "link";
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<main th:fragment="bodycontent">
|
<main th:fragment="bodycontent">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
|
|
||||||
<h1 class="def-cursor" th:text="${group.getTitle().getGroupTitle()}"></h1>
|
<h1 class="def-cursor" th:text="${group.getTitle()}"></h1>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!--Gruppendetails-->
|
<!--Gruppendetails-->
|
||||||
@ -27,7 +27,7 @@
|
|||||||
<!--Spacer-->
|
<!--Spacer-->
|
||||||
<span class="col"></span>
|
<span class="col"></span>
|
||||||
|
|
||||||
<form method="post" th:action="@{/gruppen2/details/{id}/leave(id=${group.getId()})}">
|
<form method="post" th:action="@{/gruppen2/details/{id}/leave(id=${group.getGroupid()})}">
|
||||||
<button class="btn btn-danger btn-bar" type="submit">Gruppe verlassen
|
<button class="btn btn-danger btn-bar" type="submit">Gruppe verlassen
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
@ -40,13 +40,13 @@
|
|||||||
<!--Anzahl Text-->
|
<!--Anzahl Text-->
|
||||||
<div class="mb-2">
|
<div class="mb-2">
|
||||||
<span>Teilnehmer: </span>
|
<span>Teilnehmer: </span>
|
||||||
<span th:text="${group.getMembers().size() + ' von ' + group.getUserLimit().getUserLimit()}"></span>
|
<span th:text="${group.getMembers().size() + ' von ' + group.getLimit().getUserLimit()}"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--Bearbeiten-Button-->
|
<!--Bearbeiten-Button-->
|
||||||
<div class="mb-2" th:if="${group.getRoles().get(user.getId()) == admin}">
|
<div class="mb-2" th:if="${group.getRoles().get(user.getUserid()) == admin}">
|
||||||
<form method="get"
|
<form method="get"
|
||||||
th:action="@{/gruppen2/details/{id}/edit(id=${group.getId()})}">
|
th:action="@{/gruppen2/details/{id}/edit(id=${group.getGroupid()})}">
|
||||||
<button class="btn btn-secondary btn-block">Gruppe verwalten</button>
|
<button class="btn btn-secondary btn-block">Gruppe verwalten</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10,19 +10,19 @@
|
|||||||
|
|
||||||
<main th:fragment="bodycontent">
|
<main th:fragment="bodycontent">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<h1 class="def-cursor" th:text="${group.getTitle().getGroupTitle()}"></h1>
|
<h1 class="def-cursor" th:text="${group.getTitle()}"></h1>
|
||||||
|
|
||||||
<!--Fertig oder löschen-->
|
<!--Fertig oder löschen-->
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<form method="get" th:action="@{/gruppen2/details/{id}(id=${group.getId()})}">
|
<form method="get" th:action="@{/gruppen2/details/{id}(id=${group.getGroupid()})}">
|
||||||
<button class="btn btn-primary">Fertig</button>
|
<button class="btn btn-primary">Fertig</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<!--Spacer-->
|
<!--Spacer-->
|
||||||
<span class="col"></span>
|
<span class="col"></span>
|
||||||
|
|
||||||
<form method="post" th:action="@{/gruppen2/details/{id}/edit/destroy(id=${group.getId()})}">
|
<form method="post" th:action="@{/gruppen2/details/{id}/edit/destroy(id=${group.getGroupid()})}">
|
||||||
<button class="btn btn-danger btn-bar" type="submit">Gruppe löschen
|
<button class="btn btn-danger btn-bar" type="submit">Gruppe löschen
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
<!--Beschreibung + Titel-->
|
<!--Beschreibung + Titel-->
|
||||||
<div class="content-text">
|
<div class="content-text">
|
||||||
<form th:action="@{/gruppen2/details/{id}/edit/meta(id=${group.getId()})}"
|
<form th:action="@{/gruppen2/details/{id}/edit/meta(id=${group.getGroupid()})}"
|
||||||
method="post">
|
method="post">
|
||||||
|
|
||||||
<div th:replace="~{fragments/forms :: meta}"></div>
|
<div th:replace="~{fragments/forms :: meta}"></div>
|
||||||
@ -63,7 +63,7 @@
|
|||||||
|
|
||||||
<!--Userlimit-->
|
<!--Userlimit-->
|
||||||
<div class="content-text-in">
|
<div class="content-text-in">
|
||||||
<form th:action="@{/gruppen2/details/{id}/edit/userlimit(id=${group.getId()})}"
|
<form th:action="@{/gruppen2/details/{id}/edit/userlimit(id=${group.getGroupid()})}"
|
||||||
method="post">
|
method="post">
|
||||||
|
|
||||||
<div th:replace="~{fragments/forms :: userlimit}"></div>
|
<div th:replace="~{fragments/forms :: userlimit}"></div>
|
||||||
@ -76,7 +76,7 @@
|
|||||||
|
|
||||||
<!--CSV Import-->
|
<!--CSV Import-->
|
||||||
<div class="content-text mb-0">
|
<div class="content-text mb-0">
|
||||||
<form th:action="@{/gruppen2/details/{id}/edit/csv(id=${group.getId()})}"
|
<form th:action="@{/gruppen2/details/{id}/edit/csv(id=${group.getGroupid()})}"
|
||||||
th:if="${account.getRoles().contains('orga')}"
|
th:if="${account.getRoles().contains('orga')}"
|
||||||
enctype="multipart/form-data" method="post">
|
enctype="multipart/form-data" method="post">
|
||||||
|
|
||||||
@ -103,13 +103,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
<form th:action="@{/gruppen2/details/{id}/edit/delete/{userid}(id=${group.getId()}, userid=${member.getId()})}"
|
<form th:action="@{/gruppen2/details/{id}/edit/delete/{userid}(id=${group.getGroupid()}, userid=${member.getUserid()})}"
|
||||||
th:unless="${member.getId() == account.getName()}"
|
th:unless="${member.getUserid() == account.getName()}"
|
||||||
method="post">
|
method="post">
|
||||||
<button type="submit" class="btn btn-danger mr-2">Entfernen</button>
|
<button type="submit" class="btn btn-danger mr-2">Entfernen</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<form th:action="@{/gruppen2/details/{id}/edit/role/{userid}(id=${group.getId()}, userid=${member.getId()})}"
|
<form th:action="@{/gruppen2/details/{id}/edit/role/{userid}(id=${group.getGroupid()}, userid=${member.getUserid()})}"
|
||||||
method="post">
|
method="post">
|
||||||
<button type="submit" class="btn btn-warning">Rolle ändern</button>
|
<button type="submit" class="btn btn-warning">Rolle ändern</button>
|
||||||
</form>
|
</form>
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<span class="input-group-text text-monospace">Gruppentitel:</span>
|
<span class="input-group-text text-monospace">Gruppentitel:</span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="groupTitle" minlength="4" maxlength="128"
|
<input type="text" class="form-control" name="groupTitle" minlength="4" maxlength="128"
|
||||||
th:value="${group?.getTitle()?.getGroupTitle()}" required>
|
th:value="${group?.getTitle()}" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--Gruppenbeschreibung-->
|
<!--Gruppenbeschreibung-->
|
||||||
@ -50,8 +50,8 @@
|
|||||||
<input type="hidden" id="parentdummy" name="parent" value="00000000-0000-0000-0000-000000000000" disabled>
|
<input type="hidden" id="parentdummy" name="parent" value="00000000-0000-0000-0000-000000000000" disabled>
|
||||||
<select class="custom-select" id="parentselect" name="parent">
|
<select class="custom-select" id="parentselect" name="parent">
|
||||||
<option value="00000000-0000-0000-0000-000000000000" selected>Keiner</option>
|
<option value="00000000-0000-0000-0000-000000000000" selected>Keiner</option>
|
||||||
<option th:each="lecture : ${lectures}" th:value="${lecture.getId()}"
|
<option th:each="lecture : ${lectures}" th:value="${lecture.getGroupid()}"
|
||||||
th:text="${lecture.getTitle().getGroupTitle()}"></option>
|
th:text="${lecture.getTitle()}"></option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -62,16 +62,16 @@
|
|||||||
<label for="userlimit">Teilnehmeranzahl:</label>
|
<label for="userlimit">Teilnehmeranzahl:</label>
|
||||||
<div class="btn-toolbar row mx-0" id="userlimit">
|
<div class="btn-toolbar row mx-0" id="userlimit">
|
||||||
<input type="hidden" name="userLimit" id="limit" value="999999"
|
<input type="hidden" name="userLimit" id="limit" value="999999"
|
||||||
th:disabled="${group != null && group.getUserLimit().getUserLimit() < 999999} ? 'disabled' : 'false'">
|
th:disabled="${group != null && group.getLimit().getUserLimit() < 999999} ? 'disabled' : 'false'">
|
||||||
<div class="btn-group btn-group-toggle col-sm-4 px-0" data-toggle="buttons">
|
<div class="btn-group btn-group-toggle col-sm-4 px-0" data-toggle="buttons">
|
||||||
<label class="btn btn-secondary active" onclick="disable('#limitselect'); enable('#limit')">
|
<label class="btn btn-secondary active" onclick="disable('#limitselect'); enable('#limit')">
|
||||||
<input type="radio"
|
<input type="radio"
|
||||||
th:checked="${group != null && group.getUserLimit().getUserLimit() < 999999} ? 'false' : 'checked'">
|
th:checked="${group != null && group.getLimit().getUserLimit() < 999999} ? 'false' : 'checked'">
|
||||||
Unbegrenzt
|
Unbegrenzt
|
||||||
</label>
|
</label>
|
||||||
<label class="btn btn-secondary" onclick="enable('#limitselect'); disable('#limit')">
|
<label class="btn btn-secondary" onclick="enable('#limitselect'); disable('#limit')">
|
||||||
<input type="radio"
|
<input type="radio"
|
||||||
th:checked="${group != null && group.getUserLimit().getUserLimit() < 999999} ? 'checked' : 'false'">
|
th:checked="${group != null && group.getLimit().getUserLimit() < 999999} ? 'checked' : 'false'">
|
||||||
Begrenzt
|
Begrenzt
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@ -82,9 +82,9 @@
|
|||||||
<span class="input-group-text text-monospace">Limit:</span>
|
<span class="input-group-text text-monospace">Limit:</span>
|
||||||
</div>
|
</div>
|
||||||
<input type="number" class="form-control" name="userLimit"
|
<input type="number" class="form-control" name="userLimit"
|
||||||
th:value="${group != null} ? ${group.getUserLimit().getUserLimit()} : '999999'"
|
th:value="${group != null} ? ${group.getLimit().getUserLimit()} : '999999'"
|
||||||
min="1" max="999999" id="limitselect" required
|
min="1" max="999999" id="limitselect" required
|
||||||
th:disabled="${group != null && group.getUserLimit().getUserLimit() < 999999} ? 'false' : 'disabled'">
|
th:disabled="${group != null && group.getLimit().getUserLimit() < 999999} ? 'false' : 'disabled'">
|
||||||
<div class="input-group-append">
|
<div class="input-group-append">
|
||||||
<span class="input-group-text text-monospace">Teilnehmer</span>
|
<span class="input-group-text text-monospace">Teilnehmer</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -15,9 +15,9 @@
|
|||||||
th:if='${group.getType() == lecture}'>Veranstaltung</span>
|
th:if='${group.getType() == lecture}'>Veranstaltung</span>
|
||||||
|
|
||||||
<span class="badge badge-pill parent"
|
<span class="badge badge-pill parent"
|
||||||
th:unless="${parent == null || parent?.getTitle()?.getGroupTitle() == null|| parent?.getTitle()?.getGroupTitle() == ''}"
|
th:unless="${parent == null || parent?.getTitle() == null|| parent?.getTitle() == ''}"
|
||||||
th:title="${'Die Gruppe gehört zur Veranstaltung ' + parent.getTitle().getGroupTitle() + '.'}"
|
th:title="${'Die Gruppe gehört zur Veranstaltung ' + parent.getTitle() + '.'}"
|
||||||
th:text="${parent.getTitle().getGroupTitle()}">Parent</span>
|
th:text="${parent.getTitle()}">Parent</span>
|
||||||
|
|
||||||
<!--Needs completly projected (cached) groups-->
|
<!--Needs completly projected (cached) groups-->
|
||||||
<!--<span class="badge badge-success float-right"
|
<!--<span class="badge badge-success float-right"
|
||||||
@ -28,7 +28,7 @@
|
|||||||
<!--User Badges-->
|
<!--User Badges-->
|
||||||
<th:block th:fragment="userbadges">
|
<th:block th:fragment="userbadges">
|
||||||
<span class="badge badge-success align-self-start ml-2"
|
<span class="badge badge-success align-self-start ml-2"
|
||||||
th:if="${group.getRoles().get(member.getId()) == admin}">Admin</span>
|
th:if="${group.getRoles().get(member.getUserid()) == admin}">Admin</span>
|
||||||
</th:block>
|
</th:block>
|
||||||
|
|
||||||
<th:block th:fragment="groupcontent">
|
<th:block th:fragment="groupcontent">
|
||||||
@ -48,21 +48,21 @@
|
|||||||
<!--Buttonbar zum Gruppe beitreten-->
|
<!--Buttonbar zum Gruppe beitreten-->
|
||||||
<th:block th:fragment="joingroup">
|
<th:block th:fragment="joingroup">
|
||||||
<div class="content-heading">
|
<div class="content-heading">
|
||||||
<span th:if="${group.getMembers().size() < group.getUserLimit().getUserLimit()}">
|
<span th:if="${group.getMembers().size() < group.getLimit().getUserLimit()}">
|
||||||
Möchtest du dieser Gruppe beitreten?
|
Möchtest du dieser Gruppe beitreten?
|
||||||
</span>
|
</span>
|
||||||
<span th:unless="${group.getMembers().size() < group.getUserLimit().getUserLimit()}">
|
<span th:unless="${group.getMembers().size() < group.getLimit().getUserLimit()}">
|
||||||
Diese Gruppe hat ihre maximale Teilnehmeranzahl erreicht.
|
Diese Gruppe hat ihre maximale Teilnehmeranzahl erreicht.
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<form method="post" th:action="@{/gruppen2/details/{id}/join(id = ${group.getId()})}"
|
<form method="post" th:action="@{/gruppen2/details/{id}/join(id = ${group.getGroupId()})}"
|
||||||
th:if="${group.getMembers().size() < group.getUserLimit().getUserLimit()}">
|
th:if="${group.getMembers().size() < group.getLimit().getUserLimit()}">
|
||||||
<button class="btn btn-success" type="submit">Gruppe beitreten.</button>
|
<button class="btn btn-success" type="submit">Gruppe beitreten.</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div class="col" th:if="${group.getMembers().size() < group.getUserLimit().getUserLimit()}"></div>
|
<div class="col" th:if="${group.getMembers().size() < group.getLimit().getUserLimit()}"></div>
|
||||||
|
|
||||||
<a class="btn btn-primary" href="/gruppen2"
|
<a class="btn btn-primary" href="/gruppen2"
|
||||||
type="submit">Startseite.</a>
|
type="submit">Startseite.</a>
|
||||||
|
@ -16,8 +16,8 @@
|
|||||||
<!--Gruppenliste belegte Gruppen-->
|
<!--Gruppenliste belegte Gruppen-->
|
||||||
<div class="content" th:each="group: ${groups}">
|
<div class="content" th:each="group: ${groups}">
|
||||||
<div class="content-heading row">
|
<div class="content-heading row">
|
||||||
<a class="link col" th:href="@{/gruppen2/details/{id}(id=${group.getId()})}"
|
<a class="link col" th:href="@{/gruppen2/details/{id}(id=${group.getGroupid()})}"
|
||||||
th:text="${group.getTitle().getGroupTitle()}"></a>
|
th:text="${group.getTitle()}"></a>
|
||||||
|
|
||||||
<span th:replace="~{fragments/groups :: badges}"></span>
|
<span th:replace="~{fragments/groups :: badges}"></span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<main th:fragment="bodycontent">
|
<main th:fragment="bodycontent">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<h1 class="def-cursor" th:text="${group.getTitle().getGroupTitle()}"></h1>
|
<h1 class="def-cursor" th:text="${group.getTitle()}"></h1>
|
||||||
|
|
||||||
<div class="content" th:insert="~{fragments/groups :: groupcontent}"></div>
|
<div class="content" th:insert="~{fragments/groups :: groupcontent}"></div>
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<main th:fragment="bodycontent">
|
<main th:fragment="bodycontent">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<h1 class="def-cursor" th:text="${group.getTitle().getGroupTitle()}"></h1>
|
<h1 class="def-cursor" th:text="${group.getTitle()}"></h1>
|
||||||
|
|
||||||
<div class="content" th:insert="~{fragments/groups :: groupcontent}"></div>
|
<div class="content" th:insert="~{fragments/groups :: groupcontent}"></div>
|
||||||
|
|
||||||
|
@ -31,8 +31,8 @@
|
|||||||
<div class="content-heading row">
|
<div class="content-heading row">
|
||||||
<span th:replace="~{fragments/groups :: badges}"></span>
|
<span th:replace="~{fragments/groups :: badges}"></span>
|
||||||
|
|
||||||
<a class="link col" th:href="@{/gruppen2/details/{id}(id=${group.getId()})}"
|
<a class="link col" th:href="@{/gruppen2/details/{id}(id=${group.getGroupid()})}"
|
||||||
th:text="${group.getTitle().getGroupTitle()}"></a>
|
th:text="${group.getTitle()}"></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="content-text-in">
|
<div class="content-text-in">
|
||||||
<span th:text="${group.getDescription().getGroupDescription()}"></span>
|
<span th:text="${group.getDescription().getGroupDescription()}"></span>
|
||||||
|
@ -230,7 +230,7 @@ public class TestBuilder {
|
|||||||
Collections.shuffle(shuffle);
|
Collections.shuffle(shuffle);
|
||||||
|
|
||||||
for (Event event : shuffle) {
|
for (Event event : shuffle) {
|
||||||
removeEvents.add(new DeleteUserEvent(event.getGroupId(), event.getUserId()));
|
removeEvents.add(new DeleteUserEvent(event.getGroupid(), event.getUserid()));
|
||||||
|
|
||||||
if (removeEvents.size() >= count) {
|
if (removeEvents.size() >= count) {
|
||||||
break;
|
break;
|
||||||
@ -249,7 +249,7 @@ public class TestBuilder {
|
|||||||
*/
|
*/
|
||||||
public static List<Event> deleteUserEvents(Group group) {
|
public static List<Event> deleteUserEvents(Group group) {
|
||||||
return group.getMembers().parallelStream()
|
return group.getMembers().parallelStream()
|
||||||
.map(user -> deleteUserEvent(group.getId(), user.getId()))
|
.map(user -> deleteUserEvent(group.getGroupid(), user.getUserId()))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ class CreateGroupEventTest {
|
|||||||
|
|
||||||
assertThat(group.getMembers()).hasSize(0);
|
assertThat(group.getMembers()).hasSize(0);
|
||||||
assertThat(group.getType()).isEqualTo(Type.PUBLIC);
|
assertThat(group.getType()).isEqualTo(Type.PUBLIC);
|
||||||
assertThat(group.getId()).isEqualTo(uuidMock(0));
|
assertThat(group.getGroupid()).isEqualTo(uuidMock(0));
|
||||||
assertThat(group.getParent()).isEqualTo(uuidMock(1));
|
assertThat(group.getParent()).isEqualTo(uuidMock(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,8 @@ class DeleteGroupEventTest {
|
|||||||
|
|
||||||
assertThat(group.getMembers()).isEmpty();
|
assertThat(group.getMembers()).isEmpty();
|
||||||
assertThat(group.getType()).isEqualTo(null);
|
assertThat(group.getType()).isEqualTo(null);
|
||||||
assertThat(group.getUserLimit()).isEqualTo(0);
|
assertThat(group.getLimit()).isEqualTo(0);
|
||||||
assertThat(group.getId()).isEqualTo(uuidMock(0));
|
assertThat(group.getGroupid()).isEqualTo(uuidMock(0));
|
||||||
assertThat(group.getParent()).isEqualTo(null);
|
assertThat(group.getParent()).isEqualTo(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ class UpdateUserLimitEventTest {
|
|||||||
|
|
||||||
Group group = apply(createEvent, updateEvent);
|
Group group = apply(createEvent, updateEvent);
|
||||||
|
|
||||||
assertThat(group.getUserLimit()).isEqualTo(5);
|
assertThat(group.getLimit()).isEqualTo(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -72,8 +72,8 @@ class EventStoreServiceTest {
|
|||||||
|
|
||||||
EventDTO dto = EventStoreService.getDTOFromEvent(event);
|
EventDTO dto = EventStoreService.getDTOFromEvent(event);
|
||||||
|
|
||||||
assertThat(dto.getGroup_id()).isEqualTo(event.getGroupId().toString());
|
assertThat(dto.getGroup_id()).isEqualTo(event.getGroupid().toString());
|
||||||
assertThat(dto.getUser_id()).isEqualTo(event.getUserId());
|
assertThat(dto.getUser_id()).isEqualTo(event.getUserid());
|
||||||
assertThat(dto.getEvent_id()).isEqualTo(null);
|
assertThat(dto.getEvent_id()).isEqualTo(null);
|
||||||
assertThat(dto.getEvent_type()).isEqualTo("CreateGroupEvent");
|
assertThat(dto.getEvent_type()).isEqualTo("CreateGroupEvent");
|
||||||
}
|
}
|
||||||
|
@ -108,8 +108,8 @@ class GroupServiceTest {
|
|||||||
List<UUID> groupIds = Arrays.asList(uuidMock(0), uuidMock(1));
|
List<UUID> groupIds = Arrays.asList(uuidMock(0), uuidMock(1));
|
||||||
|
|
||||||
assertThat(eventStoreService.findGroupEvents(groupIds)).hasSize(2);
|
assertThat(eventStoreService.findGroupEvents(groupIds)).hasSize(2);
|
||||||
assertThat(eventStoreService.findGroupEvents(groupIds).get(0).getGroupId()).isEqualTo(uuidMock(0));
|
assertThat(eventStoreService.findGroupEvents(groupIds).get(0).getGroupid()).isEqualTo(uuidMock(0));
|
||||||
assertThat(eventStoreService.findGroupEvents(groupIds).get(1).getGroupId()).isEqualTo(uuidMock(1));
|
assertThat(eventStoreService.findGroupEvents(groupIds).get(1).getGroupid()).isEqualTo(uuidMock(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: ProjectionServiceTest
|
//TODO: ProjectionServiceTest
|
||||||
|
@ -161,7 +161,7 @@ class APIControllerTest {
|
|||||||
void getGroupFromId_singleGroup() {
|
void getGroupFromId_singleGroup() {
|
||||||
eventStoreService.saveAll(createPrivateGroupEvent(uuidMock(0)));
|
eventStoreService.saveAll(createPrivateGroupEvent(uuidMock(0)));
|
||||||
|
|
||||||
assertThat(apiController.getApiGroup(uuidMock(0).toString()).getId()).isEqualTo(uuidMock(0));
|
assertThat(apiController.getApiGroup(uuidMock(0).toString()).getGroupid()).isEqualTo(uuidMock(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Reference in New Issue
Block a user