Kernel360 / F2-TECHPICK

웹에서 지식을 찾는 사람들을 위한 링크 관리 유틸리티
4 stars 3 forks source link

[FEAT] 크롬 북마크 Import 기능 구현 #522

Closed Gyaak closed 4 days ago

Gyaak commented 4 days ago

What is this PR? 🔍

Changes 📝

request body 캐싱 방식 변경

기존 : 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 구현

다음과 같은 계층구조를 가진 크롬 북마크라면 -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())));
    }
}