diff --git a/src/main/java/com/example/FixLog/config/WebConfig.java b/src/main/java/com/example/FixLog/config/WebConfig.java index 3da71a9..00b5a09 100644 --- a/src/main/java/com/example/FixLog/config/WebConfig.java +++ b/src/main/java/com/example/FixLog/config/WebConfig.java @@ -10,7 +10,7 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 모든 경로에 대해 - .allowedOriginPatterns("https://fixlog.netlify.app", "http://localhost:3000") // 모든 도메인 허용 (개발용) → 배포 시 정확한 프론트 주소로 수정 권장 + .allowedOriginPatterns("*") // 모든 도메인 허용 (개발용) → 배포 시 정확한 프론트 주소로 수정 권장 .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS") .allowedHeaders("*") .allowCredentials(true); // 인증정보(쿠키, Authorization) 허용 diff --git a/src/main/java/com/example/FixLog/dto/post/MyPostPageResponseDto.java b/src/main/java/com/example/FixLog/dto/post/MyPostPageResponseDto.java index e83f70e..49db433 100644 --- a/src/main/java/com/example/FixLog/dto/post/MyPostPageResponseDto.java +++ b/src/main/java/com/example/FixLog/dto/post/MyPostPageResponseDto.java @@ -25,10 +25,19 @@ public class MyPostPageResponseDto { private String nickname; private String profileImageUrl;; - public static String getDefaultImage(String image) { - return (image == null || image.isBlank()) - ? "https://fixlog-bucket.s3.ap-northeast-2.amazonaws.com/default/profile.png" - : image; + // 이미지 null일 때 default 사진으로 변경 - 프로필 사진 + public static String getDefaultProfile(String image){ + String imageUrl = (image == null || image.isBlank()) + ? "https://fixlog-bucket.s3.ap-northeast-2.amazonaws.com/default/profile.png" : image; + System.out.println(imageUrl); + return imageUrl; + } + // 이미지 null일 때 default 사진으로 변경 - 썸네일 + public static String getDefaultCover(String image){ + String imageUrl = (image == null || image.isBlank()) + ? "https://fixlogsmwubucket.s3.ap-northeast-2.amazonaws.com/default/DefaulThumnail.png" : image; + System.out.println(imageUrl); + return imageUrl; } public static MyPostPageResponseDto from(Post post, int forkCount) { @@ -37,8 +46,8 @@ public static MyPostPageResponseDto from(Post post, int forkCount) { .nickname(post.getUserId().getNickname()) .postTitle(post.getPostTitle()) .postSummary(generateSummary(post.getProblem())) - .imageUrl(getDefaultImage(post.getCoverImage())) - .profileImageUrl(getDefaultImage(post.getUserId().getProfileImageUrl())) + .imageUrl(getDefaultCover(post.getCoverImage())) + .profileImageUrl(getDefaultProfile(post.getUserId().getProfileImageUrl())) .tags(post.getPostTags().stream().map(tag -> tag.getTagId().getTagName()).toList()) .createdAt(post.getCreatedAt()) .likeCount(post.getPostLikes().size()) diff --git a/src/main/java/com/example/FixLog/exception/ErrorCode.java b/src/main/java/com/example/FixLog/exception/ErrorCode.java index db86c04..d1eeb1a 100644 --- a/src/main/java/com/example/FixLog/exception/ErrorCode.java +++ b/src/main/java/com/example/FixLog/exception/ErrorCode.java @@ -24,6 +24,7 @@ public enum ErrorCode { TAG_NOT_FOUND(HttpStatus.NOT_FOUND, "없는 태그 번호입니다."), SORT_NOT_EXIST(HttpStatus.BAD_REQUEST, "사용할 수 없는 정렬입니다."), INVALID_PASSWORD(HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다."), + POST_UPDATE_FORBIDDEN(HttpStatus.BAD_REQUEST, "본인 게시글만 수정할 수 있습니다."), REQUIRED_TAGS_MISSING(HttpStatus.BAD_REQUEST, "태그를 선택해주세요."), REQUIRED_CONTENT_MISSING(HttpStatus.BAD_REQUEST, "필수 본문이 입력되지 않았습니다."), SAME_AS_OLD_PASSWORD(HttpStatus.BAD_REQUEST, "다른 비밀번호 입력 바랍니다."), diff --git a/src/main/java/com/example/FixLog/service/MainPageService.java b/src/main/java/com/example/FixLog/service/MainPageService.java index 3b27b2d..9c8ff00 100644 --- a/src/main/java/com/example/FixLog/service/MainPageService.java +++ b/src/main/java/com/example/FixLog/service/MainPageService.java @@ -27,13 +27,20 @@ public MainPageService(PostRepository postRepository, MemberService memberServic this.memberService = memberService; } - // 이미지 null일 때 default 사진으로 변경 (프로필 사진, - public String getDefaultImage(String image){ + // 이미지 null일 때 default 사진으로 변경 - 프로필 사진 + public String getDefaultProfile(String image){ String imageUrl = (image == null || image.isBlank()) ? "https://fixlog-bucket.s3.ap-northeast-2.amazonaws.com/default/profile.png" : image; System.out.println(imageUrl); return imageUrl; } + // 이미지 null일 때 default 사진으로 변경 - 썸네일 + public String getDefaultCover(String image){ + String imageUrl = (image == null || image.isBlank()) + ? "https://fixlogsmwubucket.s3.ap-northeast-2.amazonaws.com/default/DefaulThumnail.png" : image; + System.out.println(imageUrl); + return imageUrl; + } // 메인페이지 보기 public MainPageResponseDto mainPageView(int sort, int size){ @@ -44,9 +51,9 @@ public MainPageResponseDto mainPageView(int sort, int size){ if (optionalMember.isPresent()) { Member member = optionalMember.get(); String imageUrl = member.getProfileImageUrl(); - profileImageUrl = getDefaultImage(imageUrl); + profileImageUrl = getDefaultProfile(imageUrl); } else { - profileImageUrl = "https://example.com/default-cover-image.png"; // 비로그인 기본 이미지 + profileImageUrl = "https://fixlog-bucket.s3.ap-northeast-2.amazonaws.com/default/profile.png"; // 비로그인 기본 이미지 } // 페이지 (글 12개) 불러오기 @@ -67,11 +74,11 @@ public MainPageResponseDto mainPageView(int sort, int size){ List postList = posts.stream() .map(post -> new MainPagePostResponseDto( post.getPostTitle(), - getDefaultImage(post.getCoverImage()), + getDefaultCover(post.getCoverImage()), post.getPostTags().stream() .map(postTag -> postTag.getTagId().getTagName()) .collect(Collectors.toList()), - getDefaultImage(post.getUserId().getProfileImageUrl()), + getDefaultProfile(post.getUserId().getProfileImageUrl()), post.getUserId().getNickname(), post.getCreatedAt().toLocalDate(), post.getPostLikes().size() @@ -90,9 +97,9 @@ public MainPageResponseDto mainPageFullView(int sort, int page, int size){ if (optionalMember.isPresent()) { Member member = optionalMember.get(); String imageUrl = member.getProfileImageUrl(); - profileImageUrl = getDefaultImage(imageUrl); + profileImageUrl = getDefaultProfile(imageUrl); } else { - profileImageUrl = "https://example.com/default-cover-image.png"; // 비로그인 기본 이미지 + profileImageUrl = "https://fixlog-bucket.s3.ap-northeast-2.amazonaws.com/default/profile.png"; // 비로그인 기본 이미지 } // 페이지 설정 (한 페이지당 12개) @@ -109,11 +116,11 @@ public MainPageResponseDto mainPageFullView(int sort, int page, int size){ List postList = postPage.stream() .map(post -> new MainPagePostResponseDto( post.getPostTitle(), - getDefaultImage(post.getCoverImage()), + getDefaultCover(post.getCoverImage()), post.getPostTags().stream() .map(postTag -> postTag.getTagId().getTagName()) .collect(Collectors.toList()), - getDefaultImage(post.getUserId().getProfileImageUrl()), + getDefaultProfile(post.getUserId().getProfileImageUrl()), post.getUserId().getNickname(), post.getCreatedAt().toLocalDate(), post.getPostLikes().size() diff --git a/src/main/java/com/example/FixLog/service/PostService.java b/src/main/java/com/example/FixLog/service/PostService.java index 6970fe5..720178e 100644 --- a/src/main/java/com/example/FixLog/service/PostService.java +++ b/src/main/java/com/example/FixLog/service/PostService.java @@ -20,9 +20,9 @@ import com.example.FixLog.repository.post.PostRepository; import com.example.FixLog.repository.tag.TagRepository; import jakarta.transaction.Transactional; -import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; @@ -55,13 +55,20 @@ public PostService(PostRepository postRepository, PostLikeRepository postLikeRep this.s3Service = s3Service; } - // 이미지 null일 때 default 사진으로 변경 (프로필 사진, - public String getDefaultImage(String image){ + // 이미지 null일 때 default 사진으로 변경 - 프로필 사진 + public String getDefaultProfile(String image){ String imageUrl = (image == null || image.isBlank()) ? "https://fixlog-bucket.s3.ap-northeast-2.amazonaws.com/default/profile.png" : image; System.out.println(imageUrl); return imageUrl; } + // 이미지 null일 때 default 사진으로 변경 - 썸네일 + public String getDefaultCover(String image){ + String imageUrl = (image == null || image.isBlank()) + ? "https://fixlogsmwubucket.s3.ap-northeast-2.amazonaws.com/default/DefaulThumnail.png" : image; + System.out.println(imageUrl); + return imageUrl; + } // 게시글 작성하기 @Transactional @@ -144,15 +151,21 @@ else if (categories.size() > 1) // 게시글 필수 항목 다 작성했는지 private void validatePost(PostRequestDto postRequestDto){ - if (postRequestDto.getPostTitle().isBlank() | postRequestDto.getProblem().isBlank() - | postRequestDto.getErrorMessage().isBlank() | postRequestDto.getEnvironment().isBlank() - | postRequestDto.getReproduceCode().isBlank() | postRequestDto.getSolutionCode().isBlank()) + if (!StringUtils.hasText(postRequestDto.getPostTitle()) + || !StringUtils.hasText(postRequestDto.getProblem()) + || !StringUtils.hasText(postRequestDto.getErrorMessage()) + || !StringUtils.hasText(postRequestDto.getEnvironment()) + || !StringUtils.hasText(postRequestDto.getReproduceCode()) + || !StringUtils.hasText(postRequestDto.getSolutionCode())) throw new CustomException(ErrorCode.REQUIRED_CONTENT_MISSING); } private void validatePost(NewPostRequestDto newPostRequestDto){ - if (newPostRequestDto.getPostTitle().isBlank() | newPostRequestDto.getProblem().isBlank() - | newPostRequestDto.getErrorMessage().isBlank() | newPostRequestDto.getEnvironment().isBlank() - | newPostRequestDto.getReproduceCode().isBlank() | newPostRequestDto.getSolutionCode().isBlank()) + if (!StringUtils.hasText(newPostRequestDto.getPostTitle()) + || !StringUtils.hasText(newPostRequestDto.getProblem()) + || !StringUtils.hasText(newPostRequestDto.getErrorMessage()) + || !StringUtils.hasText(newPostRequestDto.getEnvironment()) + || !StringUtils.hasText(newPostRequestDto.getReproduceCode()) + || !StringUtils.hasText(newPostRequestDto.getSolutionCode())) throw new CustomException(ErrorCode.REQUIRED_CONTENT_MISSING); } @@ -169,12 +182,18 @@ public String uploadImage(MultipartFile imageFile){ return "![image](" + imageUrl + ")"; } + // 게시글 수정하기 @Transactional public void editPost(Long postId, NewPostRequestDto newPostRequestDto) { Member member = memberService.getCurrentMemberInfo(); Post post = postRepository.findById(postId) .orElseThrow(() -> new CustomException(ErrorCode.POST_NOT_FOUND)); + // 게시글 작성자가 본인이 맞는지 + if (!member.getUserId().equals(post.getUserId().getUserId())) { + throw new CustomException(ErrorCode.POST_UPDATE_FORBIDDEN); + } + // 북마크 카테고리별로 선택 제한 두기 List tags = fetchAndValidateTags(newPostRequestDto.getTags()); @@ -194,6 +213,8 @@ & compareTags(post.getPostTags(), tags)){ } // 필드 업데이트 + validatePost(newPostRequestDto); + post.changeTitle(newPostRequestDto.getPostTitle()); post.changeCoverImage(newPostRequestDto.getCoverImageUrl()); post.changeProblem(newPostRequestDto.getProblem()); @@ -233,7 +254,7 @@ public PostResponseDto viewPost(Long postId){ currentPost.getUserId().getUserId(), currentPost.getUserId().getNickname(), currentPost.getPostTitle(), - getDefaultImage(currentPost.getCoverImage()), + getDefaultCover(currentPost.getCoverImage()), currentPost.getProblem(), currentPost.getErrorMessage(), currentPost.getEnvironment(), @@ -253,7 +274,7 @@ public PostResponseDto viewPost(Long postId){ Member member = optionalMember.get(); nickname = member.getNickname(); String imageUrl = member.getProfileImageUrl(); - profileImageUrl = getDefaultImage(imageUrl); + profileImageUrl = getDefaultProfile(imageUrl); isLiked = currentPost.getPostLikes().stream() .anyMatch(postLike -> postLike.getUserId().equals(member)); @@ -261,7 +282,7 @@ public PostResponseDto viewPost(Long postId){ .anyMatch(bookmark -> bookmark.getFolderId().getUserId().equals(member)); } else { nickname = "로그인하지 않았습니다."; - profileImageUrl = "https://example.com/default-cover-image.png"; // 비로그인 기본 이미지 + profileImageUrl = "https://fixlog-bucket.s3.ap-northeast-2.amazonaws.com/default/profile.png"; // 비로그인 기본 이미지 isLiked = false; isMarked = false; }