요청한 날짜로 저장하는 버그 해결결
This commit is contained in:
@@ -90,6 +90,10 @@ export async function GET(request: Request) {
|
|||||||
|
|
||||||
const isoDate = parseKoreanDateToISO(dateStr) || parseYYMMDD(dateStr) || new Date().toISOString();
|
const isoDate = parseKoreanDateToISO(dateStr) || parseYYMMDD(dateStr) || new Date().toISOString();
|
||||||
const prisma = new PrismaClient();
|
const prisma = new PrismaClient();
|
||||||
|
// 날짜를 하루 단위(UTC 자정)로 고정해 동일 날짜는 같은 값으로 취급
|
||||||
|
const dayStart = new Date(isoDate);
|
||||||
|
dayStart.setUTCHours(0, 0, 0, 0);
|
||||||
|
const nextDay = new Date(dayStart.getTime() + 24 * 60 * 60 * 1000);
|
||||||
try {
|
try {
|
||||||
// handle 연결은 비워둠 (요청에 따라 핸들 매핑 생략)
|
// handle 연결은 비워둠 (요청에 따라 핸들 매핑 생략)
|
||||||
|
|
||||||
@@ -123,19 +127,31 @@ export async function GET(request: Request) {
|
|||||||
const premiumViews = toInt(row['YouTube Premium 조회수']);
|
const premiumViews = toInt(row['YouTube Premium 조회수']);
|
||||||
const watchTime = toInt(row['시청 시간(단위: 시간)']);
|
const watchTime = toInt(row['시청 시간(단위: 시간)']);
|
||||||
|
|
||||||
// contentId + date 복합 유니크로 upsert
|
// 같은 날짜(하루 단위)에 이미 존재하면 update, 없으면 create
|
||||||
await prisma.contentDayView.upsert({
|
const existing = await prisma.contentDayView.findFirst({
|
||||||
where: { contentId_date: { contentId: upsertedContent.id, date: new Date(isoDate) } },
|
where: {
|
||||||
update: { views, validViews, premiumViews, watchTime },
|
|
||||||
create: {
|
|
||||||
contentId: upsertedContent.id,
|
contentId: upsertedContent.id,
|
||||||
date: new Date(isoDate),
|
date: { gte: dayStart, lt: nextDay },
|
||||||
|
},
|
||||||
|
select: { id: true },
|
||||||
|
});
|
||||||
|
if (existing) {
|
||||||
|
await prisma.contentDayView.update({
|
||||||
|
where: { id: existing.id },
|
||||||
|
data: { views, validViews, premiumViews, watchTime },
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
await prisma.contentDayView.create({
|
||||||
|
data: {
|
||||||
|
contentId: upsertedContent.id,
|
||||||
|
date: dayStart,
|
||||||
views,
|
views,
|
||||||
validViews,
|
validViews,
|
||||||
premiumViews,
|
premiumViews,
|
||||||
watchTime,
|
watchTime,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
}
|
||||||
upserted += 1;
|
upserted += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1
dumps/ContentDayView_20251015_074150.sql
Normal file
1
dumps/ContentDayView_20251015_074150.sql
Normal file
File diff suppressed because one or more lines are too long
@@ -277,7 +277,8 @@ const server = http.createServer((req, res) => {
|
|||||||
const result = await runFreshExport(ymd);
|
const result = await runFreshExport(ymd);
|
||||||
const payload = {
|
const payload = {
|
||||||
...result,
|
...result,
|
||||||
date: ymd === 'latest' ? result.endDate : (ymd || result.endDate),
|
// 요청된 ymd 대신 실제 적용된 기간의 종료일(=단일일자)로 반환
|
||||||
|
date: result.endDate,
|
||||||
};
|
};
|
||||||
sendJson(res, 200, payload);
|
sendJson(res, 200, payload);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user