Tools/src/main/java/de/ph87/tools/group/access/GroupAccessService.java
2024-11-06 14:52:02 +01:00

59 lines
2.0 KiB
Java

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));
}
}