package de.ph87.tools.group.access; import de.ph87.tools.group.Group; import de.ph87.tools.group.GroupRepository; import de.ph87.tools.group.uuid.GroupUuid; import de.ph87.tools.user.User; import de.ph87.tools.user.UserAccessService; import de.ph87.tools.user.uuid.UserPrivateUuid; import jakarta.annotation.Nullable; 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; @Slf4j @Service @Transactional @RequiredArgsConstructor public class GroupAccessService { private final GroupRepository groupRepository; private final UserAccessService userAccessService; public boolean canAccess(@Nullable final UserPrivateUuid userPrivateUuid, @NonNull final GroupUuid groupUuid) { final User user = userAccessService.accessOrNull(userPrivateUuid); if (user == null) { return false; } final Group group = getByUuidOrThrow(groupUuid); return group.getUsers().contains(user); } @NonNull public GroupAccess access(@NonNull final UserPrivateUuid userPrivateUuid, @NonNull final GroupUuid groupUuid) { final User user = userAccessService.access(userPrivateUuid); final Group group = getByUuidOrThrow(groupUuid); return new GroupAccess(user, group); } @NonNull public GroupAccess ownerAccess(@NonNull final UserPrivateUuid userPrivateUuid, @NonNull final GroupUuid groupUuid) { final GroupAccess groupAccess = access(userPrivateUuid, groupUuid); if (!groupAccess.group.isOwnedBy(groupAccess.principal)) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST); } return groupAccess; } @NonNull private Group getByUuidOrThrow(@NonNull final GroupUuid groupUuid) { return groupRepository.findByUuid(groupUuid.uuid).orElseThrow(() -> new ResponseStatusException(HttpStatus.BAD_REQUEST)); } }