diff --git a/.env.development b/.env.development index 506406f..1a372fa 100644 --- a/.env.development +++ b/.env.development @@ -10,8 +10,8 @@ NEXT_PUBLIC_QSP_API_URL=http://1.248.227.176:8120 NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080 #QPARTNER 로그인 api -#DB_HOST=202.218.61.226 -#DB_USER=readonly -#DB_PASSWORD=aAjmFW12iHKW84l1 -#DB_DATABASE=qpartners -#DB_PORT=3306 \ No newline at end of file +DB_HOST=202.218.61.226 +DB_USER=readonly +DB_PASSWORD=aAjmFW12iHKW84l1 +DB_DATABASE=qpartners +DB_PORT=3306 \ No newline at end of file diff --git a/.env.production b/.env.production index 67f32f2..4c39e83 100644 --- a/.env.production +++ b/.env.production @@ -8,8 +8,8 @@ NEXT_PUBLIC_QSP_API_URL=http://1.248.227.176:8120 NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080 #QPARTNER 로그인 api -#DB_HOST=202.218.61.226 -#DB_USER=readonly -#DB_PASSWORD=aAjmFW12iHKW84l1 -#DB_DATABASE=qpartners -#DB_PORT=3306 \ No newline at end of file +DB_HOST=202.218.61.226 +DB_USER=readonly +DB_PASSWORD=aAjmFW12iHKW84l1 +DB_DATABASE=qpartners +DB_PORT=3306 \ No newline at end of file diff --git a/src/app/api/auth/chg-pwd/route.ts b/src/app/api/auth/chg-pwd/route.ts index 436f101..71e9f6b 100644 --- a/src/app/api/auth/chg-pwd/route.ts +++ b/src/app/api/auth/chg-pwd/route.ts @@ -1,5 +1,4 @@ import { NextResponse } from 'next/server' - import { axiosInstance } from '@/libs/axios' export async function POST(req: Request) { diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts index 390f8d1..78f0a58 100644 --- a/src/app/api/auth/logout/route.ts +++ b/src/app/api/auth/logout/route.ts @@ -1,8 +1,8 @@ -import { sessionOptions } from '@/libs/session' -import { SessionData } from '@/types/Auth' -import { getIronSession } from 'iron-session' +import type { SessionData } from '@/types/Auth' import { cookies } from 'next/headers' import { NextResponse } from 'next/server' +import { getIronSession } from 'iron-session' +import { sessionOptions } from '@/libs/session' export async function GET(request: Request) { const cookieStore = await cookies() diff --git a/src/app/api/auth/route.ts b/src/app/api/auth/route.ts index 32ac8f9..c595ecd 100644 --- a/src/app/api/auth/route.ts +++ b/src/app/api/auth/route.ts @@ -1,12 +1,10 @@ +import type { SessionData } from '@/types/Auth' import { cookies } from 'next/headers' import { NextResponse } from 'next/server' - import { getIronSession } from 'iron-session' import { axiosInstance } from '@/libs/axios' import { sessionOptions } from '@/libs/session' -import type { SessionData } from '@/types/Auth' - export async function POST(request: Request) { const { loginId, pwd } = await request.json() @@ -14,7 +12,7 @@ export async function POST(request: Request) { loginId, pwd, }) - // console.log('🚀 ~ result ~ result:', result) + console.log('🚀 ~ result ~ result:', result.data) if (result.data.result.code === 200) { const cookieStore = await cookies() @@ -59,8 +57,6 @@ export async function POST(request: Request) { session.role = 'Admin_Sub' } else if (result.data.data.groupId === '70000' && result.data.data.builderNo !== null) { session.role = 'Builder' - } else if (result.data.data.groupId === '90000' && result.data.data.builderNo !== null) { - session.role = 'Partner' } else { session.role = 'User' } @@ -70,5 +66,50 @@ export async function POST(request: Request) { await session.save() } - return NextResponse.json({ code: 200, message: 'Login is Succecss!!', result: result.data.data }) + const resultForSession = { + LANG_CD: result.data.data.langCd, + CURR_PAGE: result.data.data.currPage, + ROW_COUNT: result.data.data.rowCount, + START_ROW: result.data.data.startRow, + END_ROW: result.data.data.endRow, + COMP_CD: result.data.data.compCd, + AGENCY_STORE_ID: result.data.data.agencyStoreId, + STORE_ID: result.data.data.storeId, + STORE_NM: result.data.data.storeNm, + USER_ID: result.data.data.userId, + CATEGORY: result.data.data.category, + USER_NM: result.data.data.userNm, + USER_NM_KANA: result.data.data.userNmKana, + TEL_NO: result.data.data.telNo, + FAX: result.data.data.fax, + EMAIL: result.data.data.email, + LAST_EDIT_USER: result.data.data.lastEditUser, + STORE_GUBUN: result.data.data.storeGubun, + PW_CURR: result.data.data.pwCurr, + PWD_INIT_YN: result.data.data.pwdInitYn, + APPR_STAT_CD: result.data.data.apprStatCd, + LOGIN_FAIL_CNT: result.data.data.loginFailCnt, + LOGIN_FAIL_MIN_YN: result.data.data.loginFailMinYn, + PRICE_VIEW_STAT_CD: result.data.data.priceViewStatCd, + GROUP_ID: result.data.data.groupId, + STORE_LVL: result.data.data.storeLvl, + CUST_CD: result.data.data.custCd, + BUILDER_NO: result.data.data.builderNo, + IS_LOGGED_IN: true, + ROLE: '', + } + + if (result.data.data.userId === 'T01') { + resultForSession.ROLE = 'T01' + } else if (result.data.data.groupId === '60000') { + resultForSession.ROLE = 'Admin' + } else if (result.data.data.groupId === '70000' && result.data.data.builderNo === null) { + resultForSession.ROLE = 'Admin_Sub' + } else if (result.data.data.groupId === '70000' && result.data.data.builderNo !== null) { + resultForSession.ROLE = 'Builder' + } else { + resultForSession.ROLE = 'User' + } + + return NextResponse.json({ code: 200, message: 'Login is Succecss!!', result: resultForSession }) } diff --git a/src/app/api/partner/route.ts b/src/app/api/partner/route.ts index 60b1540..7d02959 100644 --- a/src/app/api/partner/route.ts +++ b/src/app/api/partner/route.ts @@ -1,49 +1,131 @@ +import type { SessionData } from '@/types/Auth' import { NextResponse } from 'next/server' +import { cookies } from 'next/headers' +import { getIronSession } from 'iron-session' import executeQuery from '@/libs/partner' +import { sessionOptions } from '@/libs/session' -export async function GET(request: Request) { - // const sqls = `SELECT - // r.data_id, - // u.id AS user_id, - // u.login_id AS user_login_id, - // u.password AS user_password, - // u.user_name AS user_name, - // u.user_name_kana AS user_name_kana, - // u.sei AS user_sei, - // u.mei AS user_mei, - // u.sei_kana AS user_sei_kana, - // u.mei_kana AS user_mei_kana, - // u.user_tel AS user_tel, - // u.user_fax AS user_fax, - // u.status AS user_status, - // u.seko_id AS user_seko_id, - // u.seko_limit AS user_seko_limit, - // s.id AS supplier_id, - // s.code AS supplier_code, - // s.name AS supplier_name, - // s.name_kana AS supplier_name_kana, - // s.kind AS supplier_kind - // FROM - // R_DATA r - // JOIN - // M_USER u ON r.data_id = u.id - // JOIN - // M_SUPPLIER s ON r.relation_id = s.id - // WHERE - // u.status = '1' - // AND - // u.seko_id is not null - // AND - // u.seko_limit > now() - // AND - // s.kind = '4' - // AND - // u.login_id = ? - // AND - // u.password = ? - // ` - const sql = 'SELECT * FROM M_USER' - const data = await executeQuery(sql, []) - console.log('🚀 ~ GET ~ data:', data) - return NextResponse.json(data) +export async function POST(request: Request) { + const cookieStore = await cookies() + const session = await getIronSession(cookieStore, sessionOptions) + const { loginId, pwd } = await request.json() + + const sql = ` + SELECT + r.data_id, + u.id AS user_id, + u.login_id AS user_login_id, + u.password AS user_password, + u.user_name AS user_name, + u.user_name_kana AS user_name_kana, + u.sei AS user_sei, + u.mei AS user_mei, + u.sei_kana AS user_sei_kana, + u.mei_kana AS user_mei_kana, + u.user_tel AS user_tel, + u.user_fax AS user_fax, + u.status AS user_status, + u.seko_id AS user_seko_id, + u.seko_limit AS user_seko_limit, + s.id AS supplier_id, + s.code AS supplier_code, + s.name AS supplier_name, + s.name_kana AS supplier_name_kana, + s.kind AS supplier_kind + FROM + R_DATA r + JOIN + M_USER u ON r.data_id = u.id + JOIN + M_SUPPLIER s ON r.relation_id = s.id + WHERE + u.status = '1' + AND + u.seko_id is not null + AND + u.seko_limit > now() + AND + s.kind = '4' + AND + u.login_id = ? + AND + u.password = ? + ` + // const sql = 'SELECT * FROM M_USER' + const data = (await executeQuery(sql, [loginId, pwd])) as any[] + console.log('🚀 ~ POST ~ data:', data) + + if (data.length > 0) { + console.log('start session edit!') + session.langCd = null + session.currPage = null + session.rowCount = null + session.startRow = null + session.endRow = null + session.compCd = null + session.agencyStoreId = null + session.storeId = data[0].supplier_code + session.storeNm = data[0].supplier_name + session.userId = data[0].user_login_id + session.category = data[0].supplier_name + session.userNm = `${data[0].user_sei} ${data[0].user_mei}` + session.userNmKana = `${data[0].user_sei_kana} ${data[0].user_mei_kana}` + session.telNo = data[0].tel + session.fax = data[0].fax + session.email = data[0].user_login_id + session.lastEditUser = null + session.storeGubun = null + session.pwCurr = null + session.pwdInitYn = null + session.apprStatCd = null + session.loginFailCnt = null + session.loginFailMinYn = null + session.priceViewStatCd = null + session.groupId = null + session.storeLvl = null + session.custCd = null + session.builderNo = data[0].user_seko_id + session.isLoggedIn = true + session.role = 'Partner' + + console.log('end session edit!') + + await session.save() + } + + // qsp 유저 데이터 모양과 맞춰서 변환 + const result = { + LANG_CD: null, + CURR_PAGE: null, + ROW_COUNT: null, + START_ROW: null, + END_ROW: null, + COMP_CD: null, + AGENCY_STORE_ID: null, + STORE_ID: data[0].supplier_code, + STORE_NM: data[0].supplier_name, + USER_ID: data[0].user_login_id, + CATEGORY: data[0].supplier_name, + USER_NM: `${data[0].user_sei} ${data[0].user_mei}`, + USER_NM_KANA: `${data[0].user_sei_kana} ${data[0].user_mei_kana}`, + TEL_NO: data[0].tel, + FAX: data[0].fax, + EMAIL: data[0].user_login_id, + LAST_EDIT_USER: null, + STORE_GUBUN: null, + PW_CURR: null, + PWD_INIT_YN: null, + APPR_STAT_CD: null, + LOGIN_FAIL_CNT: null, + LOGIN_FAIL_MIN_YN: null, + PRICE_VIEW_STAT_CD: null, + GROUP_ID: null, + STORE_LVL: null, + CUST_CD: null, + BUILDER_NO: data[0].user_seko_id, + IS_LOGGED_IN: true, + ROLE: 'Partner', + } + + return NextResponse.json({ code: 200, message: 'Partner Login is Succecss!!', result }) } diff --git a/src/components/Login.tsx b/src/components/Login.tsx index 5f086af..24b7219 100644 --- a/src/components/Login.tsx +++ b/src/components/Login.tsx @@ -3,10 +3,8 @@ import type { SessionData } from '@/types/Auth' import { useEffect, useReducer, useState } from 'react' import { useRouter } from 'next/navigation' - import { useLocalStorage } from 'usehooks-ts' import { useQuery } from '@tanstack/react-query' - import { axiosInstance } from '@/libs/axios' import { useSessionStore } from '@/store/session' @@ -48,7 +46,14 @@ export default function Login() { } = useQuery({ queryKey: ['login', 'account'], queryFn: async () => { - const { data } = await axiosInstance('').post(`/api/auth`, { + let url = '' + if (!isPartners) { + url = '/api/auth' + } else { + url = '/api/partner' + } + + const { data } = await axiosInstance('').post(`${url}`, { loginId: account.loginId, pwd: account.pwd, }) @@ -68,6 +73,7 @@ export default function Login() { indivisualData: account.pwd, }) // 세션 정보 저장 + console.log('🚀 ~ Login ~ loginData:', loginData) setSession({ ...session, ...loginData?.result, diff --git a/src/components/popup/MemberInformationPopup.tsx b/src/components/popup/MemberInformationPopup.tsx index 87a8829..8cf0bae 100644 --- a/src/components/popup/MemberInformationPopup.tsx +++ b/src/components/popup/MemberInformationPopup.tsx @@ -57,9 +57,11 @@ export default function MemberInformationPopup() { - + {session.role !== 'Partner' && ( + + )} diff --git a/src/components/ui/common/Header.tsx b/src/components/ui/common/Header.tsx index da3cf49..3a2ca15 100644 --- a/src/components/ui/common/Header.tsx +++ b/src/components/ui/common/Header.tsx @@ -114,9 +114,11 @@ export default function Header() {
  • -
  • - -
  • + {session.role !== 'Partner' && ( +
  • + +
  • + )}
    diff --git a/src/libs/axios.ts b/src/libs/axios.ts index a5d355c..15127ec 100644 --- a/src/libs/axios.ts +++ b/src/libs/axios.ts @@ -75,8 +75,19 @@ export const transformObjectKeys = (obj: any): any => { if (obj !== null && typeof obj === 'object') { return Object.keys(obj).reduce((acc: any, key: string) => { - const camelKey = snakeToCamel(key) - acc[camelKey] = transformObjectKeys(obj[key]) + let transformedKey = key + + // Handle uppercase snake_case (e.g., USER_NAME -> userName) + if (/^[A-Z_]+$/.test(key)) { + transformedKey = snakeToCamel(key) + } + // Handle single uppercase word (e.g., ROLE -> role) + else if (/^[A-Z]+$/.test(key)) { + transformedKey = key.toLowerCase() + } + // Preserve existing camelCase + + acc[transformedKey] = transformObjectKeys(obj[key]) return acc }, {}) } diff --git a/src/providers/EdgeProvider.tsx b/src/providers/EdgeProvider.tsx index ed2d329..de3c00f 100644 --- a/src/providers/EdgeProvider.tsx +++ b/src/providers/EdgeProvider.tsx @@ -1,7 +1,7 @@ 'use client' import { useEffect } from 'react' -import { usePathname } from 'next/navigation' +import { usePathname, useRouter } from 'next/navigation' import { useHeaderStore } from '@/store/header' import { usePopupController } from '@/store/popupController' @@ -22,12 +22,19 @@ interface EdgeProviderProps { } export default function EdgeProvider({ children, sessionData }: EdgeProviderProps) { + const router = useRouter() const pathname = usePathname() const { setBackBtn } = useHeaderStore() const { reset } = useSideNavState() const { setAlertMsg, setAlertBtn, setAlert, setAlert2, setAlert2BtnYes, setAlert2BtnNo } = usePopupController() const { session, setSession } = useSessionStore() + if (pathname === '/login') { + if (session?.isLoggedIn) { + router.push('/') + } + } + /** * 사용자 이벤트 트래킹 처리 *