1

Merge branch 'refactoring' into error-handling

# Conflicts:
#	src/main/java/mops/gruppen2/controller/Gruppen2Controller.java
#	src/main/java/mops/gruppen2/domain/Exceptions/UserAlreadyExistsException.java
#	src/main/java/mops/gruppen2/domain/Exceptions/UserNotFoundException.java
#	src/main/java/mops/gruppen2/domain/Group.java
#	src/main/java/mops/gruppen2/domain/event/AddUserEvent.java
#	src/main/java/mops/gruppen2/domain/event/CreateGroupEvent.java
#	src/main/java/mops/gruppen2/domain/event/DeleteUserEvent.java
#	src/main/java/mops/gruppen2/domain/event/Event.java
#	src/main/java/mops/gruppen2/domain/event/UpdateGroupDescriptionEvent.java
#	src/main/java/mops/gruppen2/domain/event/UpdateGroupTitleEvent.java
#	src/main/java/mops/gruppen2/domain/event/UpdateRoleEvent.java
#	src/main/java/mops/gruppen2/domain/exception/EventException.java
#	src/main/java/mops/gruppen2/domain/exception/GroupIdMismatchException.java
#	src/main/java/mops/gruppen2/domain/exception/GroupNotFoundException.java
#	src/main/java/mops/gruppen2/domain/exception/NoValueException.java
#	src/main/java/mops/gruppen2/service/ControllerService.java
#	src/main/java/mops/gruppen2/service/GroupService.java
#	src/main/java/mops/gruppen2/service/UserService.java
#	src/main/resources/templates/errorRenameLater.html
This commit is contained in:
Christoph
2020-03-18 23:40:39 +01:00
57 changed files with 741 additions and 631 deletions

View File

@ -1,14 +1,15 @@
package mops.gruppen2.service;
import mops.gruppen2.domain.Group;
import mops.gruppen2.domain.apiWrapper.UpdatedGroupRequestMapper;
import mops.gruppen2.domain.api.GroupRequestWrapper;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class APIFormatterService {
static public UpdatedGroupRequestMapper wrapp(Long status, List<Group> groupList){
return new UpdatedGroupRequestMapper(status, groupList);
public static GroupRequestWrapper wrap(Long status, List<Group> groupList) {
return new GroupRequestWrapper(status, groupList);
}
}

View File

@ -1,8 +1,18 @@
package mops.gruppen2.service;
import mops.gruppen2.domain.Exceptions.EventException;
import mops.gruppen2.domain.*;
import mops.gruppen2.domain.event.*;
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;
import mops.gruppen2.domain.event.DeleteUserEvent;
import mops.gruppen2.domain.event.UpdateGroupDescriptionEvent;
import mops.gruppen2.domain.event.UpdateGroupTitleEvent;
import mops.gruppen2.domain.event.UpdateRoleEvent;
import mops.gruppen2.domain.exception.EventException;
import mops.gruppen2.security.Account;
import org.springframework.stereotype.Service;
@ -14,7 +24,6 @@ import java.util.UUID;
public class ControllerService {
private final EventService eventService;
private final UserService userService;
private final InviteLinkRepositoryService inviteLinkRepositoryService;
@ -35,86 +44,90 @@ public class ControllerService {
*/
public void createGroup(Account account, String title, String description, Boolean visibility) throws EventException {
Visibility visibility1;
Long group_id = eventService.checkGroup();
Long groupId = eventService.checkGroup();
if(visibility) {
if (visibility) {
visibility1 = Visibility.PUBLIC;
} else {
visibility1 = Visibility.PRIVATE;
createInviteLink(group_id);
createInviteLink(groupId);
}
CreateGroupEvent createGroupEvent = new CreateGroupEvent(group_id, account.getName(), null , GroupType.SIMPLE, visibility1);
CreateGroupEvent createGroupEvent = new CreateGroupEvent(groupId, account.getName(), null, GroupType.SIMPLE, visibility1);
eventService.saveEvent(createGroupEvent);
addUser(account, group_id);
updateTitle(account, group_id, title);
updateDescription(account, group_id, description);
updateRole(account.getName(), group_id);
addUser(account, groupId);
updateTitle(account, groupId, title);
updateDescription(account, groupId, description);
updateRole(account.getName(), groupId);
}
private void createInviteLink(Long group_id) {
inviteLinkRepositoryService.saveInvite(group_id, UUID.randomUUID());
private void createInviteLink(Long groupId) {
inviteLinkRepositoryService.saveInvite(groupId, UUID.randomUUID());
}
public void addUser(Account account, Long group_id){
AddUserEvent addUserEvent = new AddUserEvent(group_id,account.getName(),account.getGivenname(),account.getFamilyname(),account.getEmail());
public void addUser(Account account, Long groupId) {
AddUserEvent addUserEvent = new AddUserEvent(groupId, account.getName(), account.getGivenname(), account.getFamilyname(), account.getEmail());
eventService.saveEvent(addUserEvent);
}
public void addUserList(List<User> users, Long group_id) {
public void addUserList(List<User> users, Long groupId) {
for (User user : users) {
AddUserEvent addUserEvent = new AddUserEvent(group_id, user.getUser_id(), user.getGivenname(), user.getFamilyname(), user.getEmail());
AddUserEvent addUserEvent = new AddUserEvent(groupId, user.getId(), user.getGivenname(), user.getFamilyname(), user.getEmail());
eventService.saveEvent(addUserEvent);
}
}
public void updateTitle(Account account, Long group_id, String title){
UpdateGroupTitleEvent updateGroupTitleEvent = new UpdateGroupTitleEvent(group_id,account.getName(),title);
public void updateTitle(Account account, Long groupId, String title) {
UpdateGroupTitleEvent updateGroupTitleEvent = new UpdateGroupTitleEvent(groupId, account.getName(), title);
eventService.saveEvent(updateGroupTitleEvent);
}
public void updateDescription(Account account, Long group_id, String description){
UpdateGroupDescriptionEvent updateGroupDescriptionEvent = new UpdateGroupDescriptionEvent(group_id,account.getName(),description);
public void updateDescription(Account account, Long groupId, String description) {
UpdateGroupDescriptionEvent updateGroupDescriptionEvent = new UpdateGroupDescriptionEvent(groupId, account.getName(), description);
eventService.saveEvent(updateGroupDescriptionEvent);
}
public void updateRole(String user_id, Long group_id) throws EventException {
public void updateRole(String userId, Long groupId) throws EventException {
UpdateRoleEvent updateRoleEvent;
Group group = userService.getGroupById(group_id);
Group group = userService.getGroupById(groupId);
User user = null;
for (User member : group.getMembers()) {
if(member.getUser_id().equals(user_id)) user = member;
if (member.getId().equals(userId)) {
user = member;
}
}
assert user != null;
if(group.getRoles().get(user.getUser_id()) == Role.ADMIN) {
updateRoleEvent = new UpdateRoleEvent(group_id, user.getUser_id(), Role.MEMBER);
if (group.getRoles().get(user.getId()) == Role.ADMIN) {
updateRoleEvent = new UpdateRoleEvent(groupId, user.getId(), Role.MEMBER);
} else {
updateRoleEvent = new UpdateRoleEvent(group_id, user.getUser_id(), Role.ADMIN);
updateRoleEvent = new UpdateRoleEvent(groupId, user.getId(), Role.ADMIN);
}
eventService.saveEvent(updateRoleEvent);
}
public void deleteUser(String user_id, Long group_id) throws EventException {
Group group = userService.getGroupById(group_id);
public void deleteUser(String userId, Long groupId) throws EventException {
Group group = userService.getGroupById(groupId);
User user = null;
for (User member : group.getMembers()) {
if(member.getUser_id().equals(user_id)) user = member;
if (member.getId().equals(userId)) {
user = member;
}
}
assert user != null;
DeleteUserEvent deleteUserEvent = new DeleteUserEvent(group_id, user.getUser_id());
DeleteUserEvent deleteUserEvent = new DeleteUserEvent(groupId, user.getId());
eventService.saveEvent(deleteUserEvent);
}
public void deleteGroupEvent(User user, Long group_id) {
DeleteGroupEvent deleteGroupEvent = new DeleteGroupEvent(group_id, user.getUser_id());
public void deleteGroupEvent(User user, Long groupId) {
DeleteGroupEvent deleteGroupEvent = new DeleteGroupEvent(groupId, user.getId());
eventService.saveEvent(deleteGroupEvent);
}
public void createLecture(Account account, String title, String description, Boolean visibility, List<User> users) throws EventException {
Visibility visibility1;
Long group_id = eventService.checkGroup();
Long groupId = eventService.checkGroup();
if (visibility) {
visibility1 = Visibility.PUBLIC;
@ -122,14 +135,13 @@ public class ControllerService {
visibility1 = Visibility.PRIVATE;
}
CreateGroupEvent createGroupEvent = new CreateGroupEvent(group_id, account.getName(), null, GroupType.LECTURE, visibility1);
CreateGroupEvent createGroupEvent = new CreateGroupEvent(groupId, account.getName(), null, GroupType.LECTURE, visibility1);
eventService.saveEvent(createGroupEvent);
addUser(account, group_id);
updateTitle(account, group_id, title);
updateDescription(account, group_id, description);
updateRole(account.getName(), group_id);
addUserList(users, group_id);
addUser(account, groupId);
updateTitle(account, groupId, title);
updateDescription(account, groupId, description);
updateRole(account.getName(), groupId);
addUserList(users, groupId);
}
}

View File

@ -13,18 +13,19 @@ import java.util.List;
@Service
public class EventService {
private final SerializationService serializationService;
private final JsonService jsonService;
private final EventRepository eventStore;
public EventService(SerializationService serializationService, EventRepository eventStore) {
this.serializationService = serializationService;
public EventService(JsonService jsonService, EventRepository eventStore) {
this.jsonService = jsonService;
this.eventStore = eventStore;
}
/**
* sichert ein Event Objekt indem es ein EventDTO Objekt erzeugt
* Erzeugt ein DTO aus einem Event und speicher es.
*
* @param event
* @param event Event, welches gespeichert wird
*/
public void saveEvent(Event event) {
EventDTO eventDTO = getDTO(event);
@ -35,34 +36,30 @@ public class EventService {
* Erzeugt aus einem Event Objekt ein EventDTO Objekt.
* Ist die Gruppe öffentlich, dann wird die visibility auf true gesetzt.
*
* @param event
* @return EventDTO
* @param event Event, welches in DTO übersetzt wird
* @return EventDTO Neues DTO
*/
public EventDTO getDTO(Event event) {
EventDTO eventDTO = new EventDTO();
eventDTO.setGroup_id(event.getGroup_id());
eventDTO.setUser_id(event.getUser_id());
boolean visibility = false;
if (event instanceof CreateGroupEvent) {
if (((CreateGroupEvent) event).getGroupVisibility() == Visibility.PRIVATE) {
eventDTO.setVisibility(false);
} else {
eventDTO.setVisibility(true);
}
visibility = ((CreateGroupEvent) event).getGroupVisibility() == Visibility.PUBLIC;
}
String payload = "";
try {
eventDTO.setEvent_payload(serializationService.serializeEvent(event));
payload = jsonService.serializeEvent(event);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return eventDTO;
return new EventDTO(null, event.getGroupId(), event.getUserId(), payload, visibility);
}
/**
* Gibt die nächst höhere groupID zurück die belegt werden kann.
* Gibt 1 zurück, falls keine Gruppe vorhanden ist.
*
* @return Gibt Long zurück
* @return Long GruppenId
*/
public Long checkGroup() {
Long maxGroupID = eventStore.getMaxGroupID();
@ -75,10 +72,10 @@ public class EventService {
}
/**
* Findet alle Events welche ab dem neuen Status hinzugekommen sind
* Findet alle Events welche ab dem neuen Status hinzugekommen sind.
*
* @param status
* @return Liste von Events
* @param status Die Id des zuletzt gespeicherten Events
* @return Liste von neueren Events
*/
public List<Event> getNewEvents(Long status) {
List<Long> groupIdsThatChanged = eventStore.findNewEventSinceStatus(status);
@ -88,9 +85,9 @@ public class EventService {
}
/**
* Erzeugt aus einer Liste von eventDTOs eine Liste von Events
* Erzeugt aus einer Liste von eventDTOs eine Liste von Events.
*
* @param eventDTOS
* @param eventDTOS Liste von DTOs
* @return Liste von Events
*/
public List<Event> translateEventDTOs(Iterable<EventDTO> eventDTOS) {
@ -98,7 +95,7 @@ public class EventService {
for (EventDTO eventDTO : eventDTOS) {
try {
events.add(serializationService.deserializeEvent(eventDTO.getEvent_payload()));
events.add(jsonService.deserializeEvent(eventDTO.getEvent_payload()));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
@ -107,12 +104,12 @@ public class EventService {
}
/**
* Sichert eine Liste von Event Objekten mithilfe der Methode saveEvent(Event event)
* Sichert eine Liste von Event Objekten mithilfe der Methode saveEvent(Event event).
*
* @param createGroupEvents Liste von Event Objekten
* @param eventList Liste von Event Objekten
*/
public void saveEventList(List<Event> createGroupEvents) {
for (Event event : createGroupEvents) {
public void saveEventList(List<Event> eventList) {
for (Event event : eventList) {
saveEvent(event);
}
}

View File

@ -1,9 +1,9 @@
package mops.gruppen2.service;
import mops.gruppen2.domain.Exceptions.EventException;
import mops.gruppen2.domain.Group;
import mops.gruppen2.domain.dto.EventDTO;
import mops.gruppen2.domain.event.Event;
import mops.gruppen2.domain.exception.EventException;
import mops.gruppen2.repository.EventRepository;
import mops.gruppen2.security.Account;
import org.springframework.stereotype.Service;
@ -24,86 +24,82 @@ public class GroupService {
this.eventRepository = eventRepository;
}
/** Sucht in der DB alle Zeilen raus welche eine der Gruppen_ids hat.
/**
* Sucht in der DB alle Zeilen raus welche eine der Gruppen_ids hat.
* Wandelt die Zeilen in Events um und gibt davon eine Liste zurück.
*
* @param group_ids
* @return
* @param groupIds Liste an IDs
* @return Liste an Events
*/
public List<Event> getGroupEvents(List<Long> group_ids) {
public List<Event> getGroupEvents(List<Long> groupIds) {
List<EventDTO> eventDTOS = new ArrayList<>();
for (Long group_id: group_ids) {
eventDTOS.addAll(eventRepository.findEventDTOByGroup_id(group_id));
for (Long groupId : groupIds) {
eventDTOS.addAll(eventRepository.findEventDTOByGroup_id(groupId));
}
return eventService.translateEventDTOs(eventDTOS);
}
/** Erzeugt eine neue Map wo Gruppen aus den Events erzeugt und den Gruppen_ids zugeordnet werden.
* Die Gruppen werden als Liste zurückgegeben
/**
* Erzeugt eine neue Map wo Gruppen aus den Events erzeugt und den Gruppen_ids zugeordnet werden.
* Die Gruppen werden als Liste zurückgegeben
*
* @param events
* @return
* @throws EventException
* @param events Liste an Events
* @return Liste an Projizierten Gruppen
* @throws EventException Projektionsfehler
*/
public List<Group> projectEventList(List<Event> events) throws EventException {
Map<Long, Group> groupMap = new HashMap<>();
for (Event event : events) {
Group group = getOrCreateGroup(groupMap, event.getGroup_id());
Group group = getOrCreateGroup(groupMap, event.getGroupId());
event.apply(group);
}
return new ArrayList<>(groupMap.values());
}
/** guckt in der Map anhand der Id nach ob die Gruppe schon in der Map vorhanden ist, wenn nicht wird eine neue
* Gruppe erzeugt
private Group getOrCreateGroup(Map<Long, Group> groups, long groupId) {
if (!groups.containsKey(groupId)) {
groups.put(groupId, new Group());
}
return groups.get(groupId);
}
private List<Long> removeUserGroups(List<Long> groupIds, List<Long> userGroups) {
for (Long groupId : userGroups) {
groupIds.remove(groupId);
}
return groupIds;
}
/**
* Sucht alle Zeilen in der DB mit visibility=true.
* Erstellt eine Liste aus öffentlichen Gruppen (ohen bereits beigetretenen Gruppen).
*
* @param groups
* @param group_id
* @return
* @return Liste von projizierten Gruppen
* @throws EventException Projektionsfehler
*/
private Group getOrCreateGroup(Map<Long, Group> groups, long group_id) {
if (!groups.containsKey(group_id)) {
groups.put(group_id, new Group());
}
return groups.get(group_id);
}
private List<Long> removeUserGroups(List<Long> group_ids, List<Long> user_groups) {
for (Long group_id: user_groups) {
group_ids.remove(group_id);
}
return group_ids;
}
/**
* sucht alle Zeilen in der DB wo die Visibility true ist und entfernt alle Gruppen des Users.
* Erstellt eine Liste aus Gruppen.
* @return
* @throws EventException
*/
public List<Group> getAllGroupWithVisibilityPublic(String user_id) throws EventException {
List<Long> group_ids = removeUserGroups(eventRepository.findGroup_idsWhereVisibility(Boolean.TRUE), eventRepository.findGroup_idsWhereUser_id(user_id));
List<EventDTO> eventDTOS = eventRepository.findAllEventsOfGroups(group_ids);
public List<Group> getAllGroupWithVisibilityPublic(String userId) throws EventException {
List<Long> groupIds = removeUserGroups(eventRepository.findGroup_idsWhereVisibility(Boolean.TRUE), eventRepository.findGroup_idsWhereUser_id(userId));
List<EventDTO> eventDTOS = eventRepository.findAllEventsOfGroups(groupIds);
List<Event> events = eventService.translateEventDTOs(eventDTOS);
List<Group> groups = projectEventList(events);
return groups;
return projectEventList(events);
}
/**
* Filtert alle öffentliche Gruppen nach dem suchbegriff und gibt diese als Liste von Gruppen zurück.
* Groß und kleinschreibung wird beachtet.
* @param search
* @return
* @throws EventException
* Filtert alle öffentliche Gruppen nach dem Suchbegriff und gibt diese als Liste von Gruppen zurück.
* Groß und Kleinschreibung wird nicht beachtet.
*
* @param search Der Suchstring
* @return Liste von projizierten Gruppen
* @throws EventException Projektionsfehler
*/
public List<Group> findGroupWith(String search, Account account) throws EventException {
List<Group> groups = new ArrayList<>();
for (Group group: getAllGroupWithVisibilityPublic(account.getName())) {
if (group.getTitle().toLowerCase().contains(search.toLowerCase()) || group.getDescription().toLowerCase().contains(search.toLowerCase())){
for (Group group : getAllGroupWithVisibilityPublic(account.getName())) {
if (group.getTitle().toLowerCase().contains(search.toLowerCase()) || group.getDescription().toLowerCase().contains(search.toLowerCase())) {
groups.add(group);
}
}

View File

@ -19,8 +19,8 @@ public class InviteLinkRepositoryService {
return inviteLinkRepository.findGroupIdByLink(link);
}
public void saveInvite(Long group_id, UUID link) {
inviteLinkRepository.save(new InviteLinkDTO(null, group_id, link.toString()));
public void saveInvite(Long groupId, UUID link) {
inviteLinkRepository.save(new InviteLinkDTO(null, groupId, link.toString()));
}
}

View File

@ -3,32 +3,22 @@ package mops.gruppen2.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import mops.gruppen2.domain.event.Event;
import mops.gruppen2.repository.EventRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
/**
* Übersetzt JSON-Event-Payloads zu Java-Event-Repräsentationen und zurück.
*/
@Service
public class SerializationService {
private final EventRepository eventStore;
private final Logger log = LoggerFactory.getLogger(SerializationService.class);
public SerializationService(EventRepository eventStore) {
this.eventStore = eventStore;
}
public class JsonService {
/**
* Übersetzt mithilfe der Jackson-Library eine Java-Event-Repräsentation zu einem JSON-Event-Payload.
*
* @param event Java-Event-Repräsentation
* @return JSON-Event-Payload als String
* @throws JsonProcessingException
* @throws JsonProcessingException Bei JSON Fehler
*/
public String serializeEvent(Event event) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(event);
@ -39,7 +29,7 @@ public class SerializationService {
*
* @param json JSON-Event-Payload als String
* @return Java-Event-Repräsentation
* @throws JsonProcessingException
* @throws JsonProcessingException Bei JSON Fehler
*/
public Event deserializeEvent(String json) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();

View File

@ -1,21 +1,21 @@
package mops.gruppen2.service;
import mops.gruppen2.domain.Exceptions.EventException;
import mops.gruppen2.domain.Exceptions.GroupNotFoundException;
import mops.gruppen2.domain.Group;
import mops.gruppen2.domain.User;
import mops.gruppen2.domain.event.Event;
import mops.gruppen2.domain.exception.EventException;
import mops.gruppen2.repository.EventRepository;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
//Hallo
@Service
public class UserService {
final EventRepository eventRepository;
final GroupService groupService;
private final EventRepository eventRepository;
private final GroupService groupService;
public UserService(EventRepository eventRepository, GroupService groupService) {
this.eventRepository = eventRepository;
@ -25,27 +25,27 @@ public class UserService {
//Test nötig??
public List<Group> getUserGroups(User user) throws EventException {
List<Long> group_ids = eventRepository.findGroup_idsWhereUser_id(user.getUser_id());
List<Event> events = groupService.getGroupEvents(group_ids);
List<Long> groupIds = eventRepository.findGroup_idsWhereUser_id(user.getId());
List<Event> events = groupService.getGroupEvents(groupIds);
List<Group> groups = groupService.projectEventList(events);
List<Group> newGroups = new ArrayList<>();
for (Group group: groups) {
if(group.getMembers().contains(user)){
for (Group group : groups) {
if (group.getMembers().contains(user)) {
newGroups.add(group);
}
}
return newGroups;
}
public Group getGroupById(Long group_id) throws EventException {
List<Long> group_ids = new ArrayList<>();
group_ids.add(group_id);
public Group getGroupById(Long groupId) throws EventException {
List<Long> groupIds = new ArrayList<>();
group_ids.add(groupId);
try {
List<Event> events = groupService.getGroupEvents(group_ids);
List<Event> events = groupService.getGroupEvents(groupIds);
return groupService.projectEventList(events).get(0);
} catch (IndexOutOfBoundsException e) {
throw new GroupNotFoundException("Gruppe nicht gefunden");
throw new GroupNotFoundException(this.getClass().toString());
}
}
}