Spring Boot/[Spring boot] 개발

[Spring boot] Folder 데이터베이스 생성, 기능 추가

재윤 2025. 1. 6. 04:08
반응형

 

Entity

FolderList

package com.Kkrap.Entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Entity
@Getter
@Setter
@Table(name = "folderlist")
public class FolderList {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long folderListId;

    @ManyToOne
    @JoinColumn(nullable = false, name = "folder_id")
    private Folders folder;

    @ManyToOne
    @JoinColumn(nullable = false, name = "link_id")
    private Links link;

}

Folders

package com.Kkrap.Entity;

import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;

import java.time.LocalDateTime;
import java.util.List;

@Entity
@Getter
@Setter
@Table(name = "folders")
public class Folders {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long folderId;

    @Column(nullable = false)
    private Long userId;

    @Column(nullable = true)
    private String FolderUrl;

    @Column(nullable = false)
    @CreationTimestamp
    private LocalDateTime createTime;

    @Column(nullable = false)
    private String folderName;

    @OneToMany(mappedBy = "folder", cascade = CascadeType.ALL)
    private List<FolderList> folderList;

    @Builder
    public Folders(Long userId){
        this.userId = userId;
    }

    public Folders(Long userId, String folderName){
        this.userId = userId;
        this.folderName = folderName;
    }

    public Folders()
    {}

}

 

Controller

FoldersController

package com.Kkrap.Controller;

import com.Kkrap.RequestDTO.FolderDeleteDTO;
import com.Kkrap.RequestDTO.FolderInsertUrlRequestDTO;
import com.Kkrap.RequestDTO.FolderUrlRequestDTO;
import com.Kkrap.RequestDTO.FolderCreateRequestDTO;
import com.Kkrap.ResponseDto.FolderUrlResponseDTO;
import com.Kkrap.ResponseDto.MessageResponseDTO;
import com.Kkrap.Service.FoldersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@RestController
@RequestMapping("/v1/folders")
public class FoldersController {
    @Autowired
    private FoldersService foldersService;

    //Selected
    //folders의 전체 Id 보내주기
    @GetMapping("/allid")
    public ResponseEntity<List<Long>> SelectedFoldersId(@RequestParam(name = "userId") Long user_id){
//        FoldersReponseDTO FoldersId = foldersService.SelectedFoldersId(user_id);
        return ResponseEntity.ok(foldersService.SelectedFoldersId(user_id));
    }

    //folders 안에 있는 url 보내주기
    @PostMapping("/folderurl")
    public ResponseEntity<List<FolderUrlResponseDTO>> SelectedFolderUrl(@RequestBody FolderUrlRequestDTO folderUrlRequestDTO)
    {
        List<FolderUrlResponseDTO> responseDto =  foldersService.SelectedFolderUrl(folderUrlRequestDTO.getFolderId(), folderUrlRequestDTO.getUserId());
        return ResponseEntity.ok(responseDto);
    }

    //Create
    //1. 폴더를 만드는 api
    @PostMapping("/create")
    public ResponseEntity<MessageResponseDTO> CreateFolder(@RequestBody FolderCreateRequestDTO foldersCreateRequestDTO)
    {
        return  foldersService.CreateFolder(foldersCreateRequestDTO);
    }

    //Delete
    @PostMapping("/delete")
    public ResponseEntity<MessageResponseDTO> DeleteFolder(@RequestBody FolderDeleteDTO folderDeleteDTO)
    {
        return foldersService.DeleteFolder(folderDeleteDTO);
    }

    //Update
    //폴더의 이름을 변경

    //폴더 전체 조회 -> 이거는 최악으 상황일 때 사용,,
    //요청은 사용자 id
//    @GetMapping("/all")
//    public List<> SelectedMemberFolders()
//    {}

}

Service

FolderListService

package com.Kkrap.Service;

import com.Kkrap.Entity.FolderList;
import com.Kkrap.Entity.Folders;
import com.Kkrap.Entity.Links;
import com.Kkrap.Entity.Users;
import com.Kkrap.Repository.FolderListRepository;
import com.Kkrap.Repository.FoldersRepository;
import com.Kkrap.Repository.LinksRepository;
import com.Kkrap.Repository.UsersRepository;
import com.Kkrap.RequestDTO.FolderInsertUrlRequestDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
public class FolderListService {
    @Autowired
    private FolderListRepository folderListRepository;

    @Autowired
    private UsersRepository usersRepository;

    @Autowired
    private FoldersRepository foldersRepository;

    @Autowired
    private LinksRepository linksRepository;

