From b8b0b24b0edc8e8998f34874eacbe87654a6fb82 Mon Sep 17 00:00:00 2001 From: bicochan Date: Wed, 29 Jul 2026 15:39:37 +0900 Subject: [PATCH] =?UTF-8?q?[as]=20feat:=20dc=20service=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/as/middleware.ts | 21 ++++++- apps/as/src/entities/dc/api/dc-service.ts | 19 +++++++ apps/as/src/entities/dc/api/queries.ts | 17 ++++++ apps/as/src/entities/dc/index.ts | 6 ++ apps/as/src/entities/dc/model/dc-interface.ts | 57 +++++++++++++++++++ apps/as/src/shared/config/api.ts | 3 + 6 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 apps/as/src/entities/dc/api/dc-service.ts create mode 100644 apps/as/src/entities/dc/api/queries.ts create mode 100644 apps/as/src/entities/dc/index.ts create mode 100644 apps/as/src/entities/dc/model/dc-interface.ts diff --git a/apps/as/middleware.ts b/apps/as/middleware.ts index 94a1d0381..f5bd866f3 100644 --- a/apps/as/middleware.ts +++ b/apps/as/middleware.ts @@ -1,8 +1,16 @@ import { NextRequest, NextResponse } from "next/server"; -import { AUTH_USER_ID, CLAIM_NAME, PORT, PROXY_HOST, SERVER_API_URL, SITE_ID } from "@/shared/config"; +import { + AUTH_USER_ID, + CLAIM_NAME, + PORT, + PROXY_HOST, + SERVER_API_URL, + SITE_ID, +} from "@/shared/config"; const serverApiUrl = process.env.SERVER_API_URL; +const dcServiceApiUrl = process.env.DC_SERVICE_API_URL; // CSP 헤더 설정 함수 (img-src만) function addSecurityHeaders(response: NextResponse): NextResponse { @@ -22,7 +30,15 @@ export function middleware(req: NextRequest) { if (pathname.startsWith("/server")) { const queryParams = searchParams.toString(); - const newUrl = `${serverApiUrl}${pathname.replace("/server", "")}${ + + let serverUrl: string | undefined; + if (pathname.includes("/dc-service")) { + serverUrl = dcServiceApiUrl; + } else { + serverUrl = serverApiUrl; + } + + const newUrl = `${serverUrl}${pathname.replace("/server", "")}${ queryParams ? `?${queryParams}` : "" }`; @@ -34,7 +50,6 @@ export function middleware(req: NextRequest) { return addSecurityHeaders(response); } - // tus-js-client PATCH 요청: Location 헤더로 /server 없이 반환된 경로 직접 처리 // (예: /attach-service/api/v1/tus/upload/{id}) if (pathname.startsWith("/attach-service")) { diff --git a/apps/as/src/entities/dc/api/dc-service.ts b/apps/as/src/entities/dc/api/dc-service.ts new file mode 100644 index 000000000..bea49d554 --- /dev/null +++ b/apps/as/src/entities/dc/api/dc-service.ts @@ -0,0 +1,19 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; + +import type { + NowDmgMtncGnsvyResponseDto, + NowDmgMtncGnsvySearchDto, +} from "../model/dc-interface"; + +async function getNowDmgMtncGnsvy( + params: NowDmgMtncGnsvySearchDto, +): Promise { + const response = await client.get( + ENDPOINT.DC_SERVICE.NOW_DMG_MTNC_GNSVY, + { params }, + ); + return response.data; +} + +export { getNowDmgMtncGnsvy }; diff --git a/apps/as/src/entities/dc/api/queries.ts b/apps/as/src/entities/dc/api/queries.ts new file mode 100644 index 000000000..440b66b09 --- /dev/null +++ b/apps/as/src/entities/dc/api/queries.ts @@ -0,0 +1,17 @@ +import { useQuery } from "@tanstack/react-query"; + +import { ENDPOINT } from "@/shared/config"; + +import type { NowDmgMtncGnsvySearchDto } from "../model/dc-interface"; + +import { getNowDmgMtncGnsvy } from "./dc-service"; + +export const nowDmgMtncGnsvyBaseKey = [ENDPOINT.DC_SERVICE.NOW_DMG_MTNC_GNSVY] as const; + +export function useNowDmgMtncGnsvy(params: NowDmgMtncGnsvySearchDto) { + return useQuery({ + queryKey: [...nowDmgMtncGnsvyBaseKey, params], + queryFn: () => getNowDmgMtncGnsvy(params), + enabled: Boolean(params.swtrmtFcltCd && params.ctpvNm), + }); +} diff --git a/apps/as/src/entities/dc/index.ts b/apps/as/src/entities/dc/index.ts new file mode 100644 index 000000000..be8a12d0b --- /dev/null +++ b/apps/as/src/entities/dc/index.ts @@ -0,0 +1,6 @@ +export { getNowDmgMtncGnsvy } from "./api/dc-service"; +export { nowDmgMtncGnsvyBaseKey, useNowDmgMtncGnsvy } from "./api/queries"; +export type { + NowDmgMtncGnsvyResponseDto, + NowDmgMtncGnsvySearchDto, +} from "./model/dc-interface"; diff --git a/apps/as/src/entities/dc/model/dc-interface.ts b/apps/as/src/entities/dc/model/dc-interface.ts new file mode 100644 index 000000000..cffab992d --- /dev/null +++ b/apps/as/src/entities/dc/model/dc-interface.ts @@ -0,0 +1,57 @@ +export interface NowDmgMtncGnsvySearchDto { + swtrmtFcltCd?: string; + ctpvNm?: string; + sggNm?: string; + targetYear?: string; +} + +type NullableNumber = number | null; +type NullableString = string | null; + +/** 현재·단계별(Dt/Dc) 공통 지표 필드 */ +interface NowDmgMtncGnsvyMetricFields { + planYr?: NullableString; + swtrmtPpltnCnt?: NullableNumber; + natrSwtrmtPpltnCnt?: NullableNumber; + scilSwtrmtPpltnCnt?: NullableNumber; + swtrmtZoneArea?: NullableNumber; + wtrUsqtyOrgnUnit?: NullableNumber; + drtwSwtcRt?: NullableNumber; + flctnLodRt?: NullableNumber; + drtwOrgnUnit?: NullableNumber; + planSwageQntSum?: NullableNumber; + lvngDrtwSum?: NullableNumber; + ugwtSum?: NullableNumber; + fctryWwtSum?: NullableNumber; + toursmDrtwSum?: NullableNumber; + mtbsSum?: NullableNumber; + linkPrcsCntSum?: NullableNumber; + etcDrtwSum?: NullableNumber; + ugwtUseSum?: NullableNumber; + fcltCpctSum?: NullableNumber; + exclsMethExpln?: NullableString; + brcPplSum?: NullableNumber; + icptgPplSum?: NullableNumber; + exclnPplSum?: NullableNumber; + stofcbrSum?: NullableNumber; + pmstnSum?: NullableNumber; + simplPubSwtrmtFcltSum?: NullableNumber; + swageImpdFcltSum?: NullableNumber; + mltvFclSum?: NullableNumber; +} + +type StageSuffix = "Dt1" | "Dt2" | "Dt3" | "Dt4" | "Dc1" | "Dc2" | "Dc3" | "Dc4"; + +type StagedMetricFields = { + [K in keyof NowDmgMtncGnsvyMetricFields as `${K & string}${StageSuffix}`]?: NowDmgMtncGnsvyMetricFields[K]; +}; + +/** DC nowDmgMtncGnsvy 응답 DTO */ +export interface NowDmgMtncGnsvyResponseDto + extends NowDmgMtncGnsvyMetricFields, StagedMetricFields { + swtrmtFcltCd?: NullableString; + swtrmtFcltNm?: NullableString; + gnsvyYr?: NullableString; + ctpvNm?: NullableString; + sggNm?: NullableString; +} diff --git a/apps/as/src/shared/config/api.ts b/apps/as/src/shared/config/api.ts index ab4c18af8..0ffb421a3 100644 --- a/apps/as/src/shared/config/api.ts +++ b/apps/as/src/shared/config/api.ts @@ -44,6 +44,9 @@ export const ENDPOINT = { STATVERIFY_SERVICE: { ST_ANLS_MST: "/statverify-service/api/v1/st-anls-mst", }, + DC_SERVICE: { + NOW_DMG_MTNC_GNSVY: "/dc-service/api/v1/nowDmgMtncGnsvy", + }, }; export const JWT_EXPIRATION_TIME = 1800000;