diff --git a/src/main/java/mops/gruppen2/domain/model/group/Group.java b/src/main/java/mops/gruppen2/domain/model/group/Group.java index 5c407f1..ab944bc 100644 --- a/src/main/java/mops/gruppen2/domain/model/group/Group.java +++ b/src/main/java/mops/gruppen2/domain/model/group/Group.java @@ -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; diff --git a/src/main/java/mops/gruppen2/domain/model/group/wrapper/Parent.java b/src/main/java/mops/gruppen2/domain/model/group/wrapper/Parent.java index bd3d05d..e19cc6e 100644 --- a/src/main/java/mops/gruppen2/domain/model/group/wrapper/Parent.java +++ b/src/main/java/mops/gruppen2/domain/model/group/wrapper/Parent.java @@ -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; diff --git a/src/main/java/mops/gruppen2/domain/service/EventStoreService.java b/src/main/java/mops/gruppen2/domain/service/EventStoreService.java index 00f4d2d..7d7ef02 100644 --- a/src/main/java/mops/gruppen2/domain/service/EventStoreService.java +++ b/src/main/java/mops/gruppen2/domain/service/EventStoreService.java @@ -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 findLatestEventsFromGroupsByType(EventType... types) { return getEventsFromDTOs(eventStore.findLatestEventDTOsPartitionedByGroupByType(Arrays.asList(eventTypesToString(types)))); } + + public List findAllEvents() { + return getEventsFromDTOs(eventStore.findAllEvents()); + } } diff --git a/src/main/java/mops/gruppen2/domain/service/GroupService.java b/src/main/java/mops/gruppen2/domain/service/GroupService.java index 477da7c..1d55f8a 100644 --- a/src/main/java/mops/gruppen2/domain/service/GroupService.java +++ b/src/main/java/mops/gruppen2/domain/service/GroupService.java @@ -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 { diff --git a/src/main/java/mops/gruppen2/domain/service/ProjectionService.java b/src/main/java/mops/gruppen2/domain/service/ProjectionService.java index 1338eef..eabe1e4 100644 --- a/src/main/java/mops/gruppen2/domain/service/ProjectionService.java +++ b/src/main/java/mops/gruppen2/domain/service/ProjectionService.java @@ -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 projectGroupsByEvents(List events) throws EventException { + public static Map projectGroupsByEvents(List events) throws EventException { Map 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 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 projectGroupsByIds(List groupids) { + public Map projectGroupsByIds(List groupids) { List events = eventStoreService.findGroupEvents(groupids); return projectGroupsByEvents(events); @@ -137,7 +141,7 @@ public class ProjectionService { public List projectChangedGroups(long status) { List 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()); } /** diff --git a/src/main/java/mops/gruppen2/domain/service/SearchService.java b/src/main/java/mops/gruppen2/domain/service/SearchService.java index dcb5228..720bb7c 100644 --- a/src/main/java/mops/gruppen2/domain/service/SearchService.java +++ b/src/main/java/mops/gruppen2/domain/service/SearchService.java @@ -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. diff --git a/src/main/java/mops/gruppen2/domain/helper/APIHelper.java b/src/main/java/mops/gruppen2/domain/service/helper/APIHelper.java similarity index 80% rename from src/main/java/mops/gruppen2/domain/helper/APIHelper.java rename to src/main/java/mops/gruppen2/domain/service/helper/APIHelper.java index 5da7990..39e7569 100644 --- a/src/main/java/mops/gruppen2/domain/helper/APIHelper.java +++ b/src/main/java/mops/gruppen2/domain/service/helper/APIHelper.java @@ -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; diff --git a/src/main/java/mops/gruppen2/domain/helper/CommonHelper.java b/src/main/java/mops/gruppen2/domain/service/helper/CommonHelper.java similarity index 96% rename from src/main/java/mops/gruppen2/domain/helper/CommonHelper.java rename to src/main/java/mops/gruppen2/domain/service/helper/CommonHelper.java index 6e833d8..5ac0ed1 100644 --- a/src/main/java/mops/gruppen2/domain/helper/CommonHelper.java +++ b/src/main/java/mops/gruppen2/domain/service/helper/CommonHelper.java @@ -1,4 +1,4 @@ -package mops.gruppen2.domain.helper; +package mops.gruppen2.domain.service.helper; import lombok.AccessLevel; import lombok.NoArgsConstructor; diff --git a/src/main/java/mops/gruppen2/domain/helper/CsvHelper.java b/src/main/java/mops/gruppen2/domain/service/helper/CsvHelper.java similarity index 97% rename from src/main/java/mops/gruppen2/domain/helper/CsvHelper.java rename to src/main/java/mops/gruppen2/domain/service/helper/CsvHelper.java index 5a43b85..c087540 100644 --- a/src/main/java/mops/gruppen2/domain/helper/CsvHelper.java +++ b/src/main/java/mops/gruppen2/domain/service/helper/CsvHelper.java @@ -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; diff --git a/src/main/java/mops/gruppen2/domain/helper/JsonHelper.java b/src/main/java/mops/gruppen2/domain/service/helper/JsonHelper.java similarity index 97% rename from src/main/java/mops/gruppen2/domain/helper/JsonHelper.java rename to src/main/java/mops/gruppen2/domain/service/helper/JsonHelper.java index 614e929..b66c57f 100644 --- a/src/main/java/mops/gruppen2/domain/helper/JsonHelper.java +++ b/src/main/java/mops/gruppen2/domain/service/helper/JsonHelper.java @@ -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; diff --git a/src/main/java/mops/gruppen2/domain/helper/ValidationHelper.java b/src/main/java/mops/gruppen2/domain/service/helper/ValidationHelper.java similarity index 98% rename from src/main/java/mops/gruppen2/domain/helper/ValidationHelper.java rename to src/main/java/mops/gruppen2/domain/service/helper/ValidationHelper.java index 02cdc2e..22942bd 100644 --- a/src/main/java/mops/gruppen2/domain/helper/ValidationHelper.java +++ b/src/main/java/mops/gruppen2/domain/service/helper/ValidationHelper.java @@ -1,4 +1,4 @@ -package mops.gruppen2.domain.helper; +package mops.gruppen2.domain.service.helper; import lombok.AccessLevel; import lombok.NoArgsConstructor; diff --git a/src/main/java/mops/gruppen2/web/ModelAttributeControllerAdvice.java b/src/main/java/mops/gruppen2/infrastructure/ModelAttributeControllerAdvice.java similarity index 96% rename from src/main/java/mops/gruppen2/web/ModelAttributeControllerAdvice.java rename to src/main/java/mops/gruppen2/infrastructure/ModelAttributeControllerAdvice.java index 71c432f..19c20b8 100644 --- a/src/main/java/mops/gruppen2/web/ModelAttributeControllerAdvice.java +++ b/src/main/java/mops/gruppen2/infrastructure/ModelAttributeControllerAdvice.java @@ -1,4 +1,4 @@ -package mops.gruppen2.web; +package mops.gruppen2.infrastructure; import mops.gruppen2.domain.Account; import mops.gruppen2.domain.model.group.Role; diff --git a/src/main/java/mops/gruppen2/web/api/GroupRequestWrapper.java b/src/main/java/mops/gruppen2/infrastructure/api/GroupRequestWrapper.java similarity index 89% rename from src/main/java/mops/gruppen2/web/api/GroupRequestWrapper.java rename to src/main/java/mops/gruppen2/infrastructure/api/GroupRequestWrapper.java index d8e0680..e4d32a2 100644 --- a/src/main/java/mops/gruppen2/web/api/GroupRequestWrapper.java +++ b/src/main/java/mops/gruppen2/infrastructure/api/GroupRequestWrapper.java @@ -1,4 +1,4 @@ -package mops.gruppen2.web.api; +package mops.gruppen2.infrastructure.api; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/mops/gruppen2/web/APIController.java b/src/main/java/mops/gruppen2/infrastructure/controller/APIController.java similarity index 92% rename from src/main/java/mops/gruppen2/web/APIController.java rename to src/main/java/mops/gruppen2/infrastructure/controller/APIController.java index 0a8dc5c..393c19c 100644 --- a/src/main/java/mops/gruppen2/web/APIController.java +++ b/src/main/java/mops/gruppen2/infrastructure/controller/APIController.java @@ -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; diff --git a/src/main/java/mops/gruppen2/web/GroupCreationController.java b/src/main/java/mops/gruppen2/infrastructure/controller/GroupCreationController.java similarity index 95% rename from src/main/java/mops/gruppen2/web/GroupCreationController.java rename to src/main/java/mops/gruppen2/infrastructure/controller/GroupCreationController.java index af56d77..2d0e921 100644 --- a/src/main/java/mops/gruppen2/web/GroupCreationController.java +++ b/src/main/java/mops/gruppen2/infrastructure/controller/GroupCreationController.java @@ -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; diff --git a/src/main/java/mops/gruppen2/web/GroupDetailsController.java b/src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java similarity index 98% rename from src/main/java/mops/gruppen2/web/GroupDetailsController.java rename to src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java index 58c3131..06cb243 100644 --- a/src/main/java/mops/gruppen2/web/GroupDetailsController.java +++ b/src/main/java/mops/gruppen2/infrastructure/controller/GroupDetailsController.java @@ -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; diff --git a/src/main/java/mops/gruppen2/web/GruppenfindungController.java b/src/main/java/mops/gruppen2/infrastructure/controller/GruppenfindungController.java similarity index 97% rename from src/main/java/mops/gruppen2/web/GruppenfindungController.java rename to src/main/java/mops/gruppen2/infrastructure/controller/GruppenfindungController.java index 465be52..c4f50e4 100644 --- a/src/main/java/mops/gruppen2/web/GruppenfindungController.java +++ b/src/main/java/mops/gruppen2/infrastructure/controller/GruppenfindungController.java @@ -1,4 +1,4 @@ -package mops.gruppen2.web; +package mops.gruppen2.infrastructure.controller; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; diff --git a/src/main/java/mops/gruppen2/web/SearchAndInviteController.java b/src/main/java/mops/gruppen2/infrastructure/controller/SearchAndInviteController.java similarity index 96% rename from src/main/java/mops/gruppen2/web/SearchAndInviteController.java rename to src/main/java/mops/gruppen2/infrastructure/controller/SearchAndInviteController.java index 10bc6f6..9612da5 100644 --- a/src/main/java/mops/gruppen2/web/SearchAndInviteController.java +++ b/src/main/java/mops/gruppen2/infrastructure/controller/SearchAndInviteController.java @@ -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; diff --git a/src/main/java/mops/gruppen2/persistance/EventRepository.java b/src/main/java/mops/gruppen2/persistance/EventRepository.java index d5b5164..3f8cb5b 100644 --- a/src/main/java/mops/gruppen2/persistance/EventRepository.java +++ b/src/main/java/mops/gruppen2/persistance/EventRepository.java @@ -13,6 +13,7 @@ public interface EventRepository extends CrudRepository { // ####################################### GROUP IDs ######################################### + /*@Query("SELECT DISTINCT group_id FROM event" + " WHERE user_id = :userId AND event_type = :type") List findGroupIdsByUserAndType(@Param("userId") String userId, @@ -22,8 +23,13 @@ public interface EventRepository extends CrudRepository { + " WHERE event_id > :status") List findGroupIdsWhereEventIdGreaterThanStatus(@Param("status") long status); + // ####################################### EVENT DTOs ######################################## + + @Query("SELECT * FROM event") + List findAllEvents(); + @Query("SELECT * FROM event" + " WHERE group_id IN (:groupIds) ") List findEventDTOsByGroup(@Param("groupIds") List groupIds); @@ -48,6 +54,7 @@ public interface EventRepository extends CrudRepository { // ################################ 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"