diff --git a/apps/cm/.env.production b/apps/cm/.env.production index 52e7e135c..750b4022e 100644 --- a/apps/cm/.env.production +++ b/apps/cm/.env.production @@ -1,6 +1,6 @@ # apps/cs/src/shared/config/env.ts 참고 -NEXT_PUBLIC_PORT=3001 -NEXT_PUBLIC_PROXY_HOST=http://localhost:3001 +NEXT_PUBLIC_PORT=3000 +NEXT_PUBLIC_PROXY_HOST=http://localhost:3000 NEXT_PUBLIC_SITE_ID=CS NEXT_PUBLIC_SUB_DOMAIN=http://localhost:13000 NEXT_PUBLIC_SERVER_API_URL=http://192.168.0.102:8000 diff --git a/apps/cm/app/auth/logout/route.ts b/apps/cm/app/api/auth/logout/route.ts similarity index 99% rename from apps/cm/app/auth/logout/route.ts rename to apps/cm/app/api/auth/logout/route.ts index fdcc9df7c..ba8e23374 100644 --- a/apps/cm/app/auth/logout/route.ts +++ b/apps/cm/app/api/auth/logout/route.ts @@ -15,3 +15,4 @@ export async function POST() { cookieStore.delete(CLAIM_NAME); return NextResponse.json({ message: "Logged out" }, { status: 200 }); } + diff --git a/apps/cm/middleware.ts b/apps/cm/middleware.ts index 1cc23b8c2..683defe8c 100644 --- a/apps/cm/middleware.ts +++ b/apps/cm/middleware.ts @@ -58,8 +58,7 @@ export function middleware(req: NextRequest) { const userId = req.cookies.get(AUTH_USER_ID)?.value; // const decodedQuery = toDecodedQueryString(searchParams); - const newUrl = `${serverApiUrl2}${pathname.replace("/server", "")}${searchParams ? `?${searchParams}` : ""}`; - // const newUrl = `${serverApiUrl2}${pathname}`; + const newUrl = `${serverApiUrl2}${pathname.replace("/server/", "/")}${searchParams ? `?${searchParams}` : ""}`; if (token) requestHeaders.set(CLAIM_NAME, token); if (userId) requestHeaders.set(AUTH_USER_ID, userId); @@ -96,7 +95,7 @@ export function middleware(req: NextRequest) { const token = req.cookies.get(CLAIM_NAME)?.value; const userId = req.cookies.get(AUTH_USER_ID)?.value; // const newUrl = `${serverApiUrl2}${pathname.replace("/server/", "")}`; - const newUrl = `${serverApiUrl2}${pathname.replace("/server", "")}${searchParams ? `?${searchParams}` : ""}`; + const newUrl = `${serverApiUrl2}${pathname.replace("/server/", "/")}${searchParams ? `?${searchParams}` : ""}`; if (token) requestHeaders.set(CLAIM_NAME, token); if (userId) requestHeaders.set(AUTH_USER_ID, userId); @@ -115,7 +114,7 @@ export function middleware(req: NextRequest) { const token = req.cookies.get(CLAIM_NAME)?.value; const userId = req.cookies.get(AUTH_USER_ID)?.value; - const newUrl = `${serverApiUrl3}${pathname.replace("/server/", "")}${searchParams ? `?${searchParams}` : ""}`; + const newUrl = `${serverApiUrl3}${pathname.replace("/server/", "/")}${searchParams ? `?${searchParams}` : ""}`; if (token) requestHeaders.set(CLAIM_NAME, token); if (userId) requestHeaders.set(AUTH_USER_ID, userId); @@ -134,7 +133,7 @@ export function middleware(req: NextRequest) { const token = req.cookies.get(CLAIM_NAME)?.value; const userId = req.cookies.get(AUTH_USER_ID)?.value; - const newUrl = `${serverApiUrl3}${pathname.replace("/server/", "")}${searchParams ? `?${searchParams}` : ""}`; + const newUrl = `${serverApiUrl3}${pathname.replace("/server/", "/")}${searchParams ? `?${searchParams}` : ""}`; if (token) requestHeaders.set(CLAIM_NAME, token); if (userId) requestHeaders.set(AUTH_USER_ID, userId); @@ -163,7 +162,7 @@ export function middleware(req: NextRequest) { if (pathname.startsWith("/server")) { const queryParams = searchParams.toString(); - const newUrl = `${serverApiUrl}${pathname.replace("/server", "")}${ + const newUrl = `${serverApiUrl}${pathname.replace("/server", "/")}${ queryParams ? `?${queryParams}` : "" }`; diff --git a/apps/cm/src/pages/dashboard/api/support.ts b/apps/cm/src/pages/dashboard/api/support.ts index b0513d28f..9e3f7cd78 100644 --- a/apps/cm/src/pages/dashboard/api/support.ts +++ b/apps/cm/src/pages/dashboard/api/support.ts @@ -1,4 +1,6 @@ +import { client } from "@/shared/api"; import { ENDPOINT } from "@/shared/config"; +import type { PageableList } from "@/shared/model"; export interface Support { total: number; @@ -7,38 +9,45 @@ export interface Support { youngsang: number; geum: number; nakdong: number; + completed: number; type: string; } -export const getSupportList = async () => { - const url = `/api/proxy${ENDPOINT.IC_SERVICE.GROUPING_STATISTICS}`; - console.log("[getSupportList] API 호출 시작 (프록시, 인증 없음):", url); - try { - const response = await fetch(url, { - method: "GET", - headers: { - "Content-Type": "application/json", - accept: "application/json", +export const getSupportList = async (): Promise> => { + const response = await client.get( + `${ENDPOINT.IC_SERVICE.GROUPING_STATISTICS}`, + ); + const data = response.data; + + console.log("getSupportList data:", data); + + return { + content: data, + pageable: { + sort: { + sorted: false, + unsorted: true, + empty: true, }, - }); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - console.log("[getSupportList] API 응답 성공:", data); - return data; - } catch (error: unknown) { - const err = error as - | { status?: number; message?: string; response?: { status?: number } } - | undefined; - console.error("[getBannerList] API 호출 실패:", { - url, - error: err, - status: err?.status ?? err?.response?.status, - message: err instanceof Error ? err.message : String(err), - }); - throw error; - } + offset: 0, + pageNumber: 0, + pageSize: data.length, + paged: false, + unpaged: true, + }, + sort: { + sorted: false, + unsorted: true, + empty: true, + }, + totalPages: 1, + totalElements: data.length, + number: 0, + numberOfElements: data.length, + size: data.length, + first: true, + last: true, + empty: data.length === 0, + }; }; + diff --git a/apps/cm/src/pages/dashboard/ui/fo-fclt-cnt-rt.tsx b/apps/cm/src/pages/dashboard/ui/fo-fclt-cnt-rt.tsx index 08460f123..2a0264e43 100644 --- a/apps/cm/src/pages/dashboard/ui/fo-fclt-cnt-rt.tsx +++ b/apps/cm/src/pages/dashboard/ui/fo-fclt-cnt-rt.tsx @@ -61,7 +61,7 @@ const FoFcltCntRt: React.FC = () => {