    //폴더에 url을 넣는 api
    public ResponseEntity<FolderInsertUrlRequestDTO> InsertUrlFolder(FolderInsertUrlRequestDTO folderInsertUrlRequestDTO)
    {
        System.out.println(folderInsertUrlRequestDTO.getFolderId()+ " " + folderInsertUrlRequestDTO.getUserId());
//        //먼저 folderId와 userId를 가진 folder가 있는지 체크
//        Optional<Folders> folder = foldersRepository.findById(folderInsertUrlRequestDTO.getFolderId());
//        if (folder.isEmpty())
//        {
//            return new ResponseEntity("Folder does not exist", HttpStatus.NOT_FOUND);
//        }
        //사용자가 있는지 검사
        Optional<Users> user = usersRepository.findById(
                folderInsertUrlRequestDTO.getUserId());

        if (user.isEmpty())
        {
            return new ResponseEntity("User does not exist", HttpStatus.NOT_FOUND);
        }

        //사용자가 폴더를 가지고 있는지 검사
        Optional<Folders> folder = foldersRepository.findByFolderIdAndUserId(
                folderInsertUrlRequestDTO.getFolderId(),
                folderInsertUrlRequestDTO.getUserId());
        if (folder.isEmpty())
        {
            return new ResponseEntity("Folder does not exist", HttpStatus.NOT_FOUND);
        }

        List<Long> linkIds = folderInsertUrlRequestDTO.getLinkId();
        linkIds.stream()
                .map(linkId -> {
                    FolderList folderList = new FolderList();
                    folderList.setFolder(folder.get());
                    Optional<Links> links = linksRepository.findById(linkId);
                    if (links.isPresent()) {
                        folderList.setLink(links.get());
                        return folderListRepository.save(folderList);
                    } else {
                        return new ResponseEntity<>("Url does not exist", HttpStatus.NOT_FOUND);
                    }
                }).collect(Collectors.toList());
        return ResponseEntity.ok(folderInsertUrlRequestDTO);
    }
}

FoldersService

package com.Kkrap.Service;

import com.Kkrap.Entity.FolderList;
import com.Kkrap.Entity.Folders;
import com.Kkrap.Entity.Links;
import com.Kkrap.Entity.Users;
import com.Kkrap.Exception.FoldersNotFoundException;
import com.Kkrap.Repository.FolderListRepository;
import com.Kkrap.Repository.FoldersRepository;
import com.Kkrap.Repository.LinksRepository;
import com.Kkrap.Repository.UsersRepository;
import com.Kkrap.RequestDTO.FolderCreateRequestDTO;
import com.Kkrap.RequestDTO.FolderDeleteDTO;
import com.Kkrap.RequestDTO.FolderInsertUrlRequestDTO;
import com.Kkrap.ResponseDto.FolderUrlResponseDTO;
import com.Kkrap.ResponseDto.MessageResponseDTO;
import org.apache.catalina.User;
import org.apache.coyote.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
public class FoldersService {
    @Autowired
    private UsersRepository usersRepository;

    @Autowired
    private FoldersRepository foldersRepository;

    @Autowired
    private FolderListRepository folderListRepository;

    @Autowired
    private LinksRepository linksRepository;

    public List<Long> SelectedFoldersId(Long id){
        List<Folders> foldersList = foldersRepository.findByUserId(id);

        if (foldersList.isEmpty())
        {
            throw new FoldersNotFoundException("해당 사용자 ID로 폴더를 찾을 수 없습니다.");
        }

        List<Long> folderIds = foldersList.stream()
                    .map(Folders::getFolderId)
                    .collect(Collectors.toList());

//        // Response DTO 생성 및 설정
//        FoldersReponseDTO responseDTO = new FoldersReponseDTO();
//        responseDTO.setFoldersId(folderIds);

        return folderIds;
    }

    public List<FolderUrlResponseDTO> SelectedFolderUrl(Long folderId, Long userId){
        // folderId로 모든 FolderList 조회
        List<FolderList> folderLists = folderListRepository.findByFolderFolderId(folderId);

        // folderLists에서 linkId 목록 추출
        List<Long> linkIds = folderLists.stream()
                .map(folderList -> folderList.getLink().getLinkId())
                .collect(Collectors.toList());

        // linkId 목록으로 Links 조회
        List<Links> links = linksRepository.findByLinkIdIn(linkIds);

        List<FolderUrlResponseDTO> responseDTOs = links.stream()
                .map(link -> new FolderUrlResponseDTO(link.getLinkId(), link.getLinkUrl(), link.getCreateTime()) )
                .collect(Collectors.toList());

        return responseDTOs;
    }

    //Create
    //폴더를 만드는 것
    public ResponseEntity<MessageResponseDTO> CreateFolder(FolderCreateRequestDTO foldersCreateRequestDTO)
    {
        String folderName = foldersCreateRequestDTO.getFolderName();
        Long userId = foldersCreateRequestDTO.getUserId();

        Folders folder = new Folders(userId, folderName);
        foldersRepository.save(folder);

        MessageResponseDTO responseDTO = new MessageResponseDTO("create Folder Success");
        return ResponseEntity.ok(responseDTO);
    }

