기존 : multipart file 요청의 경우에도 캐싱하여 controller에서 multipart file을 읽어오지 못함
수정 : multipart file 요청의 경우 request body를 캐싱하지 않음
public CachedHttpServletRequest(HttpServletRequest request) throws IOException {
super(request);
// multipart file 요청이면 body 를 읽지 않음
if (isMultipartRequest(request)) {
cachedBody = "";
} else {
cachedBody = readBodyFromRequest(request);
infoMap.put("requestBody", cachedBody);
}
크롬 북마크 import 구현
크롬브라우저에서 내보내기한 북마크(html)을 업로드하여 TechPick 서비스에 등록
이미 등록된 url의 경우 등록하지 않음
빈 폴더의 경우 등록하지 않음
응답으로 중복된 url을 내보냄
등록된 픽들의 태그는 존재하지 않음
폴더의 depth는 1로 고정됨
-> 각 픽들은 바로 위 부모 폴더에만 속함
ex)
다음과 같은 계층구조를 가진 크롬 북마크라면
-folderA
-folderB
-pick1
-pick2
----
이렇게 두개의 폴더로 저장됨
-folderA
-pick2
-folderB
-pick1
----
### API
`/api/chrome/import` : 크롬 북마크 업로드
`/api/chrome/export` : 전체 폴더 다운로드
`/api/chrome/{folderId}/export` : 특정 폴더 다운로드
## Precaution
현재 프론트의 폴더 depth가 1로 되어있어 크롬 북마크의 계층 구조를 펼치는 형태로 저장
이후 프론트에서 n-depth 폴더가 가능해지면
`ChromeBookmarkService.java` 에서 재귀 메소드의 주석을 해제하여 계층구조를 유지하며 저장하도록 변경 가능
```java
private void searchImportData(Long userId, ChromeFolder chromeFolder, Folder parentFolder,
List<String> alreadyExistBookmarks, List<String> ogTagUpdateUrls) {
Folder folder = folderDataHandler.saveFolder(
mapper.toFolderCreateCommand(userId, parentFolder.getId(), chromeFolder));
for (ChromeBookmark bookmark : chromeFolder.getChildBookmarkList()) {
if (!linkDataHandler.existsByUrl(bookmark.getUrl())) {
// 링크가 존재하지 않으면 url만 있는 링크를 저장하고 이후 og tag 업데이트를 위해 list에 기록
linkDataHandler.saveLink(Link.createLinkByUrl(bookmark.getUrl()));
ogTagUpdateUrls.add(bookmark.getUrl());
}
Link link = linkDataHandler.getLink(bookmark.getUrl());
if (pickDataHandler.existsByUserIdAndLink(userId, link)) {
alreadyExistBookmarks.add(bookmark.getUrl());
continue;
}
pickDataHandler.savePick(mapper.toPickCreateCommand(userId, folder.getId(), bookmark));
}
for (ChromeFolder childFolder : chromeFolder.getChildFolderList()) {
// // n-depth 로 저장
// searchImportData(userId, childFolder, folder, alreadyExistBookmarks, ogTagUpdateUrls);
// 1-depth 로 저장
searchImportData(userId, childFolder, parentFolder, alreadyExistBookmarks, ogTagUpdateUrls);
}
// 자식폴더 전부 순회했는데, 빈 폴더이면 삭제
if (folder.getChildPickIdOrderedList().isEmpty() && folder.getChildFolderIdOrderedList().isEmpty()) {
folderDataHandler.deleteFolderList(new FolderCommand.Delete(userId, List.of(folder.getId())));
}
}
What is this PR? 🔍
Changes 📝
request body 캐싱 방식 변경
기존 : multipart file 요청의 경우에도 캐싱하여 controller에서 multipart file을 읽어오지 못함 수정 : multipart file 요청의 경우 request body를 캐싱하지 않음
크롬 북마크 import 구현