수계별 시설운영 개소수 및 가동률

-
+
{/* 왼쪽: 개소수 카드 */}
@@ -69,7 +69,7 @@ const FoFcltCntRt: React.FC = () => {

개소수 ({year}년도)

-
+
{displayData.facilityCount.toLocaleString()} 개소
diff --git a/apps/cm/src/pages/dashboard/ui/fo-wqlt-Infl-effl.tsx b/apps/cm/src/pages/dashboard/ui/fo-wqlt-Infl-effl.tsx index 4a2bd86b0..05f7fe34e 100644 --- a/apps/cm/src/pages/dashboard/ui/fo-wqlt-Infl-effl.tsx +++ b/apps/cm/src/pages/dashboard/ui/fo-wqlt-Infl-effl.tsx @@ -199,7 +199,7 @@ const FoWqltInflEffl: React.FC = () => {

수계별 유입ㆍ방류수질 분석

-
+
{/* 탭 메뉴 */}
diff --git a/apps/cm/src/pages/dashboard/ui/notice-list.tsx b/apps/cm/src/pages/dashboard/ui/notice-list.tsx index feb0f4f80..dfc70732a 100644 --- a/apps/cm/src/pages/dashboard/ui/notice-list.tsx +++ b/apps/cm/src/pages/dashboard/ui/notice-list.tsx @@ -14,9 +14,6 @@ import { Button } from "@common/components"; const NoticeList: React.FC = () => { const router = useRouter(); - // #region agent log - fetch('http://127.0.0.1:7242/ingest/fdf9af6c-c6f9-41cb-8b7f-640be19ecbac',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'notice-list.tsx:16',message:'Router initialized',data:{routerExists:!!router},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'E'})}).catch(()=>{}); - // #endregion const noticePostQuery = useQuery({ queryKey: [ENDPOINT.BOARD_SERVICE.POSTS], queryFn: () => @@ -33,22 +30,11 @@ const NoticeList: React.FC = () => { }; const handleMoreClick = () => { - // #region agent log - fetch('http://127.0.0.1:7242/ingest/fdf9af6c-c6f9-41cb-8b7f-640be19ecbac',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'notice-list.tsx:32',message:'Button click handler called',data:{targetPath:'/cms/bbsnotice/7'},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{}); - // #endregion try { - // #region agent log - fetch('http://127.0.0.1:7242/ingest/fdf9af6c-c6f9-41cb-8b7f-640be19ecbac',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'notice-list.tsx:35',message:'Before router.push',data:{routerExists:!!router,path:'/cms/bbsnotice/7'},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B'})}).catch(()=>{}); - // #endregion router.push('/cms/bbsnotice/7'); - // #region agent log - fetch('http://127.0.0.1:7242/ingest/fdf9af6c-c6f9-41cb-8b7f-640be19ecbac',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'notice-list.tsx:43',message:'After router.push',data:{navigationCalled:true},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B'})}).catch(()=>{}); - // #endregion } catch (error) { - // #region agent log - fetch('http://127.0.0.1:7242/ingest/fdf9af6c-c6f9-41cb-8b7f-640be19ecbac',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'notice-list.tsx:41',message:'Router.push error',data:{error:error instanceof Error?error.message:String(error)},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B'})}).catch(()=>{}); - // #endregion - } + console.error("공지사항 더보기 이동 실패", error); + } }; const { tableComponent: noticePostTableComponent } = useDataTable({ diff --git a/apps/cm/src/pages/dashboard/ui/reuse-chart.tsx b/apps/cm/src/pages/dashboard/ui/reuse-chart.tsx index d71c04711..d812c938e 100644 --- a/apps/cm/src/pages/dashboard/ui/reuse-chart.tsx +++ b/apps/cm/src/pages/dashboard/ui/reuse-chart.tsx @@ -185,7 +185,7 @@ const ReuseChart: React.FC = () => {

{chartItems[activeIndex]?.title}

-
+
{ ))}
-
+
{chartItems.map((_, index) => (