مرور کلی
GraphPress یک بکاند بلاگ است که ترکیب GraphQL برای خواندن/نوشتن غنی با REST برای آپلود فایل را در یک اپ Express نشان میدهد. نویسندگان با JWT ثبتنام و ورود میکنند، مقاله با slug و کاور پیشنویس و منتشر میکنند، دسته و تگ مدیریت میکنند، کامنت تو در تو با moderation دریافت میکنند و لایک و بوکمارک را پیگیری میکنند—همه از schema تایپشده GraphQL با صفحهبندی. فرانت Bootstrap استاتیک در همان ریپو برای دمو: فید خانه، صفحه مقاله، ورود، داشبورد نویسنده، آپلود، GraphiQL و playground اختصاصی.
چالش
تیمهایی که GraphQL یاد میگیرند اغلب schema اسباببازی بدون auth واقعی، فایل و RBAC میبینند. کارفرمای بکاند بلاگ یا CMS به مرجع باورپذیر نیاز دارد: API هیبرید—GraphQL برای گراف داده، REST برای multipart—بههمراه JWT، قوانین پیشنویس، moderation کامنت و seed برای دموی فوری بدون setup دستی دیتابیس.
رویکرد
اپ Node.js لایهبندیشده: مدل Mongoose برای user، article، category، tag، comment، like و bookmark؛ schema SDL با enum وضعیت مقاله و کامنت؛ resolver ماژولار؛ services برای منطق؛ middleware JWT و context.user در GraphQL. آپلود فایل در REST با Multer و سرو استاتیک زیر /uploads. اسکریپت seed دیتابیس را reset و ۳۰ کاربر، ۳۰ مقاله، ۴۰ کامنت، لایک و بوکمارک بارگذاری میکند. UI Bootstrap عمومی همان APIای را صدا میزند که کلاینت واقعی استفاده میکند.
معماری
ورود در server.js: CORS، JSON، static برای public/ و uploads/، graphqlHTTP در /graphql با graphiql و context.user از resolveUser. Schema در graphql/schema.js؛ resolverها در graphql/resolvers/. مدلها از mongoose-paginate-v2. مسیر آپلود در routes/upload.js با auth. utils برای JWT، bcrypt، slugify و نقش. seed در database/seed/؛ import در scripts/import-collections.js.
مصالحهها
express-graphql و buildSchema بهجای Apollo Server—سبکتر برای یادگیری، ابزار کمتر برای subscription و dataloader. تست خودکار هنوز نیست. فرانت HTML/JS برای سرعت دمو، نه Next.js تولید (در roadmap). CRUD در GraphQL بهجز آپلود که عمداً REST مانده.
نتایج
API بلاگ قابل اجرا با RBAC (admin moderation؛ author پیشنویس خود؛ user کامنت/لایک/بوکمارک)، کوئری صفحهبندیشده، پاسخ تو در تو کامنت، شمارش بازدید و آپلود REST. توسعهدهنده با GraphiQL یا playground، اکانت seed و داشبورد publish را امتحان میکند—artifact قوی برای pitch بکاند GraphQL و API هیبرید.
درسهای آموختهشده
resolve یکبار JWT در context هر درخواست GraphQL resolverها را تمیز نگه میدارد. آپلود در REST پیچیدگی multipart GraphQL را حذف میکند و URL برای mutation برمیگرداند. نوع Paginate جدا per entity در schema یادگیری صریحتر از generic است. seed داده relational واقعی دموی GraphiQL را فوراً باورپذیر میکند.