Skip to content

Commit 1938d49

Browse files
authored
RINGUS-36: feat: 멤버Id 및 파일경로 매핑 테이블 생성 (#21)
1 parent 2f89d3b commit 1938d49

File tree

5 files changed

+92
-24
lines changed

5 files changed

+92
-24
lines changed

src/main/java/es/princip/ringus/infra/storage/api/StorageController.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package es.princip.ringus.infra.storage.api;
22

3+
import es.princip.ringus.domain.exception.MemberErrorCode;
4+
import es.princip.ringus.global.exception.CustomRuntimeException;
35
import es.princip.ringus.global.util.ApiResponseWrapper;
46
import es.princip.ringus.infra.storage.application.StorageService;
5-
import es.princip.ringus.infra.storage.domain.CertificateType;
67
import es.princip.ringus.infra.storage.dto.CertificateUploadRequest;
78
import es.princip.ringus.infra.storage.dto.ProfileUploadRequest;
9+
import jakarta.servlet.http.HttpSession;
810
import lombok.RequiredArgsConstructor;
911
import org.springframework.http.HttpStatus;
1012
import org.springframework.http.ResponseEntity;
11-
import org.springframework.web.bind.annotation.*;
12-
import org.springframework.web.multipart.MultipartFile;
13+
import org.springframework.web.bind.annotation.ModelAttribute;
14+
import org.springframework.web.bind.annotation.PostMapping;
15+
import org.springframework.web.bind.annotation.RequestMapping;
16+
import org.springframework.web.bind.annotation.RestController;
1317

1418
@RestController
1519
@RequestMapping("/storage")
@@ -23,9 +27,16 @@ public class StorageController {
2327
*/
2428
@PostMapping("/certificate/mentee")
2529
public ResponseEntity<ApiResponseWrapper<Void>> uploadMenteeCertificate(
26-
@ModelAttribute CertificateUploadRequest certificateUploadRequest
30+
@ModelAttribute CertificateUploadRequest certificateUploadRequest,
31+
HttpSession session
2732
) {
28-
String filePath = storageService.uploadMenteeCertificate(certificateUploadRequest);
33+
34+
Long memberId = (Long)session.getAttribute("memberId");
35+
if(memberId == null){
36+
throw new CustomRuntimeException(MemberErrorCode.SESSION_EXPIRED);
37+
}
38+
39+
String filePath = storageService.uploadMenteeCertificate(certificateUploadRequest,memberId);
2940
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, filePath));
3041
}
3142

@@ -34,9 +45,15 @@ public ResponseEntity<ApiResponseWrapper<Void>> uploadMenteeCertificate(
3445
*/
3546
@PostMapping("/certificate/mentor")
3647
public ResponseEntity<ApiResponseWrapper<Void>> uploadMentorCertificate(
37-
@ModelAttribute CertificateUploadRequest certificateUploadRequest
48+
@ModelAttribute CertificateUploadRequest certificateUploadRequest,
49+
HttpSession session
3850
) {
39-
String filePath = storageService.uploadMentorCertificate(certificateUploadRequest);
51+
Long memberId = (Long)session.getAttribute("memberId");
52+
if(memberId == null){
53+
throw new CustomRuntimeException(MemberErrorCode.SESSION_EXPIRED);
54+
}
55+
56+
String filePath = storageService.uploadMentorCertificate(certificateUploadRequest, memberId);
4057
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, filePath));
4158
}
4259

@@ -45,8 +62,15 @@ public ResponseEntity<ApiResponseWrapper<Void>> uploadMentorCertificate(
4562
*/
4663
@PostMapping("/profile/image")
4764
public ResponseEntity<ApiResponseWrapper<Void>> uploadProfileImage(
48-
@ModelAttribute ProfileUploadRequest request
65+
@ModelAttribute ProfileUploadRequest request,
66+
HttpSession session
4967
) {
68+
69+
Long memberId = (Long)session.getAttribute("memberId");
70+
if(memberId == null){
71+
throw new CustomRuntimeException(MemberErrorCode.SESSION_EXPIRED);
72+
}
73+
5074
String filePath = storageService.uploadProfileImage(request);
5175
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, filePath));
5276
}

