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
Expand Up @@ -10,12 +10,14 @@
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.scheduling.annotation.EnableAsync;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@EnableAsync
@EnableRetry
@EnableJpaAuditing
@SpringBootApplication
@EnableConfigurationProperties({JwtProperties.class, MemberDefaults.class})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ public void initTokens() {
.birth(LocalDate.now())
.nickname("Tester")
.status(MemberStatus.ONBOARDING)
.profileImageKey(memberDefaults.getProfileImageKey())
.build();
return memberRepository.save(m);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,40 +27,15 @@ public class AmazonS3BucketService implements CloudStorageService {
private final S3Client s3;
private final S3Config s3Config;
private final ClockHolder clockHolder;
private String profileImageBucketName;
private String fontPaperBucketName;
private String profileImagePrefix;
private String fontPaperPrefix;

@PostConstruct
void init() {
profileImageBucketName = s3Config.getBucketName(FileType.PROFILE_IMAGE);
fontPaperBucketName = s3Config.getBucketName(FileType.FONT_PAPER);
profileImagePrefix = s3Config.getPrefix(FileType.PROFILE_IMAGE);
fontPaperPrefix = s3Config.getPrefix(FileType.FONT_PAPER);
}

@Override
public FileMetadata uploadProfileImage(FileCreate request, String key) {
log.info("Uploading profile image: fileName={}, contentType={}, size={} bytes, fileKey={}",
request.getFileName(), request.getFile().getContentType(), request.getFile().getSize(), key);

AmazonS3PutRequest amazonS3PutRequest = AmazonS3PutRequest.from(
request,
key,
profileImageBucketName,
profileImagePrefix,
clockHolder.getCurrentTimeStamp());

log.info("Profile image uploaded successfully: fileKey={}, bucket={}", key, profileImageBucketName);
return uploadFile(amazonS3PutRequest).toModel();
}

@Override
public String getProfileImageUrl(String key) {
return getFileUrl(FileType.PROFILE_IMAGE, key);
}

@Override
public String getFontPaperUrl(String key) {
return getFileUrl(FileType.FONT_PAPER, key);
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import java.util.UUID;

import org.fontory.fontorybe.file.adapter.inbound.FileRequestMapper;
import org.fontory.fontorybe.file.adapter.outbound.s3.dto.ProfileImageUpdatedEvent;
import org.fontory.fontorybe.file.application.port.CloudStorageService;
import org.fontory.fontorybe.file.application.port.FileRepository;
import org.fontory.fontorybe.file.application.port.FileService;
Expand All @@ -13,7 +12,6 @@
import org.fontory.fontorybe.file.domain.FileUploadResult;
import org.fontory.fontorybe.file.domain.exception.FileNotFoundException;
import org.fontory.fontorybe.member.controller.port.MemberLookupService;
import org.fontory.fontorybe.member.controller.port.MemberUpdateService;
import org.fontory.fontorybe.member.domain.Member;
import org.fontory.fontorybe.member.domain.MemberDefaults;
import org.springframework.context.ApplicationEventPublisher;
Expand All @@ -35,7 +33,6 @@ public class FileServiceImpl implements FileService {
private final FileRequestMapper fileRequestMapper;
private final CloudStorageService cloudStorageService;
private final MemberLookupService memberLookupService;
private final MemberUpdateService memberUpdateService;
private final ApplicationEventPublisher eventPublisher;

@Override
Expand All @@ -46,35 +43,6 @@ public FileMetadata getOrThrowById(Long id) {
.orElseThrow(() -> new FileNotFoundException(id));
}

@Override
@Transactional
public FileUploadResult uploadProfileImage(MultipartFile file, Long memberId) {
log.info("Processing profile image upload: fileName={}, memberId={}", file.getOriginalFilename(), memberId);

Member requestMember = memberLookupService.getOrThrowById(memberId);
FileCreate profileImageFileCreate = fileRequestMapper.toProfileImageFileCreate(file, requestMember);
boolean isInitial = memberDefaults.getProfileImageKey().equals(requestMember.getProfileImageKey());
String fixedKey = isInitial
? UUID.randomUUID().toString()
: requestMember.getProfileImageKey();

String tempKey = UUID.randomUUID().toString();

log.info("Uploading profile image to cloud storage: memberId={}, tempKey={}", memberId, tempKey);
FileMetadata metadata = cloudStorageService.uploadProfileImage(profileImageFileCreate, tempKey);
metadata.updateKey(fixedKey);
FileMetadata savedMetaData = fileRepository.save(metadata);
Member updated = memberUpdateService.setProfileImageKey(requestMember, fixedKey);

log.info("Updating member profile image key: memberId={}, memberProfileImageKey={}", updated.getId(), updated.getProfileImageKey());
log.info("Publishing image update event: tempKey={}, fixedKey={}", tempKey, fixedKey);
eventPublisher.publishEvent(new ProfileImageUpdatedEvent(tempKey, fixedKey));
String fileUrl = cloudStorageService.getProfileImageUrl(fixedKey);
FileUploadResult result = FileUploadResult.from(savedMetaData, fileUrl);
log.info("Profile image upload completed successfully: memberId={}, fileUrl={}", memberId, fileUrl);
return result;
}

@Override
@Transactional
public FileUploadResult uploadFontTemplateImage(MultipartFile file, Long memberId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
import org.fontory.fontorybe.file.domain.FileMetadata;

public interface CloudStorageService {
FileMetadata uploadProfileImage(FileCreate fileCreate, String key);
FileMetadata uploadFontTemplateImage(FileCreate request);
String getProfileImageUrl(String key);
String getFontPaperUrl(String key);
String getWoff2Url(String key);
String getTtfUrl(String key);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import org.springframework.web.multipart.MultipartFile;

public interface FileService {

FileUploadResult uploadProfileImage(MultipartFile file, Long memberId);
FileMetadata getOrThrowById(Long id);
FileUploadResult uploadFontTemplateImage(MultipartFile file, Long memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.fontory.fontorybe.file.infrastructure;

import org.fontory.fontorybe.file.infrastructure.entity.ProfileImageDlq;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProfileImageDlqRepository extends JpaRepository<ProfileImageDlq, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.fontory.fontorybe.file.infrastructure.entity;

import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDateTime;

@Entity
@Getter
@Table(name = "dlq")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
public class ProfileImageDlq{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long memberId;
private String tempKey;
private String fixKey;
private LocalDateTime time;
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,8 @@ public ResponseEntity<ProfileResponse> getInfoMember(
log.info("Request received: Get member info ID: {} by member ID: {}", id, requestMemberId);

Member targetMember = memberLookupService.getOrThrowById(id);
String fileUrl = cloudStorageService.getProfileImageUrl(targetMember.getProfileImageKey());
log.info("ProfileImageUrl generated : {}", fileUrl);

ProfileResponse profileResponse = ProfileResponse.from(targetMember, fileUrl);
ProfileResponse profileResponse = ProfileResponse.from(targetMember);
log.info("Response sent: ProfileResponse : {}", profileResponse);

return ResponseEntity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,8 @@ public ResponseEntity<MyProfileResponse> getMyProfile(
log.info("Request received: getMyInfo - member is onboarding");
throw new MemberNotFoundException();
}
String fileUrl = cloudStorageService.getProfileImageUrl(lookupMember.getProfileImageKey());
log.info("ProfileImageUrl generated : {}", fileUrl);

MyProfileResponse myProfileResponse = MyProfileResponse.from(lookupMember, fileUrl);
MyProfileResponse myProfileResponse = MyProfileResponse.from(lookupMember);
log.info("Response sent: MyProfileDto : {}", myProfileResponse);

return ResponseEntity
Expand All @@ -79,29 +77,19 @@ public ResponseEntity<MyProfileResponse> getMyProfile(
@Operation(
summary = "내정보 수정"
)
@PatchMapping(consumes = MULTIPART_FORM_DATA_VALUE)
@PatchMapping
public ResponseEntity<MyProfileResponse> updateMember(
@Login UserPrincipal userPrincipal,
@RequestPart @Valid MemberUpdateRequest req,
@SingleFileUpload @RequestPart(value = "file", required = false) List<MultipartFile> files
@RequestBody @Valid MemberUpdateRequest req
) {
Long requestMemberId = userPrincipal.getId();
log.info("Request received: update member ID: {} with request: {}",
requestMemberId, req);

if (files != null && !files.isEmpty()) {
MultipartFile file = extractSingleMultipartFile(files);
logFileDetails(file, "Member profile image upload");
FileUploadResult fileUploadResult = fileService.uploadProfileImage(file, requestMemberId);
log.info("fileUploadResult: {}", fileUploadResult);
} else {
log.info("No profile image upload found");
}

Member updatedMember = memberUpdateService.update(requestMemberId, req);
log.info("Updated : Member ID: {} Updated successfully with nickname: {}", updatedMember.getId(), updatedMember.getNickname());

MyProfileResponse myProfileResponse = MyProfileResponse.from(updatedMember, cloudStorageService.getProfileImageUrl(updatedMember.getProfileImageKey()));
MyProfileResponse myProfileResponse = MyProfileResponse.from(updatedMember);
log.info("Response sent: MyProfileDto : {}", myProfileResponse);

return ResponseEntity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,41 +59,22 @@ public ResponseEntity<Boolean> checkDuplicate(
@Operation(
summary = "회원가입"
)
@PostMapping(consumes = MULTIPART_FORM_DATA_VALUE)
@PostMapping
public ResponseEntity<MemberCreateResponse> register(
@Login UserPrincipal user,
@RequestPart @Valid InitMemberInfoRequest req,
@SingleFileUpload @RequestPart(value = "file", required = false) List<MultipartFile> files
@RequestBody @Valid InitMemberInfoRequest req
) {
Long requestMemberId = user.getId();
log.info("Request received: Create member ID: {} with request: {}",
requestMemberId, req);

Member updatedMember;
if (files != null && !files.isEmpty()) {
MultipartFile file = extractSingleMultipartFile(files);
logFileDetails(file, "Member profile image upload");
FileUploadResult fileUploadResult = fileService.uploadProfileImage(file, requestMemberId);
updatedMember = memberOnboardService.initNewMemberInfo(requestMemberId, req, fileUploadResult);
} else {
log.info("No profile image upload found");
updatedMember = memberOnboardService.initNewMemberInfo(requestMemberId, req);
}
Member updatedMember = memberOnboardService.initNewMemberInfo(requestMemberId, req);

log.info("Response sent: Member ID: {} Created successfully with nickname: {}",
updatedMember.getId(), updatedMember.getNickname());

return ResponseEntity
.status(HttpStatus.CREATED)
.body(MemberCreateResponse.from(updatedMember, cloudStorageService.getProfileImageUrl(updatedMember.getProfileImageKey())));
}

private void logFileDetails(MultipartFile file, String context) {
log.debug("{} - File details: name='{}', original name='{}', size={} bytes, contentType='{}'",
context,
file.getName(),
file.getOriginalFilename(),
file.getSize(),
file.getContentType());
.body(MemberCreateResponse.from(updatedMember));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,13 @@
public class MemberCreateResponse {
private final String nickname;
private final Gender gender;
private final String profileImageUrl;
private final LocalDate birth;
private final LocalDateTime createdAt;

public static MemberCreateResponse from(Member member, String url) {
public static MemberCreateResponse from(Member member) {
return MemberCreateResponse.builder()
.nickname(member.getNickname())
.gender(member.getGender())
.profileImageUrl(url)
.birth(member.getBirth())
.createdAt(member.getCreatedAt())
.build();
Expand Down

This file was deleted.

Loading
Loading