From b8776959c2f8792945e0804af82f652413074353 Mon Sep 17 00:00:00 2001 From: HeHelee Date: Fri, 28 Nov 2025 10:38:56 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EC=A3=BC=EC=84=9D=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 --- .../rack/api/deleteRackEquipments.ts | 13 ++ .../serverView/rack/api/getRackEquipments.ts | 14 ++ .../rack/api/getUnassignedEquipments.ts | 19 ++ .../rack/api/postPlaceEquipments.ts | 15 ++ .../serverView/rack/api/postRackEquipments.ts | 16 ++ .../rack/api/updateRackEquipments.ts | 14 ++ .../serverView/rack/components/Button.tsx | 17 ++ .../serverView/rack/components/Card.tsx | 15 ++ .../rack/components/ClickableIcon.tsx | 19 ++ .../serverView/rack/components/Device.tsx | 28 ++- .../serverView/rack/components/Dropdown.tsx | 24 +++ .../serverView/rack/components/Rack.tsx | 38 ++++ .../serverView/rack/components/RackHeader.tsx | 15 ++ .../serverView/rack/components/RackView.tsx | 58 ++++- .../serverView/rack/components/Sidebar.tsx | 27 +++ .../serverView/rack/components/Tools.tsx | 18 ++ .../serverView/rack/components/Tooltip.tsx | 18 ++ .../rack/constants/rackConstants.ts | 17 ++ .../rack/hooks/useDeleteRackEquipments.ts | 18 ++ .../rack/hooks/useGetRackEquipments.ts | 14 ++ .../rack/hooks/useGetUnassignedEquipments.ts | 15 ++ .../serverView/rack/hooks/useImageLoad.ts | 10 + .../rack/hooks/usePostPlaceEquipments.ts | 12 ++ .../rack/hooks/usePostRackEquipments.ts | 9 + .../serverView/rack/hooks/useRackManager.ts | 65 +++++- .../rack/hooks/useUpdateRackEquipments.ts | 17 ++ src/domains/serverView/rack/types/index.ts | 35 ++++ src/domains/serverView/rack/utils/colorMap.ts | 15 ++ .../serverView/rack/utils/deviceImageMap.ts | 15 ++ .../serverView/rack/utils/dragBound.ts | 19 +- .../serverView/rack/utils/rackCalculation.ts | 54 ++++- .../rack/utils/rackCollisionDetection.ts | 36 +++- .../serverView/rack/utils/rackLayout.ts | 15 ++ .../serverDashboard/api/updateEquipments.ts | 17 ++ .../components/AreaLineChart.tsx | 24 +++ .../serverDashboard/components/BarChart.tsx | 24 +++ .../serverDashboard/components/Button.tsx | 18 ++ .../components/ButtonPlaceholder.tsx | 18 ++ .../serverDashboard/components/ChartCard.tsx | 17 ++ .../serverDashboard/components/GaugeChart.tsx | 19 ++ .../components/ServerDashboard.tsx | 39 +++- .../components/ServerDashboardHeader.tsx | 16 ++ .../components/SmoothLineChart.tsx | 23 ++ .../components/ThresholdHeader.tsx | 39 +++- .../components/ThresholdmetricInput.tsx | 64 +++++- .../serverDashboard/constants/index.ts | 17 +- .../serverDashboard/css/chartCard.css | 24 ++- .../serverDashboard/css/serverDashboard.css | 21 +- .../hooks/useAllEquipmentBackgroundSSE.ts | 36 ++++ .../serverDashboard/hooks/useEquipmentSSE.ts | 198 +++++++----------- .../hooks/useUpdateEquipment.ts | 18 ++ .../serverDashboard/stores/monitoringStore.ts | 46 +++- .../types/event-source-polyfill.d.ts | 23 ++ .../serverView/serverDashboard/types/index.ts | 17 ++ .../serverDashboard/utils/chartDataBuilder.ts | 74 ++++++- .../serverDashboard/utils/monitoring.ts | 43 ++++ src/domains/serverView/types/index.ts | 59 ++++-- 57 files changed, 1429 insertions(+), 199 deletions(-) diff --git a/src/domains/serverView/rack/api/deleteRackEquipments.ts b/src/domains/serverView/rack/api/deleteRackEquipments.ts index 5cbb8da..211d2cb 100644 --- a/src/domains/serverView/rack/api/deleteRackEquipments.ts +++ b/src/domains/serverView/rack/api/deleteRackEquipments.ts @@ -1,11 +1,24 @@ +/** + * @author 구희원 + * @description 랙 장비 삭제 API + */ + import client from "@/api/client"; +/** + * 장비 삭제 API 응답 + */ interface DeleteEquipmentsResponse { statusCode: number; message: string; data: null; } +/** + * 랙 장비 삭제 + * @param {number} id - 삭제할 장비 ID + * @returns {Promise} 삭제 결과 + */ export const deleteRackEquipments = async ( id: number ): Promise => { diff --git a/src/domains/serverView/rack/api/getRackEquipments.ts b/src/domains/serverView/rack/api/getRackEquipments.ts index 642f301..f9eab7a 100644 --- a/src/domains/serverView/rack/api/getRackEquipments.ts +++ b/src/domains/serverView/rack/api/getRackEquipments.ts @@ -1,12 +1,26 @@ +/** + * @author 구희원 + * @description 특정 랙의 장비 목록 조회 API + */ + import client from "@/api/client"; import type { EquipmentType, EquipmentStatus } from "../types"; +/** + * 랙 장비 조회 파라미터 + */ export interface GetRackEquipmentsParams { status?: EquipmentStatus; type?: EquipmentType; sortBy?: string; } +/** + * 특정 랙의 장비 목록 조회 + * @param {number} rackId - 조회할 랙 ID + * @param {GetRackEquipmentsParams} params - 필터 옵션 (status, type, sortBy) + * @returns 장비 목록 + */ export const getRackEquipments = async ( rackId: number, params?: GetRackEquipmentsParams diff --git a/src/domains/serverView/rack/api/getUnassignedEquipments.ts b/src/domains/serverView/rack/api/getUnassignedEquipments.ts index 5abec71..7d3f3f4 100644 --- a/src/domains/serverView/rack/api/getUnassignedEquipments.ts +++ b/src/domains/serverView/rack/api/getUnassignedEquipments.ts @@ -1,11 +1,22 @@ +/** + * @author 구희원 + * @description 미할당 장비 목록 조회 API + */ + import client from "@/api/client"; import type { UnassignedEquipment } from "../types"; +/** + * 미할당 장비 조회 파라미터 + */ export interface GetUnassignedEquipmentsParams { page?: number; onlyUnassigned?: boolean; } +/** + * 페이지네이션 응답 + */ interface PaginatedResponse { content: UnassignedEquipment[]; totalElements: number; @@ -15,12 +26,20 @@ interface PaginatedResponse { last: boolean; } +/** + * 미할당 장비 조회 API 응답 + */ interface GetUnassignedEquipmentsResponse { status_code: number; status_message: string; result: PaginatedResponse; } +/** + * 미할당 장비 목록 조회 + * @param {GetUnassignedEquipmentsParams} params - 조회 옵션 (page, onlyUnassigned) + * @returns {Promise} 미할당 장비 목록 (페이지당 5개) + */ export const getUnassignedEquipments = async ( params: GetUnassignedEquipmentsParams = {} ) => { diff --git a/src/domains/serverView/rack/api/postPlaceEquipments.ts b/src/domains/serverView/rack/api/postPlaceEquipments.ts index 47272bf..dd7f752 100644 --- a/src/domains/serverView/rack/api/postPlaceEquipments.ts +++ b/src/domains/serverView/rack/api/postPlaceEquipments.ts @@ -1,10 +1,25 @@ +/** + * @author 구희원 + * @description 랙에 장비 배치 API + */ + import client from "@/api/client"; +/** + * 장비 배치 요청 파라미터 + */ interface postPlaceEquipmentsRequest { startUnit: number; unitSize: number; } +/** + * 랙에 장비 배치 + * @param {number} rackId - 배치할 랙 ID + * @param {number} id - 배치할 장비 ID + * @param {postPlaceEquipmentsRequest} data - 배치 정보 (startUnit, unitSize) + * @returns 배치 결과 + */ export const postPlaceEquipments = async ( rackId: number, id: number, diff --git a/src/domains/serverView/rack/api/postRackEquipments.ts b/src/domains/serverView/rack/api/postRackEquipments.ts index f85f12d..66db070 100644 --- a/src/domains/serverView/rack/api/postRackEquipments.ts +++ b/src/domains/serverView/rack/api/postRackEquipments.ts @@ -1,6 +1,14 @@ +/** + * @author 구희원 + * @description 랙 장비 생성 API + */ + import client from "@/api/client"; import type { Equipments } from "../types"; +/** + * 장비 생성 요청 파라미터 + */ export type PostEquipmentRequest = Pick< Equipments, "equipmentName" | "equipmentType" | "startUnit" | "unitSize" | "status" @@ -8,12 +16,20 @@ export type PostEquipmentRequest = Pick< rackId: number; }; +/** + * 장비 생성 API 응답 + */ export interface PostEquipmentResponse { statusCode: number; message: string; data: Equipments; } +/** + * 랙 장비 생성 + * @param {PostEquipmentRequest} equipment - 생성할 장비 정보 + * @returns {Promise} 생성된 장비 정보 + */ export const postRackEquipment = async ( equipment: PostEquipmentRequest ): Promise => { diff --git a/src/domains/serverView/rack/api/updateRackEquipments.ts b/src/domains/serverView/rack/api/updateRackEquipments.ts index d967e20..5e98b50 100644 --- a/src/domains/serverView/rack/api/updateRackEquipments.ts +++ b/src/domains/serverView/rack/api/updateRackEquipments.ts @@ -1,6 +1,14 @@ +/** + * @author 구희원 + * @description 랙 장비 수정 API + */ + import client from "@/api/client"; import type { Equipments } from "../types"; +/** + * 장비 수정 요청 파라미터 + */ export type UpdateRackEquipmentRequest = Pick< Equipments, "equipmentName" | "equipmentType" | "startUnit" | "unitSize" | "status" @@ -8,6 +16,12 @@ export type UpdateRackEquipmentRequest = Pick< rackId: number; }; +/** + * 랙 장비 수정 + * @param {number} id - 수정할 장비 ID + * @param {UpdateRackEquipmentRequest} data - 수정할 장비 정보 + * @returns 수정된 장비 정보 + */ export const updateRackEquipments = async ( id: number, data: UpdateRackEquipmentRequest diff --git a/src/domains/serverView/rack/components/Button.tsx b/src/domains/serverView/rack/components/Button.tsx index f5699cf..aff443c 100644 --- a/src/domains/serverView/rack/components/Button.tsx +++ b/src/domains/serverView/rack/components/Button.tsx @@ -1,8 +1,25 @@ +/** + * @author 구희원 + * @description 뷰 전환 토글 버튼 컴포넌트 + */ + +/** + * 뷰 토글 버튼 props + */ interface ViewToggleButtonProps { label: string; onClick: () => void; active?: boolean; } + +/** + * 뷰 토글 버튼 + * @param {ViewToggleButtonProps} props - 버튼 속성 + * @param {string} props.label - 버튼 라벨 + * @param {() => void} props.onClick - 클릭 이벤트 핸들러 + * @param {boolean} props.active - 활성화 상태 (기본값: false) + * @returns 토글 버튼 컴포넌트 + */ function Button({ label, onClick, active = false }: ViewToggleButtonProps) { return (