diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/dto/IssueUpdateRequest.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/dto/IssueUpdateRequest.java new file mode 100644 index 000000000..e611f1847 --- /dev/null +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/dto/IssueUpdateRequest.java @@ -0,0 +1,41 @@ +package com.codesquad.issuetracker.issue.dto; + +import com.codesquad.issuetracker.issue.domain.Milestone; +import com.codesquad.issuetracker.issue.domain.Users; +import com.codesquad.issuetracker.label.domain.Labels; +import com.codesquad.issuetracker.label.mapper.LabelDtoMapper; +import com.codesquad.issuetracker.milestone.mapper.MilestoneDtoMapper; +import com.codesquad.issuetracker.user.mapper.UserDtoMapper; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import java.util.Set; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class IssueUpdateRequest { + @NotEmpty + private String title; + + private boolean isClosed; + private Set assigneeIds; + private Set labelIds; + private Long milestoneId; + + public Users assignees() { + return UserDtoMapper.toEntities(assigneeIds); + } + + public Labels labels() { + return LabelDtoMapper.toEntities(labelIds); + } + + public Milestone milestone() { + return MilestoneDtoMapper.toEntity(milestoneId); + } +} diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/mapper/IssueDtoMapper.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/mapper/IssueDtoMapper.java index c024ecca8..13dc39491 100644 --- a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/mapper/IssueDtoMapper.java +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/mapper/IssueDtoMapper.java @@ -6,6 +6,7 @@ import com.codesquad.issuetracker.issue.dto.IssueRequest; import com.codesquad.issuetracker.issue.dto.IssueResponse; import com.codesquad.issuetracker.issue.dto.IssueResponses; +import com.codesquad.issuetracker.issue.dto.IssueUpdateRequest; import com.codesquad.issuetracker.label.dto.LabelResponses; import com.codesquad.issuetracker.milestone.dto.MilestoneResponse; import com.codesquad.issuetracker.user.dto.UserResponse; @@ -29,6 +30,16 @@ public static Issue toEntity(IssueRequest issueRequest) { .build(); } + public static Issue toEntity(IssueUpdateRequest issueUpdateRequest) { + return Issue.builder() + .title(issueUpdateRequest.getTitle()) + .isClosed(issueUpdateRequest.isClosed()) + .assignees(issueUpdateRequest.assignees()) + .labels(issueUpdateRequest.labels()) + .milestone(issueUpdateRequest.milestone()) + .build(); + } + public static IssueResponses toResponses(Issues issues, User loggedinUser) { List issueResponses = issues.stream() .map(issue -> toResponse(issue, loggedinUser)) diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/service/IssueService.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/service/IssueService.java index 699f0aa02..a04d3dfb9 100644 --- a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/service/IssueService.java +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/issue/service/IssueService.java @@ -7,6 +7,7 @@ import com.codesquad.issuetracker.issue.dto.IssueDetailResponse; import com.codesquad.issuetracker.issue.dto.IssueRequest; import com.codesquad.issuetracker.issue.dto.IssueResponses; +import com.codesquad.issuetracker.issue.dto.IssueUpdateRequest; import com.codesquad.issuetracker.issue.mapper.IssueDtoMapper; import com.codesquad.issuetracker.issue.repository.IssueRepository; import lombok.RequiredArgsConstructor; @@ -46,4 +47,14 @@ public IssueDetailResponse update(long issueId, IssueRequest issueRequest) { return IssueDetailResponse.from(issueRepository.save(issue)); } + + public IssueDetailResponse update(long issueId, IssueUpdateRequest issueUpdateRequest) { + Issue issue = issueRepository.readById(issueId) + .orElseThrow(() -> new EntityNotFoundException()); + + issue.update(IssueDtoMapper.toEntity(issueUpdateRequest)); + + return IssueDetailResponse.from(issueRepository.save(issue)); + + } } diff --git a/be/issue-tracker-be/src/test/java/com/codesquad/issuetracker/issue/service/IssueServiceTest.java b/be/issue-tracker-be/src/test/java/com/codesquad/issuetracker/issue/service/IssueServiceTest.java index 64649ea16..d350bbd1e 100644 --- a/be/issue-tracker-be/src/test/java/com/codesquad/issuetracker/issue/service/IssueServiceTest.java +++ b/be/issue-tracker-be/src/test/java/com/codesquad/issuetracker/issue/service/IssueServiceTest.java @@ -5,10 +5,7 @@ import com.codesquad.issuetracker.common.exception.EntityNotFoundException; import com.codesquad.issuetracker.issue.controller.IssueDummyData; import com.codesquad.issuetracker.issue.domain.*; -import com.codesquad.issuetracker.issue.dto.IssueDetailResponse; -import com.codesquad.issuetracker.issue.dto.IssueRequest; -import com.codesquad.issuetracker.issue.dto.IssueResponse; -import com.codesquad.issuetracker.issue.dto.IssueResponses; +import com.codesquad.issuetracker.issue.dto.*; import com.codesquad.issuetracker.issue.repository.IssueRepository; import com.codesquad.issuetracker.label.controller.LabelDummyData; import com.codesquad.issuetracker.label.domain.Label; @@ -283,7 +280,8 @@ static Stream createProvider() { .labelIds(LabelDummyData.labels().stream().map(Label::getId).collect(Collectors.toSet())) .milestoneId(MilestoneDummyData.openedMilestone().getId()) .build(), - IssueDetailResponse.builder().id(1L) + IssueDetailResponse.builder() + .id(1L) .number(1L) .title("title") .createDateTime(LocalDateTime.of(2021, 6, 21, 16, 0)) @@ -321,7 +319,8 @@ static Stream createProvider() { .assigneeIds(UserDummyData.users().stream().map(User::getId).collect(Collectors.toSet())) .labelIds(LabelDummyData.labels().stream().map(Label::getId).collect(Collectors.toSet())) .build(), - IssueDetailResponse.builder().id(1L) + IssueDetailResponse.builder() + .id(1L) .number(1L) .title("title") .createDateTime(LocalDateTime.of(2021, 6, 21, 16, 0)) @@ -361,7 +360,8 @@ static Stream createProvider() { .labelIds(LabelDummyData.labels().stream().map(Label::getId).collect(Collectors.toSet())) .milestoneId(MilestoneDummyData.openedMilestone().getId()) .build(), - IssueDetailResponse.builder().id(1L) + IssueDetailResponse.builder() + .id(1L) .number(1L) .title("title") .createDateTime(LocalDateTime.of(2021, 6, 21, 16, 0)) @@ -399,7 +399,8 @@ static Stream createProvider() { .labelIds(LabelDummyData.labels().stream().map(Label::getId).collect(Collectors.toSet())) .milestoneId(MilestoneDummyData.openedMilestone().getId()) .build(), - IssueDetailResponse.builder().id(1L) + IssueDetailResponse.builder() + .id(1L) .number(1L) .title("title") .createDateTime(LocalDateTime.of(2021, 6, 21, 16, 0)) @@ -436,7 +437,8 @@ static Stream createProvider() { .labelIds(LabelDummyData.labels().stream().map(Label::getId).collect(Collectors.toSet())) .milestoneId(MilestoneDummyData.openedMilestone().getId()) .build(), - IssueDetailResponse.builder().id(1L) + IssueDetailResponse.builder() + .id(1L) .number(1L) .title("title") .createDateTime(LocalDateTime.of(2021, 6, 21, 16, 0)) @@ -451,14 +453,14 @@ static Stream createProvider() { @ParameterizedTest @MethodSource - void update(String 테스트케이스설명, Issue givenForReadById, Issue givenForSave, IssueRequest issueRequest, IssueDetailResponse expected) { + void update(String 테스트케이스설명, Issue givenForReadById, Issue givenForSave, IssueUpdateRequest issueUpdateRequest, IssueDetailResponse expected) { BDDMockito.given(issueRepository.readById(givenForReadById.getId())) .willReturn(Optional.of(givenForReadById)); BDDMockito.given(issueRepository.save(givenForSave)) .willReturn(givenForSave); - IssueDetailResponse actual = issueService.update(givenForReadById.getId(), issueRequest); + IssueDetailResponse actual = issueService.update(givenForReadById.getId(), issueUpdateRequest); IssueTestValidator.thenVerifyIssue(actual, expected); } @@ -483,6 +485,7 @@ static Stream update() { .id(1L) .number(1L) .title("title updated") + .isClosed(true) .createDateTime(LocalDateTime.of(2021, 6, 21, 16, 0)) .author(UserDummyData.userFreddie()) .assignees(Users.of(UserDummyData.userFreddie())) @@ -490,17 +493,18 @@ static Stream update() { .milestone(MilestoneDummyData.closedMilestone()) .mainComment(IssueDummyData.commentByFreddie()) .build(), - IssueRequest.builder() + IssueUpdateRequest.builder() .title("title updated") - .mainCommentContents(IssueDummyData.commentByFreddie().getContents()) - .authorId(UserDummyData.userFreddie().getId()) + .isClosed(true) .assigneeIds(new HashSet<>(Arrays.asList(UserDummyData.userFreddie().getId()))) .labelIds(new HashSet<>(Arrays.asList(LabelDummyData.labelBe().getId()))) .milestoneId(MilestoneDummyData.closedMilestone().getId()) .build(), - IssueDetailResponse.builder().id(1L) + IssueDetailResponse.builder() + .id(1L) .number(1L) .title("title updated") + .isClosed(true) .createDateTime(LocalDateTime.of(2021, 6, 21, 16, 0)) .author(UserResponse.from(UserDummyData.userFreddie())) .assignees(UserResponses.from(Users.of(UserDummyData.userFreddie())))