From 713928e7947602142c2853abb8894a39d28634ea Mon Sep 17 00:00:00 2001 From: bicochan Date: Thu, 31 Jul 2025 10:37:47 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[apps/cs]=20refactor:=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/common/components/src/ui/lnb/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/common/components/src/ui/lnb/index.tsx b/packages/common/components/src/ui/lnb/index.tsx index d7fabd39b..dee4356f6 100644 --- a/packages/common/components/src/ui/lnb/index.tsx +++ b/packages/common/components/src/ui/lnb/index.tsx @@ -67,7 +67,7 @@ export function LNB({ const { data: previewTreeMenuListData } = useQuery({ queryKey: [ENDPOINT.CMS_SERVICE.MENUS, siteId, "preview"], queryFn: () => getPreviewTreeMenuList(siteId), - enabled: isLoggedIn && previewMode, + enabled: isLoggedIn && !!previewMode, }); const { data: anonymousMenuListData } = useQuery({ From 26f222525d8a671e0ddcac0729c893e575da07b3 Mon Sep 17 00:00:00 2001 From: bicochan Date: Thu, 31 Jul 2025 11:48:27 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[apps/cs]=20refactor:=20=EC=A0=91=EC=86=8D?= =?UTF-8?q?=20=EB=A1=9C=EA=B7=B8=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/app/index.tsx | 2 +- apps/cs/src/app/providers/index.ts | 1 - .../api/connection-log-service.ts | 20 +++++++++++++++---- apps/cs/src/entities/connection-log/index.ts | 6 ++++++ .../model/connection-log-interface.ts | 20 +++++++++++++++++-- .../pages/user-statistics/model/chart-data.ts | 2 +- .../user-statistics/model/table-columns.ts | 2 +- .../ui/user-statistics-page.tsx | 8 +++++--- 8 files changed, 48 insertions(+), 13 deletions(-) delete mode 100644 apps/cs/src/app/providers/index.ts rename apps/cs/src/{pages/user-statistics => entities/connection-log}/api/connection-log-service.ts (63%) create mode 100644 apps/cs/src/entities/connection-log/index.ts rename apps/cs/src/{pages/user-statistics => entities/connection-log}/model/connection-log-interface.ts (74%) diff --git a/apps/cs/src/app/index.tsx b/apps/cs/src/app/index.tsx index 692b55ef0..6ba1e325a 100644 --- a/apps/cs/src/app/index.tsx +++ b/apps/cs/src/app/index.tsx @@ -2,8 +2,8 @@ import "./styles/base.css"; import "./styles/components.css"; import "@fontsource-variable/noto-sans-kr"; -import { AppProvider } from "./providers"; import { cookies } from "next/headers"; +import { AppProvider } from "./providers/app-provider"; const App = async ({ children }: Readonly<{ children: React.ReactNode }>) => { const theme = (await cookies()).get("site-theme-key"); diff --git a/apps/cs/src/app/providers/index.ts b/apps/cs/src/app/providers/index.ts deleted file mode 100644 index 15f99b7fd..000000000 --- a/apps/cs/src/app/providers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { AppProvider } from "./app-provider"; diff --git a/apps/cs/src/pages/user-statistics/api/connection-log-service.ts b/apps/cs/src/entities/connection-log/api/connection-log-service.ts similarity index 63% rename from apps/cs/src/pages/user-statistics/api/connection-log-service.ts rename to apps/cs/src/entities/connection-log/api/connection-log-service.ts index 0e2daeb5b..0b4cc55ad 100644 --- a/apps/cs/src/pages/user-statistics/api/connection-log-service.ts +++ b/apps/cs/src/entities/connection-log/api/connection-log-service.ts @@ -2,17 +2,19 @@ import { client } from "@/shared/api"; import { ENDPOINT } from "@/shared/config"; import { type ConnectionLogParams, - type ConnectionLogList, type ConnectionStatisticsParams, type ConnectionStatistics, type ConnectionLogService, + type ConnectionLogPageList, + type ConnectionLogPayload, + type ConnectionLog, } from "../model/connection-log-interface"; class ConnectionLogApiService implements ConnectionLogService { - async getConnectionLog( + async getConnectionLogPage( params: ConnectionLogParams, - ): Promise { - const response = await client.get( + ): Promise { + const response = await client.get( `${ENDPOINT.CMS_SERVICE.CONNECTION_LOG}`, { params }, ); @@ -28,6 +30,16 @@ class ConnectionLogApiService implements ConnectionLogService { ); return response.data; } + + async saveConnectionLog( + payload: ConnectionLogPayload, + ): Promise { + const response = await client.post( + `${ENDPOINT.CMS_SERVICE.CONNECTION_LOG}`, + payload, + ); + return response.data; + } } export const ConnectionLogApi = new ConnectionLogApiService(); diff --git a/apps/cs/src/entities/connection-log/index.ts b/apps/cs/src/entities/connection-log/index.ts new file mode 100644 index 000000000..d9c61a988 --- /dev/null +++ b/apps/cs/src/entities/connection-log/index.ts @@ -0,0 +1,6 @@ +export { ConnectionLogApi } from "./api/connection-log-service"; +export type { + ConnectionLog, + ConnectionStatistics, + ConnectionStatisticsParams, +} from "./model/connection-log-interface"; diff --git a/apps/cs/src/pages/user-statistics/model/connection-log-interface.ts b/apps/cs/src/entities/connection-log/model/connection-log-interface.ts similarity index 74% rename from apps/cs/src/pages/user-statistics/model/connection-log-interface.ts rename to apps/cs/src/entities/connection-log/model/connection-log-interface.ts index 6fbf4dc15..aed70873f 100644 --- a/apps/cs/src/pages/user-statistics/model/connection-log-interface.ts +++ b/apps/cs/src/entities/connection-log/model/connection-log-interface.ts @@ -22,11 +22,24 @@ export interface ConnectionLog { menuCd: number; siteId: string; urlPath: string; +} + +export interface ConnectionLogList extends ConnectionLog { siteNm: string; menuNm: string; wbsrKndNm: string; } +export interface ConnectionLogPayload { + cntnId?: string; + cntnIp?: string; + cntnRgn?: string; + wbsrKnd?: string; + menuCd?: number; + siteId?: string; + urlPath: string; +} + export interface ConnectionStatisticsParams { keywordType?: string; keyword?: string; @@ -62,11 +75,14 @@ export interface ConnectionStatistics { browserList: BrowserConnectionStatistics[]; } -export type ConnectionLogList = PageableList; +export type ConnectionLogPageList = PageableList; export interface ConnectionLogService { - getConnectionLog(params: ConnectionLogParams): Promise; + getConnectionLogPage( + params: ConnectionLogParams, + ): Promise; getConnectionStatistics( params: ConnectionStatisticsParams, ): Promise; + saveConnectionLog(payload: ConnectionLogPayload): Promise; } diff --git a/apps/cs/src/pages/user-statistics/model/chart-data.ts b/apps/cs/src/pages/user-statistics/model/chart-data.ts index 455dcac56..87a5322c1 100644 --- a/apps/cs/src/pages/user-statistics/model/chart-data.ts +++ b/apps/cs/src/pages/user-statistics/model/chart-data.ts @@ -1,6 +1,6 @@ import type { ChartData, ChartOptions } from "chart.js"; import { getCssVariableValue } from "@common/components"; -import type { ConnectionStatistics } from "./connection-log-interface"; +import type { ConnectionStatistics } from "@/entities/connection-log"; export const chartData = { day: ( diff --git a/apps/cs/src/pages/user-statistics/model/table-columns.ts b/apps/cs/src/pages/user-statistics/model/table-columns.ts index 09fe58adf..8530345d3 100644 --- a/apps/cs/src/pages/user-statistics/model/table-columns.ts +++ b/apps/cs/src/pages/user-statistics/model/table-columns.ts @@ -1,5 +1,5 @@ import type { ColumnDef } from "@tanstack/react-table"; -import type { ConnectionLog } from "./connection-log-interface"; +import type { ConnectionLog } from "@/entities/connection-log"; import dayjs from "dayjs"; export const columns: ColumnDef[] = [ diff --git a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx index 801ca5eb0..9ddfdd124 100644 --- a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx +++ b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx @@ -27,15 +27,17 @@ import { SelectTrigger, SelectValue, } from "@common/components"; +import { + ConnectionLogApi, + type ConnectionStatisticsParams, +} from "@/entities/connection-log"; import { SiteSelect } from "@/entities/site"; import { useDataTable } from "@/shared/lib"; import { ENDPOINT } from "@/shared/config"; import { NoData } from "@/shared/ui/no-data"; import { InputDateRangePicker } from "@/shared/ui/input-date-range-picker"; -import { ConnectionLogApi } from "../api/connection-log-service"; import { chartData } from "../model/chart-data"; import { columns } from "../model/table-columns"; -import type { ConnectionStatisticsParams } from "../model/connection-log-interface"; ChartJS.register( CategoryScale, @@ -80,7 +82,7 @@ function UserStatisticsPage() { const query = useQuery({ queryKey: [ENDPOINT.CMS_SERVICE.CONNECTION_LOG, searchParams], queryFn: () => - ConnectionLogApi.getConnectionLog({ + ConnectionLogApi.getConnectionLogPage({ ...searchParams, }), placeholderData: keepPreviousData, From 3f85aa676c722d92b4d34cd4e368d857aa666e41 Mon Sep 17 00:00:00 2001 From: bicochan Date: Thu, 31 Jul 2025 12:45:01 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[common/components]=20feat:=20=EC=A0=91?= =?UTF-8?q?=EC=86=8D=20=EB=A1=9C=EA=B7=B8=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/src/api/connection-log.ts | 34 +++++++++++++++++++ packages/common/components/src/api/index.ts | 1 + packages/common/components/src/config/api.ts | 1 + .../common/components/src/ui/lnb/index.tsx | 15 +++++++- 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 packages/common/components/src/api/connection-log.ts diff --git a/packages/common/components/src/api/connection-log.ts b/packages/common/components/src/api/connection-log.ts new file mode 100644 index 000000000..b421b7cb3 --- /dev/null +++ b/packages/common/components/src/api/connection-log.ts @@ -0,0 +1,34 @@ +import { ENDPOINT } from "../config"; +import { getApiClient } from "./client"; + +export interface ConnectionLog { + cntnSn: number; + cntnDt: string; + cntnId: string; + cntnIp: string; + cntnRgn: string; + wbsrKnd: string; + menuCd: number; + siteId: string; + urlPath: string; +} + +export interface ConnectionLogPayload { + cntnId?: string; + cntnIp?: string; + cntnRgn?: string; + wbsrKnd?: string; + menuCd?: number | null; + siteId?: string; + urlPath: string; +} + +const client = getApiClient(); + +export const saveConnectionLog = async (payload: ConnectionLogPayload) => { + const response = await client.post( + `${ENDPOINT.CMS_SERVICE.CONNECTION_LOG}`, + payload, + ); + return response.data; +}; diff --git a/packages/common/components/src/api/index.ts b/packages/common/components/src/api/index.ts index 10d68732c..d569765c2 100644 --- a/packages/common/components/src/api/index.ts +++ b/packages/common/components/src/api/index.ts @@ -1,4 +1,5 @@ export * from "./client"; +export * from "./connection-log"; export * from "./menu"; export * from "./popup"; export * from "./site"; diff --git a/packages/common/components/src/config/api.ts b/packages/common/components/src/config/api.ts index 6772182fb..a12ff5887 100644 --- a/packages/common/components/src/config/api.ts +++ b/packages/common/components/src/config/api.ts @@ -6,6 +6,7 @@ export const ENDPOINT = { SITES: "/cms-service/api/v1/sites", POPUPS: "/cms-service/api/v1/popups", IPS: "/cms-service/api/v1/site-ips", + CONNECTION_LOG: "/cms-service/api/v1/cntnlog", }, USER_SERVICE: { USERS: "/user-service/api/v1/users", diff --git a/packages/common/components/src/ui/lnb/index.tsx b/packages/common/components/src/ui/lnb/index.tsx index dee4356f6..8e3c2aebf 100644 --- a/packages/common/components/src/ui/lnb/index.tsx +++ b/packages/common/components/src/ui/lnb/index.tsx @@ -3,6 +3,7 @@ import { useState, useEffect, useRef } from "react"; import { useQuery } from "@tanstack/react-query"; import { ChevronRight } from "lucide-react"; +import { useDetectDevice } from "@frontend-opensource/use-react-hooks"; import { getConfig } from "@common/config"; import { getParentIds } from "./lib"; import { @@ -24,9 +25,10 @@ import { import { ENDPOINT } from "../../config"; import { cn, getCookie, setCookie } from "../../lib"; import { - getAnonymouseMenuList, getMenuList, getPreviewTreeMenuList, + getAnonymouseMenuList, + saveConnectionLog, type MenuItem, } from "../../api"; @@ -55,6 +57,7 @@ export function LNB({ const [defaultOpenMenuIds, setDefaultOpenMenuIds] = useState([]); const [currentMenuCode, setCurrentMenuCode] = useState(null); const prevPathRef = useRef(currentPath); + const { browser } = useDetectDevice(); const siteId = propSiteId ?? appSiteId; @@ -125,6 +128,16 @@ export function LNB({ } if (matchedMenuCode) setCurrentMenuCode(matchedMenuCode); + + // 접속 로그 저장 + saveConnectionLog({ + cntnId: userId, + cntnRgn: navigator.language, + wbsrKnd: browser, + menuCd: matchedMenuCode, + siteId, + urlPath: currentPath, + }); }, [menuList, currentPath]); function MenuItem({ From 8bb3253aa585a40f23e040fbe2c632a067f9bd73 Mon Sep 17 00:00:00 2001 From: bicochan Date: Thu, 31 Jul 2025 12:45:27 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[apps/cs]=20chore:=20=EC=A0=91=EC=86=8D?= =?UTF-8?q?=EC=9E=90=20=ED=86=B5=EA=B3=84=20=ED=85=8C=EC=9D=B4=EB=B8=94=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx index 9ddfdd124..b4c821551 100644 --- a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx +++ b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx @@ -80,10 +80,12 @@ function UserStatisticsPage() { }); const query = useQuery({ - queryKey: [ENDPOINT.CMS_SERVICE.CONNECTION_LOG, searchParams], + queryKey: [ENDPOINT.CMS_SERVICE.CONNECTION_LOG, searchParams, pagination], queryFn: () => ConnectionLogApi.getConnectionLogPage({ ...searchParams, + page: pagination.pageIndex, + size: pagination.pageSize, }), placeholderData: keepPreviousData, });