Skip to content

Commit 0ca66e9

Browse files
authored
[Feat/OPS-346] 공유 폴더 관리 (#113)
* refactor/OPS-360 : OpenAPI 애너테이션 추가 * refactor/OPS-360 : NoResultException 예외 분리 * refactor/OPS-360 : param 추가 * refactor/OPS-360 : param 추가 * refactor/OPS-360 : default 폴더 CRUD 로직 수정 * refactor/OPS-360 : 폴더 리스트는 호출 로직 수정 * refactor/OPS-346 : 공유 폴더 관리 * feat/OPS-365 : soft delete + 휴지통 조회 구현 * feat/OPS-346 : 공유 폴더 관리 * feat/OPS-346 : 공유 폴더 관리 * refactor/OPS-346 : 개인 / 공유 폳더 관리 분리 * refactor/OPS-346 : 검색 기능 출처 누락 수정
1 parent 73df3f0 commit 0ca66e9

File tree

21 files changed

+1673
-467
lines changed

21 files changed

+1673
-467
lines changed

src/main/java/org/tuna/zoopzoop/backend/domain/archive/archive/entity/SharingArchive.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import lombok.NoArgsConstructor;
99
import lombok.Setter;
1010
import org.tuna.zoopzoop.backend.domain.archive.archive.enums.ArchiveType;
11+
import org.tuna.zoopzoop.backend.domain.archive.folder.entity.Folder;
1112
import org.tuna.zoopzoop.backend.domain.space.space.entity.Space;
1213
import org.tuna.zoopzoop.backend.global.jpa.entity.BaseEntity;
1314

@@ -27,5 +28,9 @@ public class SharingArchive extends BaseEntity {
2728
public SharingArchive(Space space) {
2829
this.space = space;
2930
this.archive = new Archive(ArchiveType.SHARED);
31+
32+
// 🔧 default 폴더 자동 생성
33+
Folder defaultFolder = new Folder("default");
34+
this.archive.addFolder(defaultFolder);
3035
}
3136
}

src/main/java/org/tuna/zoopzoop/backend/domain/archive/folder/controller/FolderController.java

Lines changed: 30 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import org.tuna.zoopzoop.backend.domain.archive.folder.dto.FolderResponse;
1111
import org.tuna.zoopzoop.backend.domain.archive.folder.dto.reqBodyForCreateFolder;
1212
import org.tuna.zoopzoop.backend.domain.archive.folder.dto.resBodyForCreateFolder;
13-
import org.tuna.zoopzoop.backend.domain.archive.folder.service.FolderService;
13+
import org.tuna.zoopzoop.backend.domain.archive.folder.service.PersonalArchiveFolderService;
1414
import org.tuna.zoopzoop.backend.domain.datasource.dto.FolderFilesDto;
1515
import org.tuna.zoopzoop.backend.domain.member.entity.Member;
1616
import org.tuna.zoopzoop.backend.global.rsData.RsData;
@@ -25,12 +25,10 @@
2525
@Tag(name = "ApiV1Folder", description = "개인 아카이브의 폴더 CRUD")
2626
public class FolderController {
2727

28-
private final FolderService folderService;
28+
private final PersonalArchiveFolderService personalArchiveFolderService;
2929

3030
/**
3131
* 내 PersonalArchive 안에 새 폴더 생성
32-
* @param rq reqBodyForCreateFolder
33-
* @return resBodyForCreateFolder
3432
*/
3533
@Operation(summary = "폴더 생성", description = "내 PersonalArchive 안에 새 폴더를 생성합니다.")
3634
@PostMapping
@@ -39,41 +37,30 @@ public RsData<resBodyForCreateFolder> createFolder(
3937
@AuthenticationPrincipal CustomUserDetails userDetails
4038
) {
4139
Member member = userDetails.getMember();
42-
FolderResponse createFile = folderService.createFolderForPersonal(member.getId(), rq.folderName());
40+
FolderResponse createFile = personalArchiveFolderService.createFolder(member.getId(), rq.folderName());
4341
resBodyForCreateFolder rs = new resBodyForCreateFolder(createFile.folderName(), createFile.folderId());
4442

45-
return new RsData<>(
46-
"200",
47-
rq.folderName() + " 폴더가 생성됐습니다.",
48-
rs
49-
);
43+
return new RsData<>("200",rq.folderName() + " 폴더가 생성됐습니다.", rs);
5044
}
5145

5246
/**
5347
* 내 PersonalArchive 안의 folder 삭제
54-
* @param folderId 삭제할 folderId
5548
*/
5649
@DeleteMapping("/{folderId}")
57-
public ResponseEntity<Map<String, Object>> deleteFolder(
50+
public ResponseEntity<RsData<?>> deleteFolder(
5851
@PathVariable Integer folderId,
5952
@AuthenticationPrincipal CustomUserDetails userDetails
6053
) {
61-
if (folderId == 0) {
62-
var body = new java.util.HashMap<String, Object>();
63-
body.put("status", 409);
64-
body.put("msg", "default 폴더는 삭제할 수 없습니다.");
65-
body.put("data", null);
66-
return ResponseEntity.badRequest().body(body);
67-
}
54+
if (folderId == 0)
55+
throw new IllegalArgumentException("default 폴더는 삭제할 수 없습니다.");
56+
6857

6958
Member member = userDetails.getMember();
70-
String deletedFolderName = folderService.deleteFolder(member.getId(), folderId);
59+
String deletedFolderName = personalArchiveFolderService.deleteFolder(member.getId(), folderId);
7160

72-
var body = new java.util.HashMap<String, Object>();
73-
body.put("status", 200);
74-
body.put("msg", deletedFolderName + " 폴더가 삭제됐습니다.");
75-
body.put("data", null);
76-
return ResponseEntity.ok(body);
61+
return ResponseEntity.ok(
62+
new RsData<>("200", deletedFolderName + " 폴더가 삭제됐습니다.", null)
63+
);
7764
}
7865

7966
/**
@@ -82,28 +69,23 @@ public ResponseEntity<Map<String, Object>> deleteFolder(
8269
* @param body 수정할 폴더 값
8370
*/
8471
@PatchMapping("/{folderId}")
85-
public ResponseEntity<Map<String, Object>> updateFolderName(
72+
public ResponseEntity<RsData<Map<String, String>>> updateFolderName(
8673
@PathVariable Integer folderId,
8774
@RequestBody Map<String, String> body,
8875
@AuthenticationPrincipal CustomUserDetails userDetails
8976
) {
90-
if (folderId == 0) {
91-
var res = new java.util.HashMap<String, Object>();
92-
res.put("status", 400);
93-
res.put("msg", "default 폴더는 이름을 변경할 수 없습니다.");
94-
res.put("data", null);
95-
return ResponseEntity.badRequest().body(res);
96-
}
77+
if (folderId == 0)
78+
throw new IllegalArgumentException("default 폴더는 이름을 변경할 수 없습니다.");
79+
9780

9881
Member member = userDetails.getMember();
9982
String newName = body.get("folderName");
100-
String updatedName = folderService.updateFolderName(member.getId(), folderId, newName);
83+
String updatedName = personalArchiveFolderService.updateFolderName(member.getId(), folderId, newName);
10184

102-
return ResponseEntity.ok(java.util.Map.of(
103-
"status", 200,
104-
"msg", "폴더 이름이 " + updatedName + " 으로 변경됐습니다.",
105-
"data", java.util.Map.of("folderName", updatedName)
106-
));
85+
return ResponseEntity.ok(
86+
new RsData<>("200", "폴더 이름이 " + updatedName + " 으로 변경됐습니다.",
87+
Map.of("folderName", updatedName))
88+
);
10789
}
10890

10991
/**
@@ -112,18 +94,14 @@ public ResponseEntity<Map<String, Object>> updateFolderName(
11294
*/
11395
@Operation(summary = "폴더 이름 조회", description = "내 PersonalArchive 안에 이름을 전부 조회합니다.")
11496
@GetMapping
115-
public ResponseEntity<?> getFolders(
97+
public ResponseEntity<RsData<List<FolderResponse>>> getFolders(
11698
@AuthenticationPrincipal CustomUserDetails userDetails
11799
) {
118100
Member member = userDetails.getMember();
119-
List<FolderResponse> folders = folderService.getFoldersForPersonal(member.getId());
101+
List<FolderResponse> folders = personalArchiveFolderService.getFolders(member.getId());
120102

121103
return ResponseEntity.ok(
122-
Map.of(
123-
"status", 200,
124-
"msg", "개인 아카이브의 폴더 목록을 불러왔습니다.",
125-
"data", Map.of("folders", folders)
126-
)
104+
new RsData<>("200", "개인 아카이브의 폴더 목록을 불러왔습니다.", folders)
127105
);
128106
}
129107

@@ -138,22 +116,14 @@ public ResponseEntity<?> getFilesInFolder(
138116
int memberId = userDetails.getMember().getId();
139117

140118
Integer targetFolderId = (folderId == 0)
141-
? folderService.getDefaultFolderId(memberId)
119+
? personalArchiveFolderService.getDefaultFolderId(memberId)
142120
: folderId;
143121

144-
FolderFilesDto rs = folderService.getFilesInFolderForPersonal(memberId, targetFolderId);
145-
146-
return ResponseEntity.ok(Map.of(
147-
"status", 200,
148-
"msg", folderId == 0 ? "기본 폴더의 파일 목록을 불러왔습니다." : "해당 폴더의 파일 목록을 불러왔습니다.",
149-
"data", Map.of(
150-
"folder", Map.of(
151-
"folderId", rs.folderId(),
152-
"folderName", rs.folderName()
153-
),
154-
"files", rs.files()
155-
)
156-
));
122+
FolderFilesDto rs = personalArchiveFolderService.getFilesInFolder(memberId, targetFolderId);
123+
124+
return ResponseEntity.ok(
125+
new RsData<>("200","해당 폴더의 파일 목록을 불러왔습니다.", rs)
126+
);
157127
}
158128

159129
}
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.tuna.zoopzoop.backend.domain.archive.folder.dto;
22

33
public record FolderResponse(
4-
int folderId,
5-
String folderName
6-
4+
String folderName,
5+
int folderId
76
) {}

src/main/java/org/tuna/zoopzoop/backend/domain/archive/folder/repository/FolderRepository.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,17 @@ Optional<Folder> findByIdAndMemberId(@Param("folderId") Integer folderId,
7272
where pa.member.id = :memberId and f.isDefault = true
7373
""")
7474
Optional<Folder> findDefaultByMemberId(@Param("memberId") Integer memberId);
75+
76+
Optional<Folder> findByIdAndArchiveId(Integer folderId, Integer archiveId);
77+
78+
@Query("""
79+
select f.name
80+
from Folder f
81+
where f.archive.id = :archiveId
82+
and f.name = :name
83+
and f.id <> :excludeFolderId
84+
""")
85+
List<String> existsNameInArchiveExceptSelf(@Param("archiveId") Integer archiveId,
86+
@Param("name") String name,
87+
@Param("excludeFolderId") Integer excludeFolderId);
7588
}

0 commit comments

Comments
 (0)