From f6475d1a7d99c53e02afa1a3c050c90377465aad Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Sun, 5 Jul 2026 15:56:30 +0330 Subject: [PATCH] feat: improve error handling in API calls for blog, clinic, and doctor data retrieval --- app/blog/[slug]/page.js | 22 ++++++++++------------ app/clinic/[slug]/page.js | 22 ++++++++++------------ app/doctor/[slug]/page.js | 33 ++++++++++++++++++--------------- 3 files changed, 38 insertions(+), 39 deletions(-) diff --git a/app/blog/[slug]/page.js b/app/blog/[slug]/page.js index 319b753..d628544 100644 --- a/app/blog/[slug]/page.js +++ b/app/blog/[slug]/page.js @@ -12,16 +12,13 @@ const FALLBACK_IMG = "https://nobat724.com/assets/images/logo.png"; const API_URL = process.env.NEXT_PUBLIC_API_URL; const getBlog = cache(async (slug) => { - try { - const res = await fetch(`${API_URL}/api/v1/blog/${slug}`, { - next: { revalidate: 3600, tags: [`blog-${slug}`] }, - }); - if (!res.ok) return null; - const json = await res.json(); - return json?.data?.data ?? null; - } catch { - return null; - } + const res = await fetch(`${API_URL}/api/v1/blog/${slug}`, { + next: { revalidate: 3600, tags: [`blog-${slug}`] }, + }); + if (res.status === 404 || res.status === 400) return null; + if (!res.ok) throw new Error(`Failed to fetch blog: ${res.status}`); + const json = await res.json(); + return json?.data?.data ?? null; }); export async function generateMetadata({ params }) { @@ -29,9 +26,10 @@ export async function generateMetadata({ params }) { const { matchedCity } = await getStateInfo(); const siteName = matchedCity?.site_name || "نوبت 724"; + const blog = await getBlog(slug); + if (!blog) notFound(); + try { - const blog = await getBlog(slug); - if (!blog) return {}; const title = `${blog.title} | ${siteName}`; const rawText = (blog.summary || blog.body || "") diff --git a/app/clinic/[slug]/page.js b/app/clinic/[slug]/page.js index 87af869..a41118d 100644 --- a/app/clinic/[slug]/page.js +++ b/app/clinic/[slug]/page.js @@ -11,16 +11,13 @@ import { imageUrl } from "@/helper"; const API_URL = process.env.NEXT_PUBLIC_API_URL; const getClinic = cache(async (slug) => { - try { - const res = await fetch(`${API_URL}/api/v1/clinic/${slug}`, { - next: { revalidate: 3600, tags: [`clinic-${slug}`] }, - }); - if (!res.ok) return null; - const json = await res.json(); - return json?.data?.data ?? null; - } catch { - return null; - } + const res = await fetch(`${API_URL}/api/v1/clinic/${slug}`, { + next: { revalidate: 3600, tags: [`clinic-${slug}`] }, + }); + if (res.status === 404 || res.status === 400) return null; + if (!res.ok) throw new Error(`Failed to fetch clinic: ${res.status}`); + const json = await res.json(); + return json?.data?.data ?? null; }); export async function generateMetadata({ params }) { @@ -28,9 +25,10 @@ export async function generateMetadata({ params }) { const { matchedCity } = await getStateInfo(); const siteName = matchedCity?.site_name || "نوبت 724"; + const clinic = await getClinic(slug); + if (!clinic) notFound(); + try { - const clinic = await getClinic(slug); - if (!clinic) return {}; const title = `${clinic.title} | ${siteName}`; const description = `رزرو نوبت و اطلاعات ${clinic.title}. مشاهده لیست پزشکان و خدمات درمانی موجود.`; diff --git a/app/doctor/[slug]/page.js b/app/doctor/[slug]/page.js index 60527dc..57c274b 100644 --- a/app/doctor/[slug]/page.js +++ b/app/doctor/[slug]/page.js @@ -11,16 +11,13 @@ const API_URL = process.env.NEXT_PUBLIC_API_URL; const FALLBACK_IMG = "https://nobat724.com/assets/images/logo.png"; const getDoctor = cache(async (slug) => { - try { - const res = await fetch(`${API_URL}/api/v1/doctor/${slug}`, { - next: { revalidate: 3600, tags: [`doctor-${slug}`] }, - }); - if (!res.ok) return null; - const json = await res.json(); - return json?.data?.data ?? null; - } catch { - return null; - } + const res = await fetch(`${API_URL}/api/v1/doctor/${slug}`, { + next: { revalidate: 3600, tags: [`doctor-${slug}`] }, + }); + if (res.status === 404 || res.status === 400) return null; + if (!res.ok) throw new Error(`Failed to fetch doctor: ${res.status}`); + const json = await res.json(); + return json?.data?.data ?? null; }); const getDoctorAddresses = cache(async (doctorId) => { @@ -41,15 +38,21 @@ export async function generateMetadata({ params }) { const { matchedCity } = await getStateInfo(); const siteName = matchedCity?.site_name || "نوبت 724"; + const doctor = await getDoctor(slug); + if (!doctor) notFound(); + try { - const doctor = await getDoctor(slug); - if (!doctor) return {}; const specialtyNames = doctor.specialties?.map((s) => s.name).join(" و ") || ""; const title = `دکتر ${doctor.name}${specialtyNames ? " | " + specialtyNames : ""} | ${siteName}`; - const description = - doctor.detail || - `رزرو نوبت آنلاین دکتر ${doctor.name}${specialtyNames ? " متخصص " + specialtyNames : ""}${doctor.address ? " | " + doctor.address : ""}`.trim(); + const detailText = (doctor.detail || "") + .replace(/<[^>]*>/g, "") + .replace(/\s+/g, " ") + .trim(); + const description = ( + detailText || + `رزرو نوبت آنلاین دکتر ${doctor.name}${specialtyNames ? " متخصص " + specialtyNames : ""}${doctor.address ? " | " + doctor.address : ""}`.trim() + ).slice(0, 160); const image = imageUrl(doctor.img?.[0]?.url) || FALLBACK_IMG; return {