diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/domain/Milestone.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/domain/Milestone.java new file mode 100644 index 000000000..b14fe3cca --- /dev/null +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/domain/Milestone.java @@ -0,0 +1,30 @@ +package com.codesquad.issuetracker.milestone.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import java.time.LocalDate; + +@Builder +@Getter +@AllArgsConstructor +public class Milestone { + private Long id; + private String name; + private String description; + private LocalDate dueDate; + private boolean isClosed; + private int openedIssueCount; + private int closedIssueCount; + + public Milestone update(Milestone milestoneForUpdate) { + name = milestoneForUpdate.getName(); + description = milestoneForUpdate.getDescription(); + dueDate = milestoneForUpdate.getDueDate(); + isClosed = milestoneForUpdate.isClosed(); + openedIssueCount = milestoneForUpdate.getClosedIssueCount(); + closedIssueCount = milestoneForUpdate.getClosedIssueCount(); + + return this; + } +} diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/domain/Milestones.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/domain/Milestones.java new file mode 100644 index 000000000..318993643 --- /dev/null +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/domain/Milestones.java @@ -0,0 +1,23 @@ +package com.codesquad.issuetracker.milestone.domain; + +import com.codesquad.issuetracker.label.domain.Label; +import com.codesquad.issuetracker.label.domain.Labels; +import lombok.Data; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +@Data(staticConstructor = "from") +public class Milestones { + private final List milestones; + + public static Milestones of(Milestone... milestones) { + return from(new ArrayList<>(Arrays.asList(milestones))); + } + + public Stream stream() { + return milestones.stream(); + } +} diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneRequest.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneRequest.java index 01b386822..4ce02ace8 100644 --- a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneRequest.java +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneRequest.java @@ -1,5 +1,6 @@ package com.codesquad.issuetracker.milestone.dto; +import com.codesquad.issuetracker.milestone.domain.Milestone; import lombok.Data; import javax.validation.constraints.NotEmpty; @@ -13,4 +14,13 @@ public class MilestoneRequest { private String description; private LocalDate dueDate; private boolean isClosed; + + public Milestone toEntity() { + return Milestone.builder() + .name(name) + .description(description) + .dueDate(dueDate) + .isClosed(isClosed) + .build(); + } } diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneResponse.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneResponse.java index 7db12d126..4483091f7 100644 --- a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneResponse.java +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneResponse.java @@ -1,5 +1,6 @@ package com.codesquad.issuetracker.milestone.dto; +import com.codesquad.issuetracker.milestone.domain.Milestone; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,4 +18,16 @@ public class MilestoneResponse { private boolean isClosed; private int openedIssueCount; private int closedIssueCount; + + public static MilestoneResponse from(Milestone milestone) { + return MilestoneResponse.builder() + .id(milestone.getId()) + .name(milestone.getName()) + .description(milestone.getDescription()) + .dueDate(milestone.getDueDate()) + .isClosed(milestone.isClosed()) + .openedIssueCount(milestone.getOpenedIssueCount()) + .closedIssueCount(milestone.getClosedIssueCount()) + .build(); + } } diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneResponses.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneResponses.java index b2974e960..4f1aa766b 100644 --- a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneResponses.java +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/dto/MilestoneResponses.java @@ -1,11 +1,13 @@ package com.codesquad.issuetracker.milestone.dto; +import com.codesquad.issuetracker.milestone.domain.Milestones; import com.fasterxml.jackson.annotation.JsonValue; import lombok.Data; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import java.util.stream.Collectors; @Data(staticConstructor = "from") public class MilestoneResponses { @@ -16,4 +18,12 @@ public class MilestoneResponses { public static MilestoneResponses from(Collection milestoneResponses) { return new MilestoneResponses(new HashSet<>(milestoneResponses)); } + + public static MilestoneResponses from(Milestones milestoneEntities) { + Set milestoneResponses = milestoneEntities.stream() + .map(MilestoneResponse::from) + .collect(Collectors.toSet()); + + return MilestoneResponses.from(milestoneResponses); + } } diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/repository/MilestoneRepository.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/repository/MilestoneRepository.java new file mode 100644 index 000000000..326ce9d3a --- /dev/null +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/repository/MilestoneRepository.java @@ -0,0 +1,16 @@ +package com.codesquad.issuetracker.milestone.repository; + +import com.codesquad.issuetracker.milestone.domain.Milestone; +import com.codesquad.issuetracker.milestone.domain.Milestones; + +import java.util.Optional; + +public interface MilestoneRepository { + Milestones readAll(); + + Optional readById(long id); + + Milestone save(Milestone milestone); + + void deleteById(long id); +} diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/repository/MilestoneRepositoryImpl.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/repository/MilestoneRepositoryImpl.java new file mode 100644 index 000000000..1b3a93bde --- /dev/null +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/repository/MilestoneRepositoryImpl.java @@ -0,0 +1,30 @@ +package com.codesquad.issuetracker.milestone.repository; + +import com.codesquad.issuetracker.milestone.domain.Milestone; +import com.codesquad.issuetracker.milestone.domain.Milestones; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public class MilestoneRepositoryImpl implements MilestoneRepository{ + @Override + public Milestones readAll() { + return null; + } + + @Override + public Optional readById(long id) { + return Optional.empty(); + } + + @Override + public Milestone save(Milestone milestone) { + return null; + } + + @Override + public void deleteById(long id) { + + } +} diff --git a/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/service/MilestoneService.java b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/service/MilestoneService.java new file mode 100644 index 000000000..68ae617ac --- /dev/null +++ b/be/issue-tracker-be/src/main/java/com/codesquad/issuetracker/milestone/service/MilestoneService.java @@ -0,0 +1,45 @@ +package com.codesquad.issuetracker.milestone.service; + +import com.codesquad.issuetracker.common.exception.EntityNotFoundException; +import com.codesquad.issuetracker.milestone.domain.Milestone; +import com.codesquad.issuetracker.milestone.domain.Milestones; +import com.codesquad.issuetracker.milestone.dto.MilestoneRequest; +import com.codesquad.issuetracker.milestone.dto.MilestoneResponse; +import com.codesquad.issuetracker.milestone.dto.MilestoneResponses; +import com.codesquad.issuetracker.milestone.repository.MilestoneRepositoryImpl; +import org.springframework.stereotype.Service; + +@Service +public class MilestoneService { + + private final MilestoneRepositoryImpl milestoneRepository; + + public MilestoneService(MilestoneRepositoryImpl milestoneRepository) { + this.milestoneRepository = milestoneRepository; + } + + public MilestoneResponses readAll() { + Milestones milestones = milestoneRepository.readAll(); + + return MilestoneResponses.from(milestones); + } + + public MilestoneResponse create(MilestoneRequest milestoneRequest) { + Milestone savedMilestone = milestoneRepository.save(milestoneRequest.toEntity()); + + return MilestoneResponse.from(savedMilestone); + } + + public MilestoneResponse update(long id, MilestoneRequest milestoneRequest) { + Milestone savedMilestone = milestoneRepository.readById(id) + .orElseThrow(() -> new EntityNotFoundException()); + + Milestone updatedMilestone = milestoneRepository.save(savedMilestone.update(milestoneRequest.toEntity())); + + return MilestoneResponse.from(updatedMilestone); + } + + public void delete(long id) { + milestoneRepository.deleteById(id); + } +} diff --git a/be/issue-tracker-be/src/test/java/com/codesquad/issuetracker/milestone/service/MilestoneServiceTest.java b/be/issue-tracker-be/src/test/java/com/codesquad/issuetracker/milestone/service/MilestoneServiceTest.java new file mode 100644 index 000000000..51da902d1 --- /dev/null +++ b/be/issue-tracker-be/src/test/java/com/codesquad/issuetracker/milestone/service/MilestoneServiceTest.java @@ -0,0 +1,10 @@ +package com.codesquad.issuetracker.milestone.service; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +class MilestoneServiceTest { + + +}