1

finish group service

This commit is contained in:
Christoph
2020-04-07 23:00:23 +02:00
parent 8d88ef4346
commit 9da2d51897
6 changed files with 85 additions and 60 deletions

View File

@ -4,7 +4,6 @@ import mops.gruppen2.domain.Account;
import mops.gruppen2.domain.Group; import mops.gruppen2.domain.Group;
import mops.gruppen2.domain.GroupType; import mops.gruppen2.domain.GroupType;
import mops.gruppen2.domain.User; import mops.gruppen2.domain.User;
import mops.gruppen2.service.ControllerService;
import mops.gruppen2.service.CsvService; import mops.gruppen2.service.CsvService;
import mops.gruppen2.service.GroupService; import mops.gruppen2.service.GroupService;
import mops.gruppen2.service.IdService; import mops.gruppen2.service.IdService;
@ -35,13 +34,11 @@ import static mops.gruppen2.service.IdService.uuidToString;
public class GroupCreationController { public class GroupCreationController {
private final GroupService groupService; private final GroupService groupService;
private final ControllerService controllerService;
private final ValidationService validationService; private final ValidationService validationService;
private final ProjectionService projectionService; private final ProjectionService projectionService;
public GroupCreationController(GroupService groupService, ControllerService controllerService, ValidationService validationService, ProjectionService projectionService) { public GroupCreationController(GroupService groupService, ValidationService validationService, ProjectionService projectionService) {
this.groupService = groupService; this.groupService = groupService;
this.controllerService = controllerService;
this.validationService = validationService; this.validationService = validationService;
this.projectionService = projectionService; this.projectionService = projectionService;
} }

View File

@ -80,7 +80,7 @@ public class GroupDetailsController {
model.addAttribute("private", Visibility.PRIVATE); model.addAttribute("private", Visibility.PRIVATE);
if (validationService.checkIfAdmin(group, user)) { if (validationService.checkIfAdmin(group, user)) {
model.addAttribute("link", serverURL + "gruppen2/acceptinvite/" + inviteService.getLinkByGroup(group.getId())); model.addAttribute("link", serverURL + "gruppen2/acceptinvite/" + inviteService.getLinkByGroup(group));
} }
return "detailsMember"; return "detailsMember";

View File

@ -29,13 +29,6 @@ public class AddUserEvent extends Event {
this.email = email; this.email = email;
} }
public AddUserEvent(UUID groupId, User user) {
super(groupId, user.getId());
givenname = user.getGivenname();
familyname = user.getFamilyname();
email = user.getEmail();
}
public AddUserEvent(Group group, User user) { public AddUserEvent(Group group, User user) {
super(group.getId(), user.getId()); super(group.getId(), user.getId());
givenname = user.getGivenname(); givenname = user.getGivenname();

View File

@ -18,16 +18,14 @@ import mops.gruppen2.domain.event.UpdateUserLimitEvent;
import mops.gruppen2.domain.exception.EventException; import mops.gruppen2.domain.exception.EventException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
/** /**
* Behandelt Aufgaben, welche sich auf eine Gruppe beziehen. * Behandelt Aufgaben, welche sich auf eine Gruppe beziehen.
* Es werden übergebene Gruppen bearbeitet und dementsprechend Events erzeugt und gespeichert. * Es werden übergebene Gruppen bearbeitet und dementsprechend Events erzeugt und gespeichert.
*/ */
//TODO: Der GroupService sollte im Endeffekt größtenteils auf einer übergebenen Gruppe arbeiten.
@Service @Service
@Log4j2 @Log4j2
public class GroupService { public class GroupService {
@ -63,27 +61,16 @@ public class GroupService {
long userLimit, long userLimit,
UUID parent) { UUID parent) {
UUID groupId = UUID.randomUUID(); Group group = createGroup(user, parent, groupType, visibility, userLimit);
List<Event> events = new ArrayList<>();
//TODO: etwas auslagern? addUser(user, group);
events.add(new CreateGroupEvent(groupId, updateTitle(user, group, title);
user.getId(), updateDescription(user, group, description);
parent, updateRole(user, group, Role.ADMIN);
groupType,
visibility,
userLimit));
events.add(new AddUserEvent(groupId, user));
events.add(new UpdateGroupTitleEvent(groupId, user.getId(), title));
events.add(new UpdateGroupDescriptionEvent(groupId, user.getId(), description));
events.add(new UpdateRoleEvent(groupId, user.getId(), Role.ADMIN));
inviteService.createLink(groupId); inviteService.createLink(group);
eventStoreService.saveAll(events);
log.trace("Es wurde eine Gruppe erstellt. ({})", visibility); return group;
return ProjectionService.projectSingleGroup(events);
} }
@ -102,12 +89,7 @@ public class GroupService {
public void addUsersToGroup(List<User> newUsers, Group group, User user) { public void addUsersToGroup(List<User> newUsers, Group group, User user) {
updateUserLimit(user, group, getAdjustedUserLimit(newUsers, group)); updateUserLimit(user, group, getAdjustedUserLimit(newUsers, group));
List<Event> events = newUsers.stream() newUsers.forEach(newUser -> addUserSilent(newUser, group));
.filter(newUser -> !group.getMembers().contains(newUser))
.map(newUser -> new AddUserEvent(group.getId(), newUser))
.collect(Collectors.toList());
eventStoreService.saveAll(events);
} }
/** /**
@ -136,27 +118,58 @@ public class GroupService {
validationService.throwIfNotInGroup(group, user); validationService.throwIfNotInGroup(group, user);
Role role = group.getRoles().get(user.getId()); Role role = group.getRoles().get(user.getId());
Event updateRoleEvent = new UpdateRoleEvent(group, user, role.toggle()); updateRole(user, group, role.toggle());
eventStoreService.saveEvent(updateRoleEvent);
} }
// ################################# SINGLE EVENTS ########################################### // ################################# SINGLE EVENTS ###########################################
// Spezifische Events werden erzeugt, validiert, auf die Gruppe angewandt und gespeichert
//TODO: more validation
private Group createGroup(User user, UUID parent, GroupType groupType, Visibility visibility, long userLimit) {
Event event = new CreateGroupEvent(UUID.randomUUID(),
user.getId(),
parent,
groupType, visibility,
userLimit);
Group group = ProjectionService.projectSingleGroup(Collections.singletonList(event));
log.trace("Es wurde eine Gruppe erstellt. ({}, {})", visibility, group.getId());
eventStoreService.saveEvent(event);
return group;
}
//TODO: test if exception interrupts runtime
public void addUser(User user, Group group) { public void addUser(User user, Group group) {
validationService.throwIfUserAlreadyInGroup(group, user); validationService.throwIfUserAlreadyInGroup(group, user);
AddUserEvent event = new AddUserEvent(group, user); Event event = new AddUserEvent(group, user);
event.apply(group);
eventStoreService.saveEvent(event); eventStoreService.saveEvent(event);
} }
/**
* Dasselbe wie addUser(), aber exceptions werden abgefangen und nicht geworfen.
*/
private void addUserSilent(User user, Group group) {
try {
addUser(user, group);
} catch (Exception e) {
log.trace("Doppelter User wurde nicht hinzugefügt ({})!", user.getId());
}
}
public void deleteUser(User user, Group group) throws EventException { public void deleteUser(User user, Group group) throws EventException {
validationService.throwIfNotInGroup(group, user); validationService.throwIfNotInGroup(group, user);
validationService.throwIfLastAdmin(user, group); validationService.throwIfLastAdmin(user, group);
DeleteUserEvent event = new DeleteUserEvent(group, user); Event event = new DeleteUserEvent(group, user);
event.apply(group);
eventStoreService.saveEvent(event); eventStoreService.saveEvent(event);
if (validationService.checkIfGroupEmpty(group)) { if (validationService.checkIfGroupEmpty(group)) {
@ -167,27 +180,42 @@ public class GroupService {
public void deleteGroup(User user, Group group) { public void deleteGroup(User user, Group group) {
inviteService.destroyLink(group); inviteService.destroyLink(group);
DeleteGroupEvent event = new DeleteGroupEvent(group, user); log.trace("Eine Gruppe wurde gelöscht ({})", group.getId());
eventStoreService.saveEvent(event);
log.trace("Eine Gruppe wurde gelöscht ({})", group); Event event = new DeleteGroupEvent(group, user);
event.apply(group);
eventStoreService.saveEvent(event);
} }
//TODO: Validate title //TODO: Validate title
public void updateTitle(User user, Group group, String title) { public void updateTitle(User user, Group group, String title) {
UpdateGroupTitleEvent event = new UpdateGroupTitleEvent(group, user, title); Event event = new UpdateGroupTitleEvent(group, user, title);
event.apply(group);
eventStoreService.saveEvent(event); eventStoreService.saveEvent(event);
} }
//TODO: Validate description //TODO: Validate description
public void updateDescription(User user, Group group, String description) { public void updateDescription(User user, Group group, String description) {
UpdateGroupDescriptionEvent event = new UpdateGroupDescriptionEvent(group, user, description); Event event = new UpdateGroupDescriptionEvent(group, user, description);
event.apply(group);
eventStoreService.saveEvent(event);
}
public void updateRole(User user, Group group, Role role) {
Event event = new UpdateRoleEvent(group, user, role);
event.apply(group);
eventStoreService.saveEvent(event); eventStoreService.saveEvent(event);
} }
//TODO: Validate limit //TODO: Validate limit
public void updateUserLimit(User user, Group group, long userLimit) { public void updateUserLimit(User user, Group group, long userLimit) {
UpdateUserLimitEvent event = new UpdateUserLimitEvent(group, user, userLimit); Event event = new UpdateUserLimitEvent(group, user, userLimit);
event.apply(group);
eventStoreService.saveEvent(event); eventStoreService.saveEvent(event);
} }
} }

View File

@ -20,18 +20,18 @@ public class InviteService {
this.inviteRepository = inviteRepository; this.inviteRepository = inviteRepository;
} }
void createLink(UUID groupId) { void createLink(Group group) {
inviteRepository.save(new InviteLinkDTO(null, inviteRepository.save(new InviteLinkDTO(null,
groupId.toString(), group.getId().toString(),
UUID.randomUUID().toString())); UUID.randomUUID().toString()));
}
void destroyLink(UUID groupId) { log.trace("Link wurde erzeugt! (Gruppe: {})", group.getId());
inviteRepository.deleteLinkOfGroup(groupId.toString());
} }
void destroyLink(Group group) { void destroyLink(Group group) {
inviteRepository.deleteLinkOfGroup(group.getId().toString()); inviteRepository.deleteLinkOfGroup(group.getId().toString());
log.trace("Link wurde zerstört! (Gruppe: {})", group.getId());
} }
public UUID getGroupIdFromLink(String link) { public UUID getGroupIdFromLink(String link) {
@ -44,13 +44,13 @@ public class InviteService {
} }
} }
public String getLinkByGroup(UUID groupId) { public String getLinkByGroup(Group group) {
try { try {
return inviteRepository.findLinkByGroupId(groupId.toString()); return inviteRepository.findLinkByGroupId(group.getId().toString());
} catch (Exception e) { } catch (Exception e) {
log.error("Link zu Gruppe ({}) konnte nicht gefunden werden!", groupId); log.error("Link zu Gruppe ({}) konnte nicht gefunden werden!", group.getId());
e.printStackTrace(); e.printStackTrace();
throw new NoInviteExistException(groupId.toString()); throw new NoInviteExistException(group.getId().toString());
} }
} }
} }

View File

@ -99,8 +99,11 @@ public class ValidationService {
return false; return false;
} }
/**
* Schmeißt keine Exception, wenn der User der letzte User ist.
*/
void throwIfLastAdmin(User user, Group group) { void throwIfLastAdmin(User user, Group group) {
if (checkIfLastAdmin(user, group)) { if (!checkIfLastMember(user, group) && checkIfLastAdmin(user, group)) {
throw new NoAdminAfterActionException("Du bist letzter Admin!"); throw new NoAdminAfterActionException("Du bist letzter Admin!");
} }
} }
@ -114,6 +117,10 @@ public class ValidationService {
return true; return true;
} }
boolean checkIfLastMember(User user, Group group) {
return group.getMembers().contains(user) && group.getMembers().size() == 1;
}
/** /**
* Überprüft, ob alle Felder richtig gesetzt sind. * Überprüft, ob alle Felder richtig gesetzt sind.
* *