1
This commit is contained in:
Christoph
2020-04-15 02:03:55 +02:00
parent 1086e2f066
commit b2b636b4e8
19 changed files with 54 additions and 45 deletions

View File

@ -10,14 +10,14 @@ import mops.gruppen2.domain.exception.LastAdminException;
import mops.gruppen2.domain.exception.NoAccessException;
import mops.gruppen2.domain.exception.UserAlreadyExistsException;
import mops.gruppen2.domain.exception.UserNotFoundException;
import mops.gruppen2.domain.helper.CommonHelper;
import mops.gruppen2.domain.helper.ValidationHelper;
import mops.gruppen2.domain.model.group.wrapper.Body;
import mops.gruppen2.domain.model.group.wrapper.Description;
import mops.gruppen2.domain.model.group.wrapper.Limit;
import mops.gruppen2.domain.model.group.wrapper.Link;
import mops.gruppen2.domain.model.group.wrapper.Parent;
import mops.gruppen2.domain.model.group.wrapper.Title;
import mops.gruppen2.domain.service.helper.CommonHelper;
import mops.gruppen2.domain.service.helper.ValidationHelper;
import javax.validation.Valid;
import java.time.LocalDateTime;

View File

@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.ToString;
import lombok.Value;
import mops.gruppen2.domain.helper.CommonHelper;
import mops.gruppen2.domain.service.helper.CommonHelper;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

View File

