From f03031bfe9078276a4b96a7cf8188b9c7beeddc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Chyeonggkim=E2=80=9D?= <“hyeonggkim@smilegate.com”> Date: Mon, 8 Dec 2025 16:36:23 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20?= =?UTF-8?q?api=20=ED=98=B8=EC=B6=9C=20=EC=B6=94=EA=B0=80,=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layers/middleware/pageData.global.ts | 61 ++++++++++++++++++---------- layers/server/middleware/gameData.ts | 52 +++++++++--------------- 2 files changed, 58 insertions(+), 55 deletions(-) diff --git a/layers/middleware/pageData.global.ts b/layers/middleware/pageData.global.ts index ec2ef51..e45f274 100644 --- a/layers/middleware/pageData.global.ts +++ b/layers/middleware/pageData.global.ts @@ -11,7 +11,6 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { const runtimeConfig = useRuntimeConfig() const stoveApiBaseUrl = runtimeConfig.public.stoveApiUrl - const apiUrl = `${stoveApiBaseUrl}/pub-comm/v2.0/template/page` const gameDomain = useGetGameDomain() const gameDataStore = useGameDataStore() @@ -107,20 +106,33 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { Authorization: `Bearer ${accessToken}`, } - // 쿼리스트링에서 f 파라미터 값 추출 (CSR용) - // const fValue = (to.query.f as string) || '' + // 미리보기 쿼리스트링에서 파라미터 값 추출 + // preview?page_seq=1&page_ver=1&lang_code=ko + const queryString = to.fullPath.includes('?') ? to.fullPath.split('?')[1] : '' + const urlParams = new URLSearchParams(queryString) + const pageSeq = urlParams.get('page_seq') || '' + const pageVer = urlParams.get('page_ver') || '' + const queryLangCode = urlParams.get('lang_code') || langCode - // // 미리보기 API 호출 처리 - // let finalGameDomain = gameDomain - // if (fValue === 'preview') { - // finalGameDomain = 'samplegame.onstove.com' - // } - - const queryParams: Record = { - game_domain: gameDomain, - lang_code: langCode, - page_url: pageUrl, - _t: Date.now().toString(), // 캐시 무효화를 위한 타임스탬프 + let queryParams: Record; + let apiUrl: string; + if (pageUrl === '/preview') { + apiUrl = `${stoveApiBaseUrl}/pub-comm/v1.0/template/page/preview` + queryParams = { + lang_code: queryLangCode, + page_seq: pageSeq, + page_ver: pageVer, + _t: Date.now().toString(), // 캐시 무효화를 위한 타임스탬프 + } + + } else { + apiUrl = `${stoveApiBaseUrl}/pub-comm/v2.0/template/page` + queryParams = { + game_domain: gameDomain, + lang_code: langCode, + page_url: pageUrl, + _t: Date.now().toString(), // 캐시 무효화를 위한 타임스탬프 + } } const response = (await commonFetch('GET', apiUrl, { @@ -145,7 +157,13 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { }) } - if (response?.code === 91002 && response?.message === 'Invalid LangCode') { + // 404 에러 코드 체크 + const isNotFoundError = + (response?.code === 91002 && response?.message === 'Invalid LangCode') || + response?.code === 91003 || + response?.code === 90004 + + if (isNotFoundError) { //클릭한 주소는 주소표시줄에 표시하도록 수정 if (import.meta.client) { window.history.replaceState({}, '', to.path) @@ -154,15 +172,14 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { showError( createError({ statusCode: 404, - statusMessage: '페이지를 찾을 수 없어요.', + statusMessage: response?.message, fatal: false, // 즉시 에러 페이지로 - data: { reason: 'post-not-found Invalid LangCode' }, + data: { reason: response?.message }, }) ) } - if (response?.code === 91003) { - // return navigateTo(`/${langCode}/error`, { external: false }) + if (response?.code === 90002) { //클릭한 주소는 주소표시줄에 표시하도록 수정 if (import.meta.client) { window.history.replaceState({}, '', to.path) @@ -170,10 +187,10 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { // 뒤로가기 이동 시 이전 페이지로 이동되도록 수정 showError( createError({ - statusCode: 404, - statusMessage: '페이지를 찾을 수 없어요.', + statusCode: 500, + statusMessage: response?.message, fatal: false, // 즉시 에러 페이지로 - data: { reason: 'post-not-found' }, + data: { reason: response?.message }, }) ) } diff --git a/layers/server/middleware/gameData.ts b/layers/server/middleware/gameData.ts index 80f0fc6..95612e1 100644 --- a/layers/server/middleware/gameData.ts +++ b/layers/server/middleware/gameData.ts @@ -256,25 +256,6 @@ export default defineEventHandler(async event => { initLangCodes, initDefaultLocale ) - - // 쿼리스트링에서 f 파라미터 값 추출 - const path = event?.node.req.url || '' - let fValue = '' - if (path.includes('?')) { - try { - const queryString = path.split('?')[1] - const urlParams = new URLSearchParams(queryString) - fValue = urlParams.get('f') || '' - } catch (e) { - console.error('쿼리스트링 파싱 에러:', e) - } - } - - // 미리보기 API 호출 처리 - if (fValue === 'preview') { - cleanHost = 'samplegame.onstove.com' - } - const queryParams: Record = { game_domain: cleanHost || '', lang_code: finalLocale, @@ -313,20 +294,25 @@ export default defineEventHandler(async event => { } else { // 점검 데이터 조회 if (response?.value?.game_id) { - const inspectionApiUrl = `${iBaseApiUrl}/pub-comm/v3.0/inspection/${response?.value?.game_id}` - // 직접 $fetch 사용 (composable 사용하지 않음) - const inspectionResponse = await $fetch( - inspectionApiUrl, - { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - } - ) - inspectionData = inspectionResponse?.value?.inspection - console.log("🚀 ~ inspectionData:", inspectionData) - cache.set(cacheKey, inspectionData) // 캐시에 저장 + try { + const inspectionApiUrl = `${iBaseApiUrl}/pub-comm/v3.0/inspection/${response?.value?.game_id}` + // 직접 $fetch 사용 (composable 사용하지 않음) + const inspectionResponse = await $fetch( + inspectionApiUrl, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + } + ) + inspectionData = inspectionResponse?.value?.inspection + console.log("🚀 ~ inspectionData:", inspectionData) + cache.set(cacheKey, inspectionData) // 캐시에 저장 + } catch (error) { + console.error('inspection data load error:', error) + // 에러 발생 시 inspectionData는 undefined로 유지 + } } }