50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
import { getMethod, getRequestHeader, getRequestURL, setResponseHeader } from 'h3'
|
|
import { isBotUserAgent } from '../../lib/analytics'
|
|
import {
|
|
createVisitorHashFromEvent,
|
|
recordAnalyticsPageview
|
|
} from '../repositories/analytics-repository'
|
|
import { getPageBySlug } from '../repositories/content-repository'
|
|
|
|
/**
|
|
* 공개 페이지가 HTML 문서 모드일 때 Nuxt 렌더링 대신 원문 HTML을 응답한다.
|
|
* @param {import('h3').H3Event} event - 요청 이벤트
|
|
* @returns {Promise<string | void>} HTML 문서 또는 다음 핸들러 진행
|
|
*/
|
|
export default defineEventHandler(async (event) => {
|
|
const method = getMethod(event)
|
|
|
|
if (method !== 'GET' && method !== 'HEAD') {
|
|
return
|
|
}
|
|
|
|
const pathname = getRequestURL(event).pathname
|
|
const match = pathname.match(/^\/pages\/([^/]+)\/?$/)
|
|
|
|
if (!match) {
|
|
return
|
|
}
|
|
|
|
const slug = decodeURIComponent(match[1])
|
|
const page = await getPageBySlug(slug)
|
|
|
|
if (page?.renderMode !== 'html_document') {
|
|
return
|
|
}
|
|
|
|
if (method === 'GET' && !isBotUserAgent(String(getRequestHeader(event, 'user-agent') || ''))) {
|
|
await recordAnalyticsPageview({
|
|
visitorHash: createVisitorHashFromEvent(event),
|
|
pageId: page.id,
|
|
recordSite: true,
|
|
recordView: true,
|
|
recordRead: false
|
|
})
|
|
}
|
|
|
|
setResponseHeader(event, 'content-type', 'text/html; charset=utf-8')
|
|
setResponseHeader(event, 'cache-control', 'no-cache')
|
|
|
|
return page.content || ''
|
|
})
|