src/main/java/es/princip/ringus/infra/storage/application/StorageService.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import es.princip.ringus.domain.member.MemberType;
44
import es.princip.ringus.infra.storage.domain.CertificateType;
5+
import es.princip.ringus.infra.storage.domain.FileMemberRepository;
56
import es.princip.ringus.infra.storage.dto.CertificateUploadRequest;
67
import es.princip.ringus.infra.storage.dto.ProfileUploadRequest;
78
import lombok.RequiredArgsConstructor;
@@ -14,24 +15,33 @@
1415
public class StorageService {
1516

1617
private final S3Service s3Service;
18+
private final FileMemberRepository fileMemberRepository;
1719

1820
@Transactional
19-
public String uploadMenteeCertificate(CertificateUploadRequest request) {
21+
public String uploadMenteeCertificate(CertificateUploadRequest request, Long memberId) {
2022

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

23-
return s3Service.uploadFile(request.file(), folderPath);
25+
String filePath = s3Service.uploadFile(request.file(), folderPath);
26+
27+
fileMemberRepository.save(request.toFileMemberEntity(filePath, memberId));
28+
29+
return filePath;
2430
}
2531

2632
/**
2733
* 멘토 증명서 업로드
2834
*/
2935
@Transactional
30-
public String uploadMentorCertificate(CertificateUploadRequest request) {
36+
public String uploadMentorCertificate(CertificateUploadRequest request, Long memberId) {
3137

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

34-
return s3Service.uploadFile(request.file(), folderPath);
40+
String filePath = s3Service.uploadFile(request.file(), folderPath);
41+
42+
fileMemberRepository.save(request.toFileMemberEntity(filePath, memberId));
43+
44+
return filePath;
3545
}
3646

3747
/**
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package es.princip.ringus.infra.storage.domain;
2+
3+
import es.princip.ringus.domain.base.BaseTimeEntity;
4+
import jakarta.persistence.*;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
@Getter
10+
@Entity
11+
@NoArgsConstructor
12+
public class FileMember extends BaseTimeEntity {
13+
14+
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
15+
@Column(name = "file_member_id")
16+
private Long id;
17+
18+
private Long memberId;
19+
20+
private String filePath;
21+
22+
private Boolean isVerified;
23+
24+
@Builder
25+
public FileMember(
26+
final Long memberId,
27+
final String filePath
28+
) {
29+
this.memberId = memberId;
30+
this.filePath = filePath;
31+
this.isVerified = false;
32+
}
33+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package es.princip.ringus.infra.storage.domain;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.stereotype.Repository;
5+
6+
@Repository
7+
public interface FileMemberRepository extends JpaRepository<FileMember, Long> {
8+
}
Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package es.princip.ringus.infra.storage.dto;
22

3-
import es.princip.ringus.infra.storage.domain.Certificate;
43
import es.princip.ringus.infra.storage.domain.CertificateType;
5-
import jakarta.validation.constraints.NotBlank;
4+
import es.princip.ringus.infra.storage.domain.FileMember;
65
import org.springframework.web.multipart.MultipartFile;
76

87
public record CertificateUploadRequest(
98
MultipartFile file,
10-
CertificateType certificateType,
11-
Long userId
9+
CertificateType certificateType
1210
) {
1311
// form-data 형식에서는 record 클래스는 자동 바인딩이 안돼서 생성자를 명시적으로 만들어줘야 함
1412
public CertificateUploadRequest {
@@ -18,16 +16,11 @@ public record CertificateUploadRequest(
1816
if (certificateType == null) {
1917
throw new IllegalArgumentException("증명서 유형은 필수입니다.");
2018
}
21-
if (userId == null) {
22-
throw new IllegalArgumentException("유저 ID는 필수입니다.");
23-
}
2419
}
25-
26-
public static Certificate toEntity(CertificateUploadRequest request, String filePath) {
27-
return Certificate.builder()
28-
.fileName(request.file().getOriginalFilename())
20+
public FileMember toFileMemberEntity(String filePath, Long memberId) {
21+
return FileMember.builder()
22+
.memberId(memberId)
2923
.filePath(filePath)
30-
.certificateType(request.certificateType())
3124
.build();
3225
}
3326
}

0 commit comments

Comments
 (0)