diff --git a/app/src/main/java/it/chalmers/gamma/adapter/primary/api/info/InfoV1ApiController.java b/app/src/main/java/it/chalmers/gamma/adapter/primary/api/info/InfoV1ApiController.java index 62640fdad..1fb2c29ed 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/primary/api/info/InfoV1ApiController.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/primary/api/info/InfoV1ApiController.java @@ -2,6 +2,8 @@ import it.chalmers.gamma.adapter.primary.api.utils.NotFoundResponse; import it.chalmers.gamma.app.group.GroupFacade; +import it.chalmers.gamma.app.settings.SettingsFacade; +import it.chalmers.gamma.app.supergroup.SuperGroupFacade; import it.chalmers.gamma.app.user.UserFacade; import java.util.List; import java.util.UUID; @@ -21,12 +23,15 @@ public class InfoV1ApiController { public static final String URI = "/api/info/v1"; - private final GroupFacade groupFacade; + private final SuperGroupFacade superGroupFacade; private final UserFacade userFacade; + private final SettingsFacade settingsFacade; - public InfoV1ApiController(GroupFacade groupFacade, UserFacade userFacade) { - this.groupFacade = groupFacade; + public InfoV1ApiController( + SuperGroupFacade superGroupFacade, UserFacade userFacade, SettingsFacade settingsFacade) { + this.superGroupFacade = superGroupFacade; this.userFacade = userFacade; + this.settingsFacade = settingsFacade; } @GetMapping("/users/{id}") @@ -34,9 +39,10 @@ public UserFacade.UserWithGroupsDTO getUser(@PathVariable("id") UUID id) { return this.userFacade.get(id).orElseThrow(UserNotFoundResponse::new); } - @GetMapping("/groups") - public GroupsResponse getGroups() { - return new GroupsResponse(this.groupFacade.getAllForInfoApi()); + @GetMapping("/blob") + public List getGroups() { + return this.superGroupFacade.getAllTypesWithSuperGroups( + this.settingsFacade.getInfoApiSuperGroupTypes()); } public record GroupsResponse(List groups) {} diff --git a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/group/GroupRepositoryAdapter.java b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/group/GroupRepositoryAdapter.java index 289c56ead..c0e787757 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/group/GroupRepositoryAdapter.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/group/GroupRepositoryAdapter.java @@ -1,13 +1,11 @@ package it.chalmers.gamma.adapter.secondary.jpa.group; import it.chalmers.gamma.adapter.secondary.jpa.supergroup.SuperGroupJpaRepository; +import it.chalmers.gamma.adapter.secondary.jpa.user.UserEntityConverter; import it.chalmers.gamma.adapter.secondary.jpa.user.UserJpaRepository; import it.chalmers.gamma.adapter.secondary.jpa.util.PersistenceErrorHelper; import it.chalmers.gamma.adapter.secondary.jpa.util.PersistenceErrorState; -import it.chalmers.gamma.app.group.domain.Group; -import it.chalmers.gamma.app.group.domain.GroupId; -import it.chalmers.gamma.app.group.domain.GroupRepository; -import it.chalmers.gamma.app.group.domain.UnofficialPostName; +import it.chalmers.gamma.app.group.domain.*; import it.chalmers.gamma.app.image.domain.ImageUri; import it.chalmers.gamma.app.post.domain.PostId; import it.chalmers.gamma.app.supergroup.domain.SuperGroupId; @@ -43,6 +41,7 @@ public class GroupRepositoryAdapter implements GroupRepository { private final SuperGroupJpaRepository superGroupJpaRepository; private final PostJpaRepository postJpaRepository; private final UserJpaRepository userJpaRepository; + private final UserEntityConverter userEntityConverter; public GroupRepositoryAdapter( GroupJpaRepository groupJpaRepository, @@ -51,7 +50,8 @@ public GroupRepositoryAdapter( PostEntityConverter postEntityConverter, SuperGroupJpaRepository superGroupJpaRepository, PostJpaRepository postJpaRepository, - UserJpaRepository userJpaRepository) { + UserJpaRepository userJpaRepository, + UserEntityConverter userEntityConverter) { this.groupJpaRepository = groupJpaRepository; this.groupEntityConverter = groupEntityConverter; this.membershipJpaRepository = membershipJpaRepository; @@ -59,6 +59,7 @@ public GroupRepositoryAdapter( this.superGroupJpaRepository = superGroupJpaRepository; this.postJpaRepository = postJpaRepository; this.userJpaRepository = userJpaRepository; + this.userEntityConverter = userEntityConverter; } @Override @@ -133,6 +134,18 @@ public Optional get(GroupId groupId) { .map(this.groupEntityConverter::toDomain); } + @Override + public List getAllMembersBySuperGroup(SuperGroupId superGroupId) { + return this.membershipJpaRepository.findAllBySuperGroup(superGroupId.value()).stream() + .map( + membershipEntity -> + new GroupMember( + this.postEntityConverter.toDomain(membershipEntity.getId().getPost()), + new UnofficialPostName(membershipEntity.getUnofficialPostName()), + this.userEntityConverter.toDomain(membershipEntity.getId().getUser()))) + .toList(); + } + private GroupEntity toEntity(Group group) { GroupEntity entity = this.groupJpaRepository.findById(group.id().value()).orElse(new GroupEntity()); diff --git a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/group/MembershipJpaRepository.java b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/group/MembershipJpaRepository.java index 9210f7e08..b6b68f433 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/group/MembershipJpaRepository.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/group/MembershipJpaRepository.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository @@ -10,4 +12,10 @@ public interface MembershipJpaRepository extends JpaRepository findAllById_Post_Id(UUID postId); List findAllById_User_Id(UUID userId); + + @Query( + "SELECT DISTINCT g.members " + + "FROM GroupEntity g " + + "WHERE g.superGroup.id = :superGroupId") + List findAllBySuperGroup(@Param("superGroupId") UUID superGroupId); } diff --git a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/user/UserEntityConverter.java b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/user/UserEntityConverter.java index e2985f066..bf05db6f8 100644 --- a/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/user/UserEntityConverter.java +++ b/app/src/main/java/it/chalmers/gamma/adapter/secondary/jpa/user/UserEntityConverter.java @@ -3,7 +3,6 @@ import it.chalmers.gamma.app.authentication.UserAccessGuard; import it.chalmers.gamma.app.common.Email; import it.chalmers.gamma.app.image.domain.ImageUri; -import it.chalmers.gamma.app.settings.domain.Settings; import it.chalmers.gamma.app.settings.domain.SettingsRepository; import it.chalmers.gamma.app.user.domain.*; import org.springframework.lang.Nullable; @@ -22,7 +21,6 @@ public UserEntityConverter( } @Nullable public GammaUser toDomain(UserEntity userEntity) { - Settings settings = this.settingsRepository.getSettings(); UserId userId = new UserId(userEntity.id); if (!userAccessGuard.haveAccessToUser(userId, userEntity.locked)) { diff --git a/app/src/main/java/it/chalmers/gamma/app/group/domain/GroupRepository.java b/app/src/main/java/it/chalmers/gamma/app/group/domain/GroupRepository.java index f3a417f79..5b912437d 100644 --- a/app/src/main/java/it/chalmers/gamma/app/group/domain/GroupRepository.java +++ b/app/src/main/java/it/chalmers/gamma/app/group/domain/GroupRepository.java @@ -27,6 +27,8 @@ void save(Group group) Optional get(GroupId groupId); + List getAllMembersBySuperGroup(SuperGroupId superGroupId); + class GroupNotFoundException extends Exception {} class GroupNameAlreadyExistsException extends Exception {} diff --git a/app/src/main/java/it/chalmers/gamma/app/settings/SettingsFacade.java b/app/src/main/java/it/chalmers/gamma/app/settings/SettingsFacade.java index 9de5f4b32..2ee6f58be 100644 --- a/app/src/main/java/it/chalmers/gamma/app/settings/SettingsFacade.java +++ b/app/src/main/java/it/chalmers/gamma/app/settings/SettingsFacade.java @@ -1,8 +1,10 @@ package it.chalmers.gamma.app.settings; import static it.chalmers.gamma.app.authentication.AccessGuard.isAdmin; +import static it.chalmers.gamma.app.authentication.AccessGuard.isApi; import it.chalmers.gamma.app.Facade; +import it.chalmers.gamma.app.apikey.domain.ApiKeyType; import it.chalmers.gamma.app.authentication.AccessGuard; import it.chalmers.gamma.app.settings.domain.SettingsRepository; import it.chalmers.gamma.app.supergroup.domain.SuperGroupType; @@ -31,7 +33,7 @@ public void setInfoSuperGroupTypes(List superGroupTypes) { } public List getInfoApiSuperGroupTypes() { - this.accessGuard.require(isAdmin()); + this.accessGuard.requireEither(isAdmin(), isApi(ApiKeyType.INFO)); return this.settingsRepository.getSettings().infoSuperGroupTypes().stream() .map(SuperGroupType::value) diff --git a/app/src/main/java/it/chalmers/gamma/app/supergroup/SuperGroupFacade.java b/app/src/main/java/it/chalmers/gamma/app/supergroup/SuperGroupFacade.java index 3fb18491b..8ca7c9b40 100644 --- a/app/src/main/java/it/chalmers/gamma/app/supergroup/SuperGroupFacade.java +++ b/app/src/main/java/it/chalmers/gamma/app/supergroup/SuperGroupFacade.java @@ -1,17 +1,17 @@ package it.chalmers.gamma.app.supergroup; -import static it.chalmers.gamma.app.authentication.AccessGuard.isAdmin; -import static it.chalmers.gamma.app.authentication.AccessGuard.isSignedIn; +import static it.chalmers.gamma.app.authentication.AccessGuard.*; import it.chalmers.gamma.app.Facade; +import it.chalmers.gamma.app.apikey.domain.ApiKeyType; import it.chalmers.gamma.app.authentication.AccessGuard; import it.chalmers.gamma.app.common.PrettyName; import it.chalmers.gamma.app.common.Text; +import it.chalmers.gamma.app.group.GroupFacade; +import it.chalmers.gamma.app.group.domain.GroupRepository; import it.chalmers.gamma.app.supergroup.domain.*; import it.chalmers.gamma.app.user.domain.Name; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import org.springframework.stereotype.Service; @Service @@ -19,14 +19,17 @@ public class SuperGroupFacade extends Facade { private final SuperGroupRepository superGroupRepository; private final SuperGroupTypeRepository superGroupTypeRepository; + private final GroupRepository groupRepository; public SuperGroupFacade( AccessGuard accessGuard, SuperGroupRepository superGroupRepository, - SuperGroupTypeRepository superGroupTypeRepository) { + SuperGroupTypeRepository superGroupTypeRepository, + GroupRepository groupRepository) { super(accessGuard); this.superGroupRepository = superGroupRepository; this.superGroupTypeRepository = superGroupTypeRepository; + this.groupRepository = groupRepository; } public void addType(String type) @@ -50,6 +53,33 @@ public List getAllTypes() { return this.superGroupTypeRepository.getAll().stream().map(SuperGroupType::value).toList(); } + public List getAllTypesWithSuperGroups(List superGroupTypes) { + accessGuard.requireEither(isAdmin(), isApi(ApiKeyType.INFO), isApi(ApiKeyType.GOLDAPPS)); + + List output = new ArrayList<>(); + + for (SuperGroupType type : superGroupTypes.stream().map(SuperGroupType::new).toList()) { + List superGroupsOutput = new ArrayList<>(); + for (SuperGroup superGroup : this.superGroupRepository.getAllByType(type)) { + List members = + this.groupRepository.getAllMembersBySuperGroup(superGroup.id()).stream() + .map(GroupFacade.GroupMemberDTO::new) + .toList(); + + superGroupsOutput.add(new SuperGroupWithMembersDTO(new SuperGroupDTO(superGroup), members)); + } + + output.add(new SuperGroupTypeDTO(type.value(), superGroupsOutput)); + } + + return output; + } + + public record SuperGroupWithMembersDTO( + SuperGroupDTO superGroup, List members) {} + + public record SuperGroupTypeDTO(String type, List superGroups) {} + public UUID createSuperGroup(NewSuperGroup newSuperGroup) throws SuperGroupRepository.SuperGroupAlreadyExistsException { accessGuard.require(isAdmin()); diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index d607ac2ec..193533c9b 100644 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -50,7 +50,7 @@ server: path: "/error" http2: enabled: true - forward-headers-strategy: native + forward-headers-strategy: "native" logging: level: root: "${ROOT_DEBUG_LEVEL:INFO}"