В 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
Как выполнять проверку прав собственности на комментарии и публикации, придерживаясь принципов SOLID и избегая дублирова ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как создать экземпляры переменных в классе, придерживаясь принципов SOLID в Java?
Anonymous » » в форуме JAVA - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как создать экземпляры переменных в классе, придерживаясь принципов SOLID в Java?
Anonymous » » в форуме JAVA - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как создать экземпляры переменных в классе, придерживаясь принципов SOLID в Java? [закрыто]
Anonymous » » в форуме JAVA - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-