Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature/8 post] 거래 등록 #13

Merged
merged 7 commits into from
Oct 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/main/java/com/tomato/market/config/JpaAuditingConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.tomato.market.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {
}
34 changes: 34 additions & 0 deletions src/main/java/com/tomato/market/config/SwaggerConfig.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
package com.tomato.market.config;

import java.lang.reflect.Type;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.ObjectMapper;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
Expand All @@ -17,4 +24,31 @@ public OpenAPI openApi() {
return new OpenAPI().info(info);
}

// swagger에 multipart/form-data 형식을 인지시키기 위한 설정
@Component
public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {

/**
* "Content-Type: multipart/form-data" 헤더를 지원하는 HTTP 요청 변환기
*/
public MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) {
super(objectMapper, MediaType.APPLICATION_OCTET_STREAM);
}

@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
return false;
}

@Override
public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {
return false;
}

@Override
protected boolean canWrite(MediaType mediaType) {
return false;
}
}

}
142 changes: 115 additions & 27 deletions src/main/java/com/tomato/market/controller/BoardController.java
Original file line number Diff line number Diff line change
@@ -1,53 +1,141 @@
package com.tomato.market.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.tomato.market.data.dto.ImageDto;
import com.tomato.market.data.dto.PostDto;
import com.tomato.market.data.dto.PostListResponseDto;
import com.tomato.market.data.dto.PostResponseDto;
import com.tomato.market.service.BoardService;

import jakarta.servlet.http.HttpSession;
import jakarta.validation.Valid;

@RestController
@RequestMapping("/api")
public class BoardController {
private final Logger logger = LoggerFactory.getLogger(BoardController.class);

private final BoardService boardService;

@Autowired
public BoardController(BoardService boardService) {
this.boardService = boardService;
}

@GetMapping("/board/getList")
public void getList(HttpSession session) { // 리턴 타입 변경해야할 가능성 있음
// logger.info("BoardController.getList() is called");
// // 세션을 확인
// logger.info("BoardController.getList() : 세션 아이디-" + session.getId());
// logger.info("BoardController.getList() : 세션 값-" + session.getAttribute("userId"));

// 계획을 수정
// 기본 등록 메소드 부터 만든 후
// 조회 메소드를 만들기로 함
@PostMapping(value = "/board/writePost", consumes = {MediaType.APPLICATION_JSON_VALUE,
MediaType.MULTIPART_FORM_DATA_VALUE})
public PostResponseDto writePost(
@RequestPart(value = "postDto") @Valid PostDto postDto,
@RequestPart(value = "images", required = false) List<MultipartFile> files)
throws IOException { // 추후 @Valid // 이미지도 받아와야 함
logger.info("BoardController.writePost() is called");
logger.info("BoardController.writerPost() : Validation 검증 성공");

logger.warn(postDto.toString());
logger.warn(files.toString());

// 게시글 등록
PostDto savedPost = boardService.writePost(postDto);
logger.info("BoardController.writePost() : 게시글 저장 성공");

Integer postNum = savedPost.getPostNum(); //

if (files != null) {
logger.info("BoardController.writePost() : 이미지 개수-" + files.size());
// postID와 연관하여 이미지 등록 // Image API를 따로 분리? : DB간 관계가 성립되지 않는 문제 있음
boardService.uploadImages(postNum, files);
logger.info("BoardController.writePost() : 이미지 저장 성공");
}

// 결과 리턴
return PostResponseDto.builder()
.status(HttpStatus.OK)
.message("게시글 등록 성공")
.build();
}

// 조회 삭제 수정 : 각각 별도 이슈로 분리?
// PutMapping?
// updatePost() {}


@GetMapping("/board/getPostList")
public PostListResponseDto getPostList() { // 리턴 타입을 리스트로?
// 모든 게시글 조회 -> 페이징 처리 예정, int page 받기
logger.info("BoardController.getPostList() is called");

// List<PostDto> postList = boardService.getAllPostList();
List<PostDto> postList = boardService.getPostList();
if (postList == null) { // 잘못됨
logger.warn("BoardController.getPostList() : 게시글 리스트를 찾을 수 없음");
// throw new Error // Service에서 처리?
}
// 게시글 리스트를 받음
logger.info("BoardController.getPostList() : 게시글 리스트를 찾음");

// 찾은 postList에서 각 Post의 ID로 Image를 찾음
List<ImageDto> imageList = new ArrayList<>();
for (int i = 0; i < postList.size(); i++) {
// imageList.add(
// 썸네일로 사용할 Image 1개만 필요
// boardService.getPostImage(postList.get(i).getPostNum())
// 이미지가 없는 경우는 Service 단에서 Default 이미지 전송
// );
}


// Return
// 게시글 List 첨부
// 이미지 List 첨부
// 하나의 응답 DTO로 변환하여 반환
return PostListResponseDto.builder()
.status(HttpStatus.OK)
.message("게시글 리스트 불러오기 성공")
.content(postList)
.build();
}

// @PostMapping("/board/registerPost")
// public void registerPost() {
//
// }

// @PostMapping("/board/registerImage")
// public void uploadImage() { // 이미지 등록 메소드를 별도 처리?
// // 게시글 이미지 저장 관련 코드
// // 이미지는 다른 controller 메소드 사용
// // multiPartFile로 받음 .getOriginalFilename(),
// // 이미지는 각각 uuid를 가짐
// // File 객체 생성, uuid+주소
// // .transferTo()로 서버에 저장
//
// if (session.getAttribute("userId") != null) { // 세션이 있는 경우
// logger.info("BoardController.getList() : 세션에 userId가 있음");
// // 있으면 List<EnrolEntity>?? 반환
// // 경로를 기준, base64?
//
// // (임시) 세션이 잘 들어왔는지 확인
// return UserResponseDto.builder()
// .status(HttpStatus.OK)
// .message(session.getAttribute("userId"))
// .build();
// } else { // 세션이 없는 경우
// // 없으면 유효하지 않은 세션입니다.
// logger.warn("BoardController.getList() : 세션에 userId가 없음");
// // throw new // 예외를 던지기
// // React에서 로그인 페이지로 Redirect
// }
// // 수정 예정
// return UserResponseDto.builder()
// .status(HttpStatus.BAD_REQUEST)
// .message("세션이 존재하지 않음")
// .build();
}
//
// // 게시글 이미지 조회 관련 코드
// // List<ImageDto> list = findPostImageListById(postId)
// // for() { list.add
// // if(image == null) { .add(default Image)
//
// }


}
17 changes: 17 additions & 0 deletions src/main/java/com/tomato/market/dao/BoardDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.tomato.market.dao;

