78 lines
2.4 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
import { prisma } from '@/libs/prisma'
import { type Suitable } from '@/types/Suitable'
export async function GET(request: NextRequest) {
try {
const searchParams = request.nextUrl.searchParams
const pageNumber = parseInt(searchParams.get('pageNumber') || '0')
const itemPerPage = parseInt(searchParams.get('itemPerPage') || '0')
if (pageNumber === 0 || itemPerPage === 0) {
return NextResponse.json({ error: '페이지 번호와 페이지당 아이템 수가 필요합니다' }, { status: 400 })
}
const category = searchParams.get('category')
const keyword = searchParams.get('keyword')
let query = `
SELECT
msm.id
, msm.product_name
, details.detail_cnt
, details.detail
FROM ms_suitable_main msm
LEFT JOIN (
SELECT
msd.main_id
, COUNT(msd.id) AS detail_cnt
, (
SELECT
msd_json.id
, msd_json.trestle_mfpc_cd
, msd_json.trestle_manufacturer_product_name
, msd_json.memo
FROM ms_suitable_detail msd_json
WHERE msd.main_id = msd_json.main_id
FOR JSON PATH
) AS detail
FROM ms_suitable_detail msd
GROUP BY msd.main_id
) AS details
ON msm.id = details.main_id
WHERE 1=1
--roofMtCd AND msm.roof_mt_cd IN (:roofMtCd)
--productName AND msm.product_name LIKE '%:productName%'
ORDER BY msm.product_name
OFFSET (@P1 - 1) * @P2 ROWS
FETCH NEXT @P2 ROWS ONLY;
`
// 검색 조건 설정
if (category) {
const roofMtQuery = `
SELECT roof_mt_cd
FROM ms_suitable_roof_material_group
WHERE roof_matl_grp_cd = ':roofMtGrpCd'
`
query = query.replace('--roofMtCd ', '')
query = query.replace(':roofMtCd', roofMtQuery.replace(':roofMtGrpCd', category))
}
if (keyword) {
query = query.replace('--productName ', '')
query = query.replace(':productName', keyword)
}
const suitable: Suitable[] = await prisma.$queryRawUnsafe(query, pageNumber, itemPerPage)
return NextResponse.json(suitable, {
headers: {
'spinner-state': 'true',
},
})
} catch (error) {
console.error('❌ 데이터 조회 중 오류가 발생했습니다:', error)
return NextResponse.json({ error: '데이터 조회 중 오류가 발생했습니다' }, { status: 500 })
}
}