From 721511fd1b3fda45bca6ee7682c797097d2d49b6 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 28 Sep 2026 19:11:30 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=91=9C=EC=8B=9C=20=EC=98=A4=EB=A5=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.js | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/index.js b/src/index.js index 677b935..48552aa 100644 --- a/src/index.js +++ b/src/index.js @@ -443,21 +443,29 @@ async function listFeedbacks(request, env, url) { if (!env.ABC_API_KEY) return json({ error: "feedback_api_not_configured" }, 503); if (!env.ABC_PROJECT_ID || !env.ABC_CHANNEL_ID) return json({ error: "feedback_target_not_configured" }, 503); - const apiBaseUrl = String(env.ABC_API_BASE_URL || "https://feedback.hmac.kr").replace(/\/$/, ""); - const endpoint = new URL(apiBaseUrl + "/api/projects/" + encodeURIComponent(env.ABC_PROJECT_ID) + "/channels/" + encodeURIComponent(env.ABC_CHANNEL_ID) + "/feedbacks"); - ["cursor", "searchText", "fieldKey", "issueName"].forEach((key) => { - const value = url.searchParams.get(key); - if (value) endpoint.searchParams.set(key, value); - }); - + const configuredBaseUrl = String(env.ABC_API_BASE_URL || "https://feedback.hmac.kr"); + const apiBaseUrl = configuredBaseUrl.endsWith("/") ? configuredBaseUrl.slice(0, -1) : configuredBaseUrl; + const endpoint = apiBaseUrl + "/api/v2/projects/" + encodeURIComponent(env.ABC_PROJECT_ID) + "/channels/" + encodeURIComponent(env.ABC_CHANNEL_ID) + "/feedbacks/search"; const requestedLimit = Number(url.searchParams.get("limit") || 100); const requestedPage = Number(url.searchParams.get("page") || 1); - endpoint.searchParams.set("limit", String(Number.isFinite(requestedLimit) ? Math.min(Math.max(Math.floor(requestedLimit), 1), 100) : 100)); - endpoint.searchParams.set("page", String(Number.isFinite(requestedPage) ? Math.max(Math.floor(requestedPage), 1) : 1)); + const payload = { + limit: Number.isFinite(requestedLimit) ? Math.min(Math.max(Math.floor(requestedLimit), 1), 100) : 100, + page: Number.isFinite(requestedPage) ? Math.max(Math.floor(requestedPage), 1) : 1, + sort: { createdAt: "DESC" } + }; + const searchText = url.searchParams.get("searchText"); + const fieldKey = url.searchParams.get("fieldKey"); + const issueName = url.searchParams.get("issueName"); + if (searchText && fieldKey) payload.queries = [{ key: fieldKey, value: searchText, condition: "CONTAINS" }]; + if (issueName) payload.queries = [{ key: "issueName", value: issueName, condition: "IS" }]; let response; try { - response = await fetch(endpoint, { method: "GET", headers: { accept: "application/json", "x-api-key": env.ABC_API_KEY } }); + response = await fetch(endpoint, { + method: "POST", + headers: { accept: "application/json", "content-type": "application/json", "x-api-key": env.ABC_API_KEY }, + body: JSON.stringify(payload) + }); } catch (error) { console.error("feedback_list_api_request_failed", error instanceof Error ? error.message : "unknown"); return json({ error: "feedback_api_unreachable" }, 502); @@ -470,8 +478,8 @@ async function listFeedbacks(request, env, url) { return json({ error: "feedback_api_rejected", message: upstreamMessage || "문의 목록 조회에 실패했습니다.", status: response.status }, response.status >= 500 ? 502 : response.status); } - const items = Array.isArray(result) ? result : (result.items || result.data?.items || []); - const meta = result.meta || result.data?.meta || {}; + const items = Array.isArray(result) ? result : (result.items || (Array.isArray(result.data) ? result.data : result.data && result.data.items) || []); + const meta = result.meta || result.data && result.data.meta || {}; return json({ items: Array.isArray(items) ? items : [], meta }); }