Как выполнять проверку прав собственности на комментарии и публикации, придерживаясь принципов SOLID и избегая дублироваJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как выполнять проверку прав собственности на комментарии и публикации, придерживаясь принципов SOLID и избегая дублирова

Сообщение Anonymous »

В PostController я добавил метод isOwner, чтобы проверить, является ли пользователь, выполняющий обновление, владельцем сообщения. Чтобы реализовать эту проверку, я создал метод репозитория isByUuidAndUserEmail в BaseRepository.
Однако позже я понял, что аналогичная проверка требуется в CommentController, чтобы проверить, является ли пользователь, обновляющий комментарий, владельцем . Хотя я мог бы написать отдельный метод isOwner для комментариев, это не имеет смысла, поскольку логика по существу будет такой же, как и у существующего метода isOwner.
Технически я мог бы использовать существующий метод isOwner для CommentController, но это кажется нелогичным с точки зрения читаемости кода, поскольку метод isOwner опирается на PostRepository, поскольку здесь я имею дело с комментариями. Кто-то, читающий код, может подумать: «Проверка комментариев была проведена, но для этого использовался PostRepository».
Лучшего решения я придумать не смог. Итак, что бы вы порекомендовали в качестве лучшего решения, которое соответствует принципам SOLID и позволяет избежать дублирования кода?
@Service
@AllArgsConstructor
public class AuthServiceImpl implements AuthService {
@Override
public boolean isOwner(UUID uuid) {
String currentUserEmail = SecurityContextHolder.getContext().getAuthentication().getName();
return postRepository.existsByUuidAndUserEmail(uuid, currentUserEmail);
}
}

Постконтроллер
@RestController
@RequestMapping("api/post")
public class PostController extends BaseControllerImpl<
PostResponseDTO,
PostRequestDTO,
PostService> {

private final PostService postService;

public PostController(PostService postService) {
super(postService);
this.postService = postService;
}

@Override
@PreAuthorize("@authService.isOwner(#uuid)
public ResponseEntity
update(@PathVariable UUID uuid, @Valid @RequestBody PostRequestDTO requestDTO) {
return super.update(uuid, requestDTO);
}
}

BaseControllerImpl
@AllArgsConstructor
public abstract class BaseControllerImpl<
DTO extends BaseDTO,
RequestDTO,
Service extends BaseService>
implements BaseController {

private final Service getService;

@Override
public ResponseEntity update(@PathVariable UUID uuid, @Valid @RequestBody RequestDTO requestDTO) {
if (getService.update(uuid, requestDTO) != null) {
return new ResponseEntity(getService.update(uuid, requestDTO), HttpStatus.OK);
} else {
return new ResponseEntity(null, HttpStatus.NOT_FOUND);
}
}
}

Репозиторий:
@Repository
public interface PostRepository extends BaseRepository {}

@NoRepositoryBean
public interface BaseRepository extends JpaRepository, JpaSpecificationExecutor {

boolean existsByUuidAndUserEmail(UUID uuid, String email);

}


Подробнее здесь: https://stackoverflow.com/questions/792 ... to-solid-p
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»