From c2b1da58fbe3dcc870f71194a5f2652a756c0668 Mon Sep 17 00:00:00 2001 From: Travis Date: Sun, 28 Nov 2021 10:40:35 +0900 Subject: [PATCH 1/9] =?UTF-8?q?refactor:=20=20common.type=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=EC=9D=98=20enum=EA=B0=9D=EC=B2=B4=EB=93=A4?= =?UTF-8?q?=EC=9D=84=20entity=ED=8C=A8=ED=82=A4=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{common/type => domain/document}/ApprovalState.java | 2 +- .../playground/{common/type => domain/document}/Category.java | 2 +- src/main/java/playground/domain/document/Document.java | 4 +--- .../java/playground/domain/document/DocumentApproval.java | 1 - .../java/playground/domain/document/DocumentRepository.java | 1 - .../java/playground/service/document/DocumentApplication.java | 2 +- .../java/playground/service/document/DocumentService.java | 2 +- .../playground/service/document/dto/DocumentResponse.java | 4 ++-- .../service/document/dto/OutboxDocumentResponse.java | 4 ++-- .../playground/web/document/dto/DocumentCreateRequest.java | 4 ++-- 10 files changed, 11 insertions(+), 15 deletions(-) rename src/main/java/playground/{common/type => domain/document}/ApprovalState.java (86%) rename src/main/java/playground/{common/type => domain/document}/Category.java (87%) diff --git a/src/main/java/playground/common/type/ApprovalState.java b/src/main/java/playground/domain/document/ApprovalState.java similarity index 86% rename from src/main/java/playground/common/type/ApprovalState.java rename to src/main/java/playground/domain/document/ApprovalState.java index fe31dc2..15be5e0 100644 --- a/src/main/java/playground/common/type/ApprovalState.java +++ b/src/main/java/playground/domain/document/ApprovalState.java @@ -1,4 +1,4 @@ -package playground.common.type; +package playground.domain.document; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/playground/common/type/Category.java b/src/main/java/playground/domain/document/Category.java similarity index 87% rename from src/main/java/playground/common/type/Category.java rename to src/main/java/playground/domain/document/Category.java index 3500644..3c06a02 100644 --- a/src/main/java/playground/common/type/Category.java +++ b/src/main/java/playground/domain/document/Category.java @@ -1,4 +1,4 @@ -package playground.common.type; +package playground.domain.document; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/playground/domain/document/Document.java b/src/main/java/playground/domain/document/Document.java index 71e5981..99411a9 100644 --- a/src/main/java/playground/domain/document/Document.java +++ b/src/main/java/playground/domain/document/Document.java @@ -2,15 +2,13 @@ import lombok.*; import playground.domain.user.User; -import playground.common.type.ApprovalState; -import playground.common.type.Category; import javax.persistence.*; import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; -import static playground.common.type.ApprovalState.DRAFTING; +import static playground.domain.document.ApprovalState.DRAFTING; @Getter @EqualsAndHashCode(of = "id") diff --git a/src/main/java/playground/domain/document/DocumentApproval.java b/src/main/java/playground/domain/document/DocumentApproval.java index e169fc1..1bc528f 100644 --- a/src/main/java/playground/domain/document/DocumentApproval.java +++ b/src/main/java/playground/domain/document/DocumentApproval.java @@ -2,7 +2,6 @@ import lombok.*; import playground.domain.user.User; -import playground.common.type.ApprovalState; import javax.persistence.*; diff --git a/src/main/java/playground/domain/document/DocumentRepository.java b/src/main/java/playground/domain/document/DocumentRepository.java index b931315..b2f2848 100644 --- a/src/main/java/playground/domain/document/DocumentRepository.java +++ b/src/main/java/playground/domain/document/DocumentRepository.java @@ -3,7 +3,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import playground.common.type.ApprovalState; import java.util.List; diff --git a/src/main/java/playground/service/document/DocumentApplication.java b/src/main/java/playground/service/document/DocumentApplication.java index 571d48e..d47de2a 100644 --- a/src/main/java/playground/service/document/DocumentApplication.java +++ b/src/main/java/playground/service/document/DocumentApplication.java @@ -16,7 +16,7 @@ import java.util.Map; import java.util.stream.Collectors; -import static playground.common.type.ApprovalState.DRAFTING; +import static playground.domain.document.ApprovalState.DRAFTING; @Transactional(readOnly = true) @RequiredArgsConstructor diff --git a/src/main/java/playground/service/document/DocumentService.java b/src/main/java/playground/service/document/DocumentService.java index 52c26e6..dafbb25 100644 --- a/src/main/java/playground/service/document/DocumentService.java +++ b/src/main/java/playground/service/document/DocumentService.java @@ -5,7 +5,7 @@ import org.springframework.transaction.annotation.Transactional; import playground.domain.document.Document; import playground.domain.document.DocumentRepository; -import playground.common.type.ApprovalState; +import playground.domain.document.ApprovalState; import java.util.List; import java.util.Optional; diff --git a/src/main/java/playground/service/document/dto/DocumentResponse.java b/src/main/java/playground/service/document/dto/DocumentResponse.java index bbf68eb..9e0f57a 100644 --- a/src/main/java/playground/service/document/dto/DocumentResponse.java +++ b/src/main/java/playground/service/document/dto/DocumentResponse.java @@ -4,8 +4,8 @@ import lombok.NoArgsConstructor; import playground.domain.document.Document; import playground.domain.user.User; -import playground.common.type.ApprovalState; -import playground.common.type.Category; +import playground.domain.document.ApprovalState; +import playground.domain.document.Category; @Getter @NoArgsConstructor diff --git a/src/main/java/playground/service/document/dto/OutboxDocumentResponse.java b/src/main/java/playground/service/document/dto/OutboxDocumentResponse.java index a9ad334..ee718fd 100644 --- a/src/main/java/playground/service/document/dto/OutboxDocumentResponse.java +++ b/src/main/java/playground/service/document/dto/OutboxDocumentResponse.java @@ -3,8 +3,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import playground.domain.document.Document; -import playground.common.type.ApprovalState; -import playground.common.type.Category; +import playground.domain.document.ApprovalState; +import playground.domain.document.Category; @Getter @NoArgsConstructor diff --git a/src/main/java/playground/web/document/dto/DocumentCreateRequest.java b/src/main/java/playground/web/document/dto/DocumentCreateRequest.java index 2238217..7c2a1e0 100644 --- a/src/main/java/playground/web/document/dto/DocumentCreateRequest.java +++ b/src/main/java/playground/web/document/dto/DocumentCreateRequest.java @@ -3,11 +3,11 @@ import lombok.Getter; import playground.domain.document.Document; import playground.domain.user.User; -import playground.common.type.Category; +import playground.domain.document.Category; import java.util.List; -import static playground.common.type.ApprovalState.DRAFTING; +import static playground.domain.document.ApprovalState.DRAFTING; @Getter public class DocumentCreateRequest { From 2014717572aee6dd9f815922cea8b3c561fcb7b4 Mon Sep 17 00:00:00 2001 From: Travis Date: Fri, 3 Dec 2021 19:28:48 +0900 Subject: [PATCH 2/9] =?UTF-8?q?refactor:=20Document=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20=ED=8F=AC=EB=A7=A4=ED=8C=85,=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../playground/domain/document/Document.java | 5 +--- .../service/document/DocumentService.java | 7 ++++- .../{ => api}/DocumentController.java | 12 ++++---- .../request}/DocumentCreateRequest.java | 2 +- .../request}/OutboxDocumentRequest.java | 2 +- .../api/response}/DocumentResponse.java | 2 +- .../api/response}/OutboxDocumentResponse.java | 2 +- .../application}/DocumentApplication.java | 30 +++++++------------ 8 files changed, 28 insertions(+), 34 deletions(-) rename src/main/java/playground/web/document/{ => api}/DocumentController.java (76%) rename src/main/java/playground/web/document/{dto => api/request}/DocumentCreateRequest.java (94%) rename src/main/java/playground/web/document/{dto => api/request}/OutboxDocumentRequest.java (74%) rename src/main/java/playground/{service/document/dto => web/document/api/response}/DocumentResponse.java (95%) rename src/main/java/playground/{service/document/dto => web/document/api/response}/OutboxDocumentResponse.java (94%) rename src/main/java/playground/{service/document => web/document/application}/DocumentApplication.java (70%) diff --git a/src/main/java/playground/domain/document/Document.java b/src/main/java/playground/domain/document/Document.java index 99411a9..6a207c8 100644 --- a/src/main/java/playground/domain/document/Document.java +++ b/src/main/java/playground/domain/document/Document.java @@ -38,10 +38,7 @@ public class Document { @JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private User drafter; - @OneToMany( - mappedBy = "document", fetch = FetchType.LAZY, - cascade = CascadeType.ALL, orphanRemoval = true - ) + @OneToMany(mappedBy = "document", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) private List documentApprovals = new ArrayList<>(); @Builder diff --git a/src/main/java/playground/service/document/DocumentService.java b/src/main/java/playground/service/document/DocumentService.java index dafbb25..67fca68 100644 --- a/src/main/java/playground/service/document/DocumentService.java +++ b/src/main/java/playground/service/document/DocumentService.java @@ -18,7 +18,7 @@ public class DocumentService { private final DocumentRepository documentRepository; @Transactional - public Document createDocument(Document document) { + public Document create(Document document) { return documentRepository.save(document); } @@ -26,6 +26,11 @@ public Optional findById(Long documentId) { return documentRepository.findById(documentId); } + public Document getById(Long documentId) { + return findById(documentId) + .orElseThrow(() -> new IllegalArgumentException(String.format("존재하지 않는 문서입니다. documentId = %s", documentId))); + } + public List findAllByDrafterIdAndApprovalStateOrderByIdDesc(Long drafterId, ApprovalState approvalState) { return documentRepository.findByDrafterIdAndApprovalStateOrderByIdDesc(drafterId, approvalState); } diff --git a/src/main/java/playground/web/document/DocumentController.java b/src/main/java/playground/web/document/api/DocumentController.java similarity index 76% rename from src/main/java/playground/web/document/DocumentController.java rename to src/main/java/playground/web/document/api/DocumentController.java index 0b63962..72153b8 100644 --- a/src/main/java/playground/web/document/DocumentController.java +++ b/src/main/java/playground/web/document/api/DocumentController.java @@ -1,13 +1,13 @@ -package playground.web.document; +package playground.web.document.api; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import playground.web.document.dto.DocumentCreateRequest; -import playground.service.document.dto.DocumentResponse; -import playground.service.document.dto.OutboxDocumentResponse; -import playground.service.document.DocumentApplication; -import playground.web.document.dto.OutboxDocumentRequest; +import playground.web.document.api.request.DocumentCreateRequest; +import playground.web.document.api.response.DocumentResponse; +import playground.web.document.api.response.OutboxDocumentResponse; +import playground.web.document.application.DocumentApplication; +import playground.web.document.api.request.OutboxDocumentRequest; import java.util.List; diff --git a/src/main/java/playground/web/document/dto/DocumentCreateRequest.java b/src/main/java/playground/web/document/api/request/DocumentCreateRequest.java similarity index 94% rename from src/main/java/playground/web/document/dto/DocumentCreateRequest.java rename to src/main/java/playground/web/document/api/request/DocumentCreateRequest.java index 7c2a1e0..35100cc 100644 --- a/src/main/java/playground/web/document/dto/DocumentCreateRequest.java +++ b/src/main/java/playground/web/document/api/request/DocumentCreateRequest.java @@ -1,4 +1,4 @@ -package playground.web.document.dto; +package playground.web.document.api.request; import lombok.Getter; import playground.domain.document.Document; diff --git a/src/main/java/playground/web/document/dto/OutboxDocumentRequest.java b/src/main/java/playground/web/document/api/request/OutboxDocumentRequest.java similarity index 74% rename from src/main/java/playground/web/document/dto/OutboxDocumentRequest.java rename to src/main/java/playground/web/document/api/request/OutboxDocumentRequest.java index 3ef9886..b22b871 100644 --- a/src/main/java/playground/web/document/dto/OutboxDocumentRequest.java +++ b/src/main/java/playground/web/document/api/request/OutboxDocumentRequest.java @@ -1,4 +1,4 @@ -package playground.web.document.dto; +package playground.web.document.api.request; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/playground/service/document/dto/DocumentResponse.java b/src/main/java/playground/web/document/api/response/DocumentResponse.java similarity index 95% rename from src/main/java/playground/service/document/dto/DocumentResponse.java rename to src/main/java/playground/web/document/api/response/DocumentResponse.java index 9e0f57a..3951f35 100644 --- a/src/main/java/playground/service/document/dto/DocumentResponse.java +++ b/src/main/java/playground/web/document/api/response/DocumentResponse.java @@ -1,4 +1,4 @@ -package playground.service.document.dto; +package playground.web.document.api.response; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/playground/service/document/dto/OutboxDocumentResponse.java b/src/main/java/playground/web/document/api/response/OutboxDocumentResponse.java similarity index 94% rename from src/main/java/playground/service/document/dto/OutboxDocumentResponse.java rename to src/main/java/playground/web/document/api/response/OutboxDocumentResponse.java index ee718fd..4de3e37 100644 --- a/src/main/java/playground/service/document/dto/OutboxDocumentResponse.java +++ b/src/main/java/playground/web/document/api/response/OutboxDocumentResponse.java @@ -1,4 +1,4 @@ -package playground.service.document.dto; +package playground.web.document.api.response; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/playground/service/document/DocumentApplication.java b/src/main/java/playground/web/document/application/DocumentApplication.java similarity index 70% rename from src/main/java/playground/service/document/DocumentApplication.java rename to src/main/java/playground/web/document/application/DocumentApplication.java index d47de2a..bc4343d 100644 --- a/src/main/java/playground/service/document/DocumentApplication.java +++ b/src/main/java/playground/web/document/application/DocumentApplication.java @@ -1,15 +1,16 @@ -package playground.service.document; +package playground.web.document.application; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import playground.domain.document.Document; import playground.domain.user.User; -import playground.service.document.dto.DocumentResponse; -import playground.service.document.dto.OutboxDocumentResponse; +import playground.service.document.DocumentService; import playground.service.user.UserService; -import playground.web.document.dto.DocumentCreateRequest; -import playground.domain.document.Document; -import playground.web.document.dto.OutboxDocumentRequest; +import playground.web.document.api.request.DocumentCreateRequest; +import playground.web.document.api.request.OutboxDocumentRequest; +import playground.web.document.api.response.DocumentResponse; +import playground.web.document.api.response.OutboxDocumentResponse; import java.util.ArrayList; import java.util.List; @@ -26,14 +27,15 @@ public class DocumentApplication { private final DocumentService documentService; private final UserService userService; + @Transactional public void create(DocumentCreateRequest request) { List orderedApprovers = createOrderedApprovers(request); - User drafter = findUserById(request.getDrafterId()); + User drafter = userService.getById(request.getDrafterId()); Document document = request.toEntity(drafter); document.createApprovals(orderedApprovers); - documentService.createDocument(document); + documentService.create(document); } private List createOrderedApprovers(DocumentCreateRequest request) { @@ -52,23 +54,13 @@ private Map createApproverMap(DocumentCreateRequest request) { .collect(Collectors.toMap(User::getId, user -> user)); } - private User findUserById(Long userId) { - return userService.findById(userId) - .orElseThrow(() -> new IllegalArgumentException(String.format("존재하지 않는 사용자입니다. userId = %s", userId))); - } - public DocumentResponse findDocument(Long documentId) { - Document document = findDocumentById(documentId); + Document document = documentService.getById(documentId); User drafter = document.getDrafter(); return new DocumentResponse(document, drafter); } - private Document findDocumentById(Long documentId) { - return documentService.findById(documentId) - .orElseThrow(() -> new IllegalArgumentException(String.format("존재하지 않는 문서입니다. documentId = %s", documentId))); - } - public List findOutboxDocuments(OutboxDocumentRequest request) { List documents = documentService.findAllByDrafterIdAndApprovalStateOrderByIdDesc(request.getDrafterId(), DRAFTING); return convertOutboxDocumentResponseFrom(documents); From fde101e6e0ba6811aeb6d94ffb52871948839296 Mon Sep 17 00:00:00 2001 From: Travis Date: Sat, 11 Dec 2021 00:02:46 +0900 Subject: [PATCH 3/9] =?UTF-8?q?feat:=20team=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EC=99=80=20user=EC=99=80=EC=9D=98=20?= =?UTF-8?q?=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/playground/domain/user/Team.java | 31 +++++++++++++++++++ .../java/playground/domain/user/User.java | 8 ++++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/main/java/playground/domain/user/Team.java diff --git a/src/main/java/playground/domain/user/Team.java b/src/main/java/playground/domain/user/Team.java new file mode 100644 index 0000000..3043715 --- /dev/null +++ b/src/main/java/playground/domain/user/Team.java @@ -0,0 +1,31 @@ +package playground.domain.user; + +import lombok.*; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Getter +@EqualsAndHashCode(of = "id") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "team") +@Entity +public class Team { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String name; + + @OneToMany(mappedBy = "team", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + private List users = new ArrayList<>(); + + @Builder + public Team(String name) { + this.name = name; + } + +} diff --git a/src/main/java/playground/domain/user/User.java b/src/main/java/playground/domain/user/User.java index b61357e..9e83eb2 100644 --- a/src/main/java/playground/domain/user/User.java +++ b/src/main/java/playground/domain/user/User.java @@ -23,10 +23,16 @@ public class User { private String name; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Team team; + @Builder - public User(String email, String password, String name) { + public User(String email, String password, String name, JobPosition jobPosition) { this.email = email; this.password = password; this.name = name; + this.jobPosition = jobPosition; } + } \ No newline at end of file From 9b3bfa1d04f761faac1af6d1e1b4befa4acbede4 Mon Sep 17 00:00:00 2001 From: Travis Date: Sat, 11 Dec 2021 00:03:56 +0900 Subject: [PATCH 4/9] =?UTF-8?q?feat:=20user=EC=97=90=EC=84=9C=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8A=94=20JobPosition=20enum=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../playground/domain/user/JobPosition.java | 17 +++++++++++++++++ src/main/java/playground/domain/user/User.java | 3 +++ 2 files changed, 20 insertions(+) create mode 100644 src/main/java/playground/domain/user/JobPosition.java diff --git a/src/main/java/playground/domain/user/JobPosition.java b/src/main/java/playground/domain/user/JobPosition.java new file mode 100644 index 0000000..5b84f6d --- /dev/null +++ b/src/main/java/playground/domain/user/JobPosition.java @@ -0,0 +1,17 @@ +package playground.domain.user; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum JobPosition { + + TEAM_LEADER("팀장"), + PART_MANAGER("파트장"), + TEAM_MEMBER("팀원") + ; + + private final String text; + +} diff --git a/src/main/java/playground/domain/user/User.java b/src/main/java/playground/domain/user/User.java index 9e83eb2..2bba08d 100644 --- a/src/main/java/playground/domain/user/User.java +++ b/src/main/java/playground/domain/user/User.java @@ -23,6 +23,9 @@ public class User { private String name; + @Enumerated(EnumType.STRING) + private JobPosition jobPosition; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Team team; From b8a6e758d49bb46e84138d4d7f220c53d01636bf Mon Sep 17 00:00:00 2001 From: Travis Date: Sat, 11 Dec 2021 00:06:38 +0900 Subject: [PATCH 5/9] =?UTF-8?q?feat:=20TeamRepository=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EC=99=80=20UserService=EC=97=90=20=EC=A1=B0=ED=9A=8C=20method?= =?UTF-8?q?=EB=93=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../playground/domain/user/TeamRepository.java | 6 ++++++ .../playground/service/user/UserService.java | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/main/java/playground/domain/user/TeamRepository.java diff --git a/src/main/java/playground/domain/user/TeamRepository.java b/src/main/java/playground/domain/user/TeamRepository.java new file mode 100644 index 0000000..8948bda --- /dev/null +++ b/src/main/java/playground/domain/user/TeamRepository.java @@ -0,0 +1,6 @@ +package playground.domain.user; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TeamRepository extends JpaRepository { +} diff --git a/src/main/java/playground/service/user/UserService.java b/src/main/java/playground/service/user/UserService.java index 397525a..c1878e5 100644 --- a/src/main/java/playground/service/user/UserService.java +++ b/src/main/java/playground/service/user/UserService.java @@ -3,6 +3,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import playground.domain.user.Team; +import playground.domain.user.TeamRepository; import playground.domain.user.User; import playground.domain.user.UserRepository; @@ -15,12 +17,26 @@ public class UserService { private final UserRepository userRepository; + private final TeamRepository teamRepository; public Optional findById(Long userId) { return userRepository.findById(userId); } + public User getById(Long userId) { + return findById(userId) + .orElseThrow(() -> new IllegalArgumentException(String.format("존재하지 않는 사용자입니다. userId = %s", userId))); + } + public List findAllById(List userIds) { return userRepository.findAllById(userIds); } + + public Optional findTeamById(Long teamId) { + return teamRepository.findById(teamId); + } + + public List findAllTeams() { + return teamRepository.findAll(); + } } From a45a8e76c4536b8340ba5c8e9cb2c94afdf8e470 Mon Sep 17 00:00:00 2001 From: Travis Date: Sat, 11 Dec 2021 00:07:15 +0900 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20UserController,=20UserSearchApplica?= =?UTF-8?q?tion=20=EA=B7=B8=EB=A6=AC=EA=B3=A0=20dto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http/user.http | 5 ++ .../web/user/api/UserController.java | 32 ++++++++++++ .../web/user/api/request/UserRequest.java | 12 +++++ .../web/user/api/response/TeamResponse.java | 20 ++++++++ .../web/user/api/response/UserResponse.java | 33 ++++++++++++ .../application/UserSearchApplication.java | 50 +++++++++++++++++++ 6 files changed, 152 insertions(+) create mode 100644 http/user.http create mode 100644 src/main/java/playground/web/user/api/UserController.java create mode 100644 src/main/java/playground/web/user/api/request/UserRequest.java create mode 100644 src/main/java/playground/web/user/api/response/TeamResponse.java create mode 100644 src/main/java/playground/web/user/api/response/UserResponse.java create mode 100644 src/main/java/playground/web/user/application/UserSearchApplication.java diff --git a/http/user.http b/http/user.http new file mode 100644 index 0000000..8dd2331 --- /dev/null +++ b/http/user.http @@ -0,0 +1,5 @@ +### 전체 팀 조회 +GET http://localhost:8080/api/teams + +### 팀에 속한 회원 조회 +GET http://localhost:8080/api/users?teamId=1 diff --git a/src/main/java/playground/web/user/api/UserController.java b/src/main/java/playground/web/user/api/UserController.java new file mode 100644 index 0000000..c2e2919 --- /dev/null +++ b/src/main/java/playground/web/user/api/UserController.java @@ -0,0 +1,32 @@ +package playground.web.user.api; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import playground.web.user.application.UserSearchApplication; +import playground.web.user.api.response.TeamResponse; +import playground.web.user.api.response.UserResponse; +import playground.web.user.api.request.UserRequest; + +import java.util.List; + +@RequiredArgsConstructor +@RestController +public class UserController { + + private final UserSearchApplication userSearchApplication; + + @GetMapping(path = "/api/teams") + public ResponseEntity> findAllTeams() { + List teamResponseDtos = userSearchApplication.findAllTeams(); + return ResponseEntity.ok(teamResponseDtos); + } + + @GetMapping(path = "/api/users") + public ResponseEntity> findUsersByTeam(UserRequest userRequest) { + List userResponseDtos = userSearchApplication.findUsersByTeam(userRequest); + return ResponseEntity.ok(userResponseDtos); + } + +} diff --git a/src/main/java/playground/web/user/api/request/UserRequest.java b/src/main/java/playground/web/user/api/request/UserRequest.java new file mode 100644 index 0000000..1ad0ac1 --- /dev/null +++ b/src/main/java/playground/web/user/api/request/UserRequest.java @@ -0,0 +1,12 @@ +package playground.web.user.api.request; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class UserRequest { + + private Long teamId; + +} diff --git a/src/main/java/playground/web/user/api/response/TeamResponse.java b/src/main/java/playground/web/user/api/response/TeamResponse.java new file mode 100644 index 0000000..df71f21 --- /dev/null +++ b/src/main/java/playground/web/user/api/response/TeamResponse.java @@ -0,0 +1,20 @@ +package playground.web.user.api.response; + + +import lombok.Getter; +import lombok.NoArgsConstructor; +import playground.domain.user.Team; + +@Getter +@NoArgsConstructor +public class TeamResponse { + + private Long id; + private String name; + + public TeamResponse(Team team) { + this.id = team.getId(); + this.name = team.getName(); + } + +} diff --git a/src/main/java/playground/web/user/api/response/UserResponse.java b/src/main/java/playground/web/user/api/response/UserResponse.java new file mode 100644 index 0000000..16de607 --- /dev/null +++ b/src/main/java/playground/web/user/api/response/UserResponse.java @@ -0,0 +1,33 @@ +package playground.web.user.api.response; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import playground.domain.user.JobPosition; +import playground.domain.user.Team; +import playground.domain.user.User; + +@Getter +@NoArgsConstructor +public class UserResponse { + + private Long id; + private JobPosition jobPosition; + private String teamName; + private String name; + + public UserResponse(User user, Team team) { + this.id = user.getId(); + this.jobPosition = user.getJobPosition(); + this.teamName = team.getName(); + this.name = user.getName(); + } + + public String getJobPosition() { + return jobPosition.name(); + } + + public String getJobPositionText() { + return jobPosition.getText(); + } + +} diff --git a/src/main/java/playground/web/user/application/UserSearchApplication.java b/src/main/java/playground/web/user/application/UserSearchApplication.java new file mode 100644 index 0000000..e6fe3bf --- /dev/null +++ b/src/main/java/playground/web/user/application/UserSearchApplication.java @@ -0,0 +1,50 @@ +package playground.web.user.application; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import playground.domain.user.Team; +import playground.domain.user.User; +import playground.service.user.UserService; +import playground.web.user.api.response.TeamResponse; +import playground.web.user.api.response.UserResponse; +import playground.web.user.api.request.UserRequest; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Transactional(readOnly = true) +@RequiredArgsConstructor +@Service +public class UserSearchApplication { + + private final UserService userService; + + public List findAllTeams() { + List allTeams = userService.findAllTeams(); + return covertTeamResponseFrom(allTeams); + } + + private List covertTeamResponseFrom(List teams) { + return teams.stream() + .map(TeamResponse::new) + .collect(Collectors.toList()); + } + + public List findUsersByTeam(UserRequest userRequest) { + Optional team = userService.findTeamById(userRequest.getTeamId()); + + if (team.isPresent()) { + return convertUserResponseFrom(team.get().getUsers(), team.get()); + } + return Collections.emptyList(); + } + + private List convertUserResponseFrom(List users, Team team) { + return users.stream() + .map(user -> new UserResponse(user, team)) + .collect(Collectors.toList()); + } +} From 7cc91f8f6b0462e886132f34c0ad954a0cb1b31a Mon Sep 17 00:00:00 2001 From: Travis Date: Sat, 11 Dec 2021 00:10:16 +0900 Subject: [PATCH 7/9] =?UTF-8?q?refactor:=20DocumentApplication=EC=9D=84=20?= =?UTF-8?q?Create=EC=99=80=20Search=20application=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/document/api/DocumentController.java | 13 ++++--- .../response/DocumentApprovalResponse.java | 38 +++++++++++++++++++ .../DocumentSearchApplication.java | 29 ++++++++++++++ 3 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 src/main/java/playground/web/document/api/response/DocumentApprovalResponse.java create mode 100644 src/main/java/playground/web/document/application/DocumentSearchApplication.java diff --git a/src/main/java/playground/web/document/api/DocumentController.java b/src/main/java/playground/web/document/api/DocumentController.java index 72153b8..d0875b8 100644 --- a/src/main/java/playground/web/document/api/DocumentController.java +++ b/src/main/java/playground/web/document/api/DocumentController.java @@ -6,8 +6,9 @@ import playground.web.document.api.request.DocumentCreateRequest; import playground.web.document.api.response.DocumentResponse; import playground.web.document.api.response.OutboxDocumentResponse; -import playground.web.document.application.DocumentApplication; +import playground.web.document.application.DocumentCreateApplication; import playground.web.document.api.request.OutboxDocumentRequest; +import playground.web.document.application.DocumentSearchApplication; import java.util.List; @@ -15,23 +16,25 @@ @RestController public class DocumentController { - private final DocumentApplication documentApplication; + private final DocumentCreateApplication documentCreateApplication; + private final DocumentSearchApplication documentSearchApplication; @PostMapping(path = "/api/documents") public ResponseEntity createDocument(@RequestBody DocumentCreateRequest requestDto) { - documentApplication.create(requestDto); + documentCreateApplication.create(requestDto); return ResponseEntity.ok().build(); } @GetMapping(path = "/api/documents/{documentId}") public ResponseEntity findDocument(@PathVariable Long documentId) { - DocumentResponse documentResponseDto = documentApplication.findDocument(documentId); + DocumentResponse documentResponseDto = documentSearchApplication.findDocument(documentId); return ResponseEntity.ok(documentResponseDto); } @GetMapping(path = "/api/documents/outbox") public ResponseEntity> findOutboxDocuments(OutboxDocumentRequest requestDto) { - List outboxDocumentDtos = documentApplication.findOutboxDocuments(requestDto); + List outboxDocumentDtos = documentSearchApplication.findOutboxDocuments(requestDto); return ResponseEntity.ok(outboxDocumentDtos); } + } diff --git a/src/main/java/playground/web/document/api/response/DocumentApprovalResponse.java b/src/main/java/playground/web/document/api/response/DocumentApprovalResponse.java new file mode 100644 index 0000000..a1af520 --- /dev/null +++ b/src/main/java/playground/web/document/api/response/DocumentApprovalResponse.java @@ -0,0 +1,38 @@ +package playground.web.document.api.response; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import playground.domain.document.ApprovalState; +import playground.domain.document.DocumentApproval; +import playground.domain.user.Team; +import playground.domain.user.User; + +@Getter +@NoArgsConstructor +public class DocumentApprovalResponse { + + private String approverTeamName; + private String approverName; + private ApprovalState approvalState; + private Integer approvalOrder; + private String approvalComment; + + public DocumentApprovalResponse(DocumentApproval documentApproval, User approver, Team team) { + this.approverTeamName = team.getName(); + + this.approverName = approver.getName(); + + this.approvalState = documentApproval.getApprovalState(); + this.approvalOrder = documentApproval.getApprovalOrder(); + this.approvalComment = documentApproval.getApprovalComment(); + } + + public String getApprovalState() { + return approvalState.name(); + } + + public String getApprovalStateText() { + return approvalState.getText(); + } + +} diff --git a/src/main/java/playground/web/document/application/DocumentSearchApplication.java b/src/main/java/playground/web/document/application/DocumentSearchApplication.java new file mode 100644 index 0000000..c835bab --- /dev/null +++ b/src/main/java/playground/web/document/application/DocumentSearchApplication.java @@ -0,0 +1,29 @@ +package playground.web.document.application; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import playground.domain.document.Document; +import playground.domain.document.DocumentApproval; +import playground.domain.user.Team; +import playground.domain.user.User; +import playground.service.document.DocumentService; +import playground.web.document.api.request.OutboxDocumentRequest; +import playground.web.document.api.response.DocumentApprovalResponse; +import playground.web.document.api.response.DocumentResponse; +import playground.web.document.api.response.OutboxDocumentResponse; +import playground.web.user.api.response.UserResponse; + +import java.util.List; +import java.util.stream.Collectors; + +import static playground.domain.document.ApprovalState.DRAFTING; + +@Transactional(readOnly = true) +@RequiredArgsConstructor +@Service +public class DocumentSearchApplication { + + private final DocumentService documentService; + +} From cf9981f5dfeef36b06f207c1cd8d45f08c30db65 Mon Sep 17 00:00:00 2001 From: Travis Date: Sat, 11 Dec 2021 00:10:58 +0900 Subject: [PATCH 8/9] =?UTF-8?q?feat:=20DocumentApproval=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EA=B8=B0=EC=A1=B4=20dto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http/document.http | 5 ++- .../api/response/DocumentResponse.java | 14 ++++---- ...on.java => DocumentCreateApplication.java} | 28 ++-------------- .../DocumentSearchApplication.java | 33 +++++++++++++++++++ 4 files changed, 47 insertions(+), 33 deletions(-) rename src/main/java/playground/web/document/application/{DocumentApplication.java => DocumentCreateApplication.java} (60%) diff --git a/http/document.http b/http/document.http index b395e38..eb28876 100644 --- a/http/document.http +++ b/http/document.http @@ -2,7 +2,10 @@ GET http://localhost:8080/api/documents/1 ### document outbox 조회 -GET http://localhost:8080/api/documents/outbox?drafterId=1 +GET http://localhost:8080/api/documents/outbox?drafterId=2 + +### 문서 분류 조회 +GET http://localhost:8080/api/documents/categories ### document create POST http://localhost:8080/api/documents diff --git a/src/main/java/playground/web/document/api/response/DocumentResponse.java b/src/main/java/playground/web/document/api/response/DocumentResponse.java index 3951f35..3ed3cea 100644 --- a/src/main/java/playground/web/document/api/response/DocumentResponse.java +++ b/src/main/java/playground/web/document/api/response/DocumentResponse.java @@ -3,9 +3,11 @@ import lombok.Getter; import lombok.NoArgsConstructor; import playground.domain.document.Document; -import playground.domain.user.User; import playground.domain.document.ApprovalState; import playground.domain.document.Category; +import playground.web.user.api.response.UserResponse; + +import java.util.List; @Getter @NoArgsConstructor @@ -15,19 +17,19 @@ public class DocumentResponse { private String title; private Category category; private String contents; - private Long userId; private ApprovalState approvalState; - private String userName; + private UserResponse drafter; + private List approvers; - public DocumentResponse(Document document, User drafter) { + public DocumentResponse(Document document, UserResponse drafter, List approvers) { this.id = document.getId(); this.title = document.getTitle(); this.category = document.getCategory(); this.contents = document.getContents(); this.approvalState = document.getApprovalState(); - this.userId = drafter.getId(); - this.userName = drafter.getName(); + this.drafter = drafter; + this.approvers = approvers; } public String getCategoryText() { diff --git a/src/main/java/playground/web/document/application/DocumentApplication.java b/src/main/java/playground/web/document/application/DocumentCreateApplication.java similarity index 60% rename from src/main/java/playground/web/document/application/DocumentApplication.java rename to src/main/java/playground/web/document/application/DocumentCreateApplication.java index bc4343d..92c3faf 100644 --- a/src/main/java/playground/web/document/application/DocumentApplication.java +++ b/src/main/java/playground/web/document/application/DocumentCreateApplication.java @@ -8,26 +8,20 @@ import playground.service.document.DocumentService; import playground.service.user.UserService; import playground.web.document.api.request.DocumentCreateRequest; -import playground.web.document.api.request.OutboxDocumentRequest; -import playground.web.document.api.response.DocumentResponse; -import playground.web.document.api.response.OutboxDocumentResponse; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static playground.domain.document.ApprovalState.DRAFTING; - -@Transactional(readOnly = true) +@Transactional @RequiredArgsConstructor @Service -public class DocumentApplication { +public class DocumentCreateApplication { private final DocumentService documentService; private final UserService userService; - @Transactional public void create(DocumentCreateRequest request) { List orderedApprovers = createOrderedApprovers(request); User drafter = userService.getById(request.getDrafterId()); @@ -54,22 +48,4 @@ private Map createApproverMap(DocumentCreateRequest request) { .collect(Collectors.toMap(User::getId, user -> user)); } - public DocumentResponse findDocument(Long documentId) { - Document document = documentService.getById(documentId); - User drafter = document.getDrafter(); - - return new DocumentResponse(document, drafter); - } - - public List findOutboxDocuments(OutboxDocumentRequest request) { - List documents = documentService.findAllByDrafterIdAndApprovalStateOrderByIdDesc(request.getDrafterId(), DRAFTING); - return convertOutboxDocumentResponseFrom(documents); - } - - private List convertOutboxDocumentResponseFrom(List documents) { - return documents.stream() - .map(OutboxDocumentResponse::new) - .collect(Collectors.toList()); - } - } diff --git a/src/main/java/playground/web/document/application/DocumentSearchApplication.java b/src/main/java/playground/web/document/application/DocumentSearchApplication.java index c835bab..913c891 100644 --- a/src/main/java/playground/web/document/application/DocumentSearchApplication.java +++ b/src/main/java/playground/web/document/application/DocumentSearchApplication.java @@ -26,4 +26,37 @@ public class DocumentSearchApplication { private final DocumentService documentService; + public DocumentResponse findDocument(Long documentId) { + Document document = documentService.getById(documentId); + UserResponse drafter = convertUserResponseFrom(document.getDrafter()); + List approvers = convertDocumentApprovalResponse(document.getDocumentApprovals()); + + return new DocumentResponse(document, drafter, approvers); + } + + private UserResponse convertUserResponseFrom(User user) { + Team team = user.getTeam(); + return new UserResponse(user, team); + } + + private List convertDocumentApprovalResponse(List documentApprovals) { + return documentApprovals.stream() + .map(documentApproval -> { + User approver = documentApproval.getApprover(); + Team team = approver.getTeam(); + return new DocumentApprovalResponse(documentApproval, approver, team); + }) + .collect(Collectors.toList()); + } + + public List findOutboxDocuments(OutboxDocumentRequest request) { + List documents = documentService.findAllByDrafterIdAndApprovalStateOrderByIdDesc(request.getDrafterId(), DRAFTING); + return convertOutboxDocumentResponseFrom(documents); + } + + private List convertOutboxDocumentResponseFrom(List documents) { + return documents.stream() + .map(OutboxDocumentResponse::new) + .collect(Collectors.toList()); + } } From edfdc22c053b28e7e1ce55c2ec6fe0e81133937c Mon Sep 17 00:00:00 2001 From: Travis Date: Sat, 11 Dec 2021 00:32:10 +0900 Subject: [PATCH 9/9] =?UTF-8?q?feat:=20=EB=AC=B8=EC=84=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A5=98=20=EC=A1=B0=ED=9A=8C=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/document/DocumentService.java | 9 +++++++-- .../web/document/api/DocumentController.java | 7 +++++++ .../response/DocumentCategoryResponse.java | 19 +++++++++++++++++++ .../DocumentSearchApplication.java | 14 ++++++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 src/main/java/playground/web/document/api/response/DocumentCategoryResponse.java diff --git a/src/main/java/playground/service/document/DocumentService.java b/src/main/java/playground/service/document/DocumentService.java index 67fca68..5682880 100644 --- a/src/main/java/playground/service/document/DocumentService.java +++ b/src/main/java/playground/service/document/DocumentService.java @@ -3,12 +3,12 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import playground.domain.document.Category; import playground.domain.document.Document; import playground.domain.document.DocumentRepository; import playground.domain.document.ApprovalState; -import java.util.List; -import java.util.Optional; +import java.util.*; @Transactional(readOnly = true) @RequiredArgsConstructor @@ -34,4 +34,9 @@ public Document getById(Long documentId) { public List findAllByDrafterIdAndApprovalStateOrderByIdDesc(Long drafterId, ApprovalState approvalState) { return documentRepository.findByDrafterIdAndApprovalStateOrderByIdDesc(drafterId, approvalState); } + + public List findAllDocumentCategories() { + Category[] categories = Category.values(); + return Arrays.asList(categories); + } } diff --git a/src/main/java/playground/web/document/api/DocumentController.java b/src/main/java/playground/web/document/api/DocumentController.java index d0875b8..397bc0f 100644 --- a/src/main/java/playground/web/document/api/DocumentController.java +++ b/src/main/java/playground/web/document/api/DocumentController.java @@ -4,6 +4,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import playground.web.document.api.request.DocumentCreateRequest; +import playground.web.document.api.response.DocumentCategoryResponse; import playground.web.document.api.response.DocumentResponse; import playground.web.document.api.response.OutboxDocumentResponse; import playground.web.document.application.DocumentCreateApplication; @@ -37,4 +38,10 @@ public ResponseEntity> findOutboxDocuments(OutboxDo return ResponseEntity.ok(outboxDocumentDtos); } + @GetMapping(path = "/api/documents/categories") + public ResponseEntity> findDocumentCategories() { + List documentCategoryDtos = documentSearchApplication.findDocumentCategories(); + return ResponseEntity.ok(documentCategoryDtos); + } + } diff --git a/src/main/java/playground/web/document/api/response/DocumentCategoryResponse.java b/src/main/java/playground/web/document/api/response/DocumentCategoryResponse.java new file mode 100644 index 0000000..00d38e1 --- /dev/null +++ b/src/main/java/playground/web/document/api/response/DocumentCategoryResponse.java @@ -0,0 +1,19 @@ +package playground.web.document.api.response; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import playground.domain.document.Category; + +@Getter +@NoArgsConstructor +public class DocumentCategoryResponse { + + private String value; + private String text; + + public DocumentCategoryResponse(Category category) { + this.value = category.name(); + this.text = category.getText(); + } + +} diff --git a/src/main/java/playground/web/document/application/DocumentSearchApplication.java b/src/main/java/playground/web/document/application/DocumentSearchApplication.java index 913c891..2e845d0 100644 --- a/src/main/java/playground/web/document/application/DocumentSearchApplication.java +++ b/src/main/java/playground/web/document/application/DocumentSearchApplication.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import playground.domain.document.Category; import playground.domain.document.Document; import playground.domain.document.DocumentApproval; import playground.domain.user.Team; @@ -10,6 +11,7 @@ import playground.service.document.DocumentService; import playground.web.document.api.request.OutboxDocumentRequest; import playground.web.document.api.response.DocumentApprovalResponse; +import playground.web.document.api.response.DocumentCategoryResponse; import playground.web.document.api.response.DocumentResponse; import playground.web.document.api.response.OutboxDocumentResponse; import playground.web.user.api.response.UserResponse; @@ -59,4 +61,16 @@ private List convertOutboxDocumentResponseFrom(List findDocumentCategories() { + List documentCategories = documentService.findAllDocumentCategories(); + return convertDocumentCategoryResponseFrom(documentCategories); + } + + private List convertDocumentCategoryResponseFrom(List documentCategories) { + return documentCategories.stream() + .map(DocumentCategoryResponse::new) + .collect(Collectors.toList()); + } + }