    //Delete
    //폴더 삭제
    public ResponseEntity<MessageResponseDTO> DeleteFolder(FolderDeleteDTO folderDeleteDTO)
    {
        Long folderId = folderDeleteDTO.getFolderId();

        Optional<Folders> folder = foldersRepository.findById(folderId);
        if (folder.isPresent())
        {
            foldersRepository.deleteById(folderId);
            MessageResponseDTO message = new MessageResponseDTO("delete Folder Success");
            return ResponseEntity.ok(message);
        }
        else
        {
            return new ResponseEntity("Folder does not exist", HttpStatus.NOT_FOUND);
        }

    }
}

 

DTO

FolderUrlResponseDTO

package com.Kkrap.ResponseDto;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter
public class FolderUrlResponseDTO {
    private Long linkId;

    private String linkUrl;

    private LocalDateTime createTime;

    public FolderUrlResponseDTO(Long linkId, String linkUrl, LocalDateTime createTime){
        this.linkId =  linkId;
        this.linkUrl = linkUrl;
        this.createTime = createTime;

    }
}

API 설명

/v1/folders/allid?userId=1

요청

  • 사용자의 전체 Folder id값
    //folders의 전체 Id 보내주기
    @GetMapping("/allid")
    public ResponseEntity<List<Long>> SelectedFoldersId(@RequestParam(name = "userId") Long user_id){
//        FoldersReponseDTO FoldersId = foldersService.SelectedFoldersId(user_id);
        return ResponseEntity.ok(foldersService.SelectedFoldersId(user_id));
    }

 

  • List<Long> 이 반환됨.
[
    1,
    3
]

/v1/folders/folderurl

  • 요청 DTO
public class FolderUrlRequestDTO {
    private Long folderId;

    private Long userId;
}
  • 폴더 하나에 있는 모든 링크들
    @PostMapping("/folderurl")
    public ResponseEntity<List<FolderUrlResponseDTO>> SelectedFolderUrl(@RequestBody FolderUrlRequestDTO folderUrlRequestDTO)
    {
        List<FolderUrlResponseDTO> responseDto =  foldersService.SelectedFolderUrl(folderUrlRequestDTO.getFolderId(), folderUrlRequestDTO.getUserId());
        return ResponseEntity.ok(responseDto);
    }
  • 반환값의 타입 혹은 구조 설명
[
    {
        "linkId": 5,
        "linkUrl": "<https://www.youtube.com/watch?v=0-C4wzioBvY>",
        "createTime": "2024-08-30T00:31:47.768886"
    },
    {
        "linkId": 7,
        "linkUrl": "<https://www.youtube.com/watch?v=cJA1GOZ8S8o>",
        "createTime": "2024-09-22T21:33:02.83475"
    }
]

반환 DTO

public class FolderUrlResponseDTO {
    private Long linkId;

    private String linkUrl;

    private LocalDateTime createTime;

}

 

/v1/folders/create

  • 요청 DTO
public class FolderCreateRequestDTO {
    private Long userId;

    private String folderName;

}
  • Folder를 만드는 api
    //Create
    //1. 폴더를 만드는 api
    @PostMapping("/create")
    public ResponseEntity<MessageResponseDTO> CreateFolder(@RequestBody FolderCreateRequestDTO foldersCreateRequestDTO)
    {
        return  foldersService.CreateFolder(foldersCreateRequestDTO);
    }

  • 반환값의 타입 혹은 구조 설명
{
    "message": "create Folder Success"
}

/v1/folders/delete

  • 요청 DTO
public class FolderDeleteDTO {
    private Long folderId;
}
  • 폴더를 삭제하는 api
    @PostMapping("/delete")
    public ResponseEntity<MessageResponseDTO> DeleteFolder(@RequestBody FolderDeleteDTO folderDeleteDTO)
    {
        return foldersService.DeleteFolder(folderDeleteDTO);
    }
  • 반환값의 타입 혹은 구조 설명
{
    "message": "delete Folder Success"
}

 

/v1/folderlist/insert/url

  • 요청
public class FolderInsertUrlRequestDTO {
    private Long folderId;

    private List<Long> linkId;

    private Long userId;
}

  • 폴더 안에 Links들을 넣는 api
    @PostMapping("/insert/url")
    public ResponseEntity<FolderInsertUrlRequestDTO> InsertUrlFolder(@RequestBody FolderInsertUrlRequestDTO folderInsertUrlRequestDTO)
    {
        return folderListService.InsertUrlFolder(folderInsertUrlRequestDTO);
    }
  • 반환값은 FolderInsertUrlRequestDTO랑 같다
{
    "folderId": 1,
    "linkId": [
        8,
        9
    ],
    "userId": 1
}
반응형