From c05b17571085fdde810b97b74ce02c53321dea1e Mon Sep 17 00:00:00 2001 From: Just Roma Date: Tue, 29 Jul 2025 18:04:49 +0500 Subject: [PATCH 1/2] comments work --- .../src/main/java/ewm/comments/Comment.java | 40 ++ .../main/java/ewm/comments/CommentMapper.java | 52 ++ .../java/ewm/comments/CommentRepository.java | 14 + .../controller/CommentControllerAdmin.java | 19 + .../controller/CommentControllerPrivate.java | 57 ++ .../controller/CommentControllerPublic.java | 32 ++ .../java/ewm/comments/dto/CommentDto.java | 23 + .../ewm/comments/dto/CommentRequestDto.java | 23 + .../ewm/comments/service/CommentService.java | 25 + .../comments/service/CommentServiceImpl.java | 122 ++++ main-service/src/main/resources/schema.sql | 10 + postman/feature.json | 532 ++++++++++++++++++ 12 files changed, 949 insertions(+) create mode 100644 main-service/src/main/java/ewm/comments/Comment.java create mode 100644 main-service/src/main/java/ewm/comments/CommentMapper.java create mode 100644 main-service/src/main/java/ewm/comments/CommentRepository.java create mode 100644 main-service/src/main/java/ewm/comments/controller/CommentControllerAdmin.java create mode 100644 main-service/src/main/java/ewm/comments/controller/CommentControllerPrivate.java create mode 100644 main-service/src/main/java/ewm/comments/controller/CommentControllerPublic.java create mode 100644 main-service/src/main/java/ewm/comments/dto/CommentDto.java create mode 100644 main-service/src/main/java/ewm/comments/dto/CommentRequestDto.java create mode 100644 main-service/src/main/java/ewm/comments/service/CommentService.java create mode 100644 main-service/src/main/java/ewm/comments/service/CommentServiceImpl.java create mode 100644 postman/feature.json diff --git a/main-service/src/main/java/ewm/comments/Comment.java b/main-service/src/main/java/ewm/comments/Comment.java new file mode 100644 index 0000000..5913b3d --- /dev/null +++ b/main-service/src/main/java/ewm/comments/Comment.java @@ -0,0 +1,40 @@ +package ewm.comments; + +import ewm.events.Event; +import ewm.user.User; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Getter +@Setter +@Entity +@Table(name = "comments") +public class Comment { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(nullable = false) + private String text; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "author_id", nullable = false) + private User author; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "event_id", nullable = false) + private Event event; + + @Column(nullable = false) + private LocalDateTime created; + + private LocalDateTime edited; + + @Column(name = "confirmed_requests", nullable = false) + private Long confirmedRequests; +} diff --git a/main-service/src/main/java/ewm/comments/CommentMapper.java b/main-service/src/main/java/ewm/comments/CommentMapper.java new file mode 100644 index 0000000..e906d83 --- /dev/null +++ b/main-service/src/main/java/ewm/comments/CommentMapper.java @@ -0,0 +1,52 @@ +package ewm.comments; + +import ewm.comments.dto.CommentDto; +import ewm.comments.dto.CommentRequestDto; +import ewm.events.Event; +import ewm.events.EventMapper; +import ewm.user.User; +import ewm.user.UserMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +@RequiredArgsConstructor +public class CommentMapper { + private final UserMapper userMapper; + private final EventMapper eventMapper; + + + public Comment commentRequestDtoToModel(CommentRequestDto dto, User author, Event event) { + return Comment.builder() + .text(dto.getText()) + .author(author) + .event(event) + .created(dto.getCreated() != null ? dto.getCreated() : null) + .edited(dto.getEdited() != null ? dto.getEdited() : null) + .confirmedRequests(dto.getConfirmedRequests()) + .build(); + } + + public CommentDto modelToCommentDto(Comment comment) { + return CommentDto.builder() + .id(comment.getId()) + .text(comment.getText()) + .author(userMapper.modelToUserShortDto(comment.getAuthor())) + .event(eventMapper.toEventShortDto(comment.getEvent(), comment.getConfirmedRequests())) + .created(comment.getCreated()) + .edited(comment.getEdited() != null ? comment.getEdited() : null) + .build(); + } + + public List listModelToCommentDto(List comments) { + List commentsDto = new ArrayList<>(); + for (Comment comment : comments) { + commentsDto.add(modelToCommentDto(comment)); + } + return commentsDto; + } + +} diff --git a/main-service/src/main/java/ewm/comments/CommentRepository.java b/main-service/src/main/java/ewm/comments/CommentRepository.java new file mode 100644 index 0000000..baf250a --- /dev/null +++ b/main-service/src/main/java/ewm/comments/CommentRepository.java @@ -0,0 +1,14 @@ +package ewm.comments; + +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CommentRepository extends JpaRepository { + + List findAllByAuthorId(Long userId, Pageable pageable); + + List findAllByEventId(Long eventId, Pageable pageable); + +} diff --git a/main-service/src/main/java/ewm/comments/controller/CommentControllerAdmin.java b/main-service/src/main/java/ewm/comments/controller/CommentControllerAdmin.java new file mode 100644 index 0000000..61841ae --- /dev/null +++ b/main-service/src/main/java/ewm/comments/controller/CommentControllerAdmin.java @@ -0,0 +1,19 @@ +package ewm.comments.controller; + +import ewm.comments.service.CommentService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/admin/comments") +@RequiredArgsConstructor +public class CommentControllerAdmin { + private final CommentService commentService; + + @DeleteMapping("/{commentId}") + @ResponseStatus(value = HttpStatus.NO_CONTENT) + public void deleteComment(@PathVariable Long commentId) { + commentService.deleteCommentAdmin(commentId); + } +} \ No newline at end of file diff --git a/main-service/src/main/java/ewm/comments/controller/CommentControllerPrivate.java b/main-service/src/main/java/ewm/comments/controller/CommentControllerPrivate.java new file mode 100644 index 0000000..34baa3d --- /dev/null +++ b/main-service/src/main/java/ewm/comments/controller/CommentControllerPrivate.java @@ -0,0 +1,57 @@ +package ewm.comments.controller; + +import ewm.comments.dto.CommentDto; +import ewm.comments.dto.CommentRequestDto; +import ewm.comments.service.CommentService; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.PositiveOrZero; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@Validated +@RestController +@RequestMapping("/users/{userId}/comments") +@RequiredArgsConstructor +public class CommentControllerPrivate { + private final CommentService commentService; + + @PostMapping("/{eventId}") + @ResponseStatus(value = HttpStatus.CREATED) + public CommentDto addComment( + @PathVariable Long userId, + @PathVariable Long eventId, + @RequestBody @Valid CommentRequestDto commentRequestDto) { + return commentService.create(userId, eventId, commentRequestDto); + } + + @PatchMapping("/{eventId}/{commentId}") + public CommentDto updateComment( + @PathVariable Long userId, + @PathVariable Long eventId, + @PathVariable Long commentId, + @RequestBody @Valid CommentRequestDto commentRequestDto) { + return commentService.update(userId, eventId, commentId, commentRequestDto); + } + + @DeleteMapping("/{commentId}") + @ResponseStatus(value = HttpStatus.NO_CONTENT) + public void deleteComment( + @PathVariable Long userId, + @PathVariable Long commentId) { + commentService.deleteCommentUser(userId, commentId); + } + + @GetMapping + public List getComments( + @PathVariable Long userId, + @RequestParam(value = "from", defaultValue = "0") @PositiveOrZero Integer from, + @RequestParam(value = "size", defaultValue = "10") @Positive Integer size) { + return commentService.getCommentsByUserId(userId, from, size); + } +} diff --git a/main-service/src/main/java/ewm/comments/controller/CommentControllerPublic.java b/main-service/src/main/java/ewm/comments/controller/CommentControllerPublic.java new file mode 100644 index 0000000..cbe92da --- /dev/null +++ b/main-service/src/main/java/ewm/comments/controller/CommentControllerPublic.java @@ -0,0 +1,32 @@ +package ewm.comments.controller; + +import ewm.comments.dto.CommentDto; +import ewm.comments.service.CommentService; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.PositiveOrZero; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Validated +@RestController +@RequestMapping("/comments") +@RequiredArgsConstructor +public class CommentControllerPublic { + private final CommentService commentService; + + @GetMapping("/event/{eventId}") + List getComments( + @PathVariable Long eventId, + @RequestParam(value = "from", defaultValue = "0") @PositiveOrZero Integer from, + @RequestParam(value = "size", defaultValue = "10") @Positive Integer size) { + return commentService.getCommentsByUserId(eventId, from, size); + } + + @GetMapping("/{commentId}") + CommentDto getCommentById(@PathVariable Long commentId) { + return commentService.getCommentById(commentId); + } +} diff --git a/main-service/src/main/java/ewm/comments/dto/CommentDto.java b/main-service/src/main/java/ewm/comments/dto/CommentDto.java new file mode 100644 index 0000000..1e10a2a --- /dev/null +++ b/main-service/src/main/java/ewm/comments/dto/CommentDto.java @@ -0,0 +1,23 @@ +package ewm.comments.dto; + +import ewm.events.dto.EventShortDto; +import ewm.user.dto.UserShortDto; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CommentDto { + private Long id; + private String text; + private UserShortDto author; + private EventShortDto event; + private LocalDateTime created; + private LocalDateTime edited; +} \ No newline at end of file diff --git a/main-service/src/main/java/ewm/comments/dto/CommentRequestDto.java b/main-service/src/main/java/ewm/comments/dto/CommentRequestDto.java new file mode 100644 index 0000000..a164cc2 --- /dev/null +++ b/main-service/src/main/java/ewm/comments/dto/CommentRequestDto.java @@ -0,0 +1,23 @@ +package ewm.comments.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CommentRequestDto { + @Size(max = 1000) + @NotBlank + @NotNull + private String text; + private LocalDateTime created; + private LocalDateTime edited; + private Long confirmedRequests; +} diff --git a/main-service/src/main/java/ewm/comments/service/CommentService.java b/main-service/src/main/java/ewm/comments/service/CommentService.java new file mode 100644 index 0000000..1da30bd --- /dev/null +++ b/main-service/src/main/java/ewm/comments/service/CommentService.java @@ -0,0 +1,25 @@ +package ewm.comments.service; + +import ewm.comments.dto.CommentDto; +import ewm.comments.dto.CommentRequestDto; + +import java.util.List; + +public interface CommentService { + + CommentDto create(long userId, long eventId, CommentRequestDto dto); + + CommentDto update(long userId, long eventId, long commentId, CommentRequestDto dto); + + void deleteCommentUser(long userId, long commentId); + + void deleteCommentAdmin(long commentId); + + CommentDto getCommentById(long commentId); + + List getCommentsByEventId(Long eventId, Integer from, Integer size); + + List getCommentsByUserId(Long userId, Integer from, Integer size); + + +} diff --git a/main-service/src/main/java/ewm/comments/service/CommentServiceImpl.java b/main-service/src/main/java/ewm/comments/service/CommentServiceImpl.java new file mode 100644 index 0000000..8691cc9 --- /dev/null +++ b/main-service/src/main/java/ewm/comments/service/CommentServiceImpl.java @@ -0,0 +1,122 @@ +package ewm.comments.service; + +import ewm.comments.Comment; +import ewm.comments.CommentMapper; +import ewm.comments.CommentRepository; +import ewm.comments.dto.CommentDto; +import ewm.comments.dto.CommentRequestDto; +import ewm.events.Event; +import ewm.events.EventRepository; +import ewm.exception.BadRequestException; +import ewm.exception.NotFoundException; +import ewm.requests.RequestRepository; +import ewm.user.User; +import ewm.user.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; + +import static ewm.events.enums.State.PUBLISHED; +import static ewm.requests.RequestStatus.CONFIRMED; + +@Transactional +@Service +@RequiredArgsConstructor +public class CommentServiceImpl implements CommentService { + private final UserService userService; + private final EventRepository eventRepository; + private final RequestRepository requestRepository; + private final CommentMapper commentMapper; + private final CommentRepository commentRepository; + + @Override + public CommentDto create(long userId, long eventId, CommentRequestDto dto) { + User author = userService.getModelById(userId); + Event event = checkAndReturnEvent(eventId); + if (event.getState() != PUBLISHED) { + throw new BadRequestException("Для комментирования событие должно иметь статус PUBLISHED."); + } + dto.setCreated(LocalDateTime.now()); + dto.setConfirmedRequests(requestRepository.countByEventIdAndStatus(eventId, CONFIRMED)); + + Comment comment = commentMapper.commentRequestDtoToModel(dto, author, event); + return commentMapper.modelToCommentDto(commentRepository.save(comment)); + } + + @Override + public CommentDto update(long userId, long eventId, long commentId, CommentRequestDto dto) { + Comment comment = checkAndReturnComment(commentId); + + if (comment.getAuthor().getId() != userId) { + throw new NotFoundException("Редактировать комментарий может только автор."); + } + if (comment.getEvent().getId() != eventId) { + throw new NotFoundException("Событие к комментарию указано не верно."); + } + comment.setText(dto.getText()); + comment.setEdited(LocalDateTime.now()); + + return commentMapper.modelToCommentDto(commentRepository.save(comment)); + } + + @Override + public void deleteCommentUser(long userId, long commentId) { + Comment comment = checkAndReturnComment(commentId); + if (comment.getAuthor().getId() != userId) { + throw new NotFoundException("Удалять комментарий может только автор."); + } + commentRepository.deleteById(commentId); + } + + @Override + public void deleteCommentAdmin(long commentId) { + checkAndReturnComment(commentId); + commentRepository.deleteById(commentId); + } + + @Override + @Transactional(readOnly = true) + public CommentDto getCommentById(long commentId) { + Comment comment = checkAndReturnComment(commentId); + return commentMapper.modelToCommentDto(commentRepository.save(comment)); + } + + @Override + @Transactional(readOnly = true) + public List getCommentsByEventId(Long eventId, Integer from, Integer size) { + checkAndReturnEvent(eventId); + List comments = commentRepository.findAllByEventId(eventId, + PageRequest.of(from / size, size)); + if (comments.isEmpty()) { + return List.of(); + } + return commentMapper.listModelToCommentDto(comments); + } + + @Override + @Transactional(readOnly = true) + public List getCommentsByUserId(Long userId, Integer from, Integer size) { + userService.getModelById(userId); + List comments = commentRepository.findAllByAuthorId(userId, + PageRequest.of(from / size, size)); + if (comments.isEmpty()) { + return List.of(); + } + return commentMapper.listModelToCommentDto(comments); + } + + private Comment checkAndReturnComment(long commentId) { + return commentRepository.findById(commentId).orElseThrow(() -> + new NotFoundException("Comment with id=" + commentId + " was not found")); + } + + private Event checkAndReturnEvent(Long eventId) { + return eventRepository.findById(eventId).orElseThrow(() -> + new NotFoundException("Event with id=" + eventId + " was not found")); + } + +} diff --git a/main-service/src/main/resources/schema.sql b/main-service/src/main/resources/schema.sql index a53aca3..bbcb24f 100644 --- a/main-service/src/main/resources/schema.sql +++ b/main-service/src/main/resources/schema.sql @@ -61,3 +61,13 @@ CREATE TABLE IF NOT EXISTS requests( requester_id INTEGER REFERENCES users(id), status VARCHAR(50) ); + +CREATE TABLE IF NOT EXISTS comments ( + id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + text VARCHAR(1000) NOT NULL, + author_id INTEGER REFERENCES users(id) NOT NULL, + event_id INTEGER REFERENCES events(id) NOT NULL, + created TIMESTAMP NOT NULL, + edited TIMESTAMP, + confirmed_requests INTEGER +); diff --git a/postman/feature.json b/postman/feature.json new file mode 100644 index 0000000..37dd91e --- /dev/null +++ b/postman/feature.json @@ -0,0 +1,532 @@ +{ + "info": { + "_postman_id": "7293f7d5-f5f2-4203-adb5-d314a55ce963", + "name": "Test Explore With Me - Feature comments", + "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json", + "_exporter_id": "40295077" + }, + "item": [ + { + "name": "Добавление нового комментария к событию", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "\r", + "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", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"text\": \"Комметарий один\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": "http://localhost:8080/users/3/comments/2" + }, + "response": [] + }, + { + "name": "Добавление нового комментария без содержания", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r", + " pm.response.to.have.status(400); \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"text\": \"\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": "http://localhost:8080/users/3/comments/2" + }, + "response": [] + }, + { + "name": "Добавление нового комментария к еще неопубликованному событию", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r", + " pm.response.to.have.status(400); \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"text\": \"Добавление комметария к неопубликованному событию.\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": "http://localhost:8080/users/2/comments/1" + }, + "response": [] + }, + { + "name": "Обновление комментария", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", + " pm.response.to.have.status(200);\r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"text\": \"Обновленный комментарий.\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": "http://localhost:8080/users/3/comments/2/1" + }, + "response": [] + }, + { + "name": "Обновление комментария на без содержания", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r", + " pm.response.to.have.status(400); \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"text\": \"\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": "http://localhost:8080/users/3/comments/2/1" + }, + "response": [] + }, + { + "name": "Получение всех комментариев пользователя", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "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", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "url": { + "raw": "http://localhost:8080/users/3/comments", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "users", + "3", + "comments" + ], + "query": [ + { + "key": "from", + "value": "0", + "disabled": true + }, + { + "key": "size", + "value": "10", + "disabled": true + } + ] + } + }, + "response": [] + }, + { + "name": "Получение всех комментариев события", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "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", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "url": { + "raw": "http://localhost:8080/comments/event/2", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "comments", + "event", + "2" + ], + "query": [ + { + "key": "from", + "value": "0", + "disabled": true + }, + { + "key": "size", + "value": "10", + "disabled": true + } + ] + } + }, + "response": [] + }, + { + "name": "Получение комментария по id", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "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", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "url": "http://localhost:8080/comments/1" + }, + "response": [] + }, + { + "name": "Удаление комментария пользователем", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 204\", function () {\r", + " pm.response.to.have.status(204);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "url": "http://localhost:8080/users/3/comments/1" + }, + "response": [] + }, + { + "name": "Получение удаленного комментария по идентификатору", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 404 и данные в формате json\", function () {\r", + " pm.response.to.have.status(404); \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "url": "http://localhost:8080/comments/1" + }, + "response": [] + }, + { + "name": "Добавление комментария к событию второй раз", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "\r", + "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", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"text\": \"Повторный комментарий\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": "http://localhost:8080/users/3/comments/2" + }, + "response": [] + }, + { + "name": "Удаление комментария админом", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 204\", function () {\r", + " pm.response.to.have.status(204);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "DELETE", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + } + ], + "url": "http://localhost:8080/admin/comments/2" + }, + "response": [] + } + ] +} \ No newline at end of file From 72a76e71b69dc04b0ae62dd9ff36222a4bd7733b Mon Sep 17 00:00:00 2001 From: Just Roma Date: Tue, 29 Jul 2025 18:11:04 +0500 Subject: [PATCH 2/2] README.md edit --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 18a246e..70484da 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,7 @@ # java-explore-with-me + Template repository for ExploreWithMe project. + +# pull request feature_comments + +# https://github.com/Just-Roman/java-explore-with-me/pull/3