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/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/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..6a207c8 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") @@ -40,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/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/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/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/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/domain/user/User.java b/src/main/java/playground/domain/user/User.java index b61357e..2bba08d 100644 --- a/src/main/java/playground/domain/user/User.java +++ b/src/main/java/playground/domain/user/User.java @@ -23,10 +23,19 @@ 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; + @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 diff --git a/src/main/java/playground/service/document/DocumentApplication.java b/src/main/java/playground/service/document/DocumentApplication.java deleted file mode 100644 index 571d48e..0000000 --- a/src/main/java/playground/service/document/DocumentApplication.java +++ /dev/null @@ -1,83 +0,0 @@ -package playground.service.document; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import playground.domain.user.User; -import playground.service.document.dto.DocumentResponse; -import playground.service.document.dto.OutboxDocumentResponse; -import playground.service.user.UserService; -import playground.web.document.dto.DocumentCreateRequest; -import playground.domain.document.Document; -import playground.web.document.dto.OutboxDocumentRequest; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static playground.common.type.ApprovalState.DRAFTING; - -@Transactional(readOnly = true) -@RequiredArgsConstructor -@Service -public class DocumentApplication { - - private final DocumentService documentService; - private final UserService userService; - - public void create(DocumentCreateRequest request) { - List orderedApprovers = createOrderedApprovers(request); - User drafter = findUserById(request.getDrafterId()); - - Document document = request.toEntity(drafter); - document.createApprovals(orderedApprovers); - - documentService.createDocument(document); - } - - private List createOrderedApprovers(DocumentCreateRequest request) { - Map approversById = createApproverMap(request); - - List orderedApprovers = new ArrayList<>(); - for (Long approverId : request.getApproverIds()) { - orderedApprovers.add(approversById.get(approverId)); - } - return orderedApprovers; - } - - private Map createApproverMap(DocumentCreateRequest request) { - List approvers = userService.findAllById(request.getApproverIds()); - return approvers.stream() - .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); - 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); - } - - private List convertOutboxDocumentResponseFrom(List documents) { - return documents.stream() - .map(OutboxDocumentResponse::new) - .collect(Collectors.toList()); - } - -} diff --git a/src/main/java/playground/service/document/DocumentService.java b/src/main/java/playground/service/document/DocumentService.java index 52c26e6..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.common.type.ApprovalState; +import playground.domain.document.ApprovalState; -import java.util.List; -import java.util.Optional; +import java.util.*; @Transactional(readOnly = true) @RequiredArgsConstructor @@ -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,7 +26,17 @@ 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); } + + public List findAllDocumentCategories() { + Category[] categories = Category.values(); + return Arrays.asList(categories); + } } 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(); + } } diff --git a/src/main/java/playground/web/document/DocumentController.java b/src/main/java/playground/web/document/DocumentController.java deleted file mode 100644 index 0b63962..0000000 --- a/src/main/java/playground/web/document/DocumentController.java +++ /dev/null @@ -1,37 +0,0 @@ -package playground.web.document; - -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 java.util.List; - -@RequiredArgsConstructor -@RestController -public class DocumentController { - - private final DocumentApplication documentApplication; - - @PostMapping(path = "/api/documents") - public ResponseEntity createDocument(@RequestBody DocumentCreateRequest requestDto) { - documentApplication.create(requestDto); - return ResponseEntity.ok().build(); - } - - @GetMapping(path = "/api/documents/{documentId}") - public ResponseEntity findDocument(@PathVariable Long documentId) { - DocumentResponse documentResponseDto = documentApplication.findDocument(documentId); - return ResponseEntity.ok(documentResponseDto); - } - - @GetMapping(path = "/api/documents/outbox") - public ResponseEntity> findOutboxDocuments(OutboxDocumentRequest requestDto) { - List outboxDocumentDtos = documentApplication.findOutboxDocuments(requestDto); - return ResponseEntity.ok(outboxDocumentDtos); - } -} diff --git a/src/main/java/playground/web/document/api/DocumentController.java b/src/main/java/playground/web/document/api/DocumentController.java new file mode 100644 index 0000000..397bc0f --- /dev/null +++ b/src/main/java/playground/web/document/api/DocumentController.java @@ -0,0 +1,47 @@ +package playground.web.document.api; + +import lombok.RequiredArgsConstructor; +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; +import playground.web.document.api.request.OutboxDocumentRequest; +import playground.web.document.application.DocumentSearchApplication; + +import java.util.List; + +@RequiredArgsConstructor +@RestController +public class DocumentController { + + private final DocumentCreateApplication documentCreateApplication; + private final DocumentSearchApplication documentSearchApplication; + + @PostMapping(path = "/api/documents") + public ResponseEntity createDocument(@RequestBody DocumentCreateRequest requestDto) { + documentCreateApplication.create(requestDto); + return ResponseEntity.ok().build(); + } + + @GetMapping(path = "/api/documents/{documentId}") + public ResponseEntity findDocument(@PathVariable Long documentId) { + DocumentResponse documentResponseDto = documentSearchApplication.findDocument(documentId); + return ResponseEntity.ok(documentResponseDto); + } + + @GetMapping(path = "/api/documents/outbox") + public ResponseEntity> findOutboxDocuments(OutboxDocumentRequest requestDto) { + List outboxDocumentDtos = documentSearchApplication.findOutboxDocuments(requestDto); + 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/dto/DocumentCreateRequest.java b/src/main/java/playground/web/document/api/request/DocumentCreateRequest.java similarity index 79% rename from src/main/java/playground/web/document/dto/DocumentCreateRequest.java rename to src/main/java/playground/web/document/api/request/DocumentCreateRequest.java index 2238217..35100cc 100644 --- a/src/main/java/playground/web/document/dto/DocumentCreateRequest.java +++ b/src/main/java/playground/web/document/api/request/DocumentCreateRequest.java @@ -1,13 +1,13 @@ -package playground.web.document.dto; +package playground.web.document.api.request; 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 { 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/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/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/service/document/dto/DocumentResponse.java b/src/main/java/playground/web/document/api/response/DocumentResponse.java similarity index 59% rename from src/main/java/playground/service/document/dto/DocumentResponse.java rename to src/main/java/playground/web/document/api/response/DocumentResponse.java index bbf68eb..3ed3cea 100644 --- a/src/main/java/playground/service/document/dto/DocumentResponse.java +++ b/src/main/java/playground/web/document/api/response/DocumentResponse.java @@ -1,11 +1,13 @@ -package playground.service.document.dto; +package playground.web.document.api.response; import lombok.Getter; 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; +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/service/document/dto/OutboxDocumentResponse.java b/src/main/java/playground/web/document/api/response/OutboxDocumentResponse.java similarity index 83% rename from src/main/java/playground/service/document/dto/OutboxDocumentResponse.java rename to src/main/java/playground/web/document/api/response/OutboxDocumentResponse.java index a9ad334..4de3e37 100644 --- a/src/main/java/playground/service/document/dto/OutboxDocumentResponse.java +++ b/src/main/java/playground/web/document/api/response/OutboxDocumentResponse.java @@ -1,10 +1,10 @@ -package playground.service.document.dto; +package playground.web.document.api.response; 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/application/DocumentCreateApplication.java b/src/main/java/playground/web/document/application/DocumentCreateApplication.java new file mode 100644 index 0000000..92c3faf --- /dev/null +++ b/src/main/java/playground/web/document/application/DocumentCreateApplication.java @@ -0,0 +1,51 @@ +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.DocumentService; +import playground.service.user.UserService; +import playground.web.document.api.request.DocumentCreateRequest; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Transactional +@RequiredArgsConstructor +@Service +public class DocumentCreateApplication { + + private final DocumentService documentService; + private final UserService userService; + + public void create(DocumentCreateRequest request) { + List orderedApprovers = createOrderedApprovers(request); + User drafter = userService.getById(request.getDrafterId()); + + Document document = request.toEntity(drafter); + document.createApprovals(orderedApprovers); + + documentService.create(document); + } + + private List createOrderedApprovers(DocumentCreateRequest request) { + Map approversById = createApproverMap(request); + + List orderedApprovers = new ArrayList<>(); + for (Long approverId : request.getApproverIds()) { + orderedApprovers.add(approversById.get(approverId)); + } + return orderedApprovers; + } + + private Map createApproverMap(DocumentCreateRequest request) { + List approvers = userService.findAllById(request.getApproverIds()); + return approvers.stream() + .collect(Collectors.toMap(User::getId, user -> user)); + } + +} 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..2e845d0 --- /dev/null +++ b/src/main/java/playground/web/document/application/DocumentSearchApplication.java @@ -0,0 +1,76 @@ +package playground.web.document.application; + +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; +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.DocumentCategoryResponse; +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; + + 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()); + } + + public List findDocumentCategories() { + List documentCategories = documentService.findAllDocumentCategories(); + return convertDocumentCategoryResponseFrom(documentCategories); + } + + private List convertDocumentCategoryResponseFrom(List documentCategories) { + return documentCategories.stream() + .map(DocumentCategoryResponse::new) + .collect(Collectors.toList()); + } + +} 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()); + } +}