내가 담당했던 부분은 드라이브였다.
드라이브는 계층형 구조로, 폴더 안의 폴더 , 폴더 안의 폴더 안의 폴더 및 파일들을 생각하고, 해당 부분에 대한 권한까지에 생각했다.
내가 구성한 것은 나의 드라이브를 생성해야지 드라이브를 사용할 수 있고, 공유 드라이브에서는 남이 나에게 공유한것만 표시 되도록 구현하였다.
1. 아이디 생성할때, 파일 서버에 나의 uid와 동일한 이름의 폴더가 생성되고, 생성된 폴더에 모든 파일들이 저장된다.
드라이브 생성
드라이브 이름과, 설명을 적고, 드라이브 만들기를 누르면 handler를 통해 mutate가 실행됨
const { mutate, isLoading } = useMutation({
mutationFn: async (newDriveData) => {
const response = await axiosInstance.post("/api/drive/newDrive", newDriveData);
return response.data;
},
onSuccess: (data) => {
queryClient.invalidateQueries({ queryKey: ['driveList', user.uid] });
onClose();
},
onError: (error) => {
console.error("Error creating drive:", error);
},
});
const handleSubmit = () => {
console.log("최종 제출 ",formData);
mutate(formData);
};
const handleInputChange = (e) => {
const { name, value } = e.target;
setFormData({ ...formData, [name]: value });
};
formData에 필요한 사항들을 저장하고, mutate를 실행하여, 백으로 전달합니다.
useMutate에 대한 설명은 아래를 참고
2025.01.02 - [react] - [React] useMutate 란?
[React] useMutate 란?
useMutation 이란?React-Query를 이용해 서버에 변경(insert, update,delete)작업 요청시 사용const { mutate, isLoading } = useMutation({ mutationFn: async (newDriveData) => { const response = await axiosInstance.post("/api/drive/newDrive", new
codejinjinh.tistory.com
Backend 처리
드라이브는 mongoDB를 사용하여 구성하였다.
package com.backend.document.drive;
import com.backend.dto.request.drive.ShareDept;
import com.backend.dto.request.drive.SharedUser;
import com.backend.dto.response.drive.FolderDto;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.mongodb.core.mapping.Document;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
@Document(collection = "folders")
public class Folder {
@Id
private String id; // 폴더의 고유 ID
private String parentId; // 상위 폴더 ID, 최상위 폴더는 null
private String path; // 폴더 경로
private String folderUUID;
private String name; // 폴더 이름
private String ownerId;
private String type; //DRIVE, ROOT, FOLDER
private Double order; // 폴더 순서 (같은 부모 폴더 내에서의 정렬)
private String description; // 폴더 설명
@CreationTimestamp
private LocalDateTime createdAt; // 폴더 생성 날짜 및 시간
@LastModifiedDate
private LocalDateTime updatedAt; // 폴더 수정 날짜 및 시간
@Builder.Default
private int isShared =0 ; // 공유 여부 0: 나만사용, 2: 선택한 구성원 3: 전체구성원
@Builder.Default
private int linkSharing =0 ; //링크 공유 여부 허용하지않음 0 , 허용 1
@Builder.Default
private int status = 1; // 상태
@Builder.Default
private String sharedUser = "[]";
@Builder.Default
private String sharedDept = "[]";
private String sharedToken;
@Setter
@Builder.Default
private List<SharedUser> sharedUsers = new ArrayList<>(); // 공유 사용자
@Setter
@Builder.Default
private List<ShareDept> sharedDepts = new ArrayList<>(); // 공유 부서
@Setter
@Builder.Default
private List<Invitation> invitations = new ArrayList<>();
@Builder.Default
private int target=0;
@Builder.Default
private int restore=0;
@Builder.Default
private int isPinned = 0; // 1: 고정 폴더 => 즐겨 찾기 설정
public FolderDto toDTO() {
return FolderDto.builder()
.id(this.id)
.parentId(this.parentId)
.path(this.path)
.name(this.name)
.folderUUID(this.folderUUID)
.ownerId(this.ownerId)
.order(this.order)
.type(this.type)
.description(this.description)
.createdAt(this.createdAt)
.updatedAt(this.updatedAt)
.isShared(this.isShared)
.sharedUser(this.sharedUser)
.sharedDept(this.sharedDept)
.linkSharing(this.linkSharing)
.status(this.status)
.isPinned(this.isPinned)
.shareDepts(this.sharedDepts)
.sharedUsers(this.sharedUsers)
.invitations(this.invitations)
.target(this.target)
.restore(this.restore)
.sharedToken(this.sharedToken)
.build();
}
public void newFolderName(String newfolderName){
this.name = newfolderName;
}
public void moveOrder(double newOrder){this.order = newOrder;}
public void updateSharedUser(String newSharedUser){this.sharedUser = newSharedUser;}
public void updateSharedDept(String newSharedDept){this.sharedDept = newSharedDept;}
public void updateSharedUsers(List<SharedUser> newSharedUsers){this.sharedUsers = newSharedUsers;}
public void setTarget(){this.target=1;}
public void setRestore(int restore){this.restore=1;}
public void setPath(String path){this.path = path;}
public void updatedTime(){this.updatedAt = LocalDateTime.now();}
public void updateParentId(String parentId){this.parentId = parentId;}
public void updateShareToken(String sharedToken){this.sharedToken = sharedToken;}
}
컨트롤러
Controller
//드라이브생성 => 제일 큰 폴더
@PostMapping("/api/drive/newDrive")
public void createDrive(@RequestBody NewDriveRequest newDriveRequest,HttpServletRequest request) {
log.info("New drive request: " + newDriveRequest);
String uid= (String) request.getAttribute("uid");
Long userId= (Long) request.getAttribute("id");
newDriveRequest.setOwner(uid);
Folder forFolder = folderService.getFolderName("ROOT",uid);
folderService.insertDriveSetting(uid,userId);
//부모폴더생성
if(forFolder == null) {
NewDriveRequest rootdrive = NewDriveRequest.builder()
.owner(newDriveRequest.getOwner())
.name(uid)
.type("ROOT")
.driveMaster(uid)
.description(uid+"의 드라이브")
.build();
String rootId =folderService.createRootDrive(rootdrive);
newDriveRequest.setParentId(rootId);
permissionService.addPermission(rootId,uid,"folder",newDriveRequest.getPermissions());
}else{
newDriveRequest.setParentId(forFolder.getId());
}
//폴더생성
newDriveRequest.setType("DRIVE");
String forderId = folderService.createFolder(newDriveRequest);
//권한설정 저장
}
부모 폴더 생성 부분
=> 사용자 회원가입시 해당 uid의 폴더를 생성하는것 ( 만약 생성되지않은 경우 생성된 후,그 안에 새로운 드라이브가 생성될 수 있도록 구현함 )
요청을 받을때 newDriveRequest로 받게되고,
public class NewDriveRequest {
private String name; // 드라이브 이름
private String owner; // 소유자 이름
private String description; // 설명
private double order; // 순서
private String type;
private String driveMaster; // 드라이브 마스터 이름
private String masterEmail; // 드라이브 마스터 이메일
private List<String> share_Users; // 공유 사용자 목록
private int isShared; // 공유 여부 (0: 나만 사용, 1: 선택한 구성원, 2: 전체 구성원)
private int linkSharing; // 링크 공유 (0: 허용안함, 1: 허용함)
private String parentId;
private int status;
private int permissions;
private List<ShareDept> shareDepts = new ArrayList<>();
private List<SharedUser> sharedUsers = new ArrayList<>();
private FolderDto parentFolder;
private long ownerId;
}
public String createFolder(NewDriveRequest request){
String uid = request.getOwner();
NewNameResponseDto makeDrive = null;
if(request.getParentFolder() != null){
FolderDto folderDto = request.getParentFolder();
Folder exisitingFolder = folderMogoRepository.findFolderByNameAndParentIdAndStatusIsNot(request.getName(),folderDto.getId(),0);
if(exisitingFolder != null){
log.info("이미 존재하는 폴더 :{}",exisitingFolder.getName());
return exisitingFolder.getId();
}
makeDrive = sftpService.createNewFolder(request.getName(), folderDto.getPath());
}else{
makeDrive = sftpService.createFolder(request.getName(),uid);
}
log.info("결과!!!!"+makeDrive);
if(makeDrive != null){
Folder folder = Folder.builder()
.name(request.getName())
.order((request.getOrder()+1.0)*100) // 널 체크
.parentId(request.getParentId())
.path(makeDrive.getPath())
.folderUUID(makeDrive.getFolderUUID())
.type(request.getType())
.ownerId(uid)
.description(request.getDescription())
.status(1)
.sharedUser("[]")
.isShared(request.getIsShared())
.linkSharing(request.getLinkSharing())
.createdAt(LocalDateTime.now())
.updatedAt(LocalDateTime.now())
.sharedDepts(request.getShareDepts())
.sharedUsers(request.getSharedUsers())
.build();
Folder savedFolder = folderMogoRepository.save(folder);
return savedFolder.getId();
}
return null;
}
댓글