Skip to content

Commit ede94f0

Browse files
authored
Merge pull request #119 from wafflestudio/feat/admin
fix: period event errors
2 parents 3e086a9 + 0d110aa commit ede94f0

4 files changed

Lines changed: 39 additions & 19 deletions

File tree

hangsha/batch/src/main/kotlin/com/team1/hangsha/batch/crawler/ExtraSnuCrawler.kt

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,11 @@ class ExtraSnuCrawler(
6767
.filter { !it.title.isNullOrBlank() }
6868
}
6969

70-
/**
71-
* ✅ 상세 크롤링 (조건부 실행 지원)
72-
* - init 모드에서 "모집마감" 스킵 같은 정책을 main에서 람다로 주입 가능
73-
*/
7470
fun enrichDetails(
7571
events: List<ProgramEvent>,
7672
ociUploadService: OciUploadService,
77-
shouldFetch: (ProgramEvent) -> Boolean = { true }
73+
shouldFetch: (ProgramEvent) -> Boolean = { true },
74+
shouldUseDetailSessions: (ProgramEvent) -> Boolean = { true },
7875
): List<ProgramEvent> {
7976
return events.map { e ->
8077
val dataSeq = e.dataSeq
@@ -88,7 +85,9 @@ class ExtraSnuCrawler(
8885
cookieHeader = buildCookieHeader()
8986
)
9087

91-
if (parsed.sessions.isEmpty()) { // fallback once
88+
val useDetailSessions = shouldUseDetailSessions(e)
89+
90+
if (useDetailSessions && parsed.sessions.isEmpty()) {
9291
val html2 = fetchDetailPageByPlaywright(dataSeq)
9392
if (html2 != null) {
9493
parsed = parseDetailData(
@@ -100,7 +99,11 @@ class ExtraSnuCrawler(
10099
}
101100

102101
if (delayMsBetweenDetails > 0) Thread.sleep(delayMsBetweenDetails)
103-
e.copy(detailSessions = parsed.sessions, mainContentHtml = parsed.mainContentHtml)
102+
103+
e.copy(
104+
mainContentHtml = parsed.mainContentHtml,
105+
detailSessions = if (useDetailSessions) parsed.sessions else emptyList()
106+
)
104107
}
105108
}
106109

hangsha/batch/src/main/kotlin/com/team1/hangsha/batch/job/ExtraSnuSyncRunner.kt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,12 @@ class ExtraSnuSyncRunner(
5252
val events = if (!opt.withDetails) {
5353
baseEvents
5454
} else {
55-
crawler.enrichDetails(baseEvents, ociUploadService) { e ->
56-
!e.isPeriodEventFromList()
57-
}
55+
crawler.enrichDetails(
56+
events = baseEvents,
57+
ociUploadService = ociUploadService,
58+
shouldFetch = { true },
59+
shouldUseDetailSessions = { e -> !e.isPeriodEventFromList() }
60+
)
5861
}
5962

6063
// dumpOnly 여부와 상관없이 이미지 업로드는 항상 수행한다.
@@ -148,8 +151,10 @@ private fun ProgramEvent.isPeriodEventFromList(): Boolean {
148151
)
149152
}
150153

151-
private fun ProgramEvent.toCrawledProgramEvent(): CrawledProgramEvent =
152-
CrawledProgramEvent(
154+
private fun ProgramEvent.toCrawledProgramEvent(): CrawledProgramEvent {
155+
val isPeriodEvent = isPeriodEventFromList()
156+
157+
return CrawledProgramEvent(
153158
dataSeq = dataSeq,
154159
majorTypes = majorTypes,
155160
title = title,
@@ -164,8 +169,14 @@ private fun ProgramEvent.toCrawledProgramEvent(): CrawledProgramEvent =
164169
imageUrl = imageUrl,
165170
tags = tags,
166171
mainContentHtml = mainContentHtml,
167-
detailSessions = detailSessions.map { it.toCrawledDetailSession() }
172+
isPeriodEvent = isPeriodEvent,
173+
detailSessions = if (isPeriodEvent) {
174+
emptyList()
175+
} else {
176+
detailSessions.map { it.toCrawledDetailSession() }
177+
}
168178
)
179+
}
169180

170181
private fun DetailSession.toCrawledDetailSession(): CrawledDetailSession =
171182
CrawledDetailSession(

hangsha/common/src/main/kotlin/com/team1/hangsha/event/dto/core/CrawledDtos.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ data class CrawledProgramEvent(
1717
val imageUrl: String? = null,
1818
val tags: List<String> = emptyList(),
1919
val mainContentHtml: String? = null,
20+
val isPeriodEvent: Boolean? = null,
2021
val detailSessions: List<CrawledDetailSession> = emptyList(),
2122
)
2223

hangsha/common/src/main/kotlin/com/team1/hangsha/event/service/EventSyncService.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ class EventSyncService(
5454
val applyStart = e.applyStart?.let { dateStart(it) }
5555
val applyEnd = e.applyEnd?.let { dateEnd(it) }
5656

57-
val sessions = patchSessionTimesFromMainContent(e.detailSessions, e.mainContentHtml)
57+
val sessions = if (e.isPeriodEvent == true) {
58+
emptyList()
59+
} else {
60+
patchSessionTimesFromMainContent(e.detailSessions, e.mainContentHtml)
61+
}
5862
val hasExistingForApplyLink = eventRepository.existsByApplyLink(applyLink)
5963

6064
data class UnitSpec(
@@ -110,11 +114,12 @@ class EventSyncService(
110114
.toList()
111115

112116
val title = e.title!!.trim()
113-
val isPeriodEvent = EventPeriodPolicy.isPeriodEvent(
114-
title = title,
115-
eventStart = eventStart,
116-
eventEnd = eventEnd,
117-
)
117+
val isPeriodEvent =
118+
e.isPeriodEvent == true || EventPeriodPolicy.isPeriodEvent(
119+
title = title,
120+
eventStart = eventStart,
121+
eventEnd = eventEnd,
122+
)
118123

119124
val model = Event(
120125
id = existing?.id,

0 commit comments

Comments
 (0)