Skip to content

Commit

Permalink
[feat] #72 이미지 업로드 테스트 로직
Browse files Browse the repository at this point in the history
  • Loading branch information
hyeesw committed Aug 24, 2024
1 parent 9074632 commit aaca32e
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.book.backend.domain.message.controller;

import com.book.backend.domain.message.dto.MessageImgRequsetDto;
import com.book.backend.domain.message.dto.MessageRequestDto;
import com.book.backend.domain.message.dto.MessageResponseDto;
import com.book.backend.domain.message.entity.Message;
Expand All @@ -20,14 +21,14 @@
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

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


Expand All @@ -48,6 +49,14 @@ public void chat(MessageRequestDto messageRequestDto) {
sendingOperations.convertAndSend("/sub/message/" + messageRequestDto.getOpentalkId(), response); // 수신자들에게 전송
}

// 이미지 s3 에 저장 테스트
@PostMapping(value = "/api/message/image", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE},
produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<?> saveImage(MessageImgRequsetDto dto) throws IOException {
messageService.saveImage(dto);
return responseTemplate.success("success", HttpStatus.OK);
}


// 채팅 불러오기
@Operation(summary="메세지 불러오기 (특정 오픈톡)", description="오픈톡 ID 를 입력으로 받아 pageSize개 데이터를 반환합니다. (pageNo로 페이지네이션)",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.book.backend.domain.message.dto;

import lombok.Getter;
import lombok.Setter;
import org.springframework.web.multipart.MultipartFile;

@Setter
@Getter
public class MessageImgRequsetDto {
private MultipartFile image;
}
14 changes: 12 additions & 2 deletions src/main/java/com/book/backend/domain/message/entity/Message.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,17 @@ public class Message {
@JoinColumn(name = "user_id")
private User user;

private String content;

private Date createdAt;

private String content; // TODO : text로 리팩

private String imageUrl;

public void createMessage(Opentalk opentalk, User user, String content, String imageUrl){
this.opentalk = opentalk;
this.user = user;
this.content = content;
this.imageUrl = imageUrl;
this.createdAt = new Date();
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package com.book.backend.domain.message.service;

import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.book.backend.domain.auth.service.CustomUserDetailsService;
import com.book.backend.domain.message.dto.MessageImgRequsetDto;
import com.book.backend.domain.message.dto.MessageRequestDto;
import com.book.backend.domain.message.dto.MessageResponseDto;
import com.book.backend.domain.message.entity.Message;
import com.book.backend.domain.message.mapper.MessageMapper;
import com.book.backend.domain.message.repository.MessageRepository;
import com.book.backend.domain.opentalk.entity.Opentalk;
import com.book.backend.domain.opentalk.repository.OpentalkRepository;
import com.book.backend.domain.user.entity.User;
import com.book.backend.domain.user.repository.UserRepository;
import com.book.backend.exception.CustomException;
import com.book.backend.exception.ErrorCode;
import com.book.backend.global.s3.S3Config;
import com.book.backend.util.JwtUtil;
import io.jsonwebtoken.ExpiredJwtException;
import lombok.RequiredArgsConstructor;
Expand All @@ -21,7 +27,10 @@
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;

Expand All @@ -34,6 +43,9 @@ public class MessageService {
private final MessageMapper messageMapper;
private final JwtUtil jwtUtil;
private final CustomUserDetailsService userDetailsService;
private final UserRepository UserRepository;
private final UserRepository userRepository;
private final S3Config s3Client;

@Transactional
public MessageResponseDto saveMessage(MessageRequestDto messageRequestDto){
Expand All @@ -52,6 +64,24 @@ public MessageResponseDto saveMessage(MessageRequestDto messageRequestDto){
return messageMapper.convertToMessageResponseDto(message);
}

@Transactional
public void saveImage(MessageImgRequsetDto dto) throws IOException {
MultipartFile image = dto.getImage();
log.trace("MessageService > saveImage()");
User user = userRepository.findByLoginId("user6").orElseThrow();
s3Client.uploadImageToS3(image);

Opentalk opentalk = opentalkRepository.findByOpentalkId(1L).orElseThrow();
Message message = new Message();
message.createMessage(opentalk, user, "이미지", null);
// TODO : 이미지 메타데이터 DB에 저장
// try{
// messageRepository.save(message);
// } catch (Exception e){
// throw new CustomException(ErrorCode.MESSAGE_SAVE_FAILED);
// }
}


public void validateToken(String token) {
try{
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/book/backend/global/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
.requestMatchers("/api/auth/signup", "/api/auth/login", "/api/auth/kakaoLogin", "/api/auth/appleLogin").permitAll() // 회원가입, 로그인 경로
.requestMatchers("/.well-known/**").permitAll()
.requestMatchers("/ws-stomp/**").permitAll() // stomp 통신
// .requestMatchers("/**").permitAll() // 모든 API에 대한 인증 비활성화 (개발용)
.requestMatchers("/**").permitAll() // 모든 API에 대한 인증 비활성화 (개발용)
.anyRequest().authenticated()
)
.exceptionHandling((exception) -> exception
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/com/book/backend/global/s3/S3Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,24 @@
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.PutObjectResult;
import com.book.backend.exception.CustomException;
import com.book.backend.exception.ErrorCode;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;
import com.amazonaws.services.s3.AmazonS3;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

@Configuration
public class S3Config {
@Value("${cloud.aws.s3.bucket}")
private String bucketName;
@Value("${cloud.aws.credentials.access-key}")
private String accessKey;
@Value("${cloud.aws.credentials.secret-key}")
Expand All @@ -27,4 +38,21 @@ public AmazonS3 s3Client() {
.withRegion(region)
.build();
}

// 이미지 업로드
public PutObjectResult uploadImageToS3(MultipartFile image) throws IOException {
String fileName = image.getOriginalFilename(); //날짜로 바꾸기
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(image.getSize());
objectMetadata.setContentType(image.getContentType());

// 이미지 request
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, image.getInputStream(), objectMetadata);
// 이미지 전송
PutObjectResult response = s3Client().putObject(putObjectRequest);
// 실패하면 예외처리 어케?
return response;
}

//TODO : 이미지 가져오기
}

0 comments on commit aaca32e

Please sign in to comment.