Skip to content

Commit

Permalink
Chore: 큐시트 파일 업로드 추가 (#30)
Browse files Browse the repository at this point in the history
* Chore: 큐시트 최종확인, 시크릿메모 추가

* Chore: 게시판 태그 수정

* Chore: 큐시트 파일 업로드 추가

---------

Co-authored-by: yby654 <yby654321@gmail.com>
  • Loading branch information
yby654 and yby654321 authored Oct 12, 2023
1 parent 5f516eb commit f432139
Show file tree
Hide file tree
Showing 9 changed files with 149 additions and 64 deletions.
10 changes: 9 additions & 1 deletion nw/src/main/java/lab/cherry/nw/controller/FileController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.zip.ZipOutputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
Expand Down Expand Up @@ -176,7 +178,13 @@ public ResponseEntity<?> downloadFile(
String[] parts = objectName.split("/");

// 마지막 요소 확인
String fileName = parts[parts.length - 1];
String fileName = parts[parts.length - 1];

try {
fileName = URLEncoder.encode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
log.error("{}", e);
}

// 파일 다운로드를 위한 헤더 설정
HttpHeaders headers = new HttpHeaders();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package lab.cherry.nw.controller;

import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
Expand All @@ -15,7 +16,9 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
Expand Down Expand Up @@ -102,9 +105,9 @@ public ResponseEntity<?> findAllQsheets(
@ApiResponse(responseCode = "400", description = "입력 값이 잘못 되었습니다.", content = @Content(schema = @Schema(implementation = ErrorResponse.class))),
})
@Operation(summary = "Qsheet 생성", description = "Qsheet를 추가합니다.")
public ResponseEntity<?> createQsheet(@Valid @RequestBody QsheetEntity.QsheetCreateDto qsheetCreateDto) {
public ResponseEntity<?> createQsheet(@Valid @RequestPart QsheetEntity.QsheetCreateDto qsheetCreateDto, @RequestPart List<MultipartFile> files) {
log.info("[QsheetController] createQsheet...!");
qsheetService.createQsheet(qsheetCreateDto);
qsheetService.createQsheet(qsheetCreateDto, files);

final ResultResponse response = ResultResponse.of(SuccessCode.OK);
return new ResponseEntity<>(response, new HttpHeaders(), HttpStatus.OK);
Expand Down
4 changes: 2 additions & 2 deletions nw/src/main/java/lab/cherry/nw/model/BoardEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public static class BoardCreateDto {
@Schema(title = "큐시트 고유번호", example = "64f82e492948d933edfaa9c0")
private String qsheetSeq;
@Schema(title = "태그 목록")
private List<TagEntity> tag;
private List<String> tagList;
}
//
@Getter
Expand All @@ -93,7 +93,7 @@ public static class BoardUpdateDto {
@Schema(title = "큐시트 고유번호", example = "64f82e492948d933edfaa9c0")
private String qsheetSeq;
@Schema(title = "태그 목록")
private List<TagEntity> tag;
private List<String> tagList;
}

}
10 changes: 5 additions & 5 deletions nw/src/main/java/lab/cherry/nw/model/TagEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@

/**
* <pre>
* ClassName : BoardEntity
* ClassName : TagEntity
* Type : class
* Description : 게시판과 관련된 Entity를 구성하고 있는 클래스입니다.
* Related : BoardRepository, BoardServiceImpl
* Description : 태그와 관련된 Entity를 구성하고 있는 클래스입니다.
* Related : TagRepository, TagServiceImpl
* </pre>
*/
@Getter
Expand All @@ -27,8 +27,8 @@
@JsonPropertyOrder({ "created_at"})
public class TagEntity {
@Id
@JsonProperty("boardSeq")
@Schema(title = "게시판 고유번호", example = "38352658567418867") // (Long) Tsid
@JsonProperty("tagSeq")
@Schema(title = "태그 고유번호", example = "38352658567418867") // (Long) Tsid
private String id;

@JsonProperty("content")
Expand Down
120 changes: 84 additions & 36 deletions nw/src/main/java/lab/cherry/nw/service/Impl/BoardServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@
import lab.cherry.nw.error.exception.EntityNotFoundException;
import lab.cherry.nw.model.BoardEntity;
import lab.cherry.nw.model.QsheetEntity;
import lab.cherry.nw.model.TagEntity;
import lab.cherry.nw.model.UserEntity;
import lab.cherry.nw.model.TagEntity.TagCreateDto;
import lab.cherry.nw.repository.BoardRepository;
import lab.cherry.nw.repository.TagRepository;
import lab.cherry.nw.service.OrgService;
import lab.cherry.nw.service.BoardService;
import lab.cherry.nw.service.QsheetService;
import lab.cherry.nw.service.TagService;
import lab.cherry.nw.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -19,12 +23,14 @@
import org.springframework.transaction.annotation.Transactional;

import java.time.Instant;
import java.util.LinkedList;
import java.util.List;

/**
* <pre>
* ClassName : BoardServiceImpl
* Type : class0.20
* Description : 게시판 태그와 관련된 서비스 구현과 관련된 함수를 포함하고 있는 클래스입니다.
* Description : 게시물와 관련된 서비스 구현과 관련된 함수를 포함하고 있는 클래스입니다.
* Related : spring-boot-starter-data-jpa
* </pre>
*/
Expand All @@ -37,14 +43,16 @@ public class BoardServiceImpl implements BoardService {
private final BoardRepository boardRepository;
private final UserService userService;
private final QsheetService qsheetService;
private final TagService tagService;
private final TagRepository tagRepository;

/**
* [BoardServiceImpl] 전체 게시판 태그 조회 함수
* [BoardServiceImpl] 전체 게시물 조회 함수
*
* @return DB에서 전체 게시판 태그 정보 목록을 리턴합니다.
* @throws EntityNotFoundException 게시판 태그 정보가 없을 경우 예외 처리 발생
* @return DB에서 전체 게시물 정보 목록을 리턴합니다.
* @throws EntityNotFoundException 게시물 정보가 없을 경우 예외 처리 발생
* <pre>
* 전체 게시판 태그를 조회하여, 게시판 태그 목록을 반환합니다.
* 전체 게시물을 조회하여, 게시물 목록을 반환합니다.
* </pre>
*
* Author : yby654(yby654@github.com)
Expand All @@ -59,25 +67,45 @@ public Page<BoardEntity> getBoards(Pageable pageable) {

//
/**
* [BoardServiceImpl] 게시판 태그 생성 함수
* [BoardServiceImpl] 게시물 생성 함수
*
* @param boardCreateDto 게시판 태그 생성에 필요한 게시판 태그 등록 정보를 담은 개체입니다.
* @return 생성된 게시판 태그 정보를 리턴합니다.
* @param boardCreateDto 게시물 생성에 필요한 게시물 등록 정보를 담은 개체입니다.
* @return 생성된 게시물 정보를 리턴합니다.
// * @throws CustomException 중복된 이름에 대한 예외 처리 발생
* <pre>
* 게시판 태그을 등록합니다.
* 게시물을 등록합니다.
* </pre>
*
* Author : yby654(yby654@github.com)
*/
public void createBoard(BoardEntity.BoardCreateDto boardCreateDto) {
Instant instant = Instant.now();
UserEntity userEntity = userService.findById(boardCreateDto.getUserSeq());
QsheetEntity qsheetEntity= qsheetService.findById(boardCreateDto.getQsheetSeq());
QsheetEntity qsheetEntity= null;
if(boardCreateDto.getQsheetSeq()!=null){
qsheetService.findById(boardCreateDto.getQsheetSeq());
}
List<TagEntity> tagList = new LinkedList<>();
if(boardCreateDto.getTagList() !=null){
for(String tag : boardCreateDto.getTagList()){
TagEntity tagEntity = tagService.findByName(tag);
if(tagEntity !=null){
tagList.add(tagEntity);
}else{
TagEntity.TagCreateDto tagCreateDto=TagCreateDto.builder()
.name(tag)
.build();
tagService.createTag(tagCreateDto);
TagEntity newTagEntity = tagService.findByName(tag);
tagList.add(newTagEntity);
}
}
}
BoardEntity boardEntity = BoardEntity.builder()
.userid(userEntity)
.content(boardCreateDto.getContent())
.qsheet(qsheetEntity)
.tag(tagList)
// .name(boardCreateDto.getName())
// .data(boardCreateDto.getData())
.created_at(instant)
Expand All @@ -86,10 +114,10 @@ public void createBoard(BoardEntity.BoardCreateDto boardCreateDto) {
}

/**
* [BoardServiceImpl] 게시판 태그 수정 함수
* [BoardServiceImpl] 게시물 수정 함수
*
* @param id 조회할 게시판 태그의 고유번호입니다.
* @param boardUpdateDto 게시판 태그 수정에 필요한 사용자 정보를 담은 개체입니다.
* @param id 조회할 게시물의 고유번호입니다.
* @param boardUpdateDto 게시물 수정에 필요한 사용자 정보를 담은 개체입니다.
* @throws EntityNotFoundException 사용자 정보가 없을 경우 예외 처리 발생
* <pre>
* 특정 게시물에 대해 정보를 수정합니다.
Expand All @@ -100,15 +128,35 @@ public void createBoard(BoardEntity.BoardCreateDto boardCreateDto) {
public void updateById(String id, BoardEntity.BoardUpdateDto boardUpdateDto) {
Instant instant = Instant.now();
BoardEntity boardEntity = findById(id);
QsheetEntity qsheetEntity= qsheetService.findById(boardUpdateDto.getQsheetSeq());



List<TagEntity> tagList = new LinkedList<>();
if(boardUpdateDto.getTagList() !=null){
for(String tag : boardUpdateDto.getTagList()){
TagEntity tagEntity = tagService.findByName(tag);
if(tagEntity !=null){
tagList.add(tagEntity);
}else{
TagEntity.TagCreateDto tagCreateDto=TagCreateDto.builder()
.name(tag)
.build();
tagService.createTag(tagCreateDto);
TagEntity newTagEntity = tagService.findByName(tag);
tagList.add(newTagEntity);
}
}
}else{
tagList=boardEntity.getTag();
}

if (boardEntity.getContent() != null || boardEntity.getQsheet()!=null|| boardEntity.getTag()!= null) {
boardEntity = BoardEntity.builder()
.id(boardEntity.getId())
.userid(boardEntity.getUserid())
.content(boardUpdateDto.getContent())
.qsheet(qsheetEntity)
.tag(boardEntity.getTag())
.content(boardUpdateDto.getContent() != null ? boardUpdateDto.getContent():boardEntity.getContent() )
.qsheet(boardUpdateDto.getQsheetSeq()!=null? qsheetService.findById(boardUpdateDto.getQsheetSeq()) : boardEntity.getQsheet())
.tag(tagList)
.updated_at(instant)
.build();
boardRepository.save(boardEntity);
Expand All @@ -121,12 +169,12 @@ public void updateById(String id, BoardEntity.BoardUpdateDto boardUpdateDto) {
}

/**
* [BoardServiceImpl] 게시판 태그 삭제 함수
* [BoardServiceImpl] 게시물 삭제 함수
*
* @param id 삭제할 게시판 태그의 식별자입니다.
* @throws EntityNotFoundException 해당 ID의 게시판 태그 정보가 없을 경우 예외 처리 발생
* @param id 삭제할 게시물의 식별자입니다.
* @throws EntityNotFoundException 해당 ID의 게시물 정보가 없을 경우 예외 처리 발생
* <pre>
* 입력한 id를 가진 게시판 태그 정보를 삭제합니다.
* 입력한 id를 가진 게시물 정보를 삭제합니다.
* </pre>
*
* Author : yby654(yby654@github.com)
Expand All @@ -138,31 +186,31 @@ public void deleteById(String id) {


// /**
// * [BoardServiceImpl] 게시판 태그 이름 중복 체크 함수
// * [BoardServiceImpl] 게시물 이름 중복 체크 함수
// *
// * @param name 중복 체크에 필요한 게시판 태그 이름 객체입니다.
// * @throws CustomException 게시판 태그의 이름이 중복된 경우 예외 처리 발생
// * @param name 중복 체크에 필요한 게시물 이름 객체입니다.
// * @throws CustomException 게시물의 이름이 중복된 경우 예외 처리 발생
// * <pre>
// * 입력된 게시판 태그 이름으로 이미 등록된 게시판 태그이 있는지 확인합니다.
// * 입력된 게시물 이름으로 이미 등록된 게시물이 있는지 확인합니다.
// * </pre>
// *
// * Author : yby654(yby654@github.com)
// */
// @Transactional(readOnly = true)
// public void checkExistsWithBoardName(String name) {
// if (boardRepository.findByName(name).isPresent()) {
// throw new CustomException(ErrorCode.DUPLICATE); // 게시판 태그 이름이 중복됨
// throw new CustomException(ErrorCode.DUPLICATE); // 게시물 이름이 중복됨
// }
// }
//
// /**
// * [BoardServiceImpl] NAME으로 게시판 태그 조회 함수
// * [BoardServiceImpl] NAME으로 게시물 조회 함수
// *
// * @param name 조회할 게시판 태그의 이름입니다.
// * @return 주어진 이름에 해당하는 게시판 태그 정보를 리턴합니다.
// * @throws EntityNotFoundException 해당 이름의 게시판 태그 정보가 없을 경우 예외 처리 발생
// * @param name 조회할 게시물의 이름입니다.
// * @return 주어진 이름에 해당하는 게시물 정보를 리턴합니다.
// * @throws EntityNotFoundException 해당 이름의 게시물 정보가 없을 경우 예외 처리 발생
// * <pre>
// * 입력한 name에 해당하는 게시판 태그 정보를 조회합니다.
// * 입력한 name에 해당하는 게시물 정보를 조회합니다.
// * </pre>
// *
// * Author : yby654(yby654@github.com)
Expand All @@ -173,13 +221,13 @@ public void deleteById(String id) {
// }
//
/**
* [BoardServiceImpl] ID로 게시판 태그 조회 함수
* [BoardServiceImpl] ID로 게시물 조회 함수
*
* @param id 조회할 게시판 태그의 식별자입니다.
* @return 주어진 식별자에 해당하는 게시판 태그 정보
* @throws EntityNotFoundException 해당 ID의 게시판 태그 정보가 없을 경우 예외 처리 발생
* @param id 조회할 게시물의 식별자입니다.
* @return 주어진 식별자에 해당하는 게시물 정보
* @throws EntityNotFoundException 해당 ID의 게시물 정보가 없을 경우 예외 처리 발생
* <pre>
* 입력한 id에 해당하는 게시판 태그 정보를 조회합니다.
* 입력한 id에 해당하는 게시물 정보를 조회합니다.
* </pre>
*
* Author : yby654(yby654@github.com)
Expand Down
30 changes: 17 additions & 13 deletions nw/src/main/java/lab/cherry/nw/service/Impl/FileServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,46 +57,50 @@ public Page<FileEntity> getFiles(Pageable pageable) {
public List<String> uploadFiles(Map<String, String> info, List<MultipartFile> files) {

String orgId = info.get("org"); // 조직명
String userName = info.get("user"); // 사용자명
String type = info.get("type"); // 파일 구분명
String userId = info.get("user"); // 사용자명
String type = info.get("type");
String qsheetSeq= info.get("qsheetSeq"); // 파일 구분명
String bucketName = null;

String destPath;
if (userName != null) {
// user가 입력되면, {org_objectId}/고객/{userName}으로 Path 지정
destPath = "/고객/" + userName + "/";
if (userId != null) {
// user가 입력되면, /user/{userId}으로 Path 지정
bucketName = "user";
destPath = userId + "/" + qsheetSeq +"/";
} else {
// user값이 없을 시, {org_objectId}/관리/로 Path 지정
bucketName = orgId;
destPath = "/관리/";
}

List<String> fileObjectIds = new ArrayList<>();

for (MultipartFile file : files) {
String originalFilename = (userName != null) ? file.getOriginalFilename() : type + "/" + file.getOriginalFilename();
String filePath = destPath + originalFilename;
String originalFilename = (userId != null) ? file.getOriginalFilename() : type + "/" + file.getOriginalFilename();
String filepath = destPath + originalFilename;

log.error("filePath is {}", filePath);
log.error("objectName is {}", filepath);

try {
minioService.uploadObject(orgId, filePath, file);
minioService.uploadObject(bucketName, filepath, file);
} catch (IOException e) {
log.error(e.getMessage());
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
throw new RuntimeException(e);
}

String fileUrl = "/api/v1/file/download/" + orgId + "?path=" + filePath;
String fileUrl = "/api/v1/file/download/" + bucketName + "?path=" + filepath;
// 파일 객체 ID 저장
fileObjectIds.add(fileUrl);

FileEntity fileEntity = FileEntity.builder()
.name(file.getOriginalFilename())
.size(FormatConverter.convertInputBytes(file.getSize()))
.type(file.getContentType())
.path(filePath)
.path(filepath)
.url(fileUrl)
.userid(userName)
.orgid(orgId)
.userid(userId)
.orgid(bucketName)
.created_at(Instant.now())
.build();

Expand Down
Loading

0 comments on commit f432139

Please sign in to comment.