diff --git a/src/app/api/seminar/all/route.tsx b/src/app/api/seminar/all/route.tsx new file mode 100644 index 0000000..7cdc3ee --- /dev/null +++ b/src/app/api/seminar/all/route.tsx @@ -0,0 +1,52 @@ +import { Client } from '@notionhq/client'; +import { NextRequest } from 'next/server'; + +const notion = new Client({ + auth: process.env.NOTION_SECRET_KEY, +}); + +// seminar 데이터 query select, 오름차순 +async function queryAllSeminarData(databaseId: string): Promise { + try { + const response = await notion.databases.query({ + database_id: databaseId, + sorts: [ + { + property: 'Date', + direction: 'ascending' + } + ] + }); + + return response.results; + } catch (error) { + console.error('Error querying Notion database and fetching member data:', JSON.stringify(error)); + throw error; + } +} + +type Data = { + items?: any[]; + message: string; +}; + +export async function GET(req: NextRequest) { + const databaseId = process.env.NOTION_SEMINAR_DATABASE_ID || ''; + + try { + const data = await queryAllSeminarData(databaseId); + return new Response(JSON.stringify({ data, message: 'Success' }), { + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }); + } catch (error) { + return new Response(JSON.stringify({ message: `Failed: ${error?.toString()}` }), { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }); + } +} \ No newline at end of file diff --git a/src/app/seminar/[id]/page.tsx b/src/app/seminar/[id]/page.tsx index fc6fb59..8c58124 100644 --- a/src/app/seminar/[id]/page.tsx +++ b/src/app/seminar/[id]/page.tsx @@ -13,12 +13,18 @@ const SeminarDetailPage = async () => { const header = headers(); const pathname = header.get('next-url') - const seminarId = changePathtoSeperate(pathname ?? ''); + const seminarId = changePathtoSeperate(pathname ?? '', 'seminar'); - // seminar data 정의 - const seminarResponse = await fetch('http://localhost:3001/api/seminar'); + // all seminar data 정의 + const seminarResponse = await fetch(`http://localhost:3001/api/seminar/all`); const seminarList = await seminarResponse.json(); const seminars = refactorSeminarData(seminarList.data ?? []); + // 세미나 디테일 데이터로 분리 + let seminar = seminars.find(seminar => `${seminar.id}` === `${seminarId}`); + + if(!seminar) { + return ; + } // reviews 데이터 정의 const seminarReviewResponse = await fetch(`http://localhost:3001/api/seminar/review?seminarId=${seminarId}`); @@ -28,14 +34,7 @@ const SeminarDetailPage = async () => { // member 데이터 정의 const memberResponse = await fetch(`http://localhost:3001/api/member?seminarId=${seminarId}`); const memberList = await memberResponse.json(); - const member = refactorSeminarMemberData(memberList.data[0] ?? SEMINAR_MEMBER_DATA); - - // 세미나 디테일 데이터로 분리 - const seminar = seminars.find(seminar => `${seminar.id}` === `${seminarId}`); - // 오픈 세미나 데이터 - if (!seminar) { - return ; - } + const member = refactorSeminarMemberData(memberList.data[0] ?? SEMINAR_MEMBER_DATA, seminar.id); return
diff --git a/src/components/seminar/seminarDetail/header/SeminarDetailHeader.tsx b/src/components/seminar/seminarDetail/header/SeminarDetailHeader.tsx index 47ff9a5..7016819 100644 --- a/src/components/seminar/seminarDetail/header/SeminarDetailHeader.tsx +++ b/src/components/seminar/seminarDetail/header/SeminarDetailHeader.tsx @@ -2,7 +2,6 @@ import { SeminarThumbnail } from '@/interfaces/seminar/seminarThumbnail'; import React, { useState } from 'react'; -import BannerImg from '@/svg/seminar/seminar_banner.svg'; /** * @description diff --git a/src/components/seminar/thumbnail/SeminarThumbnailList.tsx b/src/components/seminar/thumbnail/SeminarThumbnailList.tsx index 30b0f20..f07c978 100644 --- a/src/components/seminar/thumbnail/SeminarThumbnailList.tsx +++ b/src/components/seminar/thumbnail/SeminarThumbnailList.tsx @@ -23,13 +23,13 @@ import SeminarMenuBar from '../menubar/SeminarMenuBar'; * @returns The rendered header component. */ -const SeminarThumbnailList = ({ seminar }: { seminar:SeminarThumbnail[] }) => { +const SeminarThumbnailList = ({ seminars }: { seminars:SeminarThumbnail[] }) => { const [currentPage, setCurrentPage] = useState(1); const [selectedCategory, setSelectedCategory] = useState('all'); const itemsPerPage = 12; // 한 페이지당 표시할 항목 수 // topic으로 데이터 필터링 - const filteredData = selectedCategory !== "all" ? seminar.filter(seminar => seminar.topic === selectedCategory) : seminar; + const filteredData = selectedCategory !== "all" ? seminars.filter(seminar => seminar.topic === selectedCategory) : seminars; // 페이지네이션 const indexOfLastItem = currentPage * itemsPerPage; diff --git a/src/components/seminar/toggle/SeminarToggle.tsx b/src/components/seminar/toggle/SeminarToggle.tsx index 39824ea..493ee4b 100644 --- a/src/components/seminar/toggle/SeminarToggle.tsx +++ b/src/components/seminar/toggle/SeminarToggle.tsx @@ -3,10 +3,10 @@ import React, { useState } from 'react'; import SeminarToggleMenu from './SeminarToggleMenu'; import ChervonDownIcon from '@/svg/icons/common/chervon_down.svg'; -import { OPEN_SEMINAR_DATA } from '@/constants/seminar/openSeminarData'; import { motion } from 'framer-motion'; import Link from 'next/link'; import { toggleVariants } from '@/constants/seminar/seminarToggleVariants'; +import { OpenSeminar } from '@/interfaces/seminar/openSeminar'; /** * @description @@ -20,7 +20,7 @@ import { toggleVariants } from '@/constants/seminar/seminarToggleVariants'; * @returns The rendered header component. */ -const SeminarToggle = () => { +const SeminarToggle = ({openSeminars}:{openSeminars:OpenSeminar[]}) => { const [isMenuVisible, setIsMenuVisible] = useState(false); // 오픈 세미나 목록 토클 버튼 const toggleMenuVisibility = () => { setIsMenuVisible(!isMenuVisible); @@ -47,14 +47,14 @@ const SeminarToggle = () => { className={isMenuVisible ? "" : "overflow-hidden"} >
- {OPEN_SEMINAR_DATA.map((seminar) => ( + {openSeminars.map((seminar) => ( ))} diff --git a/src/components/seminar/toggle/SeminarToggleMenu.tsx b/src/components/seminar/toggle/SeminarToggleMenu.tsx index 6eeaa4d..a88f141 100644 --- a/src/components/seminar/toggle/SeminarToggleMenu.tsx +++ b/src/components/seminar/toggle/SeminarToggleMenu.tsx @@ -14,11 +14,11 @@ import { motion } from 'framer-motion'; * @returns The rendered header component. */ -const SeminarToggleMenu = ({data}: {data:OpenSeminar}) => { +const SeminarToggleMenu = ({openSeminar}: {openSeminar:OpenSeminar}) => { return (
{
-

{data.seminar_month_date}{" "}{data.type}

-

{data.seminar_opening_date}

+

{openSeminar.title}{" "}{openSeminar.type}

+

{openSeminar.date}

-

- {data.status === false ? "종료" : "진행중"} +

+ {openSeminar.status === false ? "종료" : "모집중"}