1414import org .runnect .server .common .module .convert .CoordinatePathConverter ;
1515import org .runnect .server .course .entity .Course ;
1616import org .runnect .server .course .repository .CourseRepository ;
17- import org .runnect .server .record .repository .RecordRepository ;
1817import org .runnect .server .publicCourse .dto .request .CreatePublicCourseRequestDto ;
1918import org .runnect .server .publicCourse .dto .request .DeletePublicCoursesRequestDto ;
2019import org .runnect .server .publicCourse .dto .response .CreatePublicCourseResponseDto ;
4443import org .springframework .stereotype .Service ;
4544import org .springframework .transaction .annotation .Transactional ;
4645
46+ import javax .persistence .EntityManager ;
47+ import javax .persistence .PersistenceContext ;
48+
4749@ Service
4850@ RequiredArgsConstructor
4951public 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 ());
0 commit comments