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 @@ -18,7 +18,7 @@ public class CommentController {
private final CommunityCommentService commentService;

@DeleteMapping("/{commentId}")
@Operation(summary = "댓글 삭제", description = "댓글을 삭제합니다. 본인이 작성한 댓글만 삭제할 수 있습니다. 원댓글 삭제 시 대댓글도 함께 삭제됩니다.")
@Operation(summary = "댓글 삭제", description = "댓글을 삭제합니다. 본인이 작성한 댓글 또는 관리자가 삭제할 수 있습니다. 원댓글 삭제 시 대댓글도 함께 삭제됩니다.")
public ResponseDto<String> deleteComment(
@PathVariable Long commentId,
@AuthenticationPrincipal UserDetails userDetails
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.onebyone.kindergarten.domain.communityComments.service;

import com.onebyone.kindergarten.domain.communityComments.dto.response.PageCommunityCommentsResponseDTO;
import com.onebyone.kindergarten.domain.user.enums.UserRole;
import com.onebyone.kindergarten.domain.userBlock.repository.UserBlockRepository;
import com.onebyone.kindergarten.global.exception.BusinessException;
import com.onebyone.kindergarten.global.exception.ErrorCodes;
Expand Down Expand Up @@ -147,8 +148,11 @@ public void deleteComment(Long commentId, String email) {
CommunityComment comment = commentRepository.findByIdWithUser(commentId)
.orElseThrow(() -> new BusinessException(ErrorCodes.NOT_FOUND_COMMENT));

// 작성자 확인
if (!comment.getUser().getEmail().equals(email)) {
// 현재 사용자 조회
User currentUser = userService.getUserByEmail(email);

// 작성자 또는 관리자 권한 확인
if (!comment.getUser().getEmail().equals(email) && !currentUser.getRole().equals(UserRole.ADMIN)) {
throw new BusinessException(ErrorCodes.UNAUTHORIZED_DELETE);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public ResponseDto<CommunityPostResponseDTO> createPost(
}

@DeleteMapping("/{id}")
@Operation(summary = "커뮤니티 게시글 삭제", description = "게시글을 삭제합니다. 본인이 작성한 게시글만 삭제할 수 있습니다.")
@Operation(summary = "커뮤니티 게시글 삭제", description = "게시글을 삭제합니다. 본인이 작성한 게시글 또는 관리자가 삭제할 수 있습니다.")
public ResponseDto<String> deletePost(
@PathVariable Long id,
@AuthenticationPrincipal UserDetails userDetails
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.onebyone.kindergarten.domain.communityPosts.repository.CommunityCategoryRepository;
import com.onebyone.kindergarten.domain.communityPosts.repository.CommunityRepository;
import com.onebyone.kindergarten.domain.user.entity.User;
import com.onebyone.kindergarten.domain.user.enums.UserRole;
import com.onebyone.kindergarten.domain.user.service.UserService;
import com.onebyone.kindergarten.domain.userBlock.repository.UserBlockRepository;
import com.onebyone.kindergarten.global.config.CacheConfig;
Expand Down Expand Up @@ -114,8 +115,11 @@ public void deletePost(Long postId, String email) {
CommunityPost post = communityRepository.findByIdWithUser(postId)
.orElseThrow(() -> new BusinessException(ErrorCodes.NOT_FOUND_POST));

// 작성자 확인
if (!post.getUser().getEmail().equals(email)) {
// 현재 사용자 조회
User currentUser = userService.getUserByEmail(email);

// 작성자 또는 관리자 권한 확인
if (!post.getUser().getEmail().equals(email) && !currentUser.getRole().equals(UserRole.ADMIN)) {
throw new BusinessException(ErrorCodes.UNAUTHORIZED_DELETE);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.onebyone.kindergarten.domain.kindergartenInternshipReview.dto.ModifyInternshipReviewRequestDTO;
import com.onebyone.kindergarten.domain.kindergartenInternshipReview.enums.InternshipReviewStarRatingType;
import com.onebyone.kindergarten.domain.kindergartenInternshipReview.service.KindergartenInternshipReviewService;
import com.onebyone.kindergarten.global.common.ResponseDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -60,4 +61,15 @@ public InternshipReviewPagedResponseDTO getReviews(
) {
return kindergartenInternshipReviewService.getReviews(kindergartenId, page, size, sortType, internshipReviewStarRatingType, starRating);
}

@Operation(summary = "실습리뷰-05 리뷰 삭제", description = "실습 리뷰를 삭제합니다. 본인이 작성한 리뷰 또는 관리자가 삭제할 수 있습니다.")
@DeleteMapping("/review/{internshipReviewId}")
public ResponseDto<String> deleteInternshipReview(
@PathVariable("internshipReviewId") Long id,
@AuthenticationPrincipal UserDetails userDetails
) {
kindergartenInternshipReviewService.deleteInternshipReview(id, userDetails.getUsername());
return ResponseDto.success("실습 리뷰가 삭제되었습니다.");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,9 @@ public void minusLikeCount() {
public void plusLikeCount() {
this.likeCount++;
}

/// 리뷰 소프트 삭제
public void markAsDeleted() {
this.deletedAt = java.time.LocalDateTime.now();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
import com.onebyone.kindergarten.domain.kindergatens.entity.Kindergarten;
import com.onebyone.kindergarten.domain.kindergatens.service.KindergartenService;
import com.onebyone.kindergarten.domain.user.entity.User;
import com.onebyone.kindergarten.domain.user.enums.UserRole;
import com.onebyone.kindergarten.domain.user.service.UserService;
import com.onebyone.kindergarten.global.enums.ReviewStatus;
import com.onebyone.kindergarten.global.exception.BusinessException;
import com.onebyone.kindergarten.global.exception.ErrorCodes;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
Expand All @@ -34,7 +34,6 @@ public class KindergartenInternshipReviewService {
private final KindergartenService kindergartenService;
private final KindergartenInternshipReviewRepository kindergartenInternshipReviewRepository;
private final KindergartenInternshipReviewLikeHistoryRepository kindergartenInternshipReviewLikeHistoryRepository;
private final JdbcTemplateAutoConfiguration jdbcTemplateAutoConfiguration;

public Kindergarten createInternshipReview(CreateInternshipReviewRequestDTO request, String email) {
User user = userService.getUserByEmail(email);
Expand Down Expand Up @@ -175,4 +174,23 @@ public InternshipReviewPagedResponseDTO getMyReviews(String email, int page, int
.totalPages(reviewPage.getTotalPages())
.build();
}

/// 실습 리뷰 삭제 (소프트 삭제)
@Transactional
public void deleteInternshipReview(Long reviewId, String email) {
// 리뷰 조회
KindergartenInternshipReview review = kindergartenInternshipReviewRepository.findById(reviewId)
.orElseThrow(() -> new BusinessException(ErrorCodes.NOT_FOUND_INTERNSHIP_REVIEW));

// 현재 사용자 조회
User currentUser = userService.getUserByEmail(email);

// 작성자 또는 관리자 권한 확인
if (!review.getUser().getEmail().equals(email) && !currentUser.getRole().equals(UserRole.ADMIN)) {
throw new BusinessException(ErrorCodes.UNAUTHORIZED_DELETE);
}

// 리뷰 소프트 삭제 (deletedAt 설정)
review.markAsDeleted();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.onebyone.kindergarten.domain.kindergartenWorkReview.dto.WorkReviewPagedResponseDTO;
import com.onebyone.kindergarten.domain.kindergartenWorkReview.enums.WorkReviewStarRatingType;
import com.onebyone.kindergarten.domain.kindergartenWorkReview.service.KindergartenWorkReviewService;
import com.onebyone.kindergarten.global.common.ResponseDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -60,4 +61,15 @@ public WorkReviewPagedResponseDTO getReviews(
) {
return kindergartenWorkReviewService.getReviews(kindergartenId, page, size, sortType, internshipReviewStarRatingType, starRating);
}

@Operation(summary = "근무리뷰-05 리뷰 삭제", description = "근무 리뷰를 삭제합니다. 본인이 작성한 리뷰 또는 관리자가 삭제할 수 있습니다.")
@DeleteMapping("/review/{workReviewId}")
public ResponseDto<String> deleteWorkReview(
@PathVariable("workReviewId") Long id,
@AuthenticationPrincipal UserDetails userDetails
) {
kindergartenWorkReviewService.deleteWorkReview(id, userDetails.getUsername());
return ResponseDto.success("근무 리뷰가 삭제되었습니다.");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,9 @@ public void minusLikeCount() {
public void plusLikeCount() {
this.likeCount++;
}

/// 리뷰 소프트 삭제
public void markAsDeleted() {
this.deletedAt = java.time.LocalDateTime.now();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.onebyone.kindergarten.domain.kindergatens.service.KindergartenService;
import com.onebyone.kindergarten.domain.pushNotification.service.NotificationTemplateService;
import com.onebyone.kindergarten.domain.user.entity.User;
import com.onebyone.kindergarten.domain.user.enums.UserRole;
import com.onebyone.kindergarten.domain.user.service.UserService;
import com.onebyone.kindergarten.global.enums.ReviewStatus;
import com.onebyone.kindergarten.global.exception.BusinessException;
Expand Down Expand Up @@ -201,4 +202,23 @@ public WorkReviewPagedResponseDTO getMyReviews(String email, int page, int size)
.totalPages(reviewPage.getTotalPages())
.build();
}

/// 근무 리뷰 삭제 (소프트 삭제)
@Transactional
public void deleteWorkReview(Long reviewId, String email) {
// 리뷰 조회
KindergartenWorkReview review = workReviewRepository.findById(reviewId)
.orElseThrow(() -> new BusinessException(ErrorCodes.NOT_FOUND_WORK_REVIEW));

// 현재 사용자 조회
User currentUser = userService.getUserByEmail(email);

// 작성자 또는 관리자 권한 확인
if (!review.getUser().getEmail().equals(email) && !currentUser.getRole().equals(UserRole.ADMIN)) {
throw new BusinessException(ErrorCodes.UNAUTHORIZED_DELETE);
}

// 리뷰 소프트 삭제 (deletedAt 설정)
review.markAsDeleted();
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
package com.onebyone.kindergarten.domain.user.controller;

import com.onebyone.kindergarten.domain.user.dto.request.UpdateUserStatusRequestDTO;
import com.onebyone.kindergarten.domain.user.dto.request.UserSearchDTO;
import com.onebyone.kindergarten.domain.user.dto.response.AdminUserResponseDTO;
import com.onebyone.kindergarten.domain.user.service.UserService;
import com.onebyone.kindergarten.global.common.PageResponseDTO;
import com.onebyone.kindergarten.global.common.ResponseDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;

@RestController
Expand Down Expand Up @@ -49,4 +53,15 @@ public ResponseDto<AdminUserResponseDTO> getUserDetail(
AdminUserResponseDTO user = userService.getUserById(userId);
return ResponseDto.success(user);
}

@PatchMapping("/{userId}/status")
@Operation(summary = "유저 상태 변경", description = "관리자가 유저의 상태를 변경합니다. (ACTIVE, SUSPENDED, DELETED)")
public ResponseDto<String> updateUserStatus(
@PathVariable Long userId,
@Valid @RequestBody UpdateUserStatusRequestDTO request,
@AuthenticationPrincipal UserDetails userDetails
) {
userService.updateUserStatus(userId, request, userDetails.getUsername());
return ResponseDto.success("유저 상태가 변경되었습니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.onebyone.kindergarten.domain.user.dto.request;

import com.onebyone.kindergarten.domain.user.enums.UserStatus;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Schema(description = "유저 상태 변경 요청 DTO")
public class UpdateUserStatusRequestDTO {

@NotNull(message = "상태는 필수입니다.")
@Schema(description = "변경할 유저 상태", example = "ACTIVE")
private UserStatus status;

@Schema(description = "상태 변경 사유", example = "부적절한 게시물 작성으로 인한 정지")
private String reason;
}
Original file line number Diff line number Diff line change
Expand Up @@ -200,4 +200,14 @@ public void markAsReviewWriter() {
public boolean hasWrittenReview() {
return this.hasWrittenReview != null && this.hasWrittenReview;
}

/// 유저 상태 변경 (관리자용)
public void updateStatus(UserStatus status) {
this.status = status;
if (status == UserStatus.SUSPENDED) {
// TODO : 정지 시 특별한 처리가 필요하다면 여기에 추가
} else if (status == UserStatus.ACTIVE) {
// TODO : 활성화 시 특별한 처리가 필요하다면 여기에 추가
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
package com.onebyone.kindergarten.domain.user.service;

import com.onebyone.kindergarten.domain.user.dto.*;
import com.onebyone.kindergarten.domain.user.dto.request.CheckEmailCertificationRequestDTO;
import com.onebyone.kindergarten.domain.user.dto.request.ModifyUserNicknameRequestDTO;
import com.onebyone.kindergarten.domain.user.dto.request.ModifyUserPasswordRequestDTO;
import com.onebyone.kindergarten.domain.user.dto.request.SignInRequestDTO;
import com.onebyone.kindergarten.domain.user.dto.request.SignUpRequestDTO;
import com.onebyone.kindergarten.domain.user.dto.request.UpdateUserRoleRequestDTO;
import com.onebyone.kindergarten.domain.user.dto.request.*;
import com.onebyone.kindergarten.domain.user.dto.response.AppleUserResponse;
import com.onebyone.kindergarten.domain.user.dto.response.KakaoUserResponse;
import com.onebyone.kindergarten.domain.user.dto.response.NaverUserResponse;
Expand All @@ -28,7 +23,6 @@
import java.util.Set;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import com.onebyone.kindergarten.domain.user.dto.request.UserSearchDTO;
import com.onebyone.kindergarten.domain.user.dto.response.AdminUserResponseDTO;

@Service
Expand Down Expand Up @@ -478,4 +472,26 @@ public AdminUserResponseDTO getUserById(Long userId) {
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다. ID: " + userId));
return AdminUserResponseDTO.from(user);
}

/// 관리자용 - 유저 상태 변경
@Transactional
public void updateUserStatus(Long userId, UpdateUserStatusRequestDTO request, String adminEmail) {
// 관리자 권한 확인
User admin = getUserByEmail(adminEmail);
if (!admin.getRole().equals(UserRole.ADMIN)) {
throw new BusinessException(ErrorCodes.UNAUTHORIZED_DELETE);
}

// 대상 유저 조회
User targetUser = userRepository.findById(userId)
.orElseThrow(() -> new BusinessException(ErrorCodes.NOT_FOUND_EMAIL));

// 관리자는 자신의 상태를 변경할 수 없음
if (targetUser.getRole().equals(UserRole.ADMIN)) {
throw new BusinessException(ErrorCodes.UNAUTHORIZED_DELETE);
}

// 상태 변경
targetUser.updateStatus(request.getStatus());
}
}