Skip to content
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
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package es.princip.ringus.infra.storage.api;

import es.princip.ringus.domain.exception.MemberErrorCode;
import es.princip.ringus.global.exception.CustomRuntimeException;
import es.princip.ringus.global.util.ApiResponseWrapper;
import es.princip.ringus.infra.storage.application.StorageService;
import es.princip.ringus.infra.storage.domain.CertificateType;
import es.princip.ringus.infra.storage.dto.CertificateUploadRequest;
import es.princip.ringus.infra.storage.dto.ProfileUploadRequest;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/storage")
Expand All @@ -23,9 +27,16 @@ public class StorageController {
*/
@PostMapping("/certificate/mentee")
public ResponseEntity<ApiResponseWrapper<Void>> uploadMenteeCertificate(
@ModelAttribute CertificateUploadRequest certificateUploadRequest
@ModelAttribute CertificateUploadRequest certificateUploadRequest,
HttpSession session
) {
String filePath = storageService.uploadMenteeCertificate(certificateUploadRequest);

Long memberId = (Long)session.getAttribute("memberId");
if(memberId == null){
throw new CustomRuntimeException(MemberErrorCode.SESSION_EXPIRED);
}

String filePath = storageService.uploadMenteeCertificate(certificateUploadRequest,memberId);
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, filePath));
}

Expand All @@ -34,9 +45,15 @@ public ResponseEntity<ApiResponseWrapper<Void>> uploadMenteeCertificate(
*/
@PostMapping("/certificate/mentor")
public ResponseEntity<ApiResponseWrapper<Void>> uploadMentorCertificate(
@ModelAttribute CertificateUploadRequest certificateUploadRequest
@ModelAttribute CertificateUploadRequest certificateUploadRequest,
HttpSession session
) {
String filePath = storageService.uploadMentorCertificate(certificateUploadRequest);
Long memberId = (Long)session.getAttribute("memberId");
if(memberId == null){
throw new CustomRuntimeException(MemberErrorCode.SESSION_EXPIRED);
}

String filePath = storageService.uploadMentorCertificate(certificateUploadRequest, memberId);
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, filePath));
}

Expand All @@ -45,8 +62,15 @@ public ResponseEntity<ApiResponseWrapper<Void>> uploadMentorCertificate(
*/
@PostMapping("/profile/image")
public ResponseEntity<ApiResponseWrapper<Void>> uploadProfileImage(
@ModelAttribute ProfileUploadRequest request
@ModelAttribute ProfileUploadRequest request,
HttpSession session
) {

Long memberId = (Long)session.getAttribute("memberId");
if(memberId == null){
throw new CustomRuntimeException(MemberErrorCode.SESSION_EXPIRED);
}

String filePath = storageService.uploadProfileImage(request);
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, filePath));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import es.princip.ringus.domain.member.MemberType;
import es.princip.ringus.infra.storage.domain.CertificateType;
import es.princip.ringus.infra.storage.domain.FileMemberRepository;
import es.princip.ringus.infra.storage.dto.CertificateUploadRequest;
import es.princip.ringus.infra.storage.dto.ProfileUploadRequest;
import lombok.RequiredArgsConstructor;
Expand All @@ -14,24 +15,33 @@
public class StorageService {

private final S3Service s3Service;
private final FileMemberRepository fileMemberRepository;

@Transactional
public String uploadMenteeCertificate(CertificateUploadRequest request) {
public String uploadMenteeCertificate(CertificateUploadRequest request, Long memberId) {

String folderPath = buildCertificateFolderPath(request.certificateType(), false);

return s3Service.uploadFile(request.file(), folderPath);
String filePath = s3Service.uploadFile(request.file(), folderPath);

fileMemberRepository.save(request.toFileMemberEntity(filePath, memberId));

return filePath;
}

/**
* 멘토 증명서 업로드
*/
@Transactional
public String uploadMentorCertificate(CertificateUploadRequest request) {
public String uploadMentorCertificate(CertificateUploadRequest request, Long memberId) {

String folderPath = buildCertificateFolderPath(request.certificateType(), true);

return s3Service.uploadFile(request.file(), folderPath);
String filePath = s3Service.uploadFile(request.file(), folderPath);

fileMemberRepository.save(request.toFileMemberEntity(filePath, memberId));

return filePath;
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package es.princip.ringus.infra.storage.domain;

import es.princip.ringus.domain.base.BaseTimeEntity;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@NoArgsConstructor
public class FileMember extends BaseTimeEntity {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "file_member_id")
private Long id;

private Long memberId;

private String filePath;

private Boolean isVerified;

@Builder
public FileMember(
final Long memberId,
final String filePath
) {
this.memberId = memberId;
this.filePath = filePath;
this.isVerified = false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package es.princip.ringus.infra.storage.domain;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface FileMemberRepository extends JpaRepository<FileMember, Long> {
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package es.princip.ringus.infra.storage.dto;

import es.princip.ringus.infra.storage.domain.Certificate;
import es.princip.ringus.infra.storage.domain.CertificateType;
import jakarta.validation.constraints.NotBlank;
import es.princip.ringus.infra.storage.domain.FileMember;
import org.springframework.web.multipart.MultipartFile;

public record CertificateUploadRequest(
MultipartFile file,
CertificateType certificateType,
Long userId
CertificateType certificateType
) {
// form-data 형식에서는 record 클래스는 자동 바인딩이 안돼서 생성자를 명시적으로 만들어줘야 함
public CertificateUploadRequest {
Expand All @@ -18,16 +16,11 @@ public record CertificateUploadRequest(
if (certificateType == null) {
throw new IllegalArgumentException("증명서 유형은 필수입니다.");
}
if (userId == null) {
throw new IllegalArgumentException("유저 ID는 필수입니다.");
}
}

public static Certificate toEntity(CertificateUploadRequest request, String filePath) {
return Certificate.builder()
.fileName(request.file().getOriginalFilename())
public FileMember toFileMemberEntity(String filePath, Long memberId) {
return FileMember.builder()
.memberId(memberId)
.filePath(filePath)
.certificateType(request.certificateType())
.build();
}
}
Loading