From d551e6edb62a3da06996183bd12ec7f15159c858 Mon Sep 17 00:00:00 2001 From: Oksana Date: Fri, 10 Mar 2023 13:01:36 +0300 Subject: [PATCH 01/12] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D1=81=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ControllerPrivateComment.java | 54 +++++++++++ .../controller/ControllerPublicComment.java | 34 +++++++ .../events/comments/dto/CommentDto.java | 19 ++++ .../comments/dto/NewAndUpdateCommentDto.java | 18 ++++ .../events/comments/mapper/CommentMapper.java | 40 ++++++++ .../events/comments/model/Comment.java | 30 ++++++ .../events/comments/rating/model/Grade.java | 27 ++++++ .../rating/storage/RatingRepository.java | 12 +++ .../service/CommentPrivateService.java | 16 ++++ .../service/CommentPrivateServiceImpl.java | 94 +++++++++++++++++++ .../service/CommentPublicService.java | 9 ++ .../service/CommentPublicServiceImpl.java | 50 ++++++++++ .../comments/storage/CommentRepository.java | 12 +++ .../util/RepositoryObjectCreator.java | 13 ++- main-service/src/main/resources/schema.sql | 30 +++++- 15 files changed, 454 insertions(+), 4 deletions(-) create mode 100644 main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/dto/NewAndUpdateCommentDto.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/model/Comment.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/rating/model/Grade.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/rating/storage/RatingRepository.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicService.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java create mode 100644 main-service/src/main/java/ru/practicum/events/comments/storage/CommentRepository.java diff --git a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java new file mode 100644 index 0000000..ba39b60 --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java @@ -0,0 +1,54 @@ +package ru.practicum.events.comments.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import ru.practicum.events.comments.dto.CommentDto; +import ru.practicum.events.comments.dto.NewAndUpdateCommentDto; +import ru.practicum.events.comments.service.CommentPrivateService; + +@RestController +@RequestMapping("/users/{userId}/comments") +public class ControllerPrivateComment { + private final CommentPrivateService service; + + @Autowired + public ControllerPrivateComment(CommentPrivateService service) { + this.service = service; + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public CommentDto createComment(@PathVariable Long userId, + @RequestBody NewAndUpdateCommentDto dto) { + return service.createComment(userId, dto); + } + + @PatchMapping("/{commId}") + public CommentDto updateComment(@PathVariable Long userId, + @PathVariable Long commId, + @RequestBody NewAndUpdateCommentDto dto) { + return service.updateComment(userId, commId, dto); + } + + @DeleteMapping("/{commId}") + public void deleteComment(@PathVariable Long userId, + @PathVariable Long commId) { + service.deleteComment(userId, commId); + } + + @PostMapping("/{commId}/like") + @ResponseStatus(HttpStatus.CREATED) + public void leaveRating(@PathVariable Long userId, + @PathVariable Long commId, + @RequestParam Boolean grade) { + service.leaveRating(userId, commId, grade); + } + + @DeleteMapping("/{commId}/like") + @ResponseStatus(HttpStatus.CREATED) + public void deleteRating(@PathVariable Long userId, + @PathVariable Long commId) { + service.deleteRating(userId, commId); + } +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java new file mode 100644 index 0000000..f6aa3a6 --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java @@ -0,0 +1,34 @@ +package ru.practicum.events.comments.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import ru.practicum.events.comments.dto.CommentDto; +import ru.practicum.events.comments.service.CommentPublicService; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; +import java.util.List; + +@RestController +@RequestMapping("/comment") +public class ControllerPublicComment { + private final CommentPublicService service; + + @Autowired + public ControllerPublicComment(CommentPublicService service) { + this.service = service; + } + + @GetMapping + public List getCommentByEvent(@NotNull @RequestParam Long eventId, + @RequestParam(defaultValue = "false") Boolean rating, + @PositiveOrZero @RequestParam(defaultValue = "0") int from, + @Positive @RequestParam(defaultValue = "10") int size) { + return service.getCommentByEvent(eventId, rating, from, size); + } + +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java b/main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java new file mode 100644 index 0000000..5a15421 --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java @@ -0,0 +1,19 @@ +package ru.practicum.events.comments.dto; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import ru.practicum.users.dto.UserShortDto; + +import java.time.LocalDateTime; + +@Setter +@Getter +@Builder +public class CommentDto { + private Long id; + private UserShortDto commentator; + private String text; + private LocalDateTime commentTime; + private Long rating; +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/dto/NewAndUpdateCommentDto.java b/main-service/src/main/java/ru/practicum/events/comments/dto/NewAndUpdateCommentDto.java new file mode 100644 index 0000000..0d2a2ed --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/dto/NewAndUpdateCommentDto.java @@ -0,0 +1,18 @@ +package ru.practicum.events.comments.dto; + +import lombok.*; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class NewAndUpdateCommentDto { + @NotNull + @NotBlank + private String text; + private Long eventId; +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java b/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java new file mode 100644 index 0000000..f130ff5 --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java @@ -0,0 +1,40 @@ +package ru.practicum.events.comments.mapper; + +import ru.practicum.events.comments.dto.CommentDto; +import ru.practicum.events.comments.dto.NewAndUpdateCommentDto; +import ru.practicum.events.comments.model.Comment; +import ru.practicum.events.event.model.Event; +import ru.practicum.users.mapper.UserMapper; +import ru.practicum.users.model.User; + +import java.time.LocalDateTime; + +public class CommentMapper { + public static CommentDto toDto(Comment comment) { + return CommentDto.builder() + .commentator(UserMapper.toShortDto(comment.getCommentator())) + .commentTime(comment.getCommentTime()) + .id(comment.getId()) + .text(comment.getText()) + .build(); + } + + public static CommentDto toDto(Comment comment, Long rating) { + return CommentDto.builder() + .commentator(UserMapper.toShortDto(comment.getCommentator())) + .commentTime(comment.getCommentTime()) + .id(comment.getId()) + .text(comment.getText()) + .rating(rating) + .build(); + } + + public static Comment toComment(NewAndUpdateCommentDto dto, LocalDateTime time, User commentator, Event event) { + return Comment.builder() + .commentator(commentator) + .text(dto.getText()) + .commentTime(time) + .event(event) + .build(); + } +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/model/Comment.java b/main-service/src/main/java/ru/practicum/events/comments/model/Comment.java new file mode 100644 index 0000000..df364c4 --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/model/Comment.java @@ -0,0 +1,30 @@ +package ru.practicum.events.comments.model; + +import lombok.*; +import ru.practicum.events.event.model.Event; +import ru.practicum.users.model.User; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Setter +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "comments") +public class Comment { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String text; + @ManyToOne() + @JoinColumn(name = "user_id") + private User commentator; + @ManyToOne() + @JoinColumn(name = "event_id") + private Event event; + @Column(name = "comment_time") + private LocalDateTime commentTime; +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/rating/model/Grade.java b/main-service/src/main/java/ru/practicum/events/comments/rating/model/Grade.java new file mode 100644 index 0000000..1c7baae --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/rating/model/Grade.java @@ -0,0 +1,27 @@ +package ru.practicum.events.comments.rating.model; + +import lombok.*; +import ru.practicum.events.comments.model.Comment; +import ru.practicum.users.model.User; + +import javax.persistence.*; + +@Setter +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "rating") +public class Grade { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @ManyToOne() + @JoinColumn(name = "user_id") + private User rater; + @ManyToOne() + @JoinColumn(name = "comment_id") + private Comment comment; + private Boolean grade; +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/rating/storage/RatingRepository.java b/main-service/src/main/java/ru/practicum/events/comments/rating/storage/RatingRepository.java new file mode 100644 index 0000000..28f8c57 --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/rating/storage/RatingRepository.java @@ -0,0 +1,12 @@ +package ru.practicum.events.comments.rating.storage; + +import org.springframework.data.jpa.repository.JpaRepository; +import ru.practicum.events.comments.model.Comment; +import ru.practicum.events.comments.rating.model.Grade; +import ru.practicum.users.model.User; + +public interface RatingRepository extends JpaRepository { + Long countGradeByCommentAndGrade(Comment comment, Boolean grade); + Boolean existsByCommentAndRater(Comment comment, User rater); + void deleteByCommentAndRater(Comment comment, User user); +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java new file mode 100644 index 0000000..672afdc --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java @@ -0,0 +1,16 @@ +package ru.practicum.events.comments.service; + +import ru.practicum.events.comments.dto.CommentDto; +import ru.practicum.events.comments.dto.NewAndUpdateCommentDto; + +public interface CommentPrivateService { + CommentDto createComment(Long userId, NewAndUpdateCommentDto dto); + + CommentDto updateComment(Long userId, Long commId, NewAndUpdateCommentDto dto); + + void deleteComment(Long userId, Long commId); + + void leaveRating(Long userId, Long commId, Boolean grade); + + void deleteRating(Long userId, Long commId); +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java new file mode 100644 index 0000000..d991223 --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java @@ -0,0 +1,94 @@ +package ru.practicum.events.comments.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.practicum.events.comments.dto.CommentDto; +import ru.practicum.events.comments.dto.NewAndUpdateCommentDto; +import ru.practicum.events.comments.mapper.CommentMapper; +import ru.practicum.events.comments.model.Comment; +import ru.practicum.events.comments.rating.model.Grade; +import ru.practicum.events.comments.rating.storage.RatingRepository; +import ru.practicum.events.comments.storage.CommentRepository; +import ru.practicum.events.event.model.Event; +import ru.practicum.users.model.User; +import ru.practicum.util.RepositoryObjectCreator; +import ru.practicum.util.exception.BadRequestException; +import ru.practicum.util.exception.ConflictException; + +import java.time.LocalDateTime; + +@Service +public class CommentPrivateServiceImpl implements CommentPrivateService { + private final CommentRepository commentRepository; + private final RepositoryObjectCreator objectCreator; + private final RatingRepository ratingRepository; + + @Autowired + public CommentPrivateServiceImpl(CommentRepository commentRepository, + RepositoryObjectCreator objectCreator, + RatingRepository ratingRepository) { + this.commentRepository = commentRepository; + this.objectCreator = objectCreator; + this.ratingRepository = ratingRepository; + } + + @Override + public CommentDto createComment(Long userId, NewAndUpdateCommentDto dto) { + return CommentMapper.toDto(commentRepository.save(CommentMapper.toComment( + dto, + LocalDateTime.now(), + objectCreator.getUserById(userId), + objectCreator.getEventById(dto.getEventId()) + ))); + } + + @Override + public CommentDto updateComment(Long userId, Long commId, NewAndUpdateCommentDto dto) { + Comment comment = objectCreator.getCommentById(commId); + User user = objectCreator.getUserById(userId); + Event event = objectCreator.getEventById(dto.getEventId()); + + if (!comment.getCommentator().equals(user)) { + throw new BadRequestException(String + .format("Только комментатор id = %d может изменить коментарий id = %d ", userId, commId)); + } + if (!comment.getEvent().equals(event)) { + throw new BadRequestException(String + .format("У события id = %d отсутствует коментарий id = %d", userId, commId)); + } + + comment.setText(dto.getText()); + return CommentMapper.toDto(commentRepository.save(comment)); + } + + @Override + public void deleteComment(Long userId, Long commId) { + Comment comment = objectCreator.getCommentById(commId); + User user = objectCreator.getUserById(userId); + + if (!comment.getCommentator().equals(user)) { + throw new BadRequestException(String + .format("Только комментатор id = %d может удалить коментарий id = %d ", userId, commId)); + } + commentRepository.deleteById(commId); + } + + @Override + public void leaveRating(Long userId, Long commId, Boolean grade) { + if (ratingRepository + .existsByCommentAndRater(objectCreator.getCommentById(commId), objectCreator.getUserById(userId))) { + throw new ConflictException("Отавить оценку комментарию можно один раз"); + } + ratingRepository.save(Grade.builder() + .comment(objectCreator.getCommentById(commId)) + .rater(objectCreator.getUserById(userId)) + .grade(grade) + .build()); + } + + @Override + public void deleteRating(Long userId, Long commId) { + ratingRepository + .deleteByCommentAndRater(objectCreator.getCommentById(commId), objectCreator.getUserById(userId)); + } +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicService.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicService.java new file mode 100644 index 0000000..b5cedce --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicService.java @@ -0,0 +1,9 @@ +package ru.practicum.events.comments.service; + +import ru.practicum.events.comments.dto.CommentDto; + +import java.util.List; + +public interface CommentPublicService { + List getCommentByEvent(Long eventId, Boolean rating, int from, int size); +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java new file mode 100644 index 0000000..702816c --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java @@ -0,0 +1,50 @@ +package ru.practicum.events.comments.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import ru.practicum.events.comments.dto.CommentDto; +import ru.practicum.events.comments.mapper.CommentMapper; +import ru.practicum.events.comments.rating.storage.RatingRepository; +import ru.practicum.events.comments.storage.CommentRepository; +import ru.practicum.util.RepositoryObjectCreator; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.springframework.data.domain.Sort.Direction.DESC; + +@Service +public class CommentPublicServiceImpl implements CommentPublicService { + private final CommentRepository commentRepository; + private final RepositoryObjectCreator objectCreator; + private final RatingRepository ratingRepository; + + @Autowired + public CommentPublicServiceImpl(CommentRepository commentRepository, + RepositoryObjectCreator objectCreator, + RatingRepository ratingRepository) { + this.commentRepository = commentRepository; + this.objectCreator = objectCreator; + this.ratingRepository = ratingRepository; + } + + @Override + public List getCommentByEvent(Long eventId, Boolean rating, int from, int size) { + Sort sort1 = Sort.by(DESC, "comment_time"); + Stream commentDtoStream =commentRepository + .findCommentsByEvent(objectCreator.getEventById(eventId), PageRequest.of(from, size, sort1)) + .stream() + .map(comment -> CommentMapper + .toDto(comment, + ratingRepository.countGradeByCommentAndGrade(comment,true) + - ratingRepository.countGradeByCommentAndGrade(comment,false))); + if (rating){ + commentDtoStream = commentDtoStream.sorted(Comparator.comparingLong(CommentDto::getRating).reversed()); + } + return commentDtoStream.collect(Collectors.toList()); + } +} diff --git a/main-service/src/main/java/ru/practicum/events/comments/storage/CommentRepository.java b/main-service/src/main/java/ru/practicum/events/comments/storage/CommentRepository.java new file mode 100644 index 0000000..73848c8 --- /dev/null +++ b/main-service/src/main/java/ru/practicum/events/comments/storage/CommentRepository.java @@ -0,0 +1,12 @@ +package ru.practicum.events.comments.storage; + +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import ru.practicum.events.comments.model.Comment; +import ru.practicum.events.event.model.Event; + +import java.util.List; + +public interface CommentRepository extends JpaRepository { + List findCommentsByEvent(Event event, Pageable pageable); +} diff --git a/main-service/src/main/java/ru/practicum/util/RepositoryObjectCreator.java b/main-service/src/main/java/ru/practicum/util/RepositoryObjectCreator.java index 6f22614..5d73edc 100644 --- a/main-service/src/main/java/ru/practicum/util/RepositoryObjectCreator.java +++ b/main-service/src/main/java/ru/practicum/util/RepositoryObjectCreator.java @@ -4,6 +4,8 @@ import org.springframework.stereotype.Service; import ru.practicum.category.model.Category; import ru.practicum.category.storage.CategoryRepository; +import ru.practicum.events.comments.model.Comment; +import ru.practicum.events.comments.storage.CommentRepository; import ru.practicum.events.compilation.model.Compilation; import ru.practicum.events.compilation.storage.CompilationRepository; import ru.practicum.events.event.model.Event; @@ -21,18 +23,21 @@ public class RepositoryObjectCreator { private final EventRepository eventRepository; private final RequestRepository requestRepository; private final CompilationRepository compilationRepository; + private final CommentRepository commentRepository; @Autowired public RepositoryObjectCreator(UserRepository userRepository, CategoryRepository categoryRepository, EventRepository eventRepository, RequestRepository requestRepository, - CompilationRepository compilationRepository) { + CompilationRepository compilationRepository, + CommentRepository commentRepository) { this.userRepository = userRepository; this.categoryRepository = categoryRepository; this.eventRepository = eventRepository; this.requestRepository = requestRepository; this.compilationRepository = compilationRepository; + this.commentRepository = commentRepository; } public User getUserById(Long id) { @@ -60,6 +65,10 @@ public Compilation getCompilationById(Long compId) { .orElseThrow(() -> new NotFoundException(getMassage("Подборка", compId))); } + public Comment getCommentById(Long commId) { + return commentRepository.findById(commId) + .orElseThrow(() -> new NotFoundException(getMassage("Комментарий", commId))); + } public Boolean isRelatedCategory(Long id) { return eventRepository.existsByCategory(getCategoryById(id)); } @@ -67,4 +76,6 @@ public Boolean isRelatedCategory(Long id) { private String getMassage(String model, Long id) { return String.format("%s id = %d отсутствует", model, id); } + + } diff --git a/main-service/src/main/resources/schema.sql b/main-service/src/main/resources/schema.sql index 4926654..f086b7f 100644 --- a/main-service/src/main/resources/schema.sql +++ b/main-service/src/main/resources/schema.sql @@ -1,10 +1,10 @@ -DROP TABLE IF EXISTS compilation_events,compilations,requests,events,categories,users; +DROP TABLE IF EXISTS rating, comments, compilation_events,compilations,requests,events,categories,users; CREATE TABLE IF NOT EXISTS users ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, name VARCHAR(255) NOT NULL, - email VARCHAR(512) NOT NULL, + email VARCHAR(320) NOT NULL, CONSTRAINT pk_user PRIMARY KEY (id), CONSTRAINT UQ_USER_EMAIL UNIQUE (email) ); @@ -70,4 +70,28 @@ CREATE TABLE IF NOT EXISTS compilation_events CONSTRAINT pk_comp_event PRIMARY KEY (compilation_id, event_id), FOREIGN KEY (event_id) REFERENCES events (id) ON DELETE CASCADE, FOREIGN KEY (compilation_id) REFERENCES compilations (id) ON DELETE CASCADE -); \ No newline at end of file +); + +CREATE TABLE IF NOT EXISTS comments +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + text VARCHAR(2000) NOT NULL, + user_id BIGINT NOT NULL, + event_id BIGINT NOT NULL, + comment_time TIMESTAMP WITHOUT TIME ZONE, + CONSTRAINT pk_comments PRIMARY KEY (id), + FOREIGN KEY (event_id) REFERENCES events (id) ON DELETE CASCADE, + FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS rating +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + user_id BIGINT NOT NULL, + comment_id BIGINT NOT NULL, + grade BOOLEAN NOT NULL, + CONSTRAINT pk_rating PRIMARY KEY (id), + FOREIGN KEY (comment_id) REFERENCES comments (id) ON DELETE CASCADE, + FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE +); + From c7ceb2e77b5b63afc40b76cc985687e064361f44 Mon Sep 17 00:00:00 2001 From: Oksana Date: Fri, 10 Mar 2023 14:32:08 +0300 Subject: [PATCH 02/12] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B8=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .Postman/Stats-server.postman_collection.json | 464 ------------------ .../service/CommentPrivateServiceImpl.java | 8 +- .../service/CommentPublicServiceImpl.java | 18 +- .../controller/ControllerEventPrivate.java | 7 + .../practicum/events/event/model/Event.java | 2 + .../event/service/EventPrivateService.java | 2 + .../service/impl/EventPrivateServiceImp.java | 17 +- main-service/src/main/resources/schema.sql | 1 + 8 files changed, 45 insertions(+), 474 deletions(-) delete mode 100644 .Postman/Stats-server.postman_collection.json diff --git a/.Postman/Stats-server.postman_collection.json b/.Postman/Stats-server.postman_collection.json deleted file mode 100644 index 8aeb528..0000000 --- a/.Postman/Stats-server.postman_collection.json +++ /dev/null @@ -1,464 +0,0 @@ -{ - "info": { - "_postman_id": "9866b6dd-6e16-4941-99ec-dadd50444c62", - "name": "Stats-server", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "23645999" - }, - "item": [ - { - "name": "Корректное добавление статистики", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200\", function() {\r", - " pm.response.to.be.ok;\r", - "}); " - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\r\n \"app\": \"ewm-main-service\",\r\n \"uri\": \"/events/1\",\r\n \"ip\": \"192.163.0.1\",\r\n \"timestamp\": \"2022-09-06 11:00:23\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/hit", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "hit" - ] - } - }, - "response": [] - }, - { - "name": "Корректное добавление статистики Copy", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200\", function() {\r", - " pm.response.to.be.ok;\r", - "}); " - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\r\n \"app\": \"ewm-main-service\",\r\n \"uri\": \"/events/1\",\r\n \"ip\": \"192.163.0.1\",\r\n \"timestamp\": \"2022-09-06 11:00:23\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/hit", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "hit" - ] - } - }, - "response": [] - }, - { - "name": "Отсутствует app", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 400\", function () {\r", - " pm.expect(pm.response.code).to.be.oneOf([400]);\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\r\n \"app\": \"\",\r\n \"uri\": \"/events/1\",\r\n \"ip\": \"192.163.0.1\",\r\n \"timestamp\": \"2022-09-06 11:00:23\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/hit", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "hit" - ] - } - }, - "response": [] - }, - { - "name": "Отсутствует uri", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 400\", function () {\r", - " pm.expect(pm.response.code).to.be.oneOf([400]);\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"app\": \"ewm-main-service\",\r\n \"uri\": \"\",\r\n \"ip\": \"192.163.0.1\",\r\n \"timestamp\": \"2022-09-06 11:00:23\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/hit", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "hit" - ] - } - }, - "response": [] - }, - { - "name": "Отсутствует ip", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 400\", function () {\r", - " pm.expect(pm.response.code).to.be.oneOf([400]);\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"app\": \"ewm-main-service\",\r\n \"uri\": \"/events/1\",\r\n \"ip\": \"\",\r\n \"timestamp\": \"2022-09-06 11:00:23\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/hit", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "hit" - ] - } - }, - "response": [] - }, - { - "name": "Отсутствует timestamp", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 400\", function () {\r", - " pm.expect(pm.response.code).to.be.oneOf([400]);\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"app\": \"ewm-main-service\",\r\n \"uri\": \"/events/1\",\r\n \"ip\": \"192.163.0.1\",\r\n \"timestamp\": \"\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/hit", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "hit" - ] - } - }, - "response": [] - }, - { - "name": "Корректное добавление статистики 3", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200\", function() {\r", - " pm.response.to.be.ok;\r", - "}); " - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\r\n \"app\": \"ewm-main-service\",\r\n \"uri\": \"/events/3\",\r\n \"ip\": \"192.163.0.1\",\r\n \"timestamp\": \"2022-09-06 11:00:23\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/hit", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "hit" - ] - } - }, - "response": [] - }, - { - "name": "Список статистики", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {\r", - " pm.expect(pm.response.code).to.be.oneOf([200]);\r", - "});\r", - "pm.test(\"Test get all\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData.length, 'items count in total').to.eql(2);\r", - " pm.expect(jsonData[0].hits, 'result[0]: \"hits\" field').to.eql(2);\r", - " pm.expect(jsonData[1].hits, 'result[1]: \"hits\" field').to.eql(1);\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{baseUrl}}/stats?start=2022-09-06 11:00:00&end=2022-09-06 12:00:00", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "stats" - ], - "query": [ - { - "key": "start", - "value": "2022-09-06 11:00:00" - }, - { - "key": "end", - "value": "2022-09-06 12:00:00" - }, - { - "key": "", - "value": null, - "disabled": true - } - ] - } - }, - "response": [] - }, - { - "name": "Список статистики c uri", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{baseUrl}}/stats?start=2022-09-06 11:00:00&end=2022-09-06 12:00:00&uri=/events/3&unique=false", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "stats" - ], - "query": [ - { - "key": "start", - "value": "2022-09-06 11:00:00" - }, - { - "key": "end", - "value": "2022-09-06 12:00:00" - }, - { - "key": "uri", - "value": "/events/3" - }, - { - "key": "unique", - "value": "false" - } - ] - } - }, - "response": [] - }, - { - "name": "Список статистики unique true", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{baseUrl}}/stats?start=2022-09-06 11:00:00&end=2022-09-06 12:00:00&uri=/events/3&unique=true", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "stats" - ], - "query": [ - { - "key": "start", - "value": "2022-09-06 11:00:00" - }, - { - "key": "end", - "value": "2022-09-06 12:00:00" - }, - { - "key": "uri", - "value": "/events/3" - }, - { - "key": "unique", - "value": "true" - } - ] - } - }, - "response": [] - } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "variable": [ - { - "key": "baseUrl", - "value": "http://localhost:9090" - } - ] -} \ No newline at end of file diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java index d991223..6a5c89b 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java @@ -34,12 +34,16 @@ public CommentPrivateServiceImpl(CommentRepository commentRepository, @Override public CommentDto createComment(Long userId, NewAndUpdateCommentDto dto) { + Event event = objectCreator.getEventById(dto.getEventId()); + if (!event.getCommentSwitch()){ + throw new ConflictException("Невозможно добавить комментарий! У события отключены комментарии!"); + } return CommentMapper.toDto(commentRepository.save(CommentMapper.toComment( dto, LocalDateTime.now(), objectCreator.getUserById(userId), - objectCreator.getEventById(dto.getEventId()) - ))); + event) + )); } @Override diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java index 702816c..3661412 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java @@ -8,8 +8,10 @@ import ru.practicum.events.comments.mapper.CommentMapper; import ru.practicum.events.comments.rating.storage.RatingRepository; import ru.practicum.events.comments.storage.CommentRepository; +import ru.practicum.events.event.model.Event; import ru.practicum.util.RepositoryObjectCreator; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -34,16 +36,20 @@ public CommentPublicServiceImpl(CommentRepository commentRepository, @Override public List getCommentByEvent(Long eventId, Boolean rating, int from, int size) { + Event event = objectCreator.getEventById(eventId); + if (!event.getCommentSwitch()) { + return new ArrayList<>(); + } Sort sort1 = Sort.by(DESC, "comment_time"); - Stream commentDtoStream =commentRepository - .findCommentsByEvent(objectCreator.getEventById(eventId), PageRequest.of(from, size, sort1)) + Stream commentDtoStream = commentRepository + .findCommentsByEvent(event, PageRequest.of(from, size, sort1)) .stream() .map(comment -> CommentMapper .toDto(comment, - ratingRepository.countGradeByCommentAndGrade(comment,true) - - ratingRepository.countGradeByCommentAndGrade(comment,false))); - if (rating){ - commentDtoStream = commentDtoStream.sorted(Comparator.comparingLong(CommentDto::getRating).reversed()); + ratingRepository.countGradeByCommentAndGrade(comment, true) + - ratingRepository.countGradeByCommentAndGrade(comment, false))); + if (rating) { + commentDtoStream = commentDtoStream.sorted(Comparator.comparingLong(CommentDto::getRating).reversed()); } return commentDtoStream.collect(Collectors.toList()); } diff --git a/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java b/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java index 9d2bca9..2d12930 100644 --- a/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java +++ b/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java @@ -47,6 +47,13 @@ public EventFullDto updateEvent(@Positive @PathVariable Long userId, return service.update(userId, eventId, dto); } + @PatchMapping("/{eventId}/comment") + public void enableComment(@Positive @PathVariable Long userId, + @Positive @PathVariable Long eventId, + @RequestParam Boolean cutout){ + service.enableComment(userId, eventId, cutout); + } + @GetMapping("/{eventId}") public EventFullDto getEventByIdWhereUserIsOwner(@Positive @PathVariable Long userId, @Positive @PathVariable Long eventId) { diff --git a/main-service/src/main/java/ru/practicum/events/event/model/Event.java b/main-service/src/main/java/ru/practicum/events/event/model/Event.java index b6ef0ac..4e4024f 100644 --- a/main-service/src/main/java/ru/practicum/events/event/model/Event.java +++ b/main-service/src/main/java/ru/practicum/events/event/model/Event.java @@ -45,4 +45,6 @@ public class Event { @Column(unique = true) private String title; private Long views; + @Column(name = "comment_switch") + private Boolean commentSwitch; } diff --git a/main-service/src/main/java/ru/practicum/events/event/service/EventPrivateService.java b/main-service/src/main/java/ru/practicum/events/event/service/EventPrivateService.java index 0dbac1f..e7fa4bf 100644 --- a/main-service/src/main/java/ru/practicum/events/event/service/EventPrivateService.java +++ b/main-service/src/main/java/ru/practicum/events/event/service/EventPrivateService.java @@ -24,4 +24,6 @@ public interface EventPrivateService { EventRequestStatusUpdateResult updateRequestStatus(Long userId, Long eventId, EventRequestStatusUpdateRequest updateRequest); + + void enableComment(Long userId, Long eventId, Boolean cutout); } diff --git a/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java b/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java index 64012f2..50fdac9 100644 --- a/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java +++ b/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java @@ -59,9 +59,11 @@ public List getEventsByUser(Long userId, Integer from, Integer si @Override public EventFullDto addNewEvent(Long userId, NewEventDto newEventDto) { CheckTime.checkTemporaryValidation(newEventDto.getEventDate(), LocalDateTime.now(), 2); - return toEventFullDto(eventRepository.save(toEvent(newEventDto, + Event event =toEvent(newEventDto, objectCreator.getUserById(userId), - objectCreator.getCategoryById(newEventDto.getCategory()), 0L, 0L))); + objectCreator.getCategoryById(newEventDto.getCategory()), 0L, 0L); + event.setCommentSwitch(true); + return toEventFullDto(eventRepository.save(event)); } @Override @@ -147,6 +149,17 @@ public EventRequestStatusUpdateResult updateRequestStatus(Long userId, } } + @Override + public void enableComment(Long userId, Long eventId, Boolean cutout) { + User user = objectCreator.getUserById(userId); + Event event = objectCreator.getEventById(eventId); + if (event.getInitiator().equals(user)){ + throw new BadRequestException("Включать и выключать коментарии может только инициализатор события"); + } + event.setCommentSwitch(cutout); + eventRepository.save(event); + } + private EventRequestStatusUpdateResult getUpdateResultConfirmed(List requests, Event event) { List confirmed = new ArrayList<>(); List rejected = new ArrayList<>(); diff --git a/main-service/src/main/resources/schema.sql b/main-service/src/main/resources/schema.sql index f086b7f..7ec574f 100644 --- a/main-service/src/main/resources/schema.sql +++ b/main-service/src/main/resources/schema.sql @@ -36,6 +36,7 @@ CREATE TABLE IF NOT EXISTS events state VARCHAR, title VARCHAR(255) NOT NULL, views BIGINT, + comment_switch BOOLEAN, CONSTRAINT pk_events PRIMARY KEY (id), FOREIGN KEY (initiator_id) REFERENCES users (id) ON DELETE CASCADE, From 49e4f02ab03e6265af44286ca33c91bee0893ada Mon Sep 17 00:00:00 2001 From: Oksana Date: Sun, 12 Mar 2023 01:19:11 +0300 Subject: [PATCH 03/12] =?UTF-8?q?fix:=20=D0=9D=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ControllerPrivateComment.java | 9 ++++++--- .../controller/ControllerPublicComment.java | 3 ++- .../events/comments/dto/CommentDto.java | 6 +++--- .../comments/service/CommentPrivateService.java | 2 +- .../service/CommentPrivateServiceImpl.java | 17 ++++++++++++++--- .../service/CommentPublicServiceImpl.java | 8 +++++--- .../comments/storage/CommentRepository.java | 2 +- .../controller/ControllerEventPrivate.java | 14 ++++++-------- .../events/event/dto/EventFullDto.java | 1 + .../events/event/mapper/EventMapper.java | 1 + .../event/service/EventPrivateService.java | 7 ++----- .../service/impl/EventPrivateServiceImp.java | 13 +++++-------- 12 files changed, 47 insertions(+), 36 deletions(-) diff --git a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java index ba39b60..2dc305d 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java +++ b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java @@ -6,9 +6,11 @@ import ru.practicum.events.comments.dto.CommentDto; import ru.practicum.events.comments.dto.NewAndUpdateCommentDto; import ru.practicum.events.comments.service.CommentPrivateService; +import ru.practicum.util.exception.handler.CustomExceptionHandler; @RestController @RequestMapping("/users/{userId}/comments") +@CustomExceptionHandler public class ControllerPrivateComment { private final CommentPrivateService service; @@ -32,6 +34,7 @@ public CommentDto updateComment(@PathVariable Long userId, } @DeleteMapping("/{commId}") + @ResponseStatus(HttpStatus.NO_CONTENT) public void deleteComment(@PathVariable Long userId, @PathVariable Long commId) { service.deleteComment(userId, commId); @@ -39,14 +42,14 @@ public void deleteComment(@PathVariable Long userId, @PostMapping("/{commId}/like") @ResponseStatus(HttpStatus.CREATED) - public void leaveRating(@PathVariable Long userId, + public CommentDto leaveRating(@PathVariable Long userId, @PathVariable Long commId, @RequestParam Boolean grade) { - service.leaveRating(userId, commId, grade); + return service.leaveRating(userId, commId, grade); } @DeleteMapping("/{commId}/like") - @ResponseStatus(HttpStatus.CREATED) + @ResponseStatus(HttpStatus.NO_CONTENT) public void deleteRating(@PathVariable Long userId, @PathVariable Long commId) { service.deleteRating(userId, commId); diff --git a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java index f6aa3a6..52a51b4 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java +++ b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.RestController; import ru.practicum.events.comments.dto.CommentDto; import ru.practicum.events.comments.service.CommentPublicService; +import ru.practicum.util.exception.handler.CustomExceptionHandler; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; @@ -15,6 +16,7 @@ @RestController @RequestMapping("/comment") +@CustomExceptionHandler public class ControllerPublicComment { private final CommentPublicService service; @@ -30,5 +32,4 @@ public List getCommentByEvent(@NotNull @RequestParam Long eventId, @Positive @RequestParam(defaultValue = "10") int size) { return service.getCommentByEvent(eventId, rating, from, size); } - } diff --git a/main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java b/main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java index 5a15421..3c16f72 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java +++ b/main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java @@ -1,14 +1,14 @@ package ru.practicum.events.comments.dto; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import lombok.*; import ru.practicum.users.dto.UserShortDto; import java.time.LocalDateTime; @Setter @Getter +@AllArgsConstructor +@NoArgsConstructor @Builder public class CommentDto { private Long id; diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java index 672afdc..c1a1c9a 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java @@ -10,7 +10,7 @@ public interface CommentPrivateService { void deleteComment(Long userId, Long commId); - void leaveRating(Long userId, Long commId, Boolean grade); + CommentDto leaveRating(Long userId, Long commId, Boolean grade); void deleteRating(Long userId, Long commId); } diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java index 6a5c89b..61448d0 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import ru.practicum.events.comments.dto.CommentDto; import ru.practicum.events.comments.dto.NewAndUpdateCommentDto; import ru.practicum.events.comments.mapper.CommentMapper; @@ -72,13 +73,13 @@ public void deleteComment(Long userId, Long commId) { if (!comment.getCommentator().equals(user)) { throw new BadRequestException(String - .format("Только комментатор id = %d может удалить коментарий id = %d ", userId, commId)); + .format("Только комментатор может удалить коментарий id = %d ", commId)); } commentRepository.deleteById(commId); } @Override - public void leaveRating(Long userId, Long commId, Boolean grade) { + public CommentDto leaveRating(Long userId, Long commId, Boolean grade) { if (ratingRepository .existsByCommentAndRater(objectCreator.getCommentById(commId), objectCreator.getUserById(userId))) { throw new ConflictException("Отавить оценку комментарию можно один раз"); @@ -88,11 +89,21 @@ public void leaveRating(Long userId, Long commId, Boolean grade) { .rater(objectCreator.getUserById(userId)) .grade(grade) .build()); + Comment comment = objectCreator.getCommentById(commId); + return CommentMapper.toDto(comment, ratingRepository.countGradeByCommentAndGrade(comment, true) + - ratingRepository.countGradeByCommentAndGrade(comment, false)); } @Override + @Transactional public void deleteRating(Long userId, Long commId) { + Comment comment = objectCreator.getCommentById(commId); + User user = objectCreator.getUserById(userId); + if (!ratingRepository.existsByCommentAndRater(comment, user)) { + throw new BadRequestException(String.format("Невозможно удалеть лайк! " + + "Пользователь id = %d не ставил оценку комментарию id = %d", userId, commId)); + } ratingRepository - .deleteByCommentAndRater(objectCreator.getCommentById(commId), objectCreator.getUserById(userId)); + .deleteByCommentAndRater(comment, user); } } diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java index 3661412..c16dfdb 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import ru.practicum.events.comments.dto.CommentDto; import ru.practicum.events.comments.mapper.CommentMapper; +import ru.practicum.events.comments.model.Comment; import ru.practicum.events.comments.rating.storage.RatingRepository; import ru.practicum.events.comments.storage.CommentRepository; import ru.practicum.events.event.model.Event; @@ -40,9 +41,10 @@ public List getCommentByEvent(Long eventId, Boolean rating, int from if (!event.getCommentSwitch()) { return new ArrayList<>(); } - Sort sort1 = Sort.by(DESC, "comment_time"); - Stream commentDtoStream = commentRepository - .findCommentsByEvent(event, PageRequest.of(from, size, sort1)) + Sort sort1 = Sort.by(DESC, "commentTime"); + List comments =commentRepository + .findByEvent(event, PageRequest.of(from, size, sort1)); + Stream commentDtoStream = comments .stream() .map(comment -> CommentMapper .toDto(comment, diff --git a/main-service/src/main/java/ru/practicum/events/comments/storage/CommentRepository.java b/main-service/src/main/java/ru/practicum/events/comments/storage/CommentRepository.java index 73848c8..ea0028c 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/storage/CommentRepository.java +++ b/main-service/src/main/java/ru/practicum/events/comments/storage/CommentRepository.java @@ -8,5 +8,5 @@ import java.util.List; public interface CommentRepository extends JpaRepository { - List findCommentsByEvent(Event event, Pageable pageable); + List findByEvent(Event event, Pageable pageable); } diff --git a/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java b/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java index 2d12930..9e906af 100644 --- a/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java +++ b/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java @@ -4,10 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; -import ru.practicum.events.event.dto.EventFullDto; -import ru.practicum.events.event.dto.EventShortDto; -import ru.practicum.events.event.dto.NewEventDto; -import ru.practicum.events.event.dto.UpdateEventRequest; +import ru.practicum.events.event.dto.*; import ru.practicum.events.event.service.EventPrivateService; import ru.practicum.events.request.dto.EventRequestStatusUpdateRequest; import ru.practicum.events.request.dto.EventRequestStatusUpdateResult; @@ -48,10 +45,11 @@ public EventFullDto updateEvent(@Positive @PathVariable Long userId, } @PatchMapping("/{eventId}/comment") - public void enableComment(@Positive @PathVariable Long userId, - @Positive @PathVariable Long eventId, - @RequestParam Boolean cutout){ - service.enableComment(userId, eventId, cutout); + public EventFullDto enableComment(@Positive @PathVariable Long userId, + @Positive @PathVariable Long eventId, + @RequestParam(defaultValue = "false") Boolean disable) { + log.info("Получен запрос на вкдючение и выключении комментариев"); + return service.enableComment(userId, eventId, disable); } @GetMapping("/{eventId}") diff --git a/main-service/src/main/java/ru/practicum/events/event/dto/EventFullDto.java b/main-service/src/main/java/ru/practicum/events/event/dto/EventFullDto.java index 0ca97b7..9dcd1e1 100644 --- a/main-service/src/main/java/ru/practicum/events/event/dto/EventFullDto.java +++ b/main-service/src/main/java/ru/practicum/events/event/dto/EventFullDto.java @@ -34,4 +34,5 @@ public class EventFullDto { private EventState state; private String title; private Long views; + private Boolean commentSwitch; } diff --git a/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java b/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java index 92276a0..392f392 100644 --- a/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java +++ b/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java @@ -75,6 +75,7 @@ public static EventFullDto toEventFullDto(Event event) { .state(event.getState()) .title(event.getTitle()) .views(event.getViews()) + .commentSwitch(event.getCommentSwitch()) .build(); } diff --git a/main-service/src/main/java/ru/practicum/events/event/service/EventPrivateService.java b/main-service/src/main/java/ru/practicum/events/event/service/EventPrivateService.java index e7fa4bf..c117fdf 100644 --- a/main-service/src/main/java/ru/practicum/events/event/service/EventPrivateService.java +++ b/main-service/src/main/java/ru/practicum/events/event/service/EventPrivateService.java @@ -1,9 +1,6 @@ package ru.practicum.events.event.service; -import ru.practicum.events.event.dto.EventFullDto; -import ru.practicum.events.event.dto.EventShortDto; -import ru.practicum.events.event.dto.NewEventDto; -import ru.practicum.events.event.dto.UpdateEventRequest; +import ru.practicum.events.event.dto.*; import ru.practicum.events.request.dto.EventRequestStatusUpdateRequest; import ru.practicum.events.request.dto.EventRequestStatusUpdateResult; import ru.practicum.events.request.dto.RequestDto; @@ -25,5 +22,5 @@ EventRequestStatusUpdateResult updateRequestStatus(Long userId, Long eventId, EventRequestStatusUpdateRequest updateRequest); - void enableComment(Long userId, Long eventId, Boolean cutout); + EventFullDto enableComment(Long userId, Long eventId, Boolean disable); } diff --git a/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java b/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java index 50fdac9..fd9b13d 100644 --- a/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java +++ b/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java @@ -2,10 +2,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; -import ru.practicum.events.event.dto.EventFullDto; -import ru.practicum.events.event.dto.EventShortDto; -import ru.practicum.events.event.dto.NewEventDto; -import ru.practicum.events.event.dto.UpdateEventRequest; +import ru.practicum.events.event.dto.*; import ru.practicum.events.event.mapper.EventMapper; import ru.practicum.events.event.model.Event; import ru.practicum.events.event.model.EventState; @@ -150,14 +147,14 @@ public EventRequestStatusUpdateResult updateRequestStatus(Long userId, } @Override - public void enableComment(Long userId, Long eventId, Boolean cutout) { + public EventFullDto enableComment(Long userId, Long eventId, Boolean disable) { User user = objectCreator.getUserById(userId); Event event = objectCreator.getEventById(eventId); - if (event.getInitiator().equals(user)){ + if (!event.getInitiator().equals(user)){ throw new BadRequestException("Включать и выключать коментарии может только инициализатор события"); } - event.setCommentSwitch(cutout); - eventRepository.save(event); + event.setCommentSwitch(disable); + return toEventFullDto(eventRepository.save(event)); } private EventRequestStatusUpdateResult getUpdateResultConfirmed(List requests, Event event) { From 6b79c5e33b5995459630293f4cb6e58f07b5317d Mon Sep 17 00:00:00 2001 From: Oksana Date: Sun, 12 Mar 2023 01:29:14 +0300 Subject: [PATCH 04/12] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D0=B0=20Postman=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- postman/feature.json | 1922 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1922 insertions(+) create mode 100644 postman/feature.json diff --git a/postman/feature.json b/postman/feature.json new file mode 100644 index 0000000..6ede96c --- /dev/null +++ b/postman/feature.json @@ -0,0 +1,1922 @@ +{ + "info": { + "_postman_id": "03d1335b-c8f7-47ae-932a-f045f280625b", + "name": "Test Explore With Me - future comments", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "23645999" + }, + "item": [ + { + "name": "Коректные запросы", + "item": [ + { + "name": "Оценка", + "item": [ + { + "name": "Поставить положительную оценку", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id)\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id)\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id)\r", + "} catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 201\", function () {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "const commId = pm.collectionVariables.get('cid');\r", + "\r", + "let body\r", + "const req = {\r", + " url: \"http://localhost:8080/comment?eventId=\" + pm.collectionVariables.get(\"eid\"),\r", + " method: \"GET\",\r", + " body: body == null ? \"\" : JSON.stringify(body),\r", + " header: { \"Content-Type\": \"application/json\" },\r", + " };\r", + "pm.sendRequest(req, (error, response) => {\r", + " pm.test(\"Рейтинг должен быть польжительный\", function(){\r", + " pm.expect(response.json()[0]).to.have.property('rating');\r", + " pm.expect(response.json()[0].rating).equals(1);\r", + " });\r", + " ;\r", + "}) " + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId/like?grade=true", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId", + "like" + ], + "query": [ + { + "key": "grade", + "value": "true" + } + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Поставить отрицательную оценку", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id)\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id)\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id)\r", + "} catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 201\", function () {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "const commId = pm.collectionVariables.get('cid');\r", + "\r", + "let body\r", + "const req = {\r", + " url: \"http://localhost:8080/comment?eventId=\" + pm.collectionVariables.get(\"eid\"),\r", + " method: \"GET\",\r", + " body: body == null ? \"\" : JSON.stringify(body),\r", + " header: { \"Content-Type\": \"application/json\" },\r", + " };\r", + "pm.sendRequest(req, (error, response) => {\r", + " pm.test(\"Рейтинг должен быть отрицательный\", function(){\r", + " pm.expect(response.json()[0]).to.have.property('rating');\r", + " pm.expect(response.json()[0].rating).equals(-1);\r", + " });\r", + " ;\r", + "}) " + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId/like?grade=false", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId", + "like" + ], + "query": [ + { + "key": "grade", + "value": "false" + } + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Удалить польжительную оцеку", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id);\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id);\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id);\r", + " await api.addLike(user.id, comment.id);\r", + " const foundedComment = await api.findComments(event.id);\r", + " pm.collectionVariables.set('response', foundedComment); \r", + "} catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 204 и данные в формате json\", function () {\r", + " pm.response.to.have.status(204);\r", + "});\r", + "\r", + "const source = pm.collectionVariables.get('response');\r", + "const commentId = pm.collectionVariables.get('cid');\r", + "\r", + "pm.test(\"Рейтин должен быть положительным до выполнения запроса\", function(){\r", + " pm.expect(source.length).to.eql(1);\r", + " pm.expect(source[0].id).to.eql(commentId);\r", + " pm.expect(source[0].rating).to.eql(1);\r", + "});\r", + "\r", + "let body\r", + "const req = {\r", + " url: \"http://localhost:8080/comment?eventId=\" + pm.collectionVariables.get(\"eid\"),\r", + " method: \"GET\",\r", + " body: body == null ? \"\" : JSON.stringify(body),\r", + " header: { \"Content-Type\": \"application/json\" },\r", + " };\r", + "pm.sendRequest(req, (error, response) => {\r", + " pm.test(\"После удаления рейтинг должен отсутствовать\", function(){\r", + " pm.expect(response.json()[0]).to.have.property('rating');\r", + " pm.expect(response.json()[0].rating).equals(0);\r", + " });\r", + " ;\r", + "}) \r", + "\r", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId/like", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId", + "like" + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Удалить отрицательную оцеку", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id);\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id);\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id);\r", + " await api.addDislike(user.id, comment.id);\r", + " const foundedComment = await api.findComments(event.id);\r", + " pm.collectionVariables.set('response', foundedComment); \r", + "} catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 204 и данные в формате json\", function () {\r", + " pm.response.to.have.status(204);\r", + "});\r", + "\r", + "const source = pm.collectionVariables.get('response');\r", + "const commentId = pm.collectionVariables.get('cid');\r", + "\r", + "pm.test(\"Рейтин должен быть отрицательным до выполнения запроса\", function(){\r", + " pm.expect(source.length).to.eql(1);\r", + " pm.expect(source[0].id).to.eql(commentId);\r", + " pm.expect(source[0].rating).to.eql(-1);\r", + "});\r", + "\r", + "let body\r", + "const req = {\r", + " url: \"http://localhost:8080/comment?eventId=\" + pm.collectionVariables.get(\"eid\"),\r", + " method: \"GET\",\r", + " body: body == null ? \"\" : JSON.stringify(body),\r", + " header: { \"Content-Type\": \"application/json\" },\r", + " };\r", + "pm.sendRequest(req, (error, response) => {\r", + " pm.test(\"После удаления рейтинг должен отсутствовать\", function(){\r", + " pm.expect(response.json()[0]).to.have.property('rating');\r", + " pm.expect(response.json()[0].rating).equals(0);\r", + " });\r", + " ;\r", + "}) \r", + "\r", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId/like", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId", + "like" + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Добавление комментария", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " let comment;\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id)\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " comment = rnd.getComment(event.id);\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: JSON.stringify(comment),\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r", + " pm.response.to.have.status(201); \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});\r", + "\r", + "const source = JSON.parse(pm.request.body.raw);\r", + "const target = pm.response.json();\r", + "\r", + "pm.test(\"Комментарий должен содержать поля: id, commentator, text, category, commentTime\", function () {\r", + " pm.expect(target).to.have.property('id');\r", + " pm.expect(target).to.have.property('commentator');\r", + " pm.expect(target).to.have.property('text');\r", + " pm.expect(target).to.have.property('commentTime');\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{{request_body}}" + }, + "url": { + "raw": "{{baseUrl}}/users/:userId/comments", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments" + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}", + "description": "(Required) id текущего пользователя" + } + ] + } + }, + "response": [] + }, + { + "name": "Изменить комментарий", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + " const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id)\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " let comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " let comment2 = rnd.getComment(event.id);\r", + " pm.collectionVariables.set('response', comment2);\r", + " pm.collectionVariables.set(\"cid\", comment.id)\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: comment2,\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", + " pm.response.to.be.ok; \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});\r", + "\r", + "const source = pm.collectionVariables.get('response');\r", + "const target = pm.response.json();\r", + "console.log(source)\r", + "console.log(target)\r", + "\r", + "pm.test(\"Комментарий должен содержать поля: id, commentator, text, commentTime\", function () {\r", + "pm.expect(target).to.have.property('id');\r", + "pm.expect(target).to.have.property('commentator');\r", + "pm.expect(target).to.have.property('text');\r", + "pm.expect(target).to.have.property('commentTime');\r", + "});\r", + "\r", + "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r", + " pm.expect(source.text).equal(target.text, 'Текст комментария должен соответствовать искомому событию');\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PATCH", + "header": [], + "body": { + "mode": "raw", + "raw": "{{request_body}}" + }, + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId" + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Удалить комментарий", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + " const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id);\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id);\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id)\r", + " const foundedComment = await api.findComments(event.id);\r", + " pm.collectionVariables.set('response', foundedComment); \r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 204\", function () {\r", + " pm.response.to.have.status(204);\r", + "});\r", + "const source = pm.collectionVariables.get('response');\r", + "const commentId = pm.collectionVariables.get('cid');\r", + "\r", + "pm.test(\"Комментарий должен быть найден до выполнения запроса\", function(){\r", + " pm.expect(source.length).to.eql(1);\r", + " pm.expect(source[0].id).to.eql(commentId);\r", + "});\r", + "\r", + "let body\r", + "const req = {\r", + " url: \"http://localhost:8080/comment?eventId=\" + pm.collectionVariables.get(\"eid\"),\r", + " method: \"GET\",\r", + " body: body == null ? \"\" : JSON.stringify(body),\r", + " header: { \"Content-Type\": \"application/json\" },\r", + " };\r", + "pm.sendRequest(req, (error, response) => {\r", + " pm.test(\"Комментарий должен быть удалён после выполнения запроса\", function(){\r", + " pm.expect(response.json().length).to.eql(0);\r", + " });\r", + "}) " + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId" + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Получение списка комментариев события сортировка по дате", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " const user2 = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id);\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id);\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " const comment2 = await api.addComment(user2.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id);\r", + " await api.addLike(user.id, comment.id);\r", + " await api.addLike(user2.id, comment.id);\r", + " await api.addDislike(user.id, comment2.id);\r", + "} catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", + " pm.response.to.be.ok; \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});\r", + "\r", + "const target = pm.response.json();\r", + "\r", + "\r", + "pm.test(\"Коментарии должны содержать поля: id, commentator, text, commentTime, rating\", function () {\r", + " pm.expect(target[0]).to.have.all.keys('id', 'commentator', 'text', 'commentTime', 'rating');\r", + " pm.expect(target[1]).to.have.all.keys('id', 'commentator', 'text', 'commentTime', 'rating');\r", + "});\r", + "\r", + "\r", + "\r", + "pm.test(\"В теле ответа должна соблюдаться сортировка по убыванию времени\", function(){\r", + " pm.expect(new Date(target[0].commentTime)).to.be.above(new Date(target[1].commentTime));\r", + "});\r", + "\r", + "\r", + "pm.test(\"Проверка соответствия рейтинга\", function(){\r", + " pm.expect(target[0].rating).equal(-1);\r", + " pm.expect(target[1].rating).equal(2);\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/comment?rating=false&from=0&size=1000&eventId={{eid}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "comment" + ], + "query": [ + { + "key": "rating", + "value": "false" + }, + { + "key": "from", + "value": "0" + }, + { + "key": "size", + "value": "1000" + }, + { + "key": "eventId", + "value": "{{eid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Получение списка комментариев комметарии отключены", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " const user2 = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id);\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id);\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " const comment2 = await api.addComment(user2.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id);\r", + " await api.addLike(user.id, comment.id);\r", + " await api.addLike(user2.id, comment.id);\r", + " await api.addDislike(user.id, comment2.id);\r", + " await api.disableComments(user.id, event.id);\r", + "} catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", + " pm.response.to.be.ok; \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});\r", + "\r", + "const target = pm.response.json();\r", + "\r", + "\r", + "pm.test(\"Список должен быть пуст\", function () {\r", + " pm.expect(target).to.be.empty;\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/comment?rating=true&from=0&size=1000&eventId={{eid}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "comment" + ], + "query": [ + { + "key": "rating", + "value": "true" + }, + { + "key": "from", + "value": "0" + }, + { + "key": "size", + "value": "1000" + }, + { + "key": "eventId", + "value": "{{eid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Получение списка комментариев события сортировка по рейтингу", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " const user2 = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id);\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id);\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " const comment2 = await api.addComment(user2.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id);\r", + " await api.addLike(user.id, comment.id);\r", + " await api.addLike(user2.id, comment.id);\r", + " await api.addDislike(user.id, comment2.id);\r", + "} catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", + " pm.response.to.be.ok; \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});\r", + "\r", + "const target = pm.response.json();\r", + "\r", + "\r", + "pm.test(\"Коментарии должны содержать поля: id, commentator, text, commentTime, rating\", function () {\r", + " pm.expect(target[0]).to.have.all.keys('id', 'commentator', 'text', 'commentTime', 'rating');\r", + " pm.expect(target[1]).to.have.all.keys('id', 'commentator', 'text', 'commentTime', 'rating');\r", + "});\r", + "\r", + "\r", + "\r", + "pm.test(\"В теле ответа должна соблюдаться сортировка по рейтинга\", function(){\r", + " pm.expect(new Date(target[0].commentTime)).to.be.below(new Date(target[1].commentTime));\r", + "});\r", + "\r", + "\r", + "pm.test(\"Проверка соответствия рейтинга\", function(){\r", + " pm.expect(target[0].rating).equal(2);\r", + " pm.expect(target[1].rating).equal(-1);\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/comment?rating=true&from=0&size=1000&eventId={{eid}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "comment" + ], + "query": [ + { + "key": "rating", + "value": "true" + }, + { + "key": "from", + "value": "0" + }, + { + "key": "size", + "value": "1000" + }, + { + "key": "eventId", + "value": "{{eid}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Некорректные запросы", + "item": [ + { + "name": "Изменить комментарий не коментатором", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + " const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " const user2 = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id)\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " let comment = await api.addComment(user2.id, rnd.getComment(event.id));\r", + " let comment2 = rnd.getComment(event.id);\r", + " pm.collectionVariables.set(\"cid\", comment.id)\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: comment2,\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r", + " pm.response.to.be.badRequest; \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});\r", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PATCH", + "header": [], + "body": { + "mode": "raw", + "raw": "{{request_body}}" + }, + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId" + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Добавить при отключенных комметариях", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " let comment;\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id)\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " event = await api.disableComments(user.id, event.id);\r", + " comment = rnd.getComment(event.id);\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: JSON.stringify(comment),\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r", + " pm.response.to.have.status(409);\r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{{request_body}}", + "options": { + "raw": { + "language": "text" + } + } + }, + "url": { + "raw": "{{baseUrl}}/users/:userId/comments", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments" + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Изменить комментарий непринадлижащего событию", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + " const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id)\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " const event2 = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " let comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " let comment2 = rnd.getComment(event2.id);\r", + " pm.collectionVariables.set(\"cid\", comment.id)\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: comment2,\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r", + " pm.response.to.be.badRequest; \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PATCH", + "header": [], + "body": { + "mode": "raw", + "raw": "{{request_body}}" + }, + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId" + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Не коментатор удаляет коментатор", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + " const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " const user2 = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user2.id)\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id)\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id)\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r", + " pm.response.to.have.status(400);\r", + "});\r", + " " + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId" + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Удалить оцеку другого пользователя", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " const user2 = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id);\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id);\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id);\r", + " await api.addLike(user2.id, comment.id);\r", + "} catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r", + " pm.response.to.have.status(400);\r", + "});\r", + " \r", + "\r", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId/like", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId", + "like" + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Повтор оценки", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " try {\r", + " const user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"uid\", user.id)\r", + " const category = await api.addCategory(rnd.getCategory());\r", + " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", + " pm.collectionVariables.set(\"eid\", event.id)\r", + " const comment = await api.addComment(user.id, rnd.getComment(event.id));\r", + " pm.collectionVariables.set(\"cid\", comment.id)\r", + " await api.addLike(user.id,comment.id);\r", + "} catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " // выполняем наш скрипт\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 409\", function () {\r", + " pm.response.to.have.status(409);\r", + "});\r", + " " + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{baseUrl}}/users/:userId/comments/:commId/like?grade=true", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":userId", + "comments", + ":commId", + "like" + ], + "query": [ + { + "key": "grade", + "value": "true" + } + ], + "variable": [ + { + "key": "userId", + "value": "{{uid}}" + }, + { + "key": "commId", + "value": "{{cid}}" + } + ] + } + }, + "response": [] + } + ] + } + ], + "auth": { + "type": "edgegrid" + }, + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "API = class {", + " constructor(postman, verbose = false, baseUrl = \"http://localhost:8080\") {", + " this.baseUrl = baseUrl;", + " this.pm = postman;", + " this._verbose = verbose;", + " }", + "", + " async addUser(user, verbose=null) {", + " return this.post(\"/admin/users\", user, \"Ошибка при добавлении нового пользователя: \", verbose);", + " }", + "", + " async addCategory(category, verbose=null) {", + " return this.post(\"/admin/categories\", category, \"Ошибка при добавлении новой категории: \", verbose);", + " }", + "", + " async addEvent(userId, event, verbose=null) {", + " return this.post(\"/users/\" + userId + \"/events\", event, \"Ошибка при добавлении нового события: \", verbose);", + " }", + "", + " async addCompilation(compilation, verbose=null) {", + " return this.post(\"/admin/compilations\", compilation, \"Ошибка при добавлении новой подборки: \", verbose);", + " }", + "", + " async addComment(userId, comment, verbose=null) {", + " return this.post(\"/users/\" + userId + \"/comments\", comment, \"Ошибка при добавлении нового коментария: \", verbose)", + " }", + "", + " async addLike(userId, commId, verbose=null) {", + " return this.post(\"/users/\" + userId + \"/comments/\" + commId+ \"/like?grade=true\", null,\"Ошибка при добавлении лайка: \", verbose )", + " }", + "", + " async addDislike(userId, commId, verbose=null){", + " return this.post(\"/users/\" + userId + \"/comments/\" + commId + \"/like?grade=false\", null,\"Ошибка при добавлении дизлайка: \", verbose )", + " }", + "", + " async publishParticipationRequest(eventId, userId, verbose=null) {", + " return this.post('/users/' + userId + '/requests?eventId=' + eventId, null, \"Ошибка при добавлении нового запроса на участие в событии\", verbose);", + " }", + "", + " async publishEvent(eventId, verbose=null) {", + " return this.patch('/admin/events/' + eventId, {stateAction: \"PUBLISH_EVENT\"}, \"Ошибка при публикации события\", verbose);", + " }", + "", + " async disableComments(userId, eventId, verbose=null) {", + " return this.patch('/users/' + userId + '/events/' + eventId + '/comment', null, \"Ошибка при отключении комментариев\", verbose);", + " }", + " ", + " async rejectEvent(eventId, verbose=null) {", + " return this.patch('/admin/events/' + eventId, {stateAction: \"REJECT_EVENT\"}, \"Ошибка при отмене события\", verbose);", + " }", + "", + " async acceptParticipationRequest(eventId, userId, reqId, verbose=null) {", + " return this.patch('/users/' + userId + '/events/' + eventId + '/requests/', {requestIds:[reqId], status: \"CONFIRMED\"}, \"Ошибка при принятии заявки на участие в событии\", verbose);", + " }", + "", + " async findCategory(catId, verbose=null) {", + " return this.get('/categories/' + catId, null, \"Ошибка при поиске категории по id\", verbose);", + " }", + "", + " async findComments(eventId, verbose=null) {", + " return this.get('/comment?eventId=' + eventId, null, \"Ошибка при поиске комментария по id события\", verbose);", + " }", + "", + " async findCompilation(compId, verbose=null) {", + " return this.get('/compilations/' + compId, null, \"Ошибка при поиске подборки по id\", verbose);", + " }", + "", + " async findUser(userId, verbose=null) {", + " return this.get('/admin/users?ids=' + userId, null, \"Ошибка при поиске пользователя по id\", verbose);", + " }", + "", + " async post(path, body, errorText = \"Ошибка при выполнении post-запроса: \", verbose=null) {", + " return this.sendRequest(\"POST\", path, body, errorText, verbose);", + " }", + "", + " async patch(path, body = null, errorText = \"Ошибка при выполнении patch-запроса: \", verbose=null) {", + " return this.sendRequest(\"PATCH\", path, body, errorText, verbose);", + " }", + "", + " async get(path, body = null, errorText = \"Ошибка при выполнении get-запроса: \", verbose=null) {", + " return this.sendRequest(\"GET\", path, body, errorText, verbose);", + " }", + " async sendRequest(method, path, body=null, errorText = \"Ошибка при выполнении запроса: \", verbose=null) {", + " return new Promise((resolve, reject) => {", + " verbose = verbose == null ? this._verbose : verbose;", + "", + " const request = {", + " url: this.baseUrl + path,", + " method: method,", + " body: body == null ? \"\" : JSON.stringify(body),", + " header: { \"Content-Type\": \"application/json\" },", + " };", + "", + " if(verbose) {", + " console.log(\"Отправляю запрос: \", request);", + " }", + "", + " try {", + " this.pm.sendRequest(request, (error, response) => {", + " if(error || (response.code >= 400 && response.code <= 599)) {", + " let err = error ? error : JSON.stringify(response.json());", + " console.error(\"При выполнении запроса к серверу возникла ошика.\\n\", err,", + " \"\\nДля отладки проблемы повторите такой же запрос к вашей программе \" + ", + " \"на локальном компьютере. Данные запроса:\\n\", JSON.stringify(request));", + "", + " reject(new Error(errorText + err));", + " }", + "", + " if(verbose) {", + " console.log(\"Результат обработки запроса: код состояния - \", response.code, \", тело: \", response.json());", + " }", + " resolve(response.json());", + " });", + " } catch(err) {", + " if(verbose) {", + " console.error(errorText, err);", + " }", + " return Promise.reject(err);", + " }", + " });", + " }", + "};", + "", + "RandomUtils = class {", + " constructor() {}", + "", + " getUser() {", + " return {", + " name: pm.variables.replaceIn('{{$randomFullName}}'),", + " email: pm.variables.replaceIn('{{$randomEmail}}')", + " };", + " }", + "", + " getCategory() {", + " return {", + " name: pm.variables.replaceIn('{{$randomWord}}') + Math.floor(Math.random() * 100).toString()", + " };", + " }", + "", + " getEvent(categoryId) {", + " return {", + " annotation: pm.variables.replaceIn('{{$randomLoremParagraph}}'),", + " category: categoryId,", + " description: pm.variables.replaceIn('{{$randomLoremParagraphs}}'),", + " eventDate: this.getFutureDateTime(),", + " location: {", + " lat: parseFloat(pm.variables.replaceIn('{{$randomLatitude}}')),", + " lon: parseFloat(pm.variables.replaceIn('{{$randomLongitude}}')),", + " },", + " paid: pm.variables.replaceIn('{{$randomBoolean}}'),", + " participantLimit: pm.variables.replaceIn('{{$randomInt}}'),", + " requestModeration: pm.variables.replaceIn('{{$randomBoolean}}'),", + " title: pm.variables.replaceIn('{{$randomLoremSentence}}'),", + " }", + " }", + "", + " getComment(eventId) {", + " return {", + " text: pm.variables.replaceIn('{{$randomLoremSentence}}'),", + " eventId: eventId,", + " }", + " }", + "", + " getFutureDateTime(hourShift = 5, minuteShift=0, yearShift=0) {", + " let moment = require('moment');", + "", + " let m = moment();", + " m.add(hourShift, 'hour');", + " m.add(minuteShift, 'minute');", + " m.add(yearShift, 'year');", + "", + " return m.format('YYYY-MM-DD HH:mm:ss');", + " }", + "}" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "baseUrl", + "value": "http://localhost:8080", + "type": "string" + }, + { + "key": "request_body", + "value": "", + "type": "string" + }, + { + "key": "uid", + "value": "1", + "type": "string" + }, + { + "key": "eid", + "value": "" + }, + { + "key": "response", + "value": "" + }, + { + "key": "cid", + "value": "1" + } + ] +} \ No newline at end of file From a550ce9acb84cf08fb56079f95c0307371c5f6ca Mon Sep 17 00:00:00 2001 From: Oksana Date: Sun, 12 Mar 2023 01:31:10 +0300 Subject: [PATCH 05/12] =?UTF-8?q?Style:=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=D0=B0=20=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../events/event/controller/ControllerEventPrivate.java | 5 ++++- .../events/event/service/impl/EventPrivateServiceImp.java | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java b/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java index 9e906af..22c919e 100644 --- a/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java +++ b/main-service/src/main/java/ru/practicum/events/event/controller/ControllerEventPrivate.java @@ -4,7 +4,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; -import ru.practicum.events.event.dto.*; +import ru.practicum.events.event.dto.EventFullDto; +import ru.practicum.events.event.dto.EventShortDto; +import ru.practicum.events.event.dto.NewEventDto; +import ru.practicum.events.event.dto.UpdateEventRequest; import ru.practicum.events.event.service.EventPrivateService; import ru.practicum.events.request.dto.EventRequestStatusUpdateRequest; import ru.practicum.events.request.dto.EventRequestStatusUpdateResult; diff --git a/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java b/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java index fd9b13d..ec277af 100644 --- a/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java +++ b/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java @@ -2,7 +2,10 @@ import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; -import ru.practicum.events.event.dto.*; +import ru.practicum.events.event.dto.EventFullDto; +import ru.practicum.events.event.dto.EventShortDto; +import ru.practicum.events.event.dto.NewEventDto; +import ru.practicum.events.event.dto.UpdateEventRequest; import ru.practicum.events.event.mapper.EventMapper; import ru.practicum.events.event.model.Event; import ru.practicum.events.event.model.EventState; From a31c02d9aead988af9a1d9718f85b6d4d0931d7d Mon Sep 17 00:00:00 2001 From: Oksana Date: Sun, 12 Mar 2023 01:40:45 +0300 Subject: [PATCH 06/12] =?UTF-8?q?Style:=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=D0=B0=20=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../events/comments/rating/storage/RatingRepository.java | 2 ++ .../events/comments/service/CommentPrivateServiceImpl.java | 2 +- .../events/comments/service/CommentPublicServiceImpl.java | 2 +- .../events/event/service/impl/EventPrivateServiceImp.java | 4 ++-- .../main/java/ru/practicum/util/RepositoryObjectCreator.java | 1 + 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/main-service/src/main/java/ru/practicum/events/comments/rating/storage/RatingRepository.java b/main-service/src/main/java/ru/practicum/events/comments/rating/storage/RatingRepository.java index 28f8c57..16c86f4 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/rating/storage/RatingRepository.java +++ b/main-service/src/main/java/ru/practicum/events/comments/rating/storage/RatingRepository.java @@ -7,6 +7,8 @@ public interface RatingRepository extends JpaRepository { Long countGradeByCommentAndGrade(Comment comment, Boolean grade); + Boolean existsByCommentAndRater(Comment comment, User rater); + void deleteByCommentAndRater(Comment comment, User user); } diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java index 61448d0..8872208 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java @@ -36,7 +36,7 @@ public CommentPrivateServiceImpl(CommentRepository commentRepository, @Override public CommentDto createComment(Long userId, NewAndUpdateCommentDto dto) { Event event = objectCreator.getEventById(dto.getEventId()); - if (!event.getCommentSwitch()){ + if (!event.getCommentSwitch()) { throw new ConflictException("Невозможно добавить комментарий! У события отключены комментарии!"); } return CommentMapper.toDto(commentRepository.save(CommentMapper.toComment( diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java index c16dfdb..8db1e40 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java @@ -42,7 +42,7 @@ public List getCommentByEvent(Long eventId, Boolean rating, int from return new ArrayList<>(); } Sort sort1 = Sort.by(DESC, "commentTime"); - List comments =commentRepository + List comments = commentRepository .findByEvent(event, PageRequest.of(from, size, sort1)); Stream commentDtoStream = comments .stream() diff --git a/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java b/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java index ec277af..96a8053 100644 --- a/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java +++ b/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java @@ -59,7 +59,7 @@ public List getEventsByUser(Long userId, Integer from, Integer si @Override public EventFullDto addNewEvent(Long userId, NewEventDto newEventDto) { CheckTime.checkTemporaryValidation(newEventDto.getEventDate(), LocalDateTime.now(), 2); - Event event =toEvent(newEventDto, + Event event = toEvent(newEventDto, objectCreator.getUserById(userId), objectCreator.getCategoryById(newEventDto.getCategory()), 0L, 0L); event.setCommentSwitch(true); @@ -153,7 +153,7 @@ public EventRequestStatusUpdateResult updateRequestStatus(Long userId, public EventFullDto enableComment(Long userId, Long eventId, Boolean disable) { User user = objectCreator.getUserById(userId); Event event = objectCreator.getEventById(eventId); - if (!event.getInitiator().equals(user)){ + if (!event.getInitiator().equals(user)) { throw new BadRequestException("Включать и выключать коментарии может только инициализатор события"); } event.setCommentSwitch(disable); diff --git a/main-service/src/main/java/ru/practicum/util/RepositoryObjectCreator.java b/main-service/src/main/java/ru/practicum/util/RepositoryObjectCreator.java index 5d73edc..489e3cc 100644 --- a/main-service/src/main/java/ru/practicum/util/RepositoryObjectCreator.java +++ b/main-service/src/main/java/ru/practicum/util/RepositoryObjectCreator.java @@ -69,6 +69,7 @@ public Comment getCommentById(Long commId) { return commentRepository.findById(commId) .orElseThrow(() -> new NotFoundException(getMassage("Комментарий", commId))); } + public Boolean isRelatedCategory(Long id) { return eventRepository.existsByCategory(getCategoryById(id)); } From b49f3c328e1d13cff54c0e2758432fe9b88dcc53 Mon Sep 17 00:00:00 2001 From: SugarFoxy <106406397+SugarFoxy@users.noreply.github.com> Date: Sun, 12 Mar 2023 01:46:05 +0300 Subject: [PATCH 07/12] =?UTF-8?q?=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=83=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 18a246e..c55d4f6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # java-explore-with-me Template repository for ExploreWithMe project. +--- +https://github.com/SugarFoxy/java-explore-with-me/pull/3 From 0a07c55f402ee51b2a2c24fa32d6e6e79ecf1018 Mon Sep 17 00:00:00 2001 From: Oksana Date: Sun, 12 Mar 2023 12:25:35 +0300 Subject: [PATCH 08/12] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ControllerPrivateComment.java | 20 +++++----- .../controller/ControllerPublicComment.java | 10 ++--- ...teCommentDto.java => InputCommentDto.java} | 2 +- .../{CommentDto.java => OutCommentDto.java} | 2 +- .../events/comments/mapper/CommentMapper.java | 14 +++---- .../events/comments/model/Comment.java | 1 + .../service/CommentPrivateService.java | 14 +++---- .../service/CommentPrivateServiceImpl.java | 37 +++++++++---------- .../service/CommentPublicService.java | 4 +- .../service/CommentPublicServiceImpl.java | 12 +++--- main-service/src/main/resources/schema.sql | 8 ++-- 11 files changed, 60 insertions(+), 64 deletions(-) rename main-service/src/main/java/ru/practicum/events/comments/dto/{NewAndUpdateCommentDto.java => InputCommentDto.java} (88%) rename main-service/src/main/java/ru/practicum/events/comments/dto/{CommentDto.java => OutCommentDto.java} (92%) diff --git a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java index 2dc305d..8d684f0 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java +++ b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java @@ -3,8 +3,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; -import ru.practicum.events.comments.dto.CommentDto; -import ru.practicum.events.comments.dto.NewAndUpdateCommentDto; +import ru.practicum.events.comments.dto.InputCommentDto; +import ru.practicum.events.comments.dto.OutCommentDto; import ru.practicum.events.comments.service.CommentPrivateService; import ru.practicum.util.exception.handler.CustomExceptionHandler; @@ -21,15 +21,15 @@ public ControllerPrivateComment(CommentPrivateService service) { @PostMapping @ResponseStatus(HttpStatus.CREATED) - public CommentDto createComment(@PathVariable Long userId, - @RequestBody NewAndUpdateCommentDto dto) { + public OutCommentDto createComment(@PathVariable Long userId, + @RequestBody InputCommentDto dto) { return service.createComment(userId, dto); } @PatchMapping("/{commId}") - public CommentDto updateComment(@PathVariable Long userId, - @PathVariable Long commId, - @RequestBody NewAndUpdateCommentDto dto) { + public OutCommentDto updateComment(@PathVariable Long userId, + @PathVariable Long commId, + @RequestBody InputCommentDto dto) { return service.updateComment(userId, commId, dto); } @@ -42,9 +42,9 @@ public void deleteComment(@PathVariable Long userId, @PostMapping("/{commId}/like") @ResponseStatus(HttpStatus.CREATED) - public CommentDto leaveRating(@PathVariable Long userId, - @PathVariable Long commId, - @RequestParam Boolean grade) { + public OutCommentDto leaveRating(@PathVariable Long userId, + @PathVariable Long commId, + @RequestParam Boolean grade) { return service.leaveRating(userId, commId, grade); } diff --git a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java index 52a51b4..0d805f8 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java +++ b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java @@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import ru.practicum.events.comments.dto.CommentDto; +import ru.practicum.events.comments.dto.OutCommentDto; import ru.practicum.events.comments.service.CommentPublicService; import ru.practicum.util.exception.handler.CustomExceptionHandler; @@ -26,10 +26,10 @@ public ControllerPublicComment(CommentPublicService service) { } @GetMapping - public List getCommentByEvent(@NotNull @RequestParam Long eventId, - @RequestParam(defaultValue = "false") Boolean rating, - @PositiveOrZero @RequestParam(defaultValue = "0") int from, - @Positive @RequestParam(defaultValue = "10") int size) { + public List getCommentByEvent(@NotNull @RequestParam Long eventId, + @RequestParam(defaultValue = "false") Boolean rating, + @PositiveOrZero @RequestParam(defaultValue = "0") int from, + @Positive @RequestParam(defaultValue = "10") int size) { return service.getCommentByEvent(eventId, rating, from, size); } } diff --git a/main-service/src/main/java/ru/practicum/events/comments/dto/NewAndUpdateCommentDto.java b/main-service/src/main/java/ru/practicum/events/comments/dto/InputCommentDto.java similarity index 88% rename from main-service/src/main/java/ru/practicum/events/comments/dto/NewAndUpdateCommentDto.java rename to main-service/src/main/java/ru/practicum/events/comments/dto/InputCommentDto.java index 0d2a2ed..17b90a4 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/dto/NewAndUpdateCommentDto.java +++ b/main-service/src/main/java/ru/practicum/events/comments/dto/InputCommentDto.java @@ -10,7 +10,7 @@ @NoArgsConstructor @AllArgsConstructor @Builder -public class NewAndUpdateCommentDto { +public class InputCommentDto { @NotNull @NotBlank private String text; diff --git a/main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java b/main-service/src/main/java/ru/practicum/events/comments/dto/OutCommentDto.java similarity index 92% rename from main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java rename to main-service/src/main/java/ru/practicum/events/comments/dto/OutCommentDto.java index 3c16f72..b768bdd 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/dto/CommentDto.java +++ b/main-service/src/main/java/ru/practicum/events/comments/dto/OutCommentDto.java @@ -10,7 +10,7 @@ @AllArgsConstructor @NoArgsConstructor @Builder -public class CommentDto { +public class OutCommentDto { private Long id; private UserShortDto commentator; private String text; diff --git a/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java b/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java index f130ff5..c076382 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java +++ b/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java @@ -1,7 +1,7 @@ package ru.practicum.events.comments.mapper; -import ru.practicum.events.comments.dto.CommentDto; -import ru.practicum.events.comments.dto.NewAndUpdateCommentDto; +import ru.practicum.events.comments.dto.InputCommentDto; +import ru.practicum.events.comments.dto.OutCommentDto; import ru.practicum.events.comments.model.Comment; import ru.practicum.events.event.model.Event; import ru.practicum.users.mapper.UserMapper; @@ -10,8 +10,8 @@ import java.time.LocalDateTime; public class CommentMapper { - public static CommentDto toDto(Comment comment) { - return CommentDto.builder() + public static OutCommentDto toDto(Comment comment) { + return OutCommentDto.builder() .commentator(UserMapper.toShortDto(comment.getCommentator())) .commentTime(comment.getCommentTime()) .id(comment.getId()) @@ -19,8 +19,8 @@ public static CommentDto toDto(Comment comment) { .build(); } - public static CommentDto toDto(Comment comment, Long rating) { - return CommentDto.builder() + public static OutCommentDto toDto(Comment comment, Long rating) { + return OutCommentDto.builder() .commentator(UserMapper.toShortDto(comment.getCommentator())) .commentTime(comment.getCommentTime()) .id(comment.getId()) @@ -29,7 +29,7 @@ public static CommentDto toDto(Comment comment, Long rating) { .build(); } - public static Comment toComment(NewAndUpdateCommentDto dto, LocalDateTime time, User commentator, Event event) { + public static Comment toComment(InputCommentDto dto, LocalDateTime time, User commentator, Event event) { return Comment.builder() .commentator(commentator) .text(dto.getText()) diff --git a/main-service/src/main/java/ru/practicum/events/comments/model/Comment.java b/main-service/src/main/java/ru/practicum/events/comments/model/Comment.java index df364c4..a7f222d 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/model/Comment.java +++ b/main-service/src/main/java/ru/practicum/events/comments/model/Comment.java @@ -18,6 +18,7 @@ public class Comment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "comment_text") private String text; @ManyToOne() @JoinColumn(name = "user_id") diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java index c1a1c9a..9f047be 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java @@ -1,16 +1,16 @@ package ru.practicum.events.comments.service; -import ru.practicum.events.comments.dto.CommentDto; -import ru.practicum.events.comments.dto.NewAndUpdateCommentDto; +import ru.practicum.events.comments.dto.InputCommentDto; +import ru.practicum.events.comments.dto.OutCommentDto; public interface CommentPrivateService { - CommentDto createComment(Long userId, NewAndUpdateCommentDto dto); + OutCommentDto createComment(Long userId, InputCommentDto dto); - CommentDto updateComment(Long userId, Long commId, NewAndUpdateCommentDto dto); + OutCommentDto updateComment(Long userId, Long commentId, InputCommentDto dto); - void deleteComment(Long userId, Long commId); + void deleteComment(Long userId, Long commentId); - CommentDto leaveRating(Long userId, Long commId, Boolean grade); + OutCommentDto leaveRating(Long userId, Long commentId, Boolean grade); - void deleteRating(Long userId, Long commId); + void deleteRating(Long userId, Long commentId); } diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java index 8872208..3b36029 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java @@ -3,8 +3,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import ru.practicum.events.comments.dto.CommentDto; -import ru.practicum.events.comments.dto.NewAndUpdateCommentDto; +import ru.practicum.events.comments.dto.InputCommentDto; +import ru.practicum.events.comments.dto.OutCommentDto; import ru.practicum.events.comments.mapper.CommentMapper; import ru.practicum.events.comments.model.Comment; import ru.practicum.events.comments.rating.model.Grade; @@ -34,7 +34,7 @@ public CommentPrivateServiceImpl(CommentRepository commentRepository, } @Override - public CommentDto createComment(Long userId, NewAndUpdateCommentDto dto) { + public OutCommentDto createComment(Long userId, InputCommentDto dto) { Event event = objectCreator.getEventById(dto.getEventId()); if (!event.getCommentSwitch()) { throw new ConflictException("Невозможно добавить комментарий! У события отключены комментарии!"); @@ -48,18 +48,16 @@ public CommentDto createComment(Long userId, NewAndUpdateCommentDto dto) { } @Override - public CommentDto updateComment(Long userId, Long commId, NewAndUpdateCommentDto dto) { - Comment comment = objectCreator.getCommentById(commId); - User user = objectCreator.getUserById(userId); - Event event = objectCreator.getEventById(dto.getEventId()); + public OutCommentDto updateComment(Long userId, Long commentId, InputCommentDto dto) { + Comment comment = objectCreator.getCommentById(commentId); - if (!comment.getCommentator().equals(user)) { + if (!comment.getCommentator().getId().equals(userId)) { throw new BadRequestException(String - .format("Только комментатор id = %d может изменить коментарий id = %d ", userId, commId)); + .format("Только комментатор может изменить коментарий id = %d ", commentId)); } - if (!comment.getEvent().equals(event)) { + if (!comment.getEvent().getId().equals(dto.getEventId())) { throw new BadRequestException(String - .format("У события id = %d отсутствует коментарий id = %d", userId, commId)); + .format("У события id = %d отсутствует коментарий id = %d", userId, commentId)); } comment.setText(dto.getText()); @@ -69,9 +67,8 @@ public CommentDto updateComment(Long userId, Long commId, NewAndUpdateCommentDto @Override public void deleteComment(Long userId, Long commId) { Comment comment = objectCreator.getCommentById(commId); - User user = objectCreator.getUserById(userId); - if (!comment.getCommentator().equals(user)) { + if (!comment.getCommentator().getId().equals(userId)) { throw new BadRequestException(String .format("Только комментатор может удалить коментарий id = %d ", commId)); } @@ -79,29 +76,29 @@ public void deleteComment(Long userId, Long commId) { } @Override - public CommentDto leaveRating(Long userId, Long commId, Boolean grade) { + public OutCommentDto leaveRating(Long userId, Long commentId, Boolean grade) { if (ratingRepository - .existsByCommentAndRater(objectCreator.getCommentById(commId), objectCreator.getUserById(userId))) { + .existsByCommentAndRater(objectCreator.getCommentById(commentId), objectCreator.getUserById(userId))) { throw new ConflictException("Отавить оценку комментарию можно один раз"); } ratingRepository.save(Grade.builder() - .comment(objectCreator.getCommentById(commId)) + .comment(objectCreator.getCommentById(commentId)) .rater(objectCreator.getUserById(userId)) .grade(grade) .build()); - Comment comment = objectCreator.getCommentById(commId); + Comment comment = objectCreator.getCommentById(commentId); return CommentMapper.toDto(comment, ratingRepository.countGradeByCommentAndGrade(comment, true) - ratingRepository.countGradeByCommentAndGrade(comment, false)); } @Override @Transactional - public void deleteRating(Long userId, Long commId) { - Comment comment = objectCreator.getCommentById(commId); + public void deleteRating(Long userId, Long commentId) { + Comment comment = objectCreator.getCommentById(commentId); User user = objectCreator.getUserById(userId); if (!ratingRepository.existsByCommentAndRater(comment, user)) { throw new BadRequestException(String.format("Невозможно удалеть лайк! " + - "Пользователь id = %d не ставил оценку комментарию id = %d", userId, commId)); + "Пользователь id = %d не ставил оценку комментарию id = %d", userId, commentId)); } ratingRepository .deleteByCommentAndRater(comment, user); diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicService.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicService.java index b5cedce..14ce1bc 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicService.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicService.java @@ -1,9 +1,9 @@ package ru.practicum.events.comments.service; -import ru.practicum.events.comments.dto.CommentDto; +import ru.practicum.events.comments.dto.OutCommentDto; import java.util.List; public interface CommentPublicService { - List getCommentByEvent(Long eventId, Boolean rating, int from, int size); + List getCommentByEvent(Long eventId, Boolean rating, int from, int size); } diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java index 8db1e40..eca4d98 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java @@ -4,7 +4,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; -import ru.practicum.events.comments.dto.CommentDto; +import ru.practicum.events.comments.dto.OutCommentDto; import ru.practicum.events.comments.mapper.CommentMapper; import ru.practicum.events.comments.model.Comment; import ru.practicum.events.comments.rating.storage.RatingRepository; @@ -36,22 +36,22 @@ public CommentPublicServiceImpl(CommentRepository commentRepository, } @Override - public List getCommentByEvent(Long eventId, Boolean rating, int from, int size) { + public List getCommentByEvent(Long eventId, Boolean rating, int from, int size) { Event event = objectCreator.getEventById(eventId); if (!event.getCommentSwitch()) { return new ArrayList<>(); } - Sort sort1 = Sort.by(DESC, "commentTime"); + Sort sort = Sort.by(DESC, "commentTime"); List comments = commentRepository - .findByEvent(event, PageRequest.of(from, size, sort1)); - Stream commentDtoStream = comments + .findByEvent(event, PageRequest.of(from, size, sort)); + Stream commentDtoStream = comments .stream() .map(comment -> CommentMapper .toDto(comment, ratingRepository.countGradeByCommentAndGrade(comment, true) - ratingRepository.countGradeByCommentAndGrade(comment, false))); if (rating) { - commentDtoStream = commentDtoStream.sorted(Comparator.comparingLong(CommentDto::getRating).reversed()); + commentDtoStream = commentDtoStream.sorted(Comparator.comparingLong(OutCommentDto::getRating).reversed()); } return commentDtoStream.collect(Collectors.toList()); } diff --git a/main-service/src/main/resources/schema.sql b/main-service/src/main/resources/schema.sql index 7ec574f..7d6894e 100644 --- a/main-service/src/main/resources/schema.sql +++ b/main-service/src/main/resources/schema.sql @@ -1,5 +1,3 @@ -DROP TABLE IF EXISTS rating, comments, compilation_events,compilations,requests,events,categories,users; - CREATE TABLE IF NOT EXISTS users ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, @@ -36,7 +34,7 @@ CREATE TABLE IF NOT EXISTS events state VARCHAR, title VARCHAR(255) NOT NULL, views BIGINT, - comment_switch BOOLEAN, + comment_switch BOOLEAN NOT NULL, CONSTRAINT pk_events PRIMARY KEY (id), FOREIGN KEY (initiator_id) REFERENCES users (id) ON DELETE CASCADE, @@ -76,10 +74,10 @@ CREATE TABLE IF NOT EXISTS compilation_events CREATE TABLE IF NOT EXISTS comments ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - text VARCHAR(2000) NOT NULL, + comment_text VARCHAR(2000) NOT NULL, user_id BIGINT NOT NULL, event_id BIGINT NOT NULL, - comment_time TIMESTAMP WITHOUT TIME ZONE, + comment_time TIMESTAMP WITHOUT TIME ZONE NOT NULL, CONSTRAINT pk_comments PRIMARY KEY (id), FOREIGN KEY (event_id) REFERENCES events (id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE From d04c6ae369d68abadc02e72beeca6c8d02eb59b7 Mon Sep 17 00:00:00 2001 From: Oksana Date: Sun, 12 Mar 2023 13:19:19 +0300 Subject: [PATCH 09/12] =?UTF-8?q?fix:=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/ru/practicum/events/event/mapper/EventMapper.java | 2 ++ main-service/src/main/resources/schema.sql | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java b/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java index 392f392..ed2f8ec 100644 --- a/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java +++ b/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java @@ -115,6 +115,7 @@ public static Event toEvent(Event event, UpdateEventRequest eventRequest, Catego eventRequest.getTitle() : event.getTitle()) .views(event.getViews()) + .commentSwitch(event.getCommentSwitch()) .build(); } @@ -136,6 +137,7 @@ public static Event toEvent(EventFullDto eventDto, User initiator) { .state(eventDto.getState()) .title(eventDto.getTitle()) .views(eventDto.getViews()) + .commentSwitch(eventDto.getCommentSwitch()) .build(); } } diff --git a/main-service/src/main/resources/schema.sql b/main-service/src/main/resources/schema.sql index 7d6894e..4d211f9 100644 --- a/main-service/src/main/resources/schema.sql +++ b/main-service/src/main/resources/schema.sql @@ -34,7 +34,7 @@ CREATE TABLE IF NOT EXISTS events state VARCHAR, title VARCHAR(255) NOT NULL, views BIGINT, - comment_switch BOOLEAN NOT NULL, + comment_switch BOOLEAN NOT NULL DEFAULT TRUE, CONSTRAINT pk_events PRIMARY KEY (id), FOREIGN KEY (initiator_id) REFERENCES users (id) ON DELETE CASCADE, From 58a1e153fe63deb5fec723b821428a4fc7a96d56 Mon Sep 17 00:00:00 2001 From: Oksana Date: Sun, 12 Mar 2023 13:32:38 +0300 Subject: [PATCH 10/12] =?UTF-8?q?fix:=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c55d4f6..88e2636 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ # java-explore-with-me Template repository for ExploreWithMe project. --- -https://github.com/SugarFoxy/java-explore-with-me/pull/3 +https://github.com/SugarFoxy/java-explore-with-me/pull/3 From 744020338c121ef633c7892a6fae66530aed7bfa Mon Sep 17 00:00:00 2001 From: Oksana Date: Mon, 13 Mar 2023 22:05:19 +0300 Subject: [PATCH 11/12] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practicum/category/dto/CategoryDto.java | 2 - .../category/dto/NewCategoryDto.java | 1 - .../category/mapper/CategoryMapper.java | 4 +- .../controller/ControllerPrivateComment.java | 30 ++++---- .../controller/ControllerPublicComment.java | 4 +- ...InputCommentDto.java => InCommentDto.java} | 3 +- .../events/comments/dto/OutCommentDto.java | 2 - .../events/comments/mapper/CommentMapper.java | 8 +- .../service/CommentPrivateService.java | 6 +- .../service/CommentPrivateServiceImpl.java | 8 +- .../service/CommentPublicServiceImpl.java | 2 +- .../ControllerPublicCompilation.java | 4 +- .../compilation/dto/CompilationDto.java | 2 - .../compilation/dto/NewCompilationDto.java | 1 - .../dto/UpdateCompilationRequest.java | 1 - .../compilation/mapper/CompilationMapper.java | 4 +- .../events/event/dto/EventFullDto.java | 4 +- .../events/event/dto/EventShortDto.java | 17 +---- .../events/event/dto/NewEventDto.java | 1 - .../events/event/dto/UpdateEventRequest.java | 1 - .../events/event/mapper/EventMapper.java | 10 ++- .../practicum/events/event/model/Event.java | 2 +- .../service/impl/EventPrivateServiceImp.java | 4 +- .../dto/EventRequestStatusUpdateRequest.java | 1 - .../dto/EventRequestStatusUpdateResult.java | 2 - .../events/request/dto/RequestDto.java | 2 - .../events/request/mapper/RequestMapper.java | 4 +- .../users/controller/UserController.java | 2 +- .../ru/practicum/users/mapper/UserMapper.java | 4 +- postman/feature.json | 74 +++++++++---------- 30 files changed, 96 insertions(+), 114 deletions(-) rename main-service/src/main/java/ru/practicum/events/comments/dto/{InputCommentDto.java => InCommentDto.java} (87%) diff --git a/main-service/src/main/java/ru/practicum/category/dto/CategoryDto.java b/main-service/src/main/java/ru/practicum/category/dto/CategoryDto.java index 2a0f27b..05fb041 100644 --- a/main-service/src/main/java/ru/practicum/category/dto/CategoryDto.java +++ b/main-service/src/main/java/ru/practicum/category/dto/CategoryDto.java @@ -7,8 +7,6 @@ @Setter @Getter -@AllArgsConstructor -@NoArgsConstructor @Builder public class CategoryDto { private Long id; diff --git a/main-service/src/main/java/ru/practicum/category/dto/NewCategoryDto.java b/main-service/src/main/java/ru/practicum/category/dto/NewCategoryDto.java index 364e2d0..6447a91 100644 --- a/main-service/src/main/java/ru/practicum/category/dto/NewCategoryDto.java +++ b/main-service/src/main/java/ru/practicum/category/dto/NewCategoryDto.java @@ -9,7 +9,6 @@ @Getter @AllArgsConstructor @NoArgsConstructor -@Builder public class NewCategoryDto { @NotNull(message = "Название категории не может быть пустым") @NotBlank(message = "Название категории не может быть пустым") diff --git a/main-service/src/main/java/ru/practicum/category/mapper/CategoryMapper.java b/main-service/src/main/java/ru/practicum/category/mapper/CategoryMapper.java index 2f8cb81..069e086 100644 --- a/main-service/src/main/java/ru/practicum/category/mapper/CategoryMapper.java +++ b/main-service/src/main/java/ru/practicum/category/mapper/CategoryMapper.java @@ -4,7 +4,9 @@ import ru.practicum.category.dto.NewCategoryDto; import ru.practicum.category.model.Category; -public class CategoryMapper { +public final class CategoryMapper { + private CategoryMapper(){} + public static Category toCategory(NewCategoryDto dto) { return Category.builder() .name(dto.getName()) diff --git a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java index 8d684f0..a2050d3 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java +++ b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPrivateComment.java @@ -3,7 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; -import ru.practicum.events.comments.dto.InputCommentDto; +import ru.practicum.events.comments.dto.InCommentDto; import ru.practicum.events.comments.dto.OutCommentDto; import ru.practicum.events.comments.service.CommentPrivateService; import ru.practicum.util.exception.handler.CustomExceptionHandler; @@ -22,36 +22,36 @@ public ControllerPrivateComment(CommentPrivateService service) { @PostMapping @ResponseStatus(HttpStatus.CREATED) public OutCommentDto createComment(@PathVariable Long userId, - @RequestBody InputCommentDto dto) { + @RequestBody InCommentDto dto) { return service.createComment(userId, dto); } - @PatchMapping("/{commId}") + @PatchMapping("/{commentId}") public OutCommentDto updateComment(@PathVariable Long userId, - @PathVariable Long commId, - @RequestBody InputCommentDto dto) { - return service.updateComment(userId, commId, dto); + @PathVariable Long commentId, + @RequestBody InCommentDto dto) { + return service.updateComment(userId, commentId, dto); } - @DeleteMapping("/{commId}") + @DeleteMapping("/{commentId}") @ResponseStatus(HttpStatus.NO_CONTENT) public void deleteComment(@PathVariable Long userId, - @PathVariable Long commId) { - service.deleteComment(userId, commId); + @PathVariable Long commentId) { + service.deleteComment(userId, commentId); } - @PostMapping("/{commId}/like") + @PostMapping("/{commentId}/like") @ResponseStatus(HttpStatus.CREATED) public OutCommentDto leaveRating(@PathVariable Long userId, - @PathVariable Long commId, + @PathVariable Long commentId, @RequestParam Boolean grade) { - return service.leaveRating(userId, commId, grade); + return service.leaveRating(userId, commentId, grade); } - @DeleteMapping("/{commId}/like") + @DeleteMapping("/{commentId}/like") @ResponseStatus(HttpStatus.NO_CONTENT) public void deleteRating(@PathVariable Long userId, - @PathVariable Long commId) { - service.deleteRating(userId, commId); + @PathVariable Long commentId) { + service.deleteRating(userId, commentId); } } diff --git a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java index 0d805f8..ba27960 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java +++ b/main-service/src/main/java/ru/practicum/events/comments/controller/ControllerPublicComment.java @@ -28,8 +28,8 @@ public ControllerPublicComment(CommentPublicService service) { @GetMapping public List getCommentByEvent(@NotNull @RequestParam Long eventId, @RequestParam(defaultValue = "false") Boolean rating, - @PositiveOrZero @RequestParam(defaultValue = "0") int from, - @Positive @RequestParam(defaultValue = "10") int size) { + @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "10") Integer size) { return service.getCommentByEvent(eventId, rating, from, size); } } diff --git a/main-service/src/main/java/ru/practicum/events/comments/dto/InputCommentDto.java b/main-service/src/main/java/ru/practicum/events/comments/dto/InCommentDto.java similarity index 87% rename from main-service/src/main/java/ru/practicum/events/comments/dto/InputCommentDto.java rename to main-service/src/main/java/ru/practicum/events/comments/dto/InCommentDto.java index 17b90a4..dacc62f 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/dto/InputCommentDto.java +++ b/main-service/src/main/java/ru/practicum/events/comments/dto/InCommentDto.java @@ -9,8 +9,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -@Builder -public class InputCommentDto { +public class InCommentDto { @NotNull @NotBlank private String text; diff --git a/main-service/src/main/java/ru/practicum/events/comments/dto/OutCommentDto.java b/main-service/src/main/java/ru/practicum/events/comments/dto/OutCommentDto.java index b768bdd..1d4aec6 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/dto/OutCommentDto.java +++ b/main-service/src/main/java/ru/practicum/events/comments/dto/OutCommentDto.java @@ -7,8 +7,6 @@ @Setter @Getter -@AllArgsConstructor -@NoArgsConstructor @Builder public class OutCommentDto { private Long id; diff --git a/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java b/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java index c076382..119d608 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java +++ b/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java @@ -1,6 +1,6 @@ package ru.practicum.events.comments.mapper; -import ru.practicum.events.comments.dto.InputCommentDto; +import ru.practicum.events.comments.dto.InCommentDto; import ru.practicum.events.comments.dto.OutCommentDto; import ru.practicum.events.comments.model.Comment; import ru.practicum.events.event.model.Event; @@ -9,7 +9,9 @@ import java.time.LocalDateTime; -public class CommentMapper { +public final class CommentMapper { + private CommentMapper(){} + public static OutCommentDto toDto(Comment comment) { return OutCommentDto.builder() .commentator(UserMapper.toShortDto(comment.getCommentator())) @@ -29,7 +31,7 @@ public static OutCommentDto toDto(Comment comment, Long rating) { .build(); } - public static Comment toComment(InputCommentDto dto, LocalDateTime time, User commentator, Event event) { + public static Comment toComment(InCommentDto dto, LocalDateTime time, User commentator, Event event) { return Comment.builder() .commentator(commentator) .text(dto.getText()) diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java index 9f047be..8c0457b 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateService.java @@ -1,12 +1,12 @@ package ru.practicum.events.comments.service; -import ru.practicum.events.comments.dto.InputCommentDto; +import ru.practicum.events.comments.dto.InCommentDto; import ru.practicum.events.comments.dto.OutCommentDto; public interface CommentPrivateService { - OutCommentDto createComment(Long userId, InputCommentDto dto); + OutCommentDto createComment(Long userId, InCommentDto dto); - OutCommentDto updateComment(Long userId, Long commentId, InputCommentDto dto); + OutCommentDto updateComment(Long userId, Long commentId, InCommentDto dto); void deleteComment(Long userId, Long commentId); diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java index 3b36029..15340b8 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPrivateServiceImpl.java @@ -3,7 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import ru.practicum.events.comments.dto.InputCommentDto; +import ru.practicum.events.comments.dto.InCommentDto; import ru.practicum.events.comments.dto.OutCommentDto; import ru.practicum.events.comments.mapper.CommentMapper; import ru.practicum.events.comments.model.Comment; @@ -34,9 +34,9 @@ public CommentPrivateServiceImpl(CommentRepository commentRepository, } @Override - public OutCommentDto createComment(Long userId, InputCommentDto dto) { + public OutCommentDto createComment(Long userId, InCommentDto dto) { Event event = objectCreator.getEventById(dto.getEventId()); - if (!event.getCommentSwitch()) { + if (!event.getCommentAvailable()) { throw new ConflictException("Невозможно добавить комментарий! У события отключены комментарии!"); } return CommentMapper.toDto(commentRepository.save(CommentMapper.toComment( @@ -48,7 +48,7 @@ public OutCommentDto createComment(Long userId, InputCommentDto dto) { } @Override - public OutCommentDto updateComment(Long userId, Long commentId, InputCommentDto dto) { + public OutCommentDto updateComment(Long userId, Long commentId, InCommentDto dto) { Comment comment = objectCreator.getCommentById(commentId); if (!comment.getCommentator().getId().equals(userId)) { diff --git a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java index eca4d98..7a7a84b 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java +++ b/main-service/src/main/java/ru/practicum/events/comments/service/CommentPublicServiceImpl.java @@ -38,7 +38,7 @@ public CommentPublicServiceImpl(CommentRepository commentRepository, @Override public List getCommentByEvent(Long eventId, Boolean rating, int from, int size) { Event event = objectCreator.getEventById(eventId); - if (!event.getCommentSwitch()) { + if (!event.getCommentAvailable()) { return new ArrayList<>(); } Sort sort = Sort.by(DESC, "commentTime"); diff --git a/main-service/src/main/java/ru/practicum/events/compilation/controller/ControllerPublicCompilation.java b/main-service/src/main/java/ru/practicum/events/compilation/controller/ControllerPublicCompilation.java index 9b84cbf..c3c333b 100644 --- a/main-service/src/main/java/ru/practicum/events/compilation/controller/ControllerPublicCompilation.java +++ b/main-service/src/main/java/ru/practicum/events/compilation/controller/ControllerPublicCompilation.java @@ -23,8 +23,8 @@ public ControllerPublicCompilation(CompilationPublicService service) { @GetMapping public List getAllCompilations(@RequestParam(required = false) Boolean pinned, - @RequestParam(defaultValue = "0") int from, - @RequestParam(defaultValue = "10") int size) { + @RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "10") Integer size) { log.info("Получен запрос на получение подборок событий"); return service.getAllCompilations(pinned, from, size); } diff --git a/main-service/src/main/java/ru/practicum/events/compilation/dto/CompilationDto.java b/main-service/src/main/java/ru/practicum/events/compilation/dto/CompilationDto.java index 4a9c1c2..04dab08 100644 --- a/main-service/src/main/java/ru/practicum/events/compilation/dto/CompilationDto.java +++ b/main-service/src/main/java/ru/practicum/events/compilation/dto/CompilationDto.java @@ -7,8 +7,6 @@ @Setter @Getter -@NoArgsConstructor -@AllArgsConstructor @Builder public class CompilationDto { private Long id; diff --git a/main-service/src/main/java/ru/practicum/events/compilation/dto/NewCompilationDto.java b/main-service/src/main/java/ru/practicum/events/compilation/dto/NewCompilationDto.java index b8373a1..a8472fd 100644 --- a/main-service/src/main/java/ru/practicum/events/compilation/dto/NewCompilationDto.java +++ b/main-service/src/main/java/ru/practicum/events/compilation/dto/NewCompilationDto.java @@ -9,7 +9,6 @@ @Getter @AllArgsConstructor @NoArgsConstructor -@Builder public class NewCompilationDto { private List events; @NotNull(message = "pinned не может быть пустым") diff --git a/main-service/src/main/java/ru/practicum/events/compilation/dto/UpdateCompilationRequest.java b/main-service/src/main/java/ru/practicum/events/compilation/dto/UpdateCompilationRequest.java index f8f9771..04d3d9d 100644 --- a/main-service/src/main/java/ru/practicum/events/compilation/dto/UpdateCompilationRequest.java +++ b/main-service/src/main/java/ru/practicum/events/compilation/dto/UpdateCompilationRequest.java @@ -8,7 +8,6 @@ @Getter @AllArgsConstructor @NoArgsConstructor -@Builder public class UpdateCompilationRequest { private List events; private Boolean pinned; diff --git a/main-service/src/main/java/ru/practicum/events/compilation/mapper/CompilationMapper.java b/main-service/src/main/java/ru/practicum/events/compilation/mapper/CompilationMapper.java index 832b97d..3c57f81 100644 --- a/main-service/src/main/java/ru/practicum/events/compilation/mapper/CompilationMapper.java +++ b/main-service/src/main/java/ru/practicum/events/compilation/mapper/CompilationMapper.java @@ -10,7 +10,9 @@ import java.util.List; import java.util.stream.Collectors; -public class CompilationMapper { +public final class CompilationMapper { + private CompilationMapper(){} + public static Compilation toCompilation(NewCompilationDto compilationDto, List collect) { return Compilation.builder() .events(new HashSet<>(collect)) diff --git a/main-service/src/main/java/ru/practicum/events/event/dto/EventFullDto.java b/main-service/src/main/java/ru/practicum/events/event/dto/EventFullDto.java index 9dcd1e1..5433c29 100644 --- a/main-service/src/main/java/ru/practicum/events/event/dto/EventFullDto.java +++ b/main-service/src/main/java/ru/practicum/events/event/dto/EventFullDto.java @@ -12,8 +12,6 @@ @Setter @Getter @Builder -@NoArgsConstructor -@AllArgsConstructor public class EventFullDto { private Long id; private String annotation; @@ -34,5 +32,5 @@ public class EventFullDto { private EventState state; private String title; private Long views; - private Boolean commentSwitch; + private Boolean commentAvailable; } diff --git a/main-service/src/main/java/ru/practicum/events/event/dto/EventShortDto.java b/main-service/src/main/java/ru/practicum/events/event/dto/EventShortDto.java index 9cdaac5..c1f4e24 100644 --- a/main-service/src/main/java/ru/practicum/events/event/dto/EventShortDto.java +++ b/main-service/src/main/java/ru/practicum/events/event/dto/EventShortDto.java @@ -1,37 +1,26 @@ package ru.practicum.events.event.dto; import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.*; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; import ru.practicum.category.dto.CategoryDto; import ru.practicum.users.dto.UserShortDto; -import javax.validation.constraints.Future; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @Setter @Getter @Builder -@NoArgsConstructor -@AllArgsConstructor public class EventShortDto { private Long id; - @NotNull(message = "annotation не должно быть пустым") - @NotBlank(message = "annotation не должно быть пустым") private String annotation; - @NotNull(message = "category не должно быть пустым") private CategoryDto category; private Long confirmedRequests; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") - @Future() private LocalDateTime eventDate; - @NotNull(message = "initiator не должно быть пустым") private UserShortDto initiator; - @NotNull(message = "paid не должно быть пустым") private Boolean paid; - @NotNull(message = "title не должно быть пустым") - @NotBlank(message = "title не должно быть пустым") private String title; private Long views; } diff --git a/main-service/src/main/java/ru/practicum/events/event/dto/NewEventDto.java b/main-service/src/main/java/ru/practicum/events/event/dto/NewEventDto.java index bab074f..630b603 100644 --- a/main-service/src/main/java/ru/practicum/events/event/dto/NewEventDto.java +++ b/main-service/src/main/java/ru/practicum/events/event/dto/NewEventDto.java @@ -11,7 +11,6 @@ @Setter @Getter -@Builder @AllArgsConstructor @NoArgsConstructor public class NewEventDto { diff --git a/main-service/src/main/java/ru/practicum/events/event/dto/UpdateEventRequest.java b/main-service/src/main/java/ru/practicum/events/event/dto/UpdateEventRequest.java index a3c68b3..6ecd28d 100644 --- a/main-service/src/main/java/ru/practicum/events/event/dto/UpdateEventRequest.java +++ b/main-service/src/main/java/ru/practicum/events/event/dto/UpdateEventRequest.java @@ -13,7 +13,6 @@ @Setter @Getter -@Builder @NoArgsConstructor @AllArgsConstructor public class UpdateEventRequest { diff --git a/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java b/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java index ed2f8ec..cd59181 100644 --- a/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java +++ b/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java @@ -14,7 +14,9 @@ import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -public class EventMapper { +public final class EventMapper { + private EventMapper(){} + public static EventShortDto toShortDto(Event event) { return EventShortDto.builder() .id(event.getId()) @@ -75,7 +77,7 @@ public static EventFullDto toEventFullDto(Event event) { .state(event.getState()) .title(event.getTitle()) .views(event.getViews()) - .commentSwitch(event.getCommentSwitch()) + .commentAvailable(event.getCommentAvailable()) .build(); } @@ -115,7 +117,7 @@ public static Event toEvent(Event event, UpdateEventRequest eventRequest, Catego eventRequest.getTitle() : event.getTitle()) .views(event.getViews()) - .commentSwitch(event.getCommentSwitch()) + .commentAvailable(event.getCommentAvailable()) .build(); } @@ -137,7 +139,7 @@ public static Event toEvent(EventFullDto eventDto, User initiator) { .state(eventDto.getState()) .title(eventDto.getTitle()) .views(eventDto.getViews()) - .commentSwitch(eventDto.getCommentSwitch()) + .commentAvailable(eventDto.getCommentAvailable()) .build(); } } diff --git a/main-service/src/main/java/ru/practicum/events/event/model/Event.java b/main-service/src/main/java/ru/practicum/events/event/model/Event.java index 4e4024f..88ac831 100644 --- a/main-service/src/main/java/ru/practicum/events/event/model/Event.java +++ b/main-service/src/main/java/ru/practicum/events/event/model/Event.java @@ -46,5 +46,5 @@ public class Event { private String title; private Long views; @Column(name = "comment_switch") - private Boolean commentSwitch; + private Boolean commentAvailable; } diff --git a/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java b/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java index 96a8053..eba1f76 100644 --- a/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java +++ b/main-service/src/main/java/ru/practicum/events/event/service/impl/EventPrivateServiceImp.java @@ -62,7 +62,7 @@ public EventFullDto addNewEvent(Long userId, NewEventDto newEventDto) { Event event = toEvent(newEventDto, objectCreator.getUserById(userId), objectCreator.getCategoryById(newEventDto.getCategory()), 0L, 0L); - event.setCommentSwitch(true); + event.setCommentAvailable(true); return toEventFullDto(eventRepository.save(event)); } @@ -156,7 +156,7 @@ public EventFullDto enableComment(Long userId, Long eventId, Boolean disable) { if (!event.getInitiator().equals(user)) { throw new BadRequestException("Включать и выключать коментарии может только инициализатор события"); } - event.setCommentSwitch(disable); + event.setCommentAvailable(disable); return toEventFullDto(eventRepository.save(event)); } diff --git a/main-service/src/main/java/ru/practicum/events/request/dto/EventRequestStatusUpdateRequest.java b/main-service/src/main/java/ru/practicum/events/request/dto/EventRequestStatusUpdateRequest.java index af012ec..250abc1 100644 --- a/main-service/src/main/java/ru/practicum/events/request/dto/EventRequestStatusUpdateRequest.java +++ b/main-service/src/main/java/ru/practicum/events/request/dto/EventRequestStatusUpdateRequest.java @@ -9,7 +9,6 @@ @Getter @AllArgsConstructor @NoArgsConstructor -@Builder public class EventRequestStatusUpdateRequest { List requestIds; RequestStatus status; diff --git a/main-service/src/main/java/ru/practicum/events/request/dto/EventRequestStatusUpdateResult.java b/main-service/src/main/java/ru/practicum/events/request/dto/EventRequestStatusUpdateResult.java index 6371f4e..bf6d87f 100644 --- a/main-service/src/main/java/ru/practicum/events/request/dto/EventRequestStatusUpdateResult.java +++ b/main-service/src/main/java/ru/practicum/events/request/dto/EventRequestStatusUpdateResult.java @@ -7,8 +7,6 @@ @Setter @Getter @Builder -@NoArgsConstructor -@AllArgsConstructor public class EventRequestStatusUpdateResult { private List confirmedRequests; private List rejectedRequests; diff --git a/main-service/src/main/java/ru/practicum/events/request/dto/RequestDto.java b/main-service/src/main/java/ru/practicum/events/request/dto/RequestDto.java index 8e8d7ad..7b88712 100644 --- a/main-service/src/main/java/ru/practicum/events/request/dto/RequestDto.java +++ b/main-service/src/main/java/ru/practicum/events/request/dto/RequestDto.java @@ -5,8 +5,6 @@ @Setter @Getter -@AllArgsConstructor -@NoArgsConstructor @Builder public class RequestDto { private String created; diff --git a/main-service/src/main/java/ru/practicum/events/request/mapper/RequestMapper.java b/main-service/src/main/java/ru/practicum/events/request/mapper/RequestMapper.java index 5b79a7c..53f2418 100644 --- a/main-service/src/main/java/ru/practicum/events/request/mapper/RequestMapper.java +++ b/main-service/src/main/java/ru/practicum/events/request/mapper/RequestMapper.java @@ -5,7 +5,9 @@ import java.time.format.DateTimeFormatter; -public class RequestMapper { +public final class RequestMapper { + private RequestMapper(){} + public static RequestDto toDto(Request request) { return RequestDto.builder() .id(request.getId()) diff --git a/main-service/src/main/java/ru/practicum/users/controller/UserController.java b/main-service/src/main/java/ru/practicum/users/controller/UserController.java index f64a878..12aaa22 100644 --- a/main-service/src/main/java/ru/practicum/users/controller/UserController.java +++ b/main-service/src/main/java/ru/practicum/users/controller/UserController.java @@ -35,7 +35,7 @@ public UserDto createUser(@Valid @RequestBody UserCreateDto dto) { @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.NO_CONTENT) - public void deleteUser(@PathVariable long id) { + public void deleteUser(@PathVariable Long id) { log.info("Получен запрос на удаление пользователя id = {}",id); service.deleteUser(id); } diff --git a/main-service/src/main/java/ru/practicum/users/mapper/UserMapper.java b/main-service/src/main/java/ru/practicum/users/mapper/UserMapper.java index edd0034..f752b1a 100644 --- a/main-service/src/main/java/ru/practicum/users/mapper/UserMapper.java +++ b/main-service/src/main/java/ru/practicum/users/mapper/UserMapper.java @@ -5,7 +5,9 @@ import ru.practicum.users.dto.UserShortDto; import ru.practicum.users.model.User; -public class UserMapper { +public final class UserMapper { + private UserMapper(){} + public static User toUser(UserCreateDto dto) { return User.builder() .name(dto.getName()) diff --git a/postman/feature.json b/postman/feature.json index 6ede96c..03887aa 100644 --- a/postman/feature.json +++ b/postman/feature.json @@ -87,7 +87,7 @@ "method": "POST", "header": [], "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId/like?grade=true", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId/like?grade=true", "host": [ "{{baseUrl}}" ], @@ -95,7 +95,7 @@ "users", ":userId", "comments", - ":commId", + ":commentId", "like" ], "query": [ @@ -110,7 +110,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -193,7 +193,7 @@ "method": "POST", "header": [], "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId/like?grade=false", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId/like?grade=false", "host": [ "{{baseUrl}}" ], @@ -201,7 +201,7 @@ "users", ":userId", "comments", - ":commId", + ":commentId", "like" ], "query": [ @@ -216,7 +216,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -312,7 +312,7 @@ "method": "DELETE", "header": [], "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId/like", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId/like", "host": [ "{{baseUrl}}" ], @@ -320,7 +320,7 @@ "users", ":userId", "comments", - ":commId", + ":commentId", "like" ], "variable": [ @@ -329,7 +329,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -425,7 +425,7 @@ "method": "DELETE", "header": [], "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId/like", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId/like", "host": [ "{{baseUrl}}" ], @@ -433,7 +433,7 @@ "users", ":userId", "comments", - ":commId", + ":commentId", "like" ], "variable": [ @@ -442,7 +442,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -650,7 +650,7 @@ "raw": "{{request_body}}" }, "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId", "host": [ "{{baseUrl}}" ], @@ -658,7 +658,7 @@ "users", ":userId", "comments", - ":commId" + ":commentId" ], "variable": [ { @@ -666,7 +666,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -760,7 +760,7 @@ "raw": "" }, "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId", "host": [ "{{baseUrl}}" ], @@ -768,7 +768,7 @@ "users", ":userId", "comments", - ":commId" + ":commentId" ], "variable": [ { @@ -776,7 +776,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -1195,7 +1195,7 @@ "raw": "{{request_body}}" }, "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId", "host": [ "{{baseUrl}}" ], @@ -1203,7 +1203,7 @@ "users", ":userId", "comments", - ":commId" + ":commentId" ], "variable": [ { @@ -1211,7 +1211,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -1396,7 +1396,7 @@ "raw": "{{request_body}}" }, "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId", "host": [ "{{baseUrl}}" ], @@ -1404,7 +1404,7 @@ "users", ":userId", "comments", - ":commId" + ":commentId" ], "variable": [ { @@ -1412,7 +1412,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -1486,7 +1486,7 @@ "raw": "" }, "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId", "host": [ "{{baseUrl}}" ], @@ -1494,7 +1494,7 @@ "users", ":userId", "comments", - ":commId" + ":commentId" ], "variable": [ { @@ -1502,7 +1502,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -1574,7 +1574,7 @@ "method": "DELETE", "header": [], "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId/like", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId/like", "host": [ "{{baseUrl}}" ], @@ -1582,7 +1582,7 @@ "users", ":userId", "comments", - ":commId", + ":commentId", "like" ], "variable": [ @@ -1591,7 +1591,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -1660,7 +1660,7 @@ "method": "POST", "header": [], "url": { - "raw": "{{baseUrl}}/users/:userId/comments/:commId/like?grade=true", + "raw": "{{baseUrl}}/users/:userId/comments/:commentId/like?grade=true", "host": [ "{{baseUrl}}" ], @@ -1668,7 +1668,7 @@ "users", ":userId", "comments", - ":commId", + ":commentId", "like" ], "query": [ @@ -1683,7 +1683,7 @@ "value": "{{uid}}" }, { - "key": "commId", + "key": "commentId", "value": "{{cid}}" } ] @@ -1730,12 +1730,12 @@ " return this.post(\"/users/\" + userId + \"/comments\", comment, \"Ошибка при добавлении нового коментария: \", verbose)", " }", "", - " async addLike(userId, commId, verbose=null) {", - " return this.post(\"/users/\" + userId + \"/comments/\" + commId+ \"/like?grade=true\", null,\"Ошибка при добавлении лайка: \", verbose )", + " async addLike(userId, commentId, verbose=null) {", + " return this.post(\"/users/\" + userId + \"/comments/\" + commentId+ \"/like?grade=true\", null,\"Ошибка при добавлении лайка: \", verbose )", " }", "", - " async addDislike(userId, commId, verbose=null){", - " return this.post(\"/users/\" + userId + \"/comments/\" + commId + \"/like?grade=false\", null,\"Ошибка при добавлении дизлайка: \", verbose )", + " async addDislike(userId, commentId, verbose=null){", + " return this.post(\"/users/\" + userId + \"/comments/\" + commentId + \"/like?grade=false\", null,\"Ошибка при добавлении дизлайка: \", verbose )", " }", "", " async publishParticipationRequest(eventId, userId, verbose=null) {", From 3208b6ee385b880fa506ae6fe0ac72a65a9c7774 Mon Sep 17 00:00:00 2001 From: Oksana Date: Mon, 13 Mar 2023 22:10:21 +0300 Subject: [PATCH 12/12] =?UTF-8?q?fix:=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/practicum/category/mapper/CategoryMapper.java | 4 +++- .../ru/practicum/events/comments/mapper/CommentMapper.java | 4 +++- .../events/compilation/mapper/CompilationMapper.java | 4 +++- .../java/ru/practicum/events/event/mapper/EventMapper.java | 4 +++- .../ru/practicum/events/request/mapper/RequestMapper.java | 4 +++- .../src/main/java/ru/practicum/users/mapper/UserMapper.java | 4 +++- 6 files changed, 18 insertions(+), 6 deletions(-) diff --git a/main-service/src/main/java/ru/practicum/category/mapper/CategoryMapper.java b/main-service/src/main/java/ru/practicum/category/mapper/CategoryMapper.java index 069e086..3ffeadb 100644 --- a/main-service/src/main/java/ru/practicum/category/mapper/CategoryMapper.java +++ b/main-service/src/main/java/ru/practicum/category/mapper/CategoryMapper.java @@ -5,7 +5,9 @@ import ru.practicum.category.model.Category; public final class CategoryMapper { - private CategoryMapper(){} + private CategoryMapper() { + + } public static Category toCategory(NewCategoryDto dto) { return Category.builder() diff --git a/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java b/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java index 119d608..6ec697a 100644 --- a/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java +++ b/main-service/src/main/java/ru/practicum/events/comments/mapper/CommentMapper.java @@ -10,7 +10,9 @@ import java.time.LocalDateTime; public final class CommentMapper { - private CommentMapper(){} + private CommentMapper() { + + } public static OutCommentDto toDto(Comment comment) { return OutCommentDto.builder() diff --git a/main-service/src/main/java/ru/practicum/events/compilation/mapper/CompilationMapper.java b/main-service/src/main/java/ru/practicum/events/compilation/mapper/CompilationMapper.java index 3c57f81..212875d 100644 --- a/main-service/src/main/java/ru/practicum/events/compilation/mapper/CompilationMapper.java +++ b/main-service/src/main/java/ru/practicum/events/compilation/mapper/CompilationMapper.java @@ -11,7 +11,9 @@ import java.util.stream.Collectors; public final class CompilationMapper { - private CompilationMapper(){} + private CompilationMapper() { + + } public static Compilation toCompilation(NewCompilationDto compilationDto, List collect) { return Compilation.builder() diff --git a/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java b/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java index cd59181..75cb5d8 100644 --- a/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java +++ b/main-service/src/main/java/ru/practicum/events/event/mapper/EventMapper.java @@ -15,7 +15,9 @@ import java.time.temporal.ChronoUnit; public final class EventMapper { - private EventMapper(){} + private EventMapper() { + + } public static EventShortDto toShortDto(Event event) { return EventShortDto.builder() diff --git a/main-service/src/main/java/ru/practicum/events/request/mapper/RequestMapper.java b/main-service/src/main/java/ru/practicum/events/request/mapper/RequestMapper.java index 53f2418..b65ffac 100644 --- a/main-service/src/main/java/ru/practicum/events/request/mapper/RequestMapper.java +++ b/main-service/src/main/java/ru/practicum/events/request/mapper/RequestMapper.java @@ -6,7 +6,9 @@ import java.time.format.DateTimeFormatter; public final class RequestMapper { - private RequestMapper(){} + private RequestMapper() { + + } public static RequestDto toDto(Request request) { return RequestDto.builder() diff --git a/main-service/src/main/java/ru/practicum/users/mapper/UserMapper.java b/main-service/src/main/java/ru/practicum/users/mapper/UserMapper.java index f752b1a..ef6e224 100644 --- a/main-service/src/main/java/ru/practicum/users/mapper/UserMapper.java +++ b/main-service/src/main/java/ru/practicum/users/mapper/UserMapper.java @@ -6,7 +6,9 @@ import ru.practicum.users.model.User; public final class UserMapper { - private UserMapper(){} + private UserMapper() { + + } public static User toUser(UserCreateDto dto) { return User.builder()