package de.ph87.tools.group; import de.ph87.tools.group.dto.GroupDto; import de.ph87.tools.group.uuid.GroupUuid; import de.ph87.tools.user.User; import de.ph87.tools.user.UserAccessService; import de.ph87.tools.user.UserService; import de.ph87.tools.user.uuid.UserPrivateUuid; import de.ph87.tools.user.uuid.UserPublicUuid; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.server.ResponseStatusException; import java.util.Set; import java.util.stream.Collectors; @Slf4j @Service @Transactional @RequiredArgsConstructor public class GroupReadService { private final GroupAccessService groupAccessService; private final GroupRepository groupRepository; private final UserService userService; private final UserAccessService userAccessService; private final GroupMapper groupMapper; @NonNull public GroupDto get(@NonNull final UserPrivateUuid privateUuid, @NonNull final GroupUuid groupUuid) { final GroupAccess ug = groupAccessService.access(privateUuid, groupUuid); return groupMapper.toDto(ug.group); } @NonNull public Group getGroupByGroupUuid(@NonNull final GroupUuid groupUuid) { return groupRepository.findByUuid(groupUuid.uuid).orElseThrow(() -> new ResponseStatusException(HttpStatus.BAD_REQUEST)); } /* FIND & GET ----------------------------------------------------------------------------------- */ @NonNull public Set findAllCommonGroups(@NonNull final User a, @NonNull final User b) { return groupRepository.findAllByUsersContainsAndUsersContains(a, b).stream().map(groupMapper::toDto).collect(Collectors.toSet()); } @NonNull public Set findAllJoined(@NonNull final UserPrivateUuid privateUuid) { final User principal = userAccessService.access(privateUuid); return groupRepository.findAllByUsersContains(principal).stream().map(groupMapper::toDto).collect(Collectors.toSet()); } @NonNull public Set findAllCommon(@NonNull final UserPrivateUuid privateUuid, @NonNull final UserPublicUuid targetUuid) { final User principal = userAccessService.access(privateUuid); final User target = userService.getByPublicUuid(targetUuid); return findAllCommonGroups(principal, target); } }