Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.slatto.domain.project.dto.ProjectCreateRequest;
import com.slatto.domain.project.dto.ProjectDetailResponse;
import com.slatto.domain.project.dto.ProjectListResponse;
import com.slatto.domain.project.dto.ProjectPinResponse;
import com.slatto.domain.project.dto.ProjectResponse;
import com.slatto.domain.project.dto.ProjectUpdateRequest;
import com.slatto.domain.project.enums.ProjectStatus;
Expand Down Expand Up @@ -92,4 +93,26 @@ public ApiResponse<Void> deleteProject(

return ApiResponse.success(CommonSuccessCode.OK, null);
}

@Operation(summary = "프로젝트 고정")
@PostMapping("/{projectId}/pin")
public ApiResponse<ProjectPinResponse> pinProject(
@AuthenticationPrincipal Long currentUserId,
@PathVariable Long projectId
) {
ProjectPinResponse response = projectService.pinProject(projectId, currentUserId);

return ApiResponse.success(CommonSuccessCode.OK, response);
}

@Operation(summary = "프로젝트 고정 해제")
@DeleteMapping("/{projectId}/pin")
public ApiResponse<ProjectPinResponse> unpinProject(
@AuthenticationPrincipal Long currentUserId,
@PathVariable Long projectId
) {
ProjectPinResponse response = projectService.unpinProject(projectId, currentUserId);

return ApiResponse.success(CommonSuccessCode.OK, response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.slatto.domain.project.dto.ProjectFileDownloadResponse;
import com.slatto.domain.project.dto.ProjectFileListResponse;
import com.slatto.domain.project.dto.ProjectFilePinResponse;
import com.slatto.domain.project.dto.ProjectFileResponse;
import com.slatto.domain.project.dto.ProjectFileUpdateRequest;
import com.slatto.domain.project.dto.ProjectFileUploadRequest;
Expand Down Expand Up @@ -110,6 +111,38 @@ public ApiResponse<Void> deleteProjectFile(
return ApiResponse.success(CommonSuccessCode.OK, null);
}

@Operation(summary = "프로젝트 파일 고정")
@PostMapping("/{fileId}/pin")
public ApiResponse<ProjectFilePinResponse> pinProjectFile(
@AuthenticationPrincipal Long currentUserId,
@PathVariable Long projectId,
@PathVariable Long fileId
) {
ProjectFilePinResponse response = projectFileService.pinProjectFile(
projectId,
fileId,
currentUserId
);

return ApiResponse.success(CommonSuccessCode.OK, response);
}

@Operation(summary = "프로젝트 파일 고정 해제")
@DeleteMapping("/{fileId}/pin")
public ApiResponse<ProjectFilePinResponse> unpinProjectFile(
@AuthenticationPrincipal Long currentUserId,
@PathVariable Long projectId,
@PathVariable Long fileId
) {
ProjectFilePinResponse response = projectFileService.unpinProjectFile(
projectId,
fileId,
currentUserId
);

return ApiResponse.success(CommonSuccessCode.OK, response);
}

@Operation(summary = "프로젝트 파일 다운로드")
@GetMapping("/{fileId}/download")
public ResponseEntity<InputStreamResource> downloadProjectFile(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.slatto.domain.project.dto.ProjectNoticeCreateRequest;
import com.slatto.domain.project.dto.ProjectNoticeListResponse;
import com.slatto.domain.project.dto.ProjectNoticeReadResponse;
import com.slatto.domain.project.dto.ProjectNoticeResponse;
import com.slatto.domain.project.dto.ProjectNoticeUpdateRequest;
import com.slatto.domain.project.service.ProjectNoticeService;
Expand Down Expand Up @@ -96,4 +97,20 @@ public ApiResponse<Void> deleteProjectNotice(

return ApiResponse.success(CommonSuccessCode.OK, null);
}

@Operation(summary = "프로젝트 공지 읽음 처리")
@PatchMapping("/{noticeId}/read")
public ApiResponse<ProjectNoticeReadResponse> readProjectNotice(
@AuthenticationPrincipal Long currentUserId,
@PathVariable Long projectId,
@PathVariable Long noticeId
) {
ProjectNoticeReadResponse response = projectNoticeService.readProjectNotice(
projectId,
noticeId,
currentUserId
);

return ApiResponse.success(CommonSuccessCode.OK, response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@
import com.slatto.domain.project.dto.ProjectCreateRequest;
import com.slatto.domain.project.dto.ProjectDetailResponse;
import com.slatto.domain.project.dto.ProjectListResponse;
import com.slatto.domain.project.dto.ProjectPinResponse;
import com.slatto.domain.project.dto.ProjectResponse;
import com.slatto.domain.project.entity.Project;
import com.slatto.domain.project.entity.ProjectMember;
import com.slatto.domain.project.entity.ProjectPin;
import com.slatto.domain.project.enums.Permission;
import com.slatto.domain.user.entity.Users;
import com.slatto.domain.user.enums.RoleName;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -44,6 +47,14 @@ public ProjectResponse toResponse(Project project) {
.build();
}

public ProjectPinResponse toPinResponse(Long projectId, LocalDateTime pinnedAt) {
return ProjectPinResponse.builder()
.id(projectId)
.isPinned(pinnedAt != null)
.pinnedAt(pinnedAt)
.build();
}

public ProjectListResponse toListResponse(
List<ProjectListResponse.ProjectSummary> items,
Long nextCursor,
Expand All @@ -60,6 +71,10 @@ public ProjectListResponse.ProjectSummary toSummary(
Project project,
Long memberCount,
List<String> memberPreviewImageUrls,
List<RoleName> roleNames,
String previewImageUrl,
LocalDateTime pinnedAt,
Permission myPermission,
LocalDateTime lastActivityAt
) {
return ProjectListResponse.ProjectSummary.builder()
Expand All @@ -69,12 +84,17 @@ public ProjectListResponse.ProjectSummary toSummary(
.lengthType(project.getLengthType())
.status(project.getStatus())
.kind(project.getKind())
.roleNames(roleNames)
.previewImageUrl(previewImageUrl)
.startDate(project.getStartDate())
.endDate(project.getEndDate())
.deadlineProgressPercent(calculateDeadlineProgressPercent(project.getStartDate(), project.getEndDate()))
.lastActivityAt(lastActivityAt)
.memberPreviewImageUrls(memberPreviewImageUrls)
.memberCount(memberCount)
.isPinned(pinnedAt != null)
.pinnedAt(pinnedAt)
.myPermission(myPermission)
.createdAt(project.getCreatedAt())
.updatedAt(project.getUpdatedAt())
.build();
Expand All @@ -84,9 +104,10 @@ public ProjectDetailResponse toDetailResponse(
Project project,
ProjectMember currentMember,
List<RoleName> roleNames,
ProjectPin projectPin,
Long memberCount
) {
boolean admin = currentMember.isAdmin();
LocalDateTime pinnedAt = projectPin != null ? projectPin.getPinnedAt() : null;

return ProjectDetailResponse.builder()
.id(project.getId())
Expand All @@ -103,8 +124,8 @@ public ProjectDetailResponse toDetailResponse(
.myPermission(currentMember.getPermission())
.roleNames(roleNames)
.memberCount(memberCount)
.canEdit(admin)
.canDelete(admin)
.isPinned(pinnedAt != null)
.pinnedAt(pinnedAt)
.createdAt(project.getCreatedAt())
.updatedAt(project.getUpdatedAt())
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ public class ProjectDetailResponse {

private Long memberCount;

private Boolean canEdit;
private Boolean isPinned;

private Boolean canDelete;
private LocalDateTime pinnedAt;

private LocalDateTime createdAt;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.slatto.domain.project.dto;

import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
@Builder
public class ProjectFilePinResponse {

private Long id;

private Boolean isPinned;

private LocalDateTime pinnedAt;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,5 @@ public class ProjectFileUpdateRequest {

private String description;

private Boolean isPinned;

private Boolean isFinal;
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,5 @@ public class ProjectFileUploadRequest {

private String description;

private Boolean isPinned;

private Boolean isFinal;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.slatto.domain.project.dto;

import com.slatto.domain.project.enums.LengthType;
import com.slatto.domain.project.enums.Permission;
import com.slatto.domain.project.enums.ProjectStatus;
import com.slatto.domain.user.enums.CategoryName;
import com.slatto.domain.user.enums.Kind;
import com.slatto.domain.user.enums.RoleName;
import lombok.Builder;
import lombok.Getter;

Expand Down Expand Up @@ -37,6 +39,10 @@ public static class ProjectSummary {

private Kind kind;

private List<RoleName> roleNames;

private String previewImageUrl;

private LocalDate startDate;

private LocalDate endDate;
Expand All @@ -49,6 +55,12 @@ public static class ProjectSummary {

private Long memberCount;

private Boolean isPinned;

private LocalDateTime pinnedAt;

private Permission myPermission;

private LocalDateTime createdAt;

private LocalDateTime updatedAt;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.slatto.domain.project.dto;

import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
@Builder
public class ProjectNoticeReadResponse {

private Long id;

private Boolean isRead;

private LocalDateTime readAt;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ public class ProjectNoticeResponse {

private WriterSummary writer;

private Boolean isRead;

private LocalDateTime createdAt;

private LocalDateTime updatedAt;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.slatto.domain.project.dto;

import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
@Builder
public class ProjectPinResponse {

private Long id;

private Boolean isPinned;

private LocalDateTime pinnedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.slatto.domain.project.entity;

import com.slatto.domain.common.entity.BaseEntity;
import com.slatto.domain.user.entity.Users;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Entity
@Table(
name = "project_notice_read",
uniqueConstraints = @UniqueConstraint(
name = "uk_project_notice_read_notice_user",
columnNames = {"notice_id", "user_id"}
)
)
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class ProjectNoticeRead extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "notice_id", nullable = false)
private ProjectNotice notice;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private Users user;

@Column(name = "read_at", nullable = false)
private LocalDateTime readAt;

private ProjectNoticeRead(ProjectNotice notice, Users user) {
this.notice = notice;
this.user = user;
this.readAt = LocalDateTime.now();
}

public static ProjectNoticeRead create(ProjectNotice notice, Users user) {
return new ProjectNoticeRead(notice, user);
}

public void refreshReadAt() {
this.readAt = LocalDateTime.now();
}
}
Loading
Loading