@ -3,7 +3,6 @@ package mops.gruppen2.domain.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import mops.gruppen2.aspect.annotation.TraceMethodCalls;
import mops.gruppen2.domain.event.AddMemberEvent;
import mops.gruppen2.domain.event.CreateGroupEvent;
import mops.gruppen2.domain.event.Event;
@ -11,9 +10,9 @@ import mops.gruppen2.domain.event.EventType;
import mops.gruppen2.domain.event.SetTypeEvent;
import mops.gruppen2.domain.exception.BadPayloadException;
import mops.gruppen2.domain.exception.InvalidInviteException;
import mops.gruppen2.domain.helper.CommonHelper;
import mops.gruppen2.domain.helper.JsonHelper;
import mops.gruppen2.domain.model.group.Type;
import mops.gruppen2.domain.service.helper.CommonHelper;
import mops.gruppen2.domain.service.helper.JsonHelper;
import mops.gruppen2.persistance.EventRepository;
import mops.gruppen2.persistance.dto.EventDTO;
import org.springframework.stereotype.Service;
@ -29,13 +28,12 @@ import static mops.gruppen2.domain.event.EventType.CREATEGROUP;
import static mops.gruppen2.domain.event.EventType.DESTROYGROUP;
import static mops.gruppen2.domain.event.EventType.SETLINK;
import static mops.gruppen2.domain.event.EventType.SETTYPE;
import static mops.gruppen2.domain.helper.CommonHelper.eventTypesToString;
import static mops.gruppen2.domain.helper.CommonHelper.uuidsToString;
import static mops.gruppen2.domain.service.helper.CommonHelper.eventTypesToString;
import static mops.gruppen2.domain.service.helper.CommonHelper.uuidsToString;
@Log4j2
@RequiredArgsConstructor
@Service
@TraceMethodCalls
public class EventStoreService {
private final EventRepository eventStore;
@ -301,4 +299,8 @@ public class EventStoreService {
private List<Event> findLatestEventsFromGroupsByType(EventType... types) {
return getEventsFromDTOs(eventStore.findLatestEventDTOsPartitionedByGroupByType(Arrays.asList(eventTypesToString(types))));
}
public List<Event> findAllEvents() {
return getEventsFromDTOs(eventStore.findAllEvents());
}
}

View File

@ -2,7 +2,6 @@ package mops.gruppen2.domain.service;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import mops.gruppen2.aspect.annotation.TraceMethodCalls;
import mops.gruppen2.domain.event.AddMemberEvent;
import mops.gruppen2.domain.event.CreateGroupEvent;
import mops.gruppen2.domain.event.DestroyGroupEvent;
@ -16,7 +15,6 @@ import mops.gruppen2.domain.event.SetTitleEvent;
import mops.gruppen2.domain.event.SetTypeEvent;
import mops.gruppen2.domain.event.UpdateRoleEvent;
import mops.gruppen2.domain.exception.EventException;
import mops.gruppen2.domain.helper.ValidationHelper;
import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.model.group.Role;
import mops.gruppen2.domain.model.group.Type;
@ -26,6 +24,7 @@ import mops.gruppen2.domain.model.group.wrapper.Limit;
import mops.gruppen2.domain.model.group.wrapper.Link;
import mops.gruppen2.domain.model.group.wrapper.Parent;
import mops.gruppen2.domain.model.group.wrapper.Title;
import mops.gruppen2.domain.service.helper.ValidationHelper;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@ -37,7 +36,6 @@ import java.util.UUID;
* Es werden übergebene Gruppen bearbeitet und dementsprechend Events erzeugt und gespeichert.
*/
@Log4j2
@TraceMethodCalls
@RequiredArgsConstructor
@Service
public class GroupService {

View File

@ -5,8 +5,8 @@ import lombok.extern.log4j.Log4j2;
import mops.gruppen2.domain.event.Event;
import mops.gruppen2.domain.exception.EventException;
import mops.gruppen2.domain.exception.GroupNotFoundException;
import mops.gruppen2.domain.helper.CommonHelper;
import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.service.helper.CommonHelper;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@ -62,12 +62,12 @@ public class ProjectionService {
*
* @throws EventException Projektionsfehler
*/
public static List<Group> projectGroupsByEvents(List<Event> events) throws EventException {
public static Map<UUID, Group> projectGroupsByEvents(List<Event> events) throws EventException {
Map<UUID, Group> groupMap = new HashMap<>();
events.forEach(event -> event.apply(getOrCreateGroup(groupMap, event.getGroupid())));
return new ArrayList<>(groupMap.values());
return groupMap;
}
/**
@ -91,6 +91,10 @@ public class ProjectionService {
// ############################### PROJEKTIONEN MIT DATENBANK ################################
public Map<UUID, Group> projectAllGroups() {
return projectGroupsByEvents(eventStoreService.findAllEvents());
}
/**
* Gibt die Gruppe zurück, die zu der übergebenen Id passt.
* Enthält alle verfügbaren Informationen, also auch User (langsam).
@ -120,7 +124,7 @@ public class ProjectionService {
return projectGroupById(parent);
}
public List<Group> projectGroupsByIds(List<UUID> groupids) {
public Map<UUID, Group> projectGroupsByIds(List<UUID> groupids) {
List<Event> events = eventStoreService.findGroupEvents(groupids);
return projectGroupsByEvents(events);
@ -137,7 +141,7 @@ public class ProjectionService {
public List<Group> projectChangedGroups(long status) {
List<UUID> changedids = eventStoreService.findChangedGroups(status);
return projectGroupsByIds(changedids);
return new ArrayList<>(projectGroupsByIds(changedids).values());
}
/**
@ -157,7 +161,7 @@ public class ProjectionService {
return Collections.emptyList();
}
return projectGroupsByIds(groupIds);
return new ArrayList<>(projectGroupsByIds(groupIds).values());
}
/**
@ -174,7 +178,7 @@ public class ProjectionService {
return Collections.emptyList();
}
return projectGroupsByIds(groupIds);
return new ArrayList<>(projectGroupsByIds(groupIds).values());
}
/**
@ -193,7 +197,7 @@ public class ProjectionService {
return Collections.emptyList();
}
return projectGroupsByIds(groupIds);
return new ArrayList<>(projectGroupsByIds(groupIds).values());
}
/**

View File

@ -1,5 +1,6 @@
package mops.gruppen2.domain.service;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import mops.gruppen2.domain.exception.EventException;
import mops.gruppen2.domain.model.group.Group;
@ -11,15 +12,12 @@ import java.util.List;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@Log4j2
public class SearchService {
private final ProjectionService projectionService;
public SearchService(ProjectionService projectionService) {
this.projectionService = projectionService;
}
/**
* Filtert alle öffentliche Gruppen nach dem Suchbegriff und gibt diese als sortierte Liste zurück.
* Groß- und Kleinschreibung wird nicht beachtet.

View File

@ -1,10 +1,10 @@
package mops.gruppen2.domain.helper;
package mops.gruppen2.domain.service.helper;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.web.api.GroupRequestWrapper;
import mops.gruppen2.infrastructure.api.GroupRequestWrapper;
import java.util.List;

View File

@ -1,4 +1,4 @@
package mops.gruppen2.domain.helper;
package mops.gruppen2.domain.service.helper;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

View File

@ -1,4 +1,4 @@
package mops.gruppen2.domain.helper;
package mops.gruppen2.domain.service.helper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;

View File

@ -1,4 +1,4 @@
package mops.gruppen2.domain.helper;
package mops.gruppen2.domain.service.helper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

View File

@ -1,4 +1,4 @@
package mops.gruppen2.domain.helper;
package mops.gruppen2.domain.service.helper;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

View File

@ -1,4 +1,4 @@
package mops.gruppen2.web;
package mops.gruppen2.infrastructure;
import mops.gruppen2.domain.Account;
import mops.gruppen2.domain.model.group.Role;

View File

@ -1,4 +1,4 @@
package mops.gruppen2.web.api;
package mops.gruppen2.infrastructure.api;
import lombok.AllArgsConstructor;
import lombok.Getter;

View File

@ -1,4 +1,4 @@
package mops.gruppen2.web;
package mops.gruppen2.infrastructure.controller;
import io.swagger.annotations.ApiOperation;
@ -6,12 +6,12 @@ import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import mops.gruppen2.aspect.annotation.TraceMethodCalls;
import mops.gruppen2.domain.helper.APIHelper;
import mops.gruppen2.domain.helper.CommonHelper;
import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.service.EventStoreService;
import mops.gruppen2.domain.service.ProjectionService;
import mops.gruppen2.web.api.GroupRequestWrapper;
import mops.gruppen2.domain.service.helper.APIHelper;
import mops.gruppen2.domain.service.helper.CommonHelper;
import mops.gruppen2.infrastructure.api.GroupRequestWrapper;
import org.springframework.security.access.annotation.Secured;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@ -1,10 +1,8 @@
package mops.gruppen2.web;
package mops.gruppen2.infrastructure.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import mops.gruppen2.aspect.annotation.TraceMethodCalls;
import mops.gruppen2.domain.helper.CsvHelper;
import mops.gruppen2.domain.helper.ValidationHelper;
import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.model.group.Type;
import mops.gruppen2.domain.model.group.User;
@ -14,6 +12,8 @@ import mops.gruppen2.domain.model.group.wrapper.Parent;
import mops.gruppen2.domain.model.group.wrapper.Title;
import mops.gruppen2.domain.service.GroupService;
import mops.gruppen2.domain.service.ProjectionService;
import mops.gruppen2.domain.service.helper.CsvHelper;
import mops.gruppen2.domain.service.helper.ValidationHelper;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Controller;

View File

@ -1,10 +1,8 @@
package mops.gruppen2.web;
package mops.gruppen2.infrastructure.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import mops.gruppen2.aspect.annotation.TraceMethodCalls;
import mops.gruppen2.domain.helper.CsvHelper;
import mops.gruppen2.domain.helper.ValidationHelper;
import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.model.group.User;
import mops.gruppen2.domain.model.group.wrapper.Description;
@ -12,6 +10,8 @@ import mops.gruppen2.domain.model.group.wrapper.Limit;
import mops.gruppen2.domain.model.group.wrapper.Title;
import mops.gruppen2.domain.service.GroupService;
import mops.gruppen2.domain.service.ProjectionService;
import mops.gruppen2.domain.service.helper.CsvHelper;
import mops.gruppen2.domain.service.helper.ValidationHelper;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Controller;

View File

@ -1,4 +1,4 @@
package mops.gruppen2.web;
package mops.gruppen2.infrastructure.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;

View File

@ -1,13 +1,13 @@
package mops.gruppen2.web;
package mops.gruppen2.infrastructure.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import mops.gruppen2.aspect.annotation.TraceMethodCalls;
import mops.gruppen2.domain.helper.ValidationHelper;
import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.model.group.Type;
import mops.gruppen2.domain.service.ProjectionService;
import mops.gruppen2.domain.service.SearchService;
import mops.gruppen2.domain.service.helper.ValidationHelper;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;

View File

@ -13,6 +13,7 @@ public interface EventRepository extends CrudRepository<EventDTO, Long> {
// ####################################### GROUP IDs #########################################
/*@Query("SELECT DISTINCT group_id FROM event"
+ " WHERE user_id = :userId AND event_type = :type")
List<String> findGroupIdsByUserAndType(@Param("userId") String userId,
@ -22,8 +23,13 @@ public interface EventRepository extends CrudRepository<EventDTO, Long> {
+ " WHERE event_id > :status")
List<String> findGroupIdsWhereEventIdGreaterThanStatus(@Param("status") long status);
// ####################################### EVENT DTOs ########################################
@Query("SELECT * FROM event")
List<EventDTO> findAllEvents();
@Query("SELECT * FROM event"
+ " WHERE group_id IN (:groupIds) ")
List<EventDTO> findEventDTOsByGroup(@Param("groupIds") List<String> groupIds);
@ -48,6 +54,7 @@ public interface EventRepository extends CrudRepository<EventDTO, Long> {
// ################################ LATEST EVENT DTOs ########################################
@Query("WITH ranked_events AS ("
+ "SELECT *, ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY event_id DESC) AS rn"
+ " FROM event"