Skip to content

Commit 49140f5

Browse files
authored
[Feat] - 관리자 공개 코스 삭제 권한 추가 (v2) (#174)
* revert: 관리자 삭제 권한 관련 변경사항 전체 롤백 - PublicCourseService: isAdmin 체크, 스크랩 삭제, Record FK null 처리 제거 - RecordRepository: nullifyPublicCourseIn 메서드 제거 - f8b4c26 상태로 원복 * feat: 관리자 공개 코스 삭제 권한 추가 - userId 280(관리자) 소유권 검증 우회 - EntityManager JPQL로 Record FK null 처리 - Scrap 삭제 후 PublicCourse 삭제 (FK 순서 보장)
1 parent 92f197d commit 49140f5

2 files changed

Lines changed: 17 additions & 15 deletions

File tree

src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import org.runnect.server.common.module.convert.CoordinatePathConverter;
1515
import org.runnect.server.course.entity.Course;
1616
import org.runnect.server.course.repository.CourseRepository;
17-
import org.runnect.server.record.repository.RecordRepository;
1817
import org.runnect.server.publicCourse.dto.request.CreatePublicCourseRequestDto;
1918
import org.runnect.server.publicCourse.dto.request.DeletePublicCoursesRequestDto;
2019
import org.runnect.server.publicCourse.dto.response.CreatePublicCourseResponseDto;
@@ -44,17 +43,23 @@
4443
import org.springframework.stereotype.Service;
4544
import org.springframework.transaction.annotation.Transactional;
4645

46+
import javax.persistence.EntityManager;
47+
import javax.persistence.PersistenceContext;
48+
4749
@Service
4850
@RequiredArgsConstructor
4951
public class PublicCourseService {
5052
private static final Integer PAGE_SIZE = 10;
5153
private static List<Long> MARATHON_PUBLIC_COURSE_IDS;
54+
private static final Long ADMIN_USER_ID = 280L;
5255

5356
private final PublicCourseRepository publicCourseRepository;
5457
private final UserRepository userRepository;
5558
private final ScrapRepository scrapRepository;
5659
private final CourseRepository courseRepository;
57-
private final RecordRepository recordRepository;
60+
61+
@PersistenceContext
62+
private EntityManager entityManager;
5863

5964

6065
@Value("${runnect.marathon-public-course-id}")
@@ -352,7 +357,7 @@ public DeletePublicCoursesResponseDto deletePublicCourses(
352357
throw new NotFoundException(ErrorStatus.NOT_FOUND_PUBLICCOURSE_EXCEPTION, ErrorStatus.NOT_FOUND_PUBLICCOURSE_EXCEPTION.getMessage());
353358
}
354359

355-
boolean isAdmin = userId.equals(280L);
360+
boolean isAdmin = userId.equals(ADMIN_USER_ID);
356361

357362
publicCourses.stream()
358363
.filter(pc -> !isAdmin && !pc.getCourse().getRunnectUser().equals(user))
@@ -363,15 +368,18 @@ public DeletePublicCoursesResponseDto deletePublicCourses(
363368
ErrorStatus.PERMISSION_DENIED_PUBLIC_COURSE_DELETE_EXCEPTION.getMessage());
364369
});
365370

366-
//삭제전 연관된 스크랩 먼저 삭제
367-
scrapRepository.deleteByPublicCourseIn(publicCourses);
368-
369-
//삭제전 연관된 Record의 publicCourse FK null 처리
370-
recordRepository.nullifyPublicCourseIn(publicCourses);
371-
372371
//삭제전 course의 isPrivate update
373372
publicCourses.forEach(publicCourse -> publicCourse.getCourse().retrieveCourse());
374373

374+
// Record의 publicCourse FK를 null로 설정 (Record 테이블 FK 제약조건 해제)
375+
entityManager.createQuery(
376+
"UPDATE Record r SET r.publicCourse = null WHERE r.publicCourse IN :publicCourses")
377+
.setParameter("publicCourses", publicCourses)
378+
.executeUpdate();
379+
380+
// Scrap 삭제 (Scrap 테이블 FK NOT NULL 제약조건)
381+
scrapRepository.deleteByPublicCourseIn(publicCourses);
382+
375383
publicCourseRepository.deleteAllInBatch(publicCourses);
376384

377385
return DeletePublicCoursesResponseDto.from(publicCourses.size());

src/main/java/org/runnect/server/record/repository/RecordRepository.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package org.runnect.server.record.repository;
22

33
import java.util.Collection;
4-
import org.runnect.server.publicCourse.entity.PublicCourse;
54
import org.runnect.server.record.entity.Record;
65
import org.runnect.server.user.entity.RunnectUser;
7-
import org.springframework.data.jpa.repository.Modifying;
86
import org.springframework.data.jpa.repository.Query;
97
import org.springframework.data.repository.Repository;
108
import org.springframework.data.repository.query.Param;
@@ -31,8 +29,4 @@ public interface RecordRepository extends Repository<Record, Long> {
3129

3230
// DELETE
3331
long deleteByIdIn(Collection<Long> ids);
34-
35-
@Modifying
36-
@Query("UPDATE Record r SET r.publicCourse = null WHERE r.publicCourse IN :publicCourses")
37-
int nullifyPublicCourseIn(@Param("publicCourses") Collection<PublicCourse> publicCourses);
3832
}

0 commit comments

Comments
 (0)