From 7788594fc3f616042965712c646435b864253d1c Mon Sep 17 00:00:00 2001 From: infiniment Date: Fri, 16 Jan 2026 10:43:38 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[Feat]=20=ED=94=84=EB=A1=9C=EC=84=B8?= =?UTF-8?q?=EC=8A=A4,=20=EC=9B=8C=ED=81=AC=EC=8A=A4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=84=A4=EA=B3=84=20?= =?UTF-8?q?=EB=B0=8F=20DTO=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../process/controller/ProcessController.java | 28 ++++ .../process/dto/req/ProcessCreateReqDTO.java | 48 ++++++ .../dto/req/ProcessTaskItemReqDTO.java | 13 ++ .../team/process/dto/res/AssigneeResDTO.java | 14 ++ .../process/dto/res/FieldGroupResDTO.java | 15 ++ .../process/dto/res/ProcessCardResDTO.java | 37 +++++ .../process/dto/res/ProcessCreateResDTO.java | 8 + .../process/dto/res/ProcessWeekResDTO.java | 16 ++ .../com/nect/core/entity/team/Project.java | 69 +++++++++ .../nect/core/entity/team/ProjectUser.java | 5 + .../nect/core/entity/team/SharedDocument.java | 76 ++++++++++ .../core/entity/team/enums/ProjectStatus.java | 5 + .../entity/team/enums/RecruitmentStatus.java | 5 + .../nect/core/entity/team/process/Link.java | 35 +++++ .../core/entity/team/process/Process.java | 142 ++++++++++++++++++ .../entity/team/process/ProcessFeedback.java | 64 ++++++++ .../entity/team/process/ProcessField.java | 49 ++++++ .../team/process/ProcessSharedDocument.java | 52 +++++++ .../entity/team/process/ProcessTaskItem.java | 50 ++++++ .../core/entity/team/process/ProcessUser.java | 72 +++++++++ .../team/process/enums/AssignmentRole.java | 5 + .../process/enums/ProcessFeedbackStatus.java | 5 + .../team/process/enums/ProcessStatus.java | 5 + .../nect/core/entity/team/workspace/Post.java | 53 +++++++ .../entity/team/workspace/PostAttachment.java | 39 +++++ .../entity/team/workspace/PostComment.java | 65 ++++++++ .../team/workspace/PostCommentLike.java | 40 +++++ .../core/entity/team/workspace/PostLike.java | 40 +++++ .../entity/team/workspace/ProjectHistory.java | 39 +++++ .../team/workspace/enums/ActionType.java | 12 ++ .../entity/team/workspace/enums/PostType.java | 5 + .../repository/team/ProjectRepository.java | 7 + .../team/SharedDocumentRepository.java | 7 + .../team/process/ProcessRepository.java | 7 + 34 files changed, 1132 insertions(+) create mode 100644 nect-api/src/main/java/com/nect/api/domain/team/process/controller/ProcessController.java create mode 100644 nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessCreateReqDTO.java create mode 100644 nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessTaskItemReqDTO.java create mode 100644 nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/AssigneeResDTO.java create mode 100644 nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/FieldGroupResDTO.java create mode 100644 nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCardResDTO.java create mode 100644 nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCreateResDTO.java create mode 100644 nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessWeekResDTO.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/Project.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/ProjectUser.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/SharedDocument.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectStatus.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/enums/RecruitmentStatus.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/process/Link.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/process/Process.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/process/ProcessFeedback.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/process/ProcessField.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/process/ProcessSharedDocument.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/process/ProcessTaskItem.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/process/ProcessUser.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/process/enums/AssignmentRole.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/process/enums/ProcessFeedbackStatus.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/process/enums/ProcessStatus.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/workspace/Post.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/workspace/PostAttachment.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/workspace/PostComment.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/workspace/PostCommentLike.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/workspace/PostLike.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/workspace/ProjectHistory.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/workspace/enums/ActionType.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/workspace/enums/PostType.java create mode 100644 nect-core/src/main/java/com/nect/core/repository/team/ProjectRepository.java create mode 100644 nect-core/src/main/java/com/nect/core/repository/team/SharedDocumentRepository.java create mode 100644 nect-core/src/main/java/com/nect/core/repository/team/process/ProcessRepository.java diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/controller/ProcessController.java b/nect-api/src/main/java/com/nect/api/domain/team/process/controller/ProcessController.java new file mode 100644 index 0000000..12820cb --- /dev/null +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/controller/ProcessController.java @@ -0,0 +1,28 @@ +package com.nect.api.domain.team.process.controller; + +import com.nect.api.domain.team.process.dto.req.ProcessCreateReqDTO; +import com.nect.api.domain.team.process.dto.res.ProcessCreateResDTO; +import com.nect.api.global.response.ApiResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/projects/{projectId}/processes") +@RequiredArgsConstructor +public class ProcessController { + + // TODO : private final ProcessService processService + + // 새 프로세스 생성 + @PostMapping + public ApiResponse createProcess( + @PathVariable Long projectId, + @RequestBody ProcessCreateReqDTO request + ) { + // TODO : Long processId = processService.createProcess(projectId, request); + + Long processId = 1L; // 임시 + return ApiResponse.ok(new ProcessCreateResDTO(processId)); + } + +} diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessCreateReqDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessCreateReqDTO.java new file mode 100644 index 0000000..dc9981b --- /dev/null +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessCreateReqDTO.java @@ -0,0 +1,48 @@ +package com.nect.api.domain.team.process.dto.req; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.nect.core.entity.team.process.enums.ProcessStatus; + +import java.time.LocalDate; +import java.util.List; + +public record ProcessCreateReqDTO( + // TODO : @Valid 나중에 필수값 확정되면 사용하기 + + @JsonProperty("process_title") + String processTitle, + + @JsonProperty("process_content") + String processContent, + + @JsonProperty("process_status") + ProcessStatus processStatus, + + @JsonProperty("assignee_ids") + List assigneeIds, + + @JsonProperty("field_ids") + List fieldIds, + + @JsonProperty("start_date") + LocalDate startDate, + + @JsonProperty("dead_line") + LocalDate deadLine, + + @JsonProperty("mentions") + List mentions, + + @JsonProperty("file_ids") + List fileIds, + + @JsonProperty("links") + List links, + + @JsonProperty("task_items") + List taskItems + + +// TODO : 일단은 null -> 프로세스 생성할 때 초기 피드백도 같이 등록할 수 있으면 사용 +// List feedbacks +) {} diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessTaskItemReqDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessTaskItemReqDTO.java new file mode 100644 index 0000000..78bad90 --- /dev/null +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessTaskItemReqDTO.java @@ -0,0 +1,13 @@ +package com.nect.api.domain.team.process.dto.req; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public record ProcessTaskItemReqDTO( + String content, + + @JsonProperty("is_done") + Boolean isDone, + + @JsonProperty("sort_order") + Integer sortOrder +) {} diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/AssigneeResDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/AssigneeResDTO.java new file mode 100644 index 0000000..78a51fc --- /dev/null +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/AssigneeResDTO.java @@ -0,0 +1,14 @@ +package com.nect.api.domain.team.process.dto.res; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public record AssigneeResDTO( + @JsonProperty("user_id") + Long userId, + + @JsonProperty("user_name") + String userName, + + @JsonProperty("user_image") + String userImage +) {} diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/FieldGroupResDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/FieldGroupResDTO.java new file mode 100644 index 0000000..81b15b9 --- /dev/null +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/FieldGroupResDTO.java @@ -0,0 +1,15 @@ +package com.nect.api.domain.team.process.dto.res; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public record FieldGroupResDTO( + @JsonProperty("field_id") + Long fieldId, + + @JsonProperty("field_name") + String fieldName, + + List processes +) {} diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCardResDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCardResDTO.java new file mode 100644 index 0000000..b5c8a64 --- /dev/null +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCardResDTO.java @@ -0,0 +1,37 @@ +package com.nect.api.domain.team.process.dto.res; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.time.LocalDate; +import java.util.List; + +public record ProcessCardResDTO( + @JsonProperty("process_id") + Long processId, + + @JsonProperty("process_status") + String processStatus, + + // 파트(담당 분야) + String field, + + String title, + + @JsonProperty("complete_check_list") + Integer completeCheckList, + + @JsonProperty("whole_check_list") + Integer wholeCheckList, + + @JsonProperty("start_date") + LocalDate startDate, + + @JsonProperty("dead_line") + LocalDate deadLine, + + @JsonProperty("left_day") + Integer leftDay, + + @JsonProperty("assignee") + List assignee +) {} diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCreateResDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCreateResDTO.java new file mode 100644 index 0000000..1bec844 --- /dev/null +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCreateResDTO.java @@ -0,0 +1,8 @@ +package com.nect.api.domain.team.process.dto.res; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public record ProcessCreateResDTO( + @JsonProperty("process_id") + Long processId +) {} diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessWeekResDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessWeekResDTO.java new file mode 100644 index 0000000..948dccd --- /dev/null +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessWeekResDTO.java @@ -0,0 +1,16 @@ +package com.nect.api.domain.team.process.dto.res; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public record ProcessWeekResDTO( + @JsonProperty("start_date") + String startDate, + + @JsonProperty("project_purpose") + List projectPurpose, + + @JsonProperty("by_field") + List byField +) {} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/Project.java b/nect-core/src/main/java/com/nect/core/entity/team/Project.java new file mode 100644 index 0000000..8a806e2 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/Project.java @@ -0,0 +1,69 @@ +package com.nect.core.entity.team; + +import com.nect.core.entity.BaseEntity; +import com.nect.core.entity.team.enums.ProjectStatus; +import com.nect.core.entity.team.enums.RecruitmentStatus; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "project") +public class Project extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "title", length = 50, nullable = false) + private String title; + + @Column(name = "description", length = 100) + private String description; + + @Column(name = "information", columnDefinition = "TEXT") + private String information; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private ProjectStatus status; + + @Column(name = "notice_text", columnDefinition = "TEXT") + private String noticeText; + + // 정규 회의 + @Column(name = "regular_meeting_text", columnDefinition = "TEXT") + private String regularMeetingText; + + // 모집 상태 + @Enumerated(EnumType.STRING) + @Column(name = "recruitment_status", nullable = false) + private RecruitmentStatus recruitmentStatus; + + @Column(name = "ended_at") + private LocalDateTime endedAt; + + + @Builder + protected Project(String title, + String description, + String information, + ProjectStatus status, + String noticeText, + String regularMeetingText) { + this.title = title; + this.description = description; + this.information = information; + this.status = (status == null) ? ProjectStatus.ACTIVE : status; + this.noticeText = noticeText; + this.regularMeetingText = regularMeetingText; + } + + public void end() { + this.status = ProjectStatus.ENDED; + this.recruitmentStatus = RecruitmentStatus.CLOSED; + this.endedAt = LocalDateTime.now(); + } +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/ProjectUser.java b/nect-core/src/main/java/com/nect/core/entity/team/ProjectUser.java new file mode 100644 index 0000000..f7e094f --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/ProjectUser.java @@ -0,0 +1,5 @@ +package com.nect.core.entity.team; + +public class ProjectUser { + +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/SharedDocument.java b/nect-core/src/main/java/com/nect/core/entity/team/SharedDocument.java new file mode 100644 index 0000000..3ff1237 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/SharedDocument.java @@ -0,0 +1,76 @@ +package com.nect.core.entity.team; + +import com.nect.core.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "shared_document") +public class SharedDocument extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // TODO +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "created_by", nullable = false) +// private User createdBy; + + @Column(name = "is_pinned", nullable = false) + private boolean isPinned; + + @Column(name = "title", length = 200, nullable = false) + private String title; + + @Column(name = "description", columnDefinition = "TEXT") + private String description; + + @Column(name = "file_name", length = 200, nullable = false) + private String fileName; + + @Column(name = "file_ext", length = 10, nullable = false) + private String fileExt; // jpg, png, pdf, zip + + @Column(name = "file_url", nullable = false, columnDefinition = "TEXT") + private String fileUrl; + + @Column(name = "deleted_at") + private LocalDateTime deletedAt; + + // TODO : 매개변수 User createdBy 추가 + @Builder + private SharedDocument( + boolean isPinned, + String title, + String description, + String fileName, + String fileExt, + String fileUrl) { +// this.createdBy = createdBy; + this.isPinned = isPinned; + this.title = title; + this.description = description; + this.fileName = fileName; + this.fileExt = fileExt; + this.fileUrl = fileUrl; + } + + public void pin() { + this.isPinned = true; + } + + public void unpin() { + this.isPinned = false; + } + + public void softDelete() { + this.deletedAt = LocalDateTime.now(); + } +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectStatus.java b/nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectStatus.java new file mode 100644 index 0000000..98b84d2 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectStatus.java @@ -0,0 +1,5 @@ +package com.nect.core.entity.team.enums; + +public enum ProjectStatus { + ACTIVE, ENDED +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/enums/RecruitmentStatus.java b/nect-core/src/main/java/com/nect/core/entity/team/enums/RecruitmentStatus.java new file mode 100644 index 0000000..ef0e2b5 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/enums/RecruitmentStatus.java @@ -0,0 +1,5 @@ +package com.nect.core.entity.team.enums; + +public enum RecruitmentStatus { + UPCOMING, OPEN, CLOSED +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/Link.java b/nect-core/src/main/java/com/nect/core/entity/team/process/Link.java new file mode 100644 index 0000000..1e7fba4 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/Link.java @@ -0,0 +1,35 @@ +package com.nect.core.entity.team.process; + +import com.nect.core.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "link") +public class Link extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="process_id", nullable=false) + private Process process; + + @Column(name = "url", nullable = false, columnDefinition = "TEXT") + private String url; + + @Builder + public Link(Process process, String url) { + this.process = process; + this.url = url; + } + + void setProcess(Process process) { + this.process = process; + } +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/Process.java b/nect-core/src/main/java/com/nect/core/entity/team/process/Process.java new file mode 100644 index 0000000..2cfc4df --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/Process.java @@ -0,0 +1,142 @@ +package com.nect.core.entity.team.process; + +import com.nect.core.entity.BaseEntity; +import com.nect.core.entity.team.Project; +import com.nect.core.entity.team.process.enums.ProcessStatus; +import com.nect.core.entity.team.SharedDocument; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "process") +public class Process extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // 프로젝트 1 : N 프로세스(카드) + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "project_id", nullable = false) + private Project project; + + // TODO + // 작성자(created_by) +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "created_by", nullable = false) +// private User createdBy; + + // TODO + // 파트(분야/레인) - Field FK +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "field_id", nullable = false) +// private Field field; + + @Column(name = "title", length = 50, nullable = false) + private String title; + + @Lob + @Column(name = "content") + private String content; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private ProcessStatus status; + + @Column(name = "start_at") + private LocalDate startAt; + + @Column(name = "end_at") + private LocalDate endAt; + + @Column(name = "status_order", nullable = false) + private Integer statusOrder = 0; + + @Column(name = "deleted_at") + private LocalDateTime deletedAt; + + @OneToMany(mappedBy = "process", cascade = CascadeType.ALL, orphanRemoval = true) + private final List taskItems = new ArrayList<>(); + + @OneToMany(mappedBy = "process", cascade = CascadeType.ALL, orphanRemoval = true) + private final List links = new ArrayList<>(); + + @OneToMany(mappedBy = "process", cascade = CascadeType.ALL, orphanRemoval = true) + private final List processUsers = new ArrayList<>(); + + @OneToMany(mappedBy = "process", cascade = CascadeType.ALL, orphanRemoval = true) + private final List sharedDocuments = new ArrayList<>(); + + @OneToMany(mappedBy = "process", cascade = CascadeType.ALL, orphanRemoval = true) + private final List processFields = new ArrayList<>(); + + + // TODO : User createdBy, Field field 매개변수 추가하기 + @Builder + private Process(Project project, String title, String content) { + this.project = project; +// this.createdBy = createdBy; +// this.field = field; + this.title = title; + this.content = content; + this.status = ProcessStatus.PLANNING; + this.statusOrder = 0; + } + + public void attachDocument(SharedDocument doc) { + ProcessSharedDocument psd = ProcessSharedDocument.builder() + .process(this) + .document(doc) + .build(); + this.sharedDocuments.add(psd); + } + + public void addTaskItem(ProcessTaskItem item) { + item.setProcess(this); + this.taskItems.add(item); + } + + public void addLink(Link link) { + link.setProcess(this); + this.links.add(link); + } + + public void addProcessUser(ProcessUser pu) { + pu.setProcess(this); + this.processUsers.add(pu); + } + + // TODO : Field 엔티티 생성되면 주석 풀기 +// public void addField(Field field) { +// ProcessField pf = ProcessField.builder() +// .process(this) +// .field(field) +// .build(); +// this.processFields.add(pf); +// } + + public void updateStatus(ProcessStatus status) { + if (status != null) this.status = status; + } + + public void updatePeriod(LocalDate startAt, LocalDate endAt) { + this.startAt = startAt; + this.endAt = endAt; + } + + public void updateContent(String content) { + this.content = content; + } + + public void softDelete() { + this.deletedAt = LocalDateTime.now(); + } +} + + diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessFeedback.java b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessFeedback.java new file mode 100644 index 0000000..f933b3a --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessFeedback.java @@ -0,0 +1,64 @@ +package com.nect.core.entity.team.process; + +import com.nect.core.entity.BaseEntity; +import com.nect.core.entity.team.process.enums.ProcessFeedbackStatus; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "process_feedback") +public class ProcessFeedback extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="process_id", nullable=false) + private Process process; + + // TODO +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "created_by", nullable = false) +// private User createdBy; + + @Lob + @Column(name = "content", nullable = false) + private String content; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private ProcessFeedbackStatus status; + + @Column(name = "resolved_at") + private LocalDateTime resolvedAt; + + // TODO : User createdBy 추가하기 + @Builder + private ProcessFeedback(Process process, String content) { + this.process = process; +// this.createdBy = createdBy; + this.content = content; + this.status = ProcessFeedbackStatus.OPEN; + } + + void setProcess(Process process) { + this.process = process; + } + + public void resolve() { + this.status = ProcessFeedbackStatus.RESOLVED; + this.resolvedAt = LocalDateTime.now(); + } + + public void reopen() { + this.status = ProcessFeedbackStatus.OPEN; + this.resolvedAt = null; + } +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessField.java b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessField.java new file mode 100644 index 0000000..5309d1f --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessField.java @@ -0,0 +1,49 @@ +package com.nect.core.entity.team.process; + +import com.nect.core.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table( + name = "process_field", + uniqueConstraints = { + @UniqueConstraint( + name = "uk_process_field_process_field", + columnNames = {"process_id", "field_id"} + ) + } +) +public class ProcessField extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "process_id", nullable = false) + private Process process; + + // TODO +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "field_id", nullable = false) +// private Field field; + + @Column(name = "deleted_at") + private LocalDateTime deletedAt; + + // TODO : Field 추가 + @Builder + public ProcessField(Process process) { + this.process = process; +// this.field = field; + } + + void setProcess(Process process) { this.process = process; } +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessSharedDocument.java b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessSharedDocument.java new file mode 100644 index 0000000..5e4cea4 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessSharedDocument.java @@ -0,0 +1,52 @@ +package com.nect.core.entity.team.process; + +import com.nect.core.entity.BaseEntity; +import com.nect.core.entity.team.SharedDocument; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table( + name = "process_shared_document", + uniqueConstraints = { + @UniqueConstraint(name = "uk_process_document", columnNames = {"process_id", "document_id"}) + } +) +public class ProcessSharedDocument extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "process_id", nullable = false) + private Process process; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "document_id", nullable = false) + private SharedDocument document; + + @Column(name = "attached_at", nullable = false) + private LocalDateTime attachedAt; + + @Builder + public ProcessSharedDocument(Process process, SharedDocument document, LocalDateTime attachedAt) { + this.process = process; + this.document = document; + this.attachedAt = (attachedAt == null ? LocalDateTime.now() : attachedAt); + } + + void setProcess(Process process) { + this.process = process; + } + + void setDocument(SharedDocument document) { + this.document = document; + } +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessTaskItem.java b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessTaskItem.java new file mode 100644 index 0000000..821d338 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessTaskItem.java @@ -0,0 +1,50 @@ +package com.nect.core.entity.team.process; + +import com.nect.core.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "process_task_item") +public class ProcessTaskItem extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="process_id", nullable=false) + private Process process; + + @Column(name = "content",nullable = false) + private String content; + + @Column(name = "is_done") + private boolean isDone; + + @Column(name = "done_at") + private LocalDate doneAt; + + @Column(name = "sort_order") + private Integer sortOrder = 0; + + @Builder + public ProcessTaskItem(Process process, String content, boolean isDone, Integer sortOrder) { + this.process = process; + this.content = content; + this.isDone = isDone; + this.sortOrder = (sortOrder != null) ? sortOrder : 0; + this.doneAt = isDone ? LocalDate.now() : null; + } + + + void setProcess(Process process) { + this.process = process; + } +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessUser.java b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessUser.java new file mode 100644 index 0000000..9c45f16 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessUser.java @@ -0,0 +1,72 @@ +package com.nect.core.entity.team.process; + +import com.nect.core.entity.BaseEntity; +import com.nect.core.entity.team.process.enums.AssignmentRole; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table( + name = "process_user", + uniqueConstraints = { + @UniqueConstraint( + name = "uk_process_user_process_member", + columnNames = {"process_id", "member_id"} + ) + } +) +public class ProcessUser extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // 하나의 프로세스에 여러 유저 배정, 관찰 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "process_id", nullable = false) + private Process process; + + // TODO +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "user_id", nullable = false) +// private User user; + + @Enumerated(EnumType.STRING) + @Column(name = "assignment_role", nullable = false) + private AssignmentRole assignmentRole; + + @Column(name = "assigned_at") + private LocalDateTime assignedAt; + + @Column(name = "deleted_at") + private LocalDateTime deletedAt; + + // TODO : user 추가 + @Builder + public ProcessUser(Process process, AssignmentRole assignmentRole, LocalDateTime assignedAt) { + this.process = process; +// this.user = user; + this.assignmentRole = assignmentRole; + this.assignedAt = (assignedAt != null) ? assignedAt : LocalDateTime.now(); + this.deletedAt = null; + } + + public void delete() { + this.deletedAt = LocalDateTime.now(); + } + + void setProcess(Process process) { + this.process = process; + } + +// void setMember(User user) { +// this.user = user; +// } +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/enums/AssignmentRole.java b/nect-core/src/main/java/com/nect/core/entity/team/process/enums/AssignmentRole.java new file mode 100644 index 0000000..4ce5a5d --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/enums/AssignmentRole.java @@ -0,0 +1,5 @@ +package com.nect.core.entity.team.process.enums; + +public enum AssignmentRole { + ASSIGNEE, WATCHER +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/enums/ProcessFeedbackStatus.java b/nect-core/src/main/java/com/nect/core/entity/team/process/enums/ProcessFeedbackStatus.java new file mode 100644 index 0000000..a846f04 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/enums/ProcessFeedbackStatus.java @@ -0,0 +1,5 @@ +package com.nect.core.entity.team.process.enums; + +public enum ProcessFeedbackStatus { + OPEN, RESOLVED +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/enums/ProcessStatus.java b/nect-core/src/main/java/com/nect/core/entity/team/process/enums/ProcessStatus.java new file mode 100644 index 0000000..e519eb7 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/enums/ProcessStatus.java @@ -0,0 +1,5 @@ +package com.nect.core.entity.team.process.enums; + +public enum ProcessStatus { + BACKLOG, PLANNING, IN_PROGRESS, DONE +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/workspace/Post.java b/nect-core/src/main/java/com/nect/core/entity/team/workspace/Post.java new file mode 100644 index 0000000..f335180 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/workspace/Post.java @@ -0,0 +1,53 @@ +package com.nect.core.entity.team.workspace; + +import com.nect.core.entity.BaseEntity; +import com.nect.core.entity.team.Project; +import com.nect.core.entity.team.workspace.enums.PostType; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "post") +public class Post extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // TODO +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "user_id", nullable = false) +// private User author; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "project_id", nullable = false) + private Project project; + + @Enumerated(EnumType.STRING) + @Column(name = "post_type", nullable = false) + private PostType postType; + + @Column(name = "title", length = 100, nullable = false) + private String title; + + @Column(name = "content", nullable = false, columnDefinition = "TEXT") + private String content; + + @Column(name = "is_pinned", nullable = false) + private Boolean isPinned; + + @Column(name = "like_count", nullable = false) + private Long likeCount = 0L; + + @Column(name = "comment_count", nullable = false) + private Long commentCount = 0L; + + @Column(name = "deleted_at") + private LocalDateTime deletedAt; +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostAttachment.java b/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostAttachment.java new file mode 100644 index 0000000..0b8fecb --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostAttachment.java @@ -0,0 +1,39 @@ +package com.nect.core.entity.team.workspace; + +import com.nect.core.entity.BaseEntity; +import com.nect.core.entity.team.SharedDocument; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table( + name = "post_attachment", + uniqueConstraints = { + @UniqueConstraint(name = "uk_post_attachment_post_document", columnNames = {"post_id", "document_id"}) + } +) +public class PostAttachment extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "document_id", nullable = false) + private SharedDocument document; + + void setPost(Post post) { + this.post = post; + } + + void setDocument(SharedDocument document) { + this.document = document; + } +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostComment.java b/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostComment.java new file mode 100644 index 0000000..af7b8d3 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostComment.java @@ -0,0 +1,65 @@ +package com.nect.core.entity.team.workspace; + +import com.nect.core.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "post_comment") +public class PostComment extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "user_id", nullable = false) +// private User author; + + /** + * 부모 댓글 (대댓글용) + * - NULL 이면 일반 댓글 + * - 값이 있으면 해당 댓글의 대댓글 + */ + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "parent_comment_id") + private PostComment parentComment; + + @Column(name = "like_count", nullable = false) + private Long likeCount = 0L; + + @Column(name = "comment_count", nullable = false) + private Long commentCount = 0L; + + @Column(name = "content", nullable = false, columnDefinition = "TEXT") + private String content; + + @Column(name = "deleted_at") + private LocalDateTime deletedAt; + + void setPost(Post post) { + this.post = post; + } + +// void setAuthor(User author) { +// this.author = author; +// } + + void setParentComment(PostComment parentComment) { + this.parentComment = parentComment; + } + + public void softDelete() { + this.deletedAt = LocalDateTime.now(); + } + +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostCommentLike.java b/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostCommentLike.java new file mode 100644 index 0000000..6038f4c --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostCommentLike.java @@ -0,0 +1,40 @@ +package com.nect.core.entity.team.workspace; + +import com.nect.core.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table( + name = "post_comment_like", + uniqueConstraints = { + @UniqueConstraint( + name = "uk_post_comment_like_comment_member", + columnNames = {"post_comment_id", "member_id"} + ) + } +) +public class PostCommentLike extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // 어떤 댓글에 좋아요인지 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_comment_id", nullable = false) + private PostComment comment; + + // TODO +// // 누가 좋아요 했는지 +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "user_id", nullable = false) +// private User user; + + void setComment(PostComment comment) { this.comment = comment; } +// void setMember(User user) { this.user = user; } + +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostLike.java b/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostLike.java new file mode 100644 index 0000000..4bfb183 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/workspace/PostLike.java @@ -0,0 +1,40 @@ +package com.nect.core.entity.team.workspace; + +import com.nect.core.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table( + name = "post_comment_like", + uniqueConstraints = { + @UniqueConstraint( + name = "uk_post_comment_like_comment_member", + columnNames = {"post_id", "member_id"} + ) + } +) +public class PostLike extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // 어떤 게시글에 좋아요인지 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + // TODO +// // 누가 좋아요 했는지 +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "user_id", nullable = false) +// private User user; + + void setPost(Post post) { this.post = post; } +// void setMember(User member) { this.member = member; } + +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/workspace/ProjectHistory.java b/nect-core/src/main/java/com/nect/core/entity/team/workspace/ProjectHistory.java new file mode 100644 index 0000000..900c7c1 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/workspace/ProjectHistory.java @@ -0,0 +1,39 @@ +package com.nect.core.entity.team.workspace; + +import com.nect.core.entity.BaseEntity; +import com.nect.core.entity.team.Project; +import com.nect.core.entity.team.workspace.enums.ActionType; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.apache.catalina.User; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "project_history") +public class ProjectHistory extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // TODO +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "user_id", nullable = false) +// private User user; + + // TODO +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "project_id", nullable = false) +// private Project project; + + @Enumerated(EnumType.STRING) + @Column(name = "action_type", nullable = false) + private ActionType actionType; + + @Column(name = "content", nullable = false) + private String content; + + +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/workspace/enums/ActionType.java b/nect-core/src/main/java/com/nect/core/entity/team/workspace/enums/ActionType.java new file mode 100644 index 0000000..dcd6340 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/workspace/enums/ActionType.java @@ -0,0 +1,12 @@ +package com.nect.core.entity.team.workspace.enums; + +public enum ActionType { + // 프로세스(TASK) + PROCESS_CREATE, PROCESS_UPDATE, PROCESS_MOVE_STATUS, PROCESS_ASSIGN, + // 문서 + DOCUMENT_UPLOAD, DOCUMENT_DELETE, + // 게시글 + POST_CREATE, COMMENT_CREATE, POST_DELETE, + // 멤버 + MEMBER_INVITE, MEMBER_KICK +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/workspace/enums/PostType.java b/nect-core/src/main/java/com/nect/core/entity/team/workspace/enums/PostType.java new file mode 100644 index 0000000..df6f890 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/workspace/enums/PostType.java @@ -0,0 +1,5 @@ +package com.nect.core.entity.team.workspace.enums; + +public enum PostType { + NOTICE, FREE +} diff --git a/nect-core/src/main/java/com/nect/core/repository/team/ProjectRepository.java b/nect-core/src/main/java/com/nect/core/repository/team/ProjectRepository.java new file mode 100644 index 0000000..c00e782 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/repository/team/ProjectRepository.java @@ -0,0 +1,7 @@ +package com.nect.core.repository.team; + +import com.nect.core.entity.team.Project; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProjectRepository extends JpaRepository { +} \ No newline at end of file diff --git a/nect-core/src/main/java/com/nect/core/repository/team/SharedDocumentRepository.java b/nect-core/src/main/java/com/nect/core/repository/team/SharedDocumentRepository.java new file mode 100644 index 0000000..a5f536e --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/repository/team/SharedDocumentRepository.java @@ -0,0 +1,7 @@ +package com.nect.core.repository.team; + +import com.nect.core.entity.team.SharedDocument; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SharedDocumentRepository extends JpaRepository { +} diff --git a/nect-core/src/main/java/com/nect/core/repository/team/process/ProcessRepository.java b/nect-core/src/main/java/com/nect/core/repository/team/process/ProcessRepository.java new file mode 100644 index 0000000..e9c96d4 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/repository/team/process/ProcessRepository.java @@ -0,0 +1,7 @@ +package com.nect.core.repository.team.process; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProcessRepository extends JpaRepository { +} + From 10606b3ec5621604664731906359a2195f173458 Mon Sep 17 00:00:00 2001 From: infiniment Date: Fri, 16 Jan 2026 22:05:31 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[Style]=20Dto=20=EB=84=A4=EC=9D=B4=EB=B0=8D?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ProcessCreateReqDTO.java => ProcessCreateReqDto.java} | 4 ++-- ...rocessTaskItemReqDTO.java => ProcessTaskItemReqDto.java} | 2 +- .../dto/res/{AssigneeResDTO.java => AssigneeResDto.java} | 2 +- .../res/{FieldGroupResDTO.java => FieldGroupResDto.java} | 4 ++-- .../res/{ProcessCardResDTO.java => ProcessCardResDto.java} | 4 ++-- .../{ProcessCreateResDTO.java => ProcessCreateResDto.java} | 2 +- .../res/{ProcessWeekResDTO.java => ProcessWeekResDto.java} | 6 +++--- 7 files changed, 12 insertions(+), 12 deletions(-) rename nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/{ProcessCreateReqDTO.java => ProcessCreateReqDto.java} (93%) rename nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/{ProcessTaskItemReqDTO.java => ProcessTaskItemReqDto.java} (87%) rename nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/{AssigneeResDTO.java => AssigneeResDto.java} (90%) rename nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/{FieldGroupResDTO.java => FieldGroupResDto.java} (77%) rename nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/{ProcessCardResDTO.java => ProcessCardResDto.java} (91%) rename nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/{ProcessCreateResDTO.java => ProcessCreateResDto.java} (82%) rename nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/{ProcessWeekResDTO.java => ProcessWeekResDto.java} (69%) diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessCreateReqDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessCreateReqDto.java similarity index 93% rename from nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessCreateReqDTO.java rename to nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessCreateReqDto.java index dc9981b..34668c3 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessCreateReqDTO.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessCreateReqDto.java @@ -6,7 +6,7 @@ import java.time.LocalDate; import java.util.List; -public record ProcessCreateReqDTO( +public record ProcessCreateReqDto( // TODO : @Valid 나중에 필수값 확정되면 사용하기 @JsonProperty("process_title") @@ -40,7 +40,7 @@ public record ProcessCreateReqDTO( List links, @JsonProperty("task_items") - List taskItems + List taskItems // TODO : 일단은 null -> 프로세스 생성할 때 초기 피드백도 같이 등록할 수 있으면 사용 diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessTaskItemReqDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessTaskItemReqDto.java similarity index 87% rename from nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessTaskItemReqDTO.java rename to nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessTaskItemReqDto.java index 78bad90..195fdfa 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessTaskItemReqDTO.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/req/ProcessTaskItemReqDto.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; -public record ProcessTaskItemReqDTO( +public record ProcessTaskItemReqDto( String content, @JsonProperty("is_done") diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/AssigneeResDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/AssigneeResDto.java similarity index 90% rename from nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/AssigneeResDTO.java rename to nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/AssigneeResDto.java index 78a51fc..cd531fd 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/AssigneeResDTO.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/AssigneeResDto.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; -public record AssigneeResDTO( +public record AssigneeResDto( @JsonProperty("user_id") Long userId, diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/FieldGroupResDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/FieldGroupResDto.java similarity index 77% rename from nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/FieldGroupResDTO.java rename to nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/FieldGroupResDto.java index 81b15b9..a77a986 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/FieldGroupResDTO.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/FieldGroupResDto.java @@ -4,12 +4,12 @@ import java.util.List; -public record FieldGroupResDTO( +public record FieldGroupResDto( @JsonProperty("field_id") Long fieldId, @JsonProperty("field_name") String fieldName, - List processes + List processes ) {} diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCardResDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCardResDto.java similarity index 91% rename from nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCardResDTO.java rename to nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCardResDto.java index b5c8a64..335119d 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCardResDTO.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCardResDto.java @@ -5,7 +5,7 @@ import java.time.LocalDate; import java.util.List; -public record ProcessCardResDTO( +public record ProcessCardResDto( @JsonProperty("process_id") Long processId, @@ -33,5 +33,5 @@ public record ProcessCardResDTO( Integer leftDay, @JsonProperty("assignee") - List assignee + List assignee ) {} diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCreateResDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCreateResDto.java similarity index 82% rename from nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCreateResDTO.java rename to nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCreateResDto.java index 1bec844..6167ca4 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCreateResDTO.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessCreateResDto.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; -public record ProcessCreateResDTO( +public record ProcessCreateResDto( @JsonProperty("process_id") Long processId ) {} diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessWeekResDTO.java b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessWeekResDto.java similarity index 69% rename from nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessWeekResDTO.java rename to nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessWeekResDto.java index 948dccd..b4d9445 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessWeekResDTO.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/dto/res/ProcessWeekResDto.java @@ -4,13 +4,13 @@ import java.util.List; -public record ProcessWeekResDTO( +public record ProcessWeekResDto( @JsonProperty("start_date") String startDate, @JsonProperty("project_purpose") - List projectPurpose, + List projectPurpose, @JsonProperty("by_field") - List byField + List byField ) {} From 83c2fe8892d7755ef421540089c0e5448cbce19b Mon Sep 17 00:00:00 2001 From: infiniment Date: Fri, 16 Jan 2026 22:21:54 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[Refactor]=20fileExt=20=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EC=97=B4=EC=9D=84=20enum=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20ProjectUser=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EC=86=8D=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../process/controller/ProcessController.java | 10 +-- .../nect/core/entity/team/ProjectUser.java | 62 +++++++++++++++++++ .../nect/core/entity/team/SharedDocument.java | 6 +- .../nect/core/entity/team/enums/FileExt.java | 5 ++ .../team/enums/ProjectMemberStatus.java | 5 ++ .../entity/team/enums/ProjectMemberType.java | 5 ++ .../entity/team/process/ProcessFeedback.java | 3 +- 7 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/enums/FileExt.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectMemberStatus.java create mode 100644 nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectMemberType.java diff --git a/nect-api/src/main/java/com/nect/api/domain/team/process/controller/ProcessController.java b/nect-api/src/main/java/com/nect/api/domain/team/process/controller/ProcessController.java index 12820cb..79a9ffd 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/process/controller/ProcessController.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/process/controller/ProcessController.java @@ -1,7 +1,7 @@ package com.nect.api.domain.team.process.controller; -import com.nect.api.domain.team.process.dto.req.ProcessCreateReqDTO; -import com.nect.api.domain.team.process.dto.res.ProcessCreateResDTO; +import com.nect.api.domain.team.process.dto.req.ProcessCreateReqDto; +import com.nect.api.domain.team.process.dto.res.ProcessCreateResDto; import com.nect.api.global.response.ApiResponse; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -15,14 +15,14 @@ public class ProcessController { // 새 프로세스 생성 @PostMapping - public ApiResponse createProcess( + public ApiResponse createProcess( @PathVariable Long projectId, - @RequestBody ProcessCreateReqDTO request + @RequestBody ProcessCreateReqDto request ) { // TODO : Long processId = processService.createProcess(projectId, request); Long processId = 1L; // 임시 - return ApiResponse.ok(new ProcessCreateResDTO(processId)); + return ApiResponse.ok(new ProcessCreateResDto(processId)); } } diff --git a/nect-core/src/main/java/com/nect/core/entity/team/ProjectUser.java b/nect-core/src/main/java/com/nect/core/entity/team/ProjectUser.java index f7e094f..53ee3d6 100644 --- a/nect-core/src/main/java/com/nect/core/entity/team/ProjectUser.java +++ b/nect-core/src/main/java/com/nect/core/entity/team/ProjectUser.java @@ -1,5 +1,67 @@ package com.nect.core.entity.team; +import com.nect.core.entity.team.enums.ProjectMemberStatus; +import com.nect.core.entity.team.enums.ProjectMemberType; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +@Table( + name = "project_user", + uniqueConstraints = { + @UniqueConstraint( + name = "uk_project_user_project_user", + columnNames = {"project_id", "user_id"} + ) + } +) public class ProjectUser { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // TODO: User 엔티티 연결되면 연관관계로 변경 + // @ManyToOne(fetch = FetchType.LAZY) + // @JoinColumn(name = "user_id", nullable = false) + // private User user; + + @Column(name = "user_id", nullable = false) + private Long userId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "project_id", nullable = false) + private Project project; + + @Enumerated(EnumType.STRING) + @Column(name = "member_type", nullable = false) + private ProjectMemberType memberType; + + @Enumerated(EnumType.STRING) + @Column(name = "member_status", nullable = false) + private ProjectMemberStatus memberStatus; + + @Builder + private ProjectUser(Project project, Long userId, ProjectMemberType memberType, ProjectMemberStatus memberStatus) { + this.project = project; + this.userId = userId; + this.memberType = (memberType != null) ? memberType : ProjectMemberType.MEMBER; + this.memberStatus = (memberStatus != null) ? memberStatus : ProjectMemberStatus.PENDING; + } + + void setProject(Project project) { + this.project = project; + } + + public void activate() { + this.memberStatus = ProjectMemberStatus.ACTIVE; + } + public void kick() { + this.memberStatus = ProjectMemberStatus.KICKED; + } } diff --git a/nect-core/src/main/java/com/nect/core/entity/team/SharedDocument.java b/nect-core/src/main/java/com/nect/core/entity/team/SharedDocument.java index 3ff1237..fec0cac 100644 --- a/nect-core/src/main/java/com/nect/core/entity/team/SharedDocument.java +++ b/nect-core/src/main/java/com/nect/core/entity/team/SharedDocument.java @@ -1,6 +1,7 @@ package com.nect.core.entity.team; import com.nect.core.entity.BaseEntity; +import com.nect.core.entity.team.enums.FileExt; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; @@ -35,8 +36,9 @@ public class SharedDocument extends BaseEntity { @Column(name = "file_name", length = 200, nullable = false) private String fileName; + @Enumerated(EnumType.STRING) @Column(name = "file_ext", length = 10, nullable = false) - private String fileExt; // jpg, png, pdf, zip + private FileExt fileExt; @Column(name = "file_url", nullable = false, columnDefinition = "TEXT") private String fileUrl; @@ -51,7 +53,7 @@ private SharedDocument( String title, String description, String fileName, - String fileExt, + FileExt fileExt, String fileUrl) { // this.createdBy = createdBy; this.isPinned = isPinned; diff --git a/nect-core/src/main/java/com/nect/core/entity/team/enums/FileExt.java b/nect-core/src/main/java/com/nect/core/entity/team/enums/FileExt.java new file mode 100644 index 0000000..e7b2dae --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/enums/FileExt.java @@ -0,0 +1,5 @@ +package com.nect.core.entity.team.enums; + +public enum FileExt { + JPG, JPEG, PNG, PDF, ZIP +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectMemberStatus.java b/nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectMemberStatus.java new file mode 100644 index 0000000..31656f5 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectMemberStatus.java @@ -0,0 +1,5 @@ +package com.nect.core.entity.team.enums; + +public enum ProjectMemberStatus { + INVITED, PENDING, ACTIVE, KICKED +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectMemberType.java b/nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectMemberType.java new file mode 100644 index 0000000..5f91373 --- /dev/null +++ b/nect-core/src/main/java/com/nect/core/entity/team/enums/ProjectMemberType.java @@ -0,0 +1,5 @@ +package com.nect.core.entity.team.enums; + +public enum ProjectMemberType { + LEADER, MEMBER; +} diff --git a/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessFeedback.java b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessFeedback.java index f933b3a..c538662 100644 --- a/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessFeedback.java +++ b/nect-core/src/main/java/com/nect/core/entity/team/process/ProcessFeedback.java @@ -28,8 +28,7 @@ public class ProcessFeedback extends BaseEntity { // @JoinColumn(name = "created_by", nullable = false) // private User createdBy; - @Lob - @Column(name = "content", nullable = false) + @Column(name = "content", nullable = false, columnDefinition = "TEXT") private String content; @Enumerated(EnumType.STRING)