Skip to content

কন্টেন্ট ম্যানেজমেন্ট

কালেকশন, এন্ট্রি, লোকেল এবং রিলিজ সহ একটি হেডলেস CMS। Content প্যানেল বা SDK থেকে কন্টেন্ট পরিচালনা করুন।

Proyecta-তে একটি পূর্ণাঙ্গ হেডলেস CMS রয়েছে। এটি schema-first: তুমি কালেকশন (কাঠামোবদ্ধ কন্টেন্ট টাইপ) সংজ্ঞায়িত করো, তারপর প্রতিটি কালেকশনের ফিল্ড অনুযায়ী এন্ট্রি তৈরি করো। এন্ট্রিগুলো লোকালাইজ করা যায় এবং রিলিজে গ্রুপ করা যায়।

SDK ব্যবহার করে বা AI-কে জিজ্ঞেস করে কন্টেন্ট পরিচালনা করা যায়। Content API-তে ছয়টি রিসোর্স টাইপ রয়েছে:

ট্যাব / রিসোর্সকী কাজে লাগে
Collectionsকন্টেন্ট schema সংজ্ঞায়িত ও পরিচালনা করা (যেমন, “Blog Post”, “FAQ”, “Product Spec”)
Fieldsএকটি কালেকশনের মধ্যে টাইপ করা স্লট (Collections-এর সাব-রিসোর্স হিসেবে পরিচালিত)
Entriesএকটি কালেকশনের মধ্যে এন্ট্রি ব্রাউজ, তৈরি, সম্পাদনা, publish এবং মুছে ফেলা
Localesঅনুবাদ করা কন্টেন্টের জন্য ভাষা/অঞ্চল লোকেল যোগ ও পরিচালনা করা
Releasesএন্ট্রিগুলো একসাথে live করা (বা unpublish করা) — releases.publish() দিয়ে ম্যানুয়ালি publish করা
Assetsমিডিয়া ফাইল (ছবি, ভিডিও, PDF) আপলোড ও পরিচালনা করা যা এন্ট্রি থেকে রেফারেন্স করা যায়

কালেকশনের এন্ট্রিতে যেতে Collections ট্যাবে একটি কালেকশনে ক্লিক করো। Entries ট্যাব থেকে পৃথক কন্টেন্ট আইটেম তৈরি, সম্পাদনা, publish এবং মুছে ফেলা যায়।

SDK (proyecta.content) ব্যবহার করে প্রোগ্রামাটিক্যালিও সবকিছু পরিচালনা করা যায়।

ধারণাএটি কী
Collectionএকটি schema — এক ধরনের কন্টেন্টের আকৃতি (যেমন “Blog Post”, “FAQ”, “Product Spec”)
Fieldএকটি কালেকশনে টাইপ করা স্লট (যেমন title: string, body: rich_text, coverImage: asset)
Entryএকটি কালেকশনের একটি একক ইনস্ট্যান্স (একটি ব্লগ পোস্ট, একটি FAQ আইটেম)
Assetএকটি আপলোড করা মিডিয়া ফাইল যা এন্ট্রি থেকে রেফারেন্স করা যায়
Localeএকটি ভাষা/অঞ্চল যেখানে কন্টেন্ট অনুবাদ করা হয়
Releaseএকই সময়ে live হওয়া (বা unpublish হওয়া) এন্ট্রির একটি গ্রুপ
import Proyecta from '@proyecta-ai/sdk';
const proyecta = new Proyecta({ apiKey: process.env.PROYECTA_API_KEY });
// 1. Define a collection
const blog = await proyecta.content.collections.create({
api_id: 'blogPost',
name: 'Blog Post',
// fields are added via collections.fields.create()
});
// 2. Create an entry
const post = await proyecta.content.entries.create({
collection_id: blog.id,
data: {
title: 'Hello, world',
body: 'My very first post.',
},
});
// 3. Publish it
await proyecta.content.entries.publish({ entryId: post.id });
// Browse collections
for await (const collection of proyecta.content.collections.list()) {
console.log(collection.name);
}
// Add or remove fields on a collection
await proyecta.content.collections.fields.create(blog.id, {
/* field definition */
});
await proyecta.content.collections.fields.delete(blog.id, fieldId);

এন্ট্রিগুলো হলো আসল কন্টেন্ট রো। প্রতিটি এন্ট্রি একটি কালেকশনের অন্তর্গত এবং সেই কালেকশনের ফিল্ড অনুযায়ী ডেটা বহন করে।

// Browse entries (pass the collection's api_id, not its numeric id)
for await (const entry of proyecta.content.entries.list({ collection: 'blogPost' })) {
console.log(entry);
}
// Update an entry
await proyecta.content.entries.update(post.id, { data: { title: 'Updated title' } });
// Publish an entry
await proyecta.content.entries.publish({ entryId: post.id });
// Delete an entry
await proyecta.content.entries.delete(post.id);

অ্যাসেট আপলোড প্রথম শ্রেণির ফিচার — এন্ট্রিতে ছবি, ভিডিও বা PDF সংযুক্ত করতে এটি ব্যবহার করো:

// Browse assets
for await (const asset of proyecta.content.assets.list()) {
console.log(asset);
}
// Upload, update, or delete via assets.create / assets.update / assets.delete

চ্যাট-চালিত ফাইল আপলোডের জন্য (builder-এ ড্র্যাগ করে), দেখো Files & Media

কন্টেন্ট একাধিক লোকেলে অনুবাদ করা যায়। প্রতিটি লোকেল proyecta.content.locales দিয়ে পরিচালিত একটি রেকর্ড:

await proyecta.content.locales.create({
/* code, name, etc. */
});
for await (const locale of proyecta.content.locales.list()) {
console.log(locale);
}

এন্ট্রি fetch করার সময়, তুমি একটি নির্দিষ্ট লোকেলের অনুবাদ চাইতে পারো। বৃহত্তর i18n চিত্রের জন্য দেখো Internationalization

একটি রিলিজ হলো এন্ট্রির একটি বান্ডেল যা একই সময়ে live হয় (বা unpublish হয়)। এটি তোমাকে একটি সমন্বিত কন্টেন্ট ড্রপ — একটি মার্কেটিং লঞ্চ, একটি নতুন প্রোডাক্ট পেজ, একটি FAQ রিফ্রেশ — স্টেজ করতে এবং সবকিছু একসাথে atomically পরিবর্তন করতে দেয়।

দ্রষ্টব্য: স্বয়ংক্রিয় টাইমড publishing এখনো বাস্তবায়িত হয়নি। scheduled_at তারিখ সহ রিলিজগুলো scheduled স্ট্যাটাসে প্রবেশ করে কিন্তু releases.publish() দিয়ে ম্যানুয়ালি publish করতে হবে। নির্দিষ্ট সময়ে স্বয়ংক্রিয় publishing শীঘ্রই আসছে।

// Create a release (optionally with a target date)
const release = await proyecta.content.releases.create({
name: 'Monday launch',
scheduled_at: '2024-01-08T09:00:00Z',
});
// Manually publish a release when ready
await proyecta.content.releases.publish({ releaseId: release.id });
// Browse releases
for await (const r of proyecta.content.releases.list()) {
console.log(r);
}

একটি রিলিজের সময়সূচি পরিবর্তন করতে, এটি মুছে আবার তৈরি করো — কোনো update endpoint নেই।

সাধারণ প্যাটার্ন (AI-কে দিয়ে সেটআপ করাও)

Section titled “সাধারণ প্যাটার্ন (AI-কে দিয়ে সেটআপ করাও)”
  • "Build a blog using the Proyecta Content API. Collection 'Blog Post' with fields: title, slug, excerpt, body (rich text), coverImage (asset), author. Public route at /blog and /blog/[slug]."
  • "Create an FAQ collection in Proyecta Content. Build an admin page where I can add/edit FAQs and a public /faq page."
  • "Set up a multi-language landing page using Proyecta Content with English and Spanish locales."
  • "Create a release containing three blog posts and publish it manually when ready."

কখন Content ব্যবহার করবে বনাম Database

Section titled “কখন Content ব্যবহার করবে বনাম Database”
ব্যবহারের ক্ষেত্রএটি ব্যবহার করো
সম্পাদকীয় কন্টেন্ট (পোস্ট, FAQ, মার্কেটিং কপি) — publish/draft স্ট্যাটাস, scheduling, লোকালাইজেশন দরকারContent API
অ্যাপ ডেটা (ব্যবহারকারী, অর্ডার, লাইন আইটেম) — query speed, ট্রানজেকশন, real-time দরকারDatabase
কোডে স্ট্যাটিক অ্যাসেটপ্রজেক্টে public/ ডিরেক্টরি
ব্যবহারকারী-আপলোড করা ফাইলFiles & Media
  • Rich-text entry editor — Content প্যানেলে rich_text ফিল্ডের জন্য পূর্ণ WYSIWYG সম্পাদনা
  • কন্টেন্ট পরিবর্তনের Live preview তোমার অ্যাপের বিপরীতে
  • Content roles — developer পারমিশন থেকে editor পারমিশন আলাদা করা