import java.util.List;

import com.tomato.market.data.entity.ImageEntity;
import com.tomato.market.data.entity.PostEntity;

public interface BoardDao {
PostEntity save(PostEntity postEntity);

ImageEntity saveImage(ImageEntity imageEntity);

List<PostEntity> findPostList();

ImageEntity findImageByPostNum(Integer postNum);

}
83 changes: 83 additions & 0 deletions src/main/java/com/tomato/market/dao/impl/BoardDaoImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package com.tomato.market.dao.impl;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.tomato.market.dao.BoardDao;
import com.tomato.market.data.entity.ImageEntity;
import com.tomato.market.data.entity.PostEntity;
import com.tomato.market.data.repository.ImageRepository;
import com.tomato.market.data.repository.PostRepository;

@Service
@Transactional
public class BoardDaoImpl implements BoardDao {
private final Logger logger = LoggerFactory.getLogger(BoardDaoImpl.class);

private final PostRepository postRepository;
private final ImageRepository imageRepository;

@Autowired
public BoardDaoImpl(PostRepository postRepository, ImageRepository imageRepository) {
this.postRepository = postRepository;
this.imageRepository = imageRepository;
}


@Override
public PostEntity save(PostEntity postEntity) {
logger.info("BoardDaoImpl.save() is called");
// Entity로 Post 등록
PostEntity savedResult = postRepository.save(postEntity);
if (savedResult.getPostNum() != null) {
logger.info("BoardDaoImpl.save() : 데이터 저장 성공");
return savedResult;
} else {
logger.warn("BoardDaoImpl.save() : 데이터 저장 실패");
return null;
}
}

@Override
public ImageEntity saveImage(ImageEntity imageEntity) {
logger.info("BoardDaoImpl.saveImage() is called");

ImageEntity savedResult = imageRepository.save(imageEntity);
if (savedResult.getImageNum() != null) {
logger.info("BoardDaoImpl.saveImage() : 이미지 정보 저장 성공");
return savedResult;
} else {
logger.warn("BoardDaoImpl.saveImage() : 이미지 정보 저장 실패");
return null;
}
}

@Override
public List<PostEntity> findPostList() {
//
// Optional<List<PostEntity>> postEntities = postRepository.find();
// if (postEntities.isPresent()) {
// return postEntities.get();
// } else {
// throw new BoardException("데이터를 불러오지 못했습니다.");
// }
return null;
}

@Override
public ImageEntity findImageByPostNum(Integer postNum) {
// Optional<ImageEntity> imageEntity = postRepository.findImageByPostNum(postNum);
// if (imageEntity.isPresent()) { // PostId로 이미지를 찾음
// return imageEntity.get();
// } else { // 이미지를 찾지 못함 or 애초에 없음?
// // throw new ImageException();
// // or return null?
return null;
// }
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/tomato/market/data/dto/ImageDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.tomato.market.data.dto;

import com.tomato.market.data.entity.ImageEntity;

import lombok.Builder;

@Builder
public class ImageDto {

public static ImageDto toImageDto(ImageEntity imageEntity) {
return ImageDto.builder().build();
}
}
Loading