قالبهای آماده
هر قالب یک مدل دادهی کامل است، نه یک نمونهی نمایشی — و پیش از ساخت دقیقاً میبینید چه تحویل میگیرید.
وبلاگ / مجله
اسپرسونوشته و دستهبندی عمومی، نظر و نشانشدههای کاربر — بکاند یک مجلهٔ محتوایی.
۵ موجودیت، ۳ قانون آماده، ۱۱ رکورد نمونهٔ فارسی — API، مستندات و کلید همان لحظه ساخته میشوند.
- وبلاگ شخصی یا مجلهٔ تیمی
- بخش محتوای یک اپ موبایل
- بلاگ چندنویسنده با نظر کاربران
رزرو و نوبتدهی
کاپوچینوخدمت و کارشناس عمومی، نوبتها خصوصی — بکاند کلینیک، سالن و خدمات.
۴ موجودیت، ۳ قانون آماده، ۱۰ رکورد نمونهٔ فارسی — API، مستندات و کلید همان لحظه ساخته میشوند.
- نوبتدهی کلینیک یا مطب
- سالن زیبایی و آرایشگاه
- اپ رزرو جلسهٔ مشاوره
آگهیهای نیازمندی
کاپوچینوآگهی و دستهبندی عمومی با جستجوی فارسی، آگهیهای من و علاقهمندیها خصوصی.
۴ موجودیت، ۲ قانون آماده، ۹ رکورد نمونهٔ فارسی — API، مستندات و کلید همان لحظه ساخته میشوند.
- نیازمندیهای کالای دست دوم
- اپ آگهی محلی با جستجو
- اجاره و خرید و فروش
دورهٔ آموزشی آنلاین
کاپوچینودوره و درس عمومی، ثبتنام و پیشرفت خصوصی — بکاند یک پلتفرم آموزشی.
۴ موجودیت، ۴ قانون آماده، ۱۱ رکورد نمونهٔ فارسی — API، مستندات و کلید همان لحظه ساخته میشوند.
- پلتفرم دورهٔ ویدیویی
- اپ موبایل آموزشی با پیگیری پیشرفت
- آموزشگاه با ثبتنام آنلاین
فروشگاه اینترنتی
کاپوچینوکاتالوگ عمومی، سبد و سفارش خصوصی، و کاربران واقعی — بکاند کامل یک فروشگاه.
۴ موجودیت، ۵ قانون آماده، ۱۱ رکورد نمونهٔ فارسی — API، مستندات و کلید همان لحظه ساخته میشوند.
- فروشگاه کوچک با ۵۰-۵۰۰ محصول
- اپ موبایل فروشگاهی (Flutter / Kotlin / Swift)
- کاتالوگ عمومی با سفارشگیری کاربر
یادداشت شخصی
اسپرسودفترچه، یادداشت و برچسب — کوچکترین بکاند کاملی که یک اپ واقعی لازم دارد.
۳ موجودیت، ۲ قانون آماده، ۸ رکورد نمونهٔ فارسی — API، مستندات و کلید همان لحظه ساخته میشوند.
- اولین اپ با فیکارو
- اپ یادداشت موبایل (Flutter / Kotlin / Swift)
- دفترچهٔ شخصی با ورود کاربر
فرمساز / نظرسنجی
اسپرسوفرم و سؤال عمومی، پاسخها خصوصی — بکاند نظرسنجی و فرم جمعآوری داده.
۴ موجودیت، ۳ قانون آماده، ۱۰ رکورد نمونهٔ فارسی — API، مستندات و کلید همان لحظه ساخته میشوند.
- نظرسنجی رضایت مشتری
- فرم ثبتنام رویداد
- جمعآوری بازخورد داخل اپ
مدیریت وظایف
اسپرسوپروژه و برچسب مشترک، وظیفهٔ هر کس مال خودش، مدیر همه را میبیند.
۴ موجودیت، ۳ قانون آماده، ۱۰ رکورد نمونهٔ فارسی — API، مستندات و کلید همان لحظه ساخته میشوند.
- صف کاری تیم کوچک یا فریلنسر
- اپ to-do با ورود کاربر
- پیگیری وظایف چند پروژه
مدل داده
دستهبندی
عمومی/v1/categorynameناممتنضروریslugنشانیمتنضروریdescriptionتوضیحمتن
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- نام
- برنامهنویسی
- نشانی
- programming
- توضیح
- یادداشتهای فنی و تجربههای کدنویسی
برچسب
عمومی/v1/tagnameناممتنضروریslugنشانیمتنضروری
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- نام
- Go
- نشانی
- go
نوشته
عمومی/v1/postمطالب منتشرشده — عمومی، همان چیزی که خواننده بدون ورود میبیند
titleعنوانمتنضروریslugنشانیمتنضروریexcerptخلاصهمتنcontentمحتوا (Markdown)متنcoverتصویر شاخصفایلauthor_idنویسندهمتنcategory_idدستهبندیمتنstatusوضعیتگزینهای= "published"published_atتاریخ انتشارتاریخview_countبازدیدعدد= 0comment_countتعداد نظرعدد= 0editor_noteیادداشت سردبیرمتنپنهانread_timeزمان مطالعه (دقیقه)محاسبهشده
یک ردیف واقعی از دادهٔ نمونه(۳ ردیف)
- عنوان
- چرا بکاند نوشتن برای یک اپ کوچک اینقدر طول میکشد
- نشانی
- why-backend-takes-long
- خلاصه
- سه هفته برای چیزی که قرار بود دو روز باشد — و اینکه وقت دقیقاً کجا میرود.
- محتوا (Markdown)
- هر بار که یک اپ کوچک میسازیم، تخمین اولیه دو روز است و نتیجه سه هفته. دلیلش نوشتن CRUD نیست؛ چیزهایی است که کسی در تخمین حسابشان نمیکند: احراز هویت، صفحهبندی، اعتبارسنجی ورودی، مستندسازی، و آن نیمروزی که صرف فهمیدن یک خطای CORS میشود.
نظر
عمومی/v1/commentنظرها — عمومی خوانده میشوند، ولی هرکس فقط نظر خودش را ویرایش یا حذف میکند
post_idنوشتهمتنضروریauthor_idنویسندهٔ نظرمتنdisplay_nameنام نمایشیمتنbodyمتن نظرمتنضروری
یک ردیف واقعی از دادهٔ نمونه(۳ ردیف)
- نام نمایشی
- سارا
- متن نظر
- دقیقاً همین! بخش مستندسازی همیشه از تخمین جا میماند.
نشانشده
فقط صاحب رکورد/v1/bookmarkنوشتههایی که خواننده ذخیره کرده — فقط خودش میبیند
user_idکاربرمتنpost_idنوشتهمتنضروریnoteیادداشتمتن
یک ردیف واقعی از دادهٔ نمونه(۱ ردیف)
- یادداشت
- برای بازخوانی موقع پیادهسازی صفحهبندی
اولین درخواست
خواندن فهرست نوشتهها
نوشتهها، دستهبندیها و نظرها عمومیاند — اپ بدون ورود کاربر میتواند کل مجله را نشان بدهد.
npm install @fikaro/clientimport { createClient } from "@fikaro/client";
const client = createClient({
project: "{{slug}}",
key: "{{publishable_key}}",
});
// فهرست نوشتهها با نویسنده و دستهبندی
const { data: posts } = await client.from("post").list({
filter: { status: "published" },
sort: "-published_at",
include: "author,category",
});
// نشانکردن یک نوشته نیازمند ورود کاربر است
await client.auth.login("reader@example.com", "«رمزی که هنگام ساخت پروژه دیدید»");
await client.from("bookmark").create({ post_id: posts[0].id });
کلید عمومی فقط میخواند و فقط موجودیتهای عمومی؛ برای گذاشتنش داخل اپ امن است. «نشانشدهها» فقط برای خود کاربر است و به توکن ورود نیاز دارد. نوشتن نظر هم نیازمند ورود است، چون هر نظر به نویسندهاش گره میخورد.
قوانین آماده
- ثبت تاریخ انتشارتریگر شرطی
post - شمارش نظر روی نوشتهتریگر شرطی
comment - الزام خلاصه برای نوشتهٔ بلنداعتبارسنجی
post
راهنماهای همراه این قالب
- فهرست نوشتهها برای صفحهٔ اصلی
GET /v1/post - نظر گذاشتن
POST /v1/comment - نشانکردن یک نوشته
POST /v1/bookmark
مدل داده
خدمت
عمومی/v1/serviceخدمتهای قابل رزرو — عمومی، فهرستی که اپ قبل از ورود نشان میدهد
nameناممتنضروریdescriptionتوضیحاتمتنduration_minutesمدت (دقیقه)عددضروریpriceقیمت (تومان)عددضروریcostهزینهٔ تمامشدهعددفقط مدیرactiveفعالبولی= true
یک ردیف واقعی از دادهٔ نمونه(۳ ردیف)
- نام
- ویزیت مشاورهٔ تغذیه
- توضیحات
- جلسهٔ ۴۵ دقیقهای بررسی رژیم و برنامهٔ غذایی.
- مدت (دقیقه)
- ۴۵
- قیمت (تومان)
- ۸۵۰۰۰۰
کارشناس
عمومی/v1/staffکسانی که خدمت ارائه میدهند — عمومی، برای انتخاب در اپ
nameناممتنضروریtitleعنوان شغلیمتنphotoتصویرفایلphoneتلفنتلفنفقط مدیرactiveفعالبولی= true
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- نام
- دکتر مریم احمدی
- عنوان شغلی
- متخصص تغذیه
- تلفن
- +989121234567
- فعال
- بله
بازهٔ کاری
عمومی/v1/availabilityساعتهای کاری هر کارشناس — عمومی، تا اپ بتواند تقویم را بسازد
staff_idکارشناسمتنضروریlabelعنوانمتنweekdayروز هفتهگزینهایstart_hourساعت شروعمتنend_hourساعت پایانمتن
یک ردیف واقعی از دادهٔ نمونه(۳ ردیف)
- عنوان
- شنبه صبح
- روز هفته
- saturday
- ساعت شروع
- 09:00
- ساعت پایان
- 13:00
نوبت
فقط صاحب رکورد/v1/bookingنوبتها — هر کاربر فقط نوبتهای خودش را میبیند
customer_idمشتریمتنservice_idخدمتمتنضروریstaff_idکارشناسمتنضروریreferenceکد نوبتمتنstart_timeزمان شروعتاریخضروریend_timeزمان پایانتاریخضروریstatusوضعیتگزینهای= "pending"price_at_bookingمبلغ هنگام رزروعدد= 0customer_noteیادداشت مشتریمتنstaff_noteیادداشت داخلیمتنپنهانcancelled_atزمان لغوتاریخ
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- کد نوبت
- NB-1403-0041
- زمان شروع
- 2026-07-30T09:30:00Z
- زمان پایان
- 2026-07-30T10:15:00Z
- وضعیت
- completed
اولین درخواست
نمایش خدمتها و کارشناسها
خدمتها، کارشناسها و بازههای کاری عمومیاند — اپ میتواند کل ویترین و تقویم را بدون ورود کاربر بسازد.
npm install @fikaro/clientimport { createClient } from "@fikaro/client";
const client = createClient({
project: "{{slug}}",
key: "{{publishable_key}}",
});
// ویترین: خدمتهای فعال و کارشناسها
const { data: services } = await client.from("service").list({
filter: { active: true },
});
const { data: staff } = await client.from("staff").list({ filter: { active: true } });
// گرفتن نوبت نیازمند ورود است؛ customer_id خودکار پر میشود
await client.auth.login("patient@example.com", "«رمزی که هنگام ساخت پروژه دیدید»");
await client.from("booking").create({
service_id: services[0].id,
staff_id: staff[0].id,
start_time: "2026-09-01T09:30:00Z",
end_time: "2026-09-01T10:15:00Z",
});
کلید عمومی فقط ویترین را میخواند: خدمت، کارشناس و بازهٔ کاری. نوبتها «فقط مال خود کاربر» هستند، پس برای گرفتن یا دیدن نوبت باید وارد شود. شمارهٔ تلفن کارشناس و هزینهٔ تمامشده حتی برای کاربر واردشده هم برنمیگردد.
قوانین آماده
- ثبت زمان لغوتریگر شرطی
booking - جلوگیری از تکمیل نوبت تأییدنشدهاعتبارسنجی
booking - الزام ترتیب زمان شروع و پایاناعتبارسنجی
booking
راهنماهای همراه این قالب
- ساخت صفحهٔ انتخاب خدمت
GET /v1/service - بررسی تداخل پیش از رزرو
GET /v1/booking - گرفتن نوبت
POST /v1/booking - لغو نوبت
PATCH /v1/booking/{id}
مدل داده
دستهبندی
عمومی/v1/categoryدرخت دستهبندی — عمومی، برای منوی اپ
nameناممتنضروریقابل جستجوslugنشانیمتنضروریparent_idدستهٔ والدمتن
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- نام
- موبایل و تبلت
- نشانی
- mobile
شهر
عمومی/v1/cityشهرها — عمومی
nameناممتنضروریقابل جستجوslugنشانیمتنضروریprovinceاستانمتن
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- نام
- تهران
- نشانی
- tehran
- استان
- تهران
آگهی
عمومی/v1/listingآگهیها — عمومی، و عنوان و توضیحاتشان با جستجوی فارسی پیدا میشوند
owner_idآگهیدهندهمتنtitleعنوانمتنضروریقابل جستجوdescriptionتوضیحاتمتنضروریقابل جستجوpriceقیمت (تومان)عددis_negotiableقیمت توافقیبولی= falsephotoتصویرفایلcategory_idدستهبندیمتنضروریcity_idشهرمتنconditionوضعیت کالاگزینهای= "used"statusوضعیت آگهیگزینهای= "active"contact_phoneتلفن تماستلفنضروریفقط کاربر واردشدهview_countبازدیدعدد= 0moderation_noteیادداشت بررسیمتنپنهان
یک ردیف واقعی از دادهٔ نمونه(۴ ردیف)
- عنوان
- گوشی سامسونگ گلکسی A54 در حد نو
- توضیحات
- خریداریشده از نمایندگی، ۸ ماه کارکرد، بدون خط و خش، همراه با جعبه و شارژر اصلی. باتری سالم.
- قیمت (تومان)
- ۱۴۵۰۰۰۰۰
- وضعیت کالا
- used
علاقهمندی
فقط صاحب رکورد/v1/favoriteآگهیهای نشانشده — فقط برای خود کاربر
user_idکاربرمتنlisting_idآگهیمتنضروریnoteیادداشتمتن
یک ردیف واقعی از دادهٔ نمونه(۱ ردیف)
- یادداشت
- برای مقایسه با مدل بعدی
اولین درخواست
جستجوی فارسی در آگهیها
آگهیها عمومیاند و عنوان و توضیحاتشان با «?search=» پیدا میشوند — «كتاب» آگهی «کتاب» را هم میآورد.
npm install @fikaro/clientimport { createClient } from "@fikaro/client";
const client = createClient({
project: "{{slug}}",
key: "{{publishable_key}}",
});
// جستجوی فارسی — نیمفاصله و کاف عربی خودکار یکسانسازی میشوند
const { data: results } = await client.from("listing").list({
search: "یخچال",
filter: { status: "active" },
include: "category,city",
});
// تلفن تماس فقط بعد از ورود کاربر برمیگردد
await client.auth.login("seller@example.com", "«رمزی که هنگام ساخت پروژه دیدید»");
const { data: withPhone } = await client.from("listing").list({ search: "یخچال" });
کلید عمومی ویترین و جستجو را میدهد، ولی تلفن تماس را نه: آن فیلد فقط برای کاربر واردشده برمیگردد تا شمارهها بهسادگی برداشت انبوه نشوند. علاقهمندیها «فقط مال خود کاربر» است. جستجو ی/ي، ک/ك، نیمفاصله، اعراب و ارقام فارسی را خودکار یکسان میکند، پس لازم نیست کاربر درست تایپ کند.
قوانین آماده
- قیمت توافقی نباید عدد داشته باشداعتبارسنجی
listing - شمارش علاقهمندی روی آگهیتریگر شرطی
favorite
راهنماهای همراه این قالب
- جستجوی آگهی
GET /v1/listing - فیلتر روی دسته و شهر
GET /v1/listing - ثبت آگهی
POST /v1/listing - نشانکردن آگهی
POST /v1/favorite
مدل داده
دوره
عمومی/v1/courseدورهها — عمومی، ویترین اپ
titleعنوانمتنضروریslugنشانیمتنضروریsummaryمعرفی کوتاهمتنdescriptionتوضیحاتمتنcoverتصویر دورهفایلlevelسطحگزینهای= "beginner"priceقیمت (تومان)عددضروریstatusوضعیتگزینهای= "published"lesson_countتعداد درسعدد= 0student_countتعداد دانشجوعدد= 0instructor_idمدرسمتنrevenue_noteیادداشت مالیمتنفقط مدیر
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- عنوان
- ساخت اپ فروشگاهی با Flutter
- نشانی
- flutter-shop-app
- معرفی کوتاه
- از صفر تا انتشار در بازار: رابط کاربری، اتصال به API و پرداخت.
- توضیحات
- در این دوره یک اپ فروشگاهی کامل میسازیم: فهرست محصولات با صفحهبندی، سبد خرید، ورود کاربر با شمارهٔ موبایل، و اتصال به درگاه پرداخت. پیشنیاز: آشنایی مقدماتی با Dart.
درس
عمومی/v1/lessonسرفصل دوره — عمومی، تا خریدار پیش از ثبتنام بداند چه میخرد
course_idدورهمتنضروریpositionترتیبعددضروریtitleعنوانمتنضروریsummaryخلاصهمتنduration_minutesمدت (دقیقه)عدد= 0is_previewپیشنمایش رایگانبولی= falsevideo_keyکلید ویدیومتنفقط مدیرpreview_urlنشانی پیشنمایشنشانی
یک ردیف واقعی از دادهٔ نمونه(۵ ردیف)
- ترتیب
- ۱
- عنوان
- راهاندازی پروژه و ساختار پوشهها
- خلاصه
- نصب ابزارها و چیدمانی که تا آخر دوره باهاش کار میکنیم.
- مدت (دقیقه)
- ۱۸
ثبتنام
فقط صاحب رکورد/v1/enrollmentثبتنامها — هر دانشجو فقط ثبتنامهای خودش را میبیند
student_idدانشجومتنcourse_idدورهمتنضروریreferenceکد ثبتناممتنstatusوضعیتگزینهای= "active"price_paidمبلغ پرداختیعدد= 0completed_lessonsدرسهای تمامشدهعدد= 0completed_atتاریخ اتمامتاریخ
یک ردیف واقعی از دادهٔ نمونه(۱ ردیف)
- کد ثبتنام
- EN-1403-0112
- وضعیت
- active
- مبلغ پرداختی
- ۲۴۰۰۰۰۰
- درسهای تمامشده
- ۲
پیشرفت درس
فقط صاحب رکورد/v1/lesson_progressپیشرفت هر دانشجو در هر درس — فقط خودش میبیند
student_idدانشجومتنenrollment_idثبتناممتنضروریlesson_idدرسمتنضروریis_doneتمامشدهبولی= falseseconds_watchedثانیهٔ تماشاعدد= 0noteیادداشت دانشجومتن
یک ردیف واقعی از دادهٔ نمونه(۳ ردیف)
- تمامشده
- بله
- ثانیهٔ تماشا
- ۱۰۸۰
اولین درخواست
نمایش ویترین دورهها
دورهها و سرفصلها عمومیاند — اپ میتواند کل ویترین را قبل از ورود کاربر نشان بدهد.
npm install @fikaro/clientimport { createClient } from "@fikaro/client";
const client = createClient({
project: "{{slug}}",
key: "{{publishable_key}}",
});
// ویترین: دورههای منتشرشده و سرفصلهایشان
const { data: courses } = await client.from("course").list({
filter: { status: "published" },
sort: "-createdAt",
});
const { data: lessons } = await client.from("lesson").list({
filter: { course_id: courses[0].id },
sort: "position",
});
// ثبتنام و پیشرفت نیازمند ورود است
await client.auth.login("student@example.com", "«رمزی که هنگام ساخت پروژه دیدید»");
const { data: myEnrollments } = await client.from("enrollment").list({ include: "course" });
کلید عمومی ویترین را میخواند: دوره، سرفصل و پیشنمایش رایگان. کلید ویدیوی اصلی و یادداشت مالی حتی برای کاربر واردشده هم برنمیگردد — فقط کلید خود پروژه آنها را میبیند. ثبتنام و پیشرفت «فقط مال خود کاربر» است.
قوانین آماده
- شمارش درسهای دورهتریگر شرطی
lesson - شمارش دانشجویان دورهتریگر شرطی
enrollment - ثبت تاریخ اتمام دورهتریگر شرطی
enrollment - جلوگیری از استرداد دورهٔ رایگاناعتبارسنجی
enrollment
راهنماهای همراه این قالب
- ویترین دورهها
GET /v1/course - ثبتنام دانشجو
POST /v1/enrollment - ثبت پیشرفت
POST /v1/lesson_progress - تحویل ویدیوی اصلی
GET /v1/lesson/{id}
مدل داده
دستهبندی
عمومی/v1/categoryدستهبندی محصولات — عمومی، برای منوی اپ
nameناممتنضروریslugنشانیمتنضروریsort_orderترتیب نمایشعدد= 0
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- نام
- لوازم آشپزخانه
- نشانی
- kitchen
- ترتیب نمایش
- ۱
محصول
عمومی/v1/productمحصولات فروشگاه — عمومی، همان چیزی که اپ قبل از ورود کاربر نشان میدهد
nameناممتنضروریdescriptionتوضیحاتمتنimageتصویرفایلpriceقیمت (تومان)عددضروریcost_priceقیمت خریدعددفقط مدیرinternal_noteیادداشت داخلیمتنپنهانstockموجودیعدد= 0category_idدستهبندیمتنstatusوضعیتگزینهای= "active"
یک ردیف واقعی از دادهٔ نمونه(۴ ردیف)
- نام
- لیوان سرامیکی دستساز شیراز
- توضیحات
- لیوان لعابدار ۳۰۰ میلیلیتری، ساخت کارگاه سفال شیراز.
- قیمت (تومان)
- ۲۸۵۰۰۰
- قیمت خرید
- ۱۶۰۰۰۰
سفارش
فقط صاحب رکورد/v1/orderسفارشها — هر کاربر فقط سفارشهای خودش را میبیند
customer_idمشتریمتنstatusوضعیتگزینهای= "pending"totalمبلغ کل (تومان)عدد= 0tracking_codeکد رهگیریمتنshipping_addressنشانی تحویلمتنpaid_atتاریخ پرداختتاریخnotesیادداشتمتن
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- وضعیت
- delivered
- مبلغ کل (تومان)
- ۱۷۳۵۰۰۰
- کد رهگیری
- FKR-14030512-001
- نشانی تحویل
- تهران، خیابان ولیعصر، کوچهٔ بهار، پلاک ۱۲، واحد ۳
آیتم سفارش
فقط صاحب رکورد/v1/order_itemسطرهای هر سفارش — با همان محدودهٔ مالکیت سفارش
customer_idمشتریمتنorder_idسفارشمتنضروریproduct_idمحصولمتنضروریtitleعنوانمتنquantityتعدادعددضروریprice_at_purchaseقیمت هنگام خریدعددضروری
یک ردیف واقعی از دادهٔ نمونه(۳ ردیف)
- عنوان
- لیوان سرامیکی دستساز شیراز
- تعداد
- ۱
- قیمت هنگام خرید
- ۲۸۵۰۰۰
اولین درخواست
اولین درخواست، بدون ورود کاربر
کاتالوگ محصول عمومی است، پس با کلید عمومی و بدون احراز هویت خوانده میشود — همان چیزی که اپ شما موقع باز شدن نشان میدهد.
npm install @fikaro/clientimport { createClient } from "@fikaro/client";
const client = createClient({
project: "{{slug}}",
key: "{{publishable_key}}",
});
// کاتالوگ عمومی — بدون ورود کاربر
const { data: products } = await client.from("product").list({
filter: { status: "active" },
sort: "-createdAt",
});
// سفارشها own-scoped هستند: اول کاربر وارد شود
await client.auth.login("demo@example.com", "«رمزی که هنگام ساخت پروژه دیدید»");
const { data: orders } = await client.from("order").list({ include: "items" });
کلید عمومی فقط میخواند و فقط موجودیتهایی که عمومی علامت خوردهاند؛ امن است که داخل اپ یا APK قرار بگیرد. سفارشها «فقط رکوردهای خود کاربر» هستند، پس برای دیدنشان کاربر باید وارد شود. توجه: کلید خودِ پروژه همهچیز را میبیند — اگر از پنل تست میکنید دادهای میبینید که اپ شما نمیبیند.
قوانین آماده
- ثبت زمان پرداختتریگر شرطی
order - کاهش موجودی هنگام ثبت آیتم سفارشتریگر شرطی
order_item - افزودن مبلغ آیتم به جمع سفارشتریگر شرطی
order_item - الزام کد رهگیری برای ارسالشدهاعتبارسنجی
order - جلوگیری از تحویل سفارش پرداختنشدهاعتبارسنجی
order
راهنماهای همراه این قالب
- خواندن کاتالوگ با کلید عمومی
GET /v1/product - ثبتنام خریدار
POST /v1/auth/signup - ثبت یک سفارش
POST /v1/order - افزودن آیتم به سفارش
POST /v1/order_item
مدل داده
برچسب
/v1/tagبرچسبهای مشترک — برای دستهبندی یادداشتها
nameناممتنضروریcolorرنگمتن= "#9CA3AF"
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- نام
- ایده
- رنگ
- #F59E0B
دفترچه
فقط صاحب رکورد/v1/notebookدفترچههای هر کاربر — فقط خودش میبیند
user_idکاربرمتنnameناممتنضروریiconآیکونمتن= "📓"note_countتعداد یادداشتعدد= 0is_archivedبایگانیشدهبولی= false
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- نام
- کار
- آیکون
- 💼
- تعداد یادداشت
- ۲
یادداشت
فقط صاحب رکورد/v1/noteیادداشتهای هر کاربر — فقط خودش میبیند
user_idکاربرمتنnotebook_idدفترچهمتنtitleعنوانمتنضروریbodyمتنمتنis_pinnedسنجاقشدهبولی= falsecolorرنگمتن= "#FFFFFF"attachmentپیوستفایلreminder_atیادآوریتاریخword_countتعداد کاراکترمحاسبهشده
یک ردیف واقعی از دادهٔ نمونه(۴ ردیف)
- عنوان
- جمعبندی جلسهٔ سهشنبه
- متن
- قرار شد نسخهٔ بعدی روی سرعت بارگذاری تمرکز کند، نه ویژگی جدید. سه مورد مشخص شد: کش تصاویر، حذف درخواستهای تکراری موقع باز شدن اپ، و صفحهبندی فهرست.
- سنجاقشده
- بله
- رنگ
- #FEF3C7
اولین درخواست
ورود و ساخت اولین یادداشت
یادداشتها شخصیاند، پس همهچیز از ورود کاربر شروع میشود — و از همان لحظه هر کاربر فقط دادهٔ خودش را میبیند.
npm install @fikaro/clientimport { createClient } from "@fikaro/client";
const client = createClient({ project: "{{slug}}", key: "{{api_key}}" });
// ثبتنام یا ورود
await client.auth.signup("me@example.com", "یک-رمز-امن");
// ساخت دفترچه و یادداشت — user_id را نمیفرستید، موتور خودش میگذارد
const notebook = await client.from("notebook").create({ name: "کار", icon: "💼" });
await client.from("note").create({
notebook_id: notebook.id,
title: "اولین یادداشت",
body: "این فقط برای من دیده میشود.",
});
// فهرست یادداشتها — بدون هیچ فیلتری روی کاربر
const { data: notes } = await client.from("note").list({ sort: "-createdAt" });
هیچ موجودیتی عمومی نیست، پس کلید عمومی اینجا کاربردی ندارد. نکتهٔ اصلی این قالب همین است: شما هیچ شرطی برای «فقط یادداشتهای خودم» نمینویسید — فیلد مالک را موتور پر میکند و خواندن را هم خودش محدود میکند. برای دیدنش، دو کاربر بسازید و با هرکدام فهرست را بخوانید.
قوانین آماده
- شمارش یادداشتهای دفترچهتریگر شرطی
note - رد یادداشت بیمحتوااعتبارسنجی
note
راهنماهای همراه این قالب
- ثبتنام و ورود
POST /v1/auth/signup - ساخت یادداشت
POST /v1/note - اثبات جداسازی داده
GET /v1/note - برچسبزدن یادداشت
POST /v1/note/{id}/tags
مدل داده
فرم
عمومی/v1/surveyفرمها — عمومی، تا هر کسی با لینک بتواند بازشان کند
titleعنوانمتنضروریslugنشانیمتنضروریdescriptionتوضیحاتمتنstatusوضعیتگزینهای= "open"closes_atپایان پذیرشتاریخresponse_countتعداد پاسخعدد= 0internal_ownerمسئول داخلیمتنپنهان
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- عنوان
- نظرسنجی رضایت مشتریان — تابستان
- نشانی
- summer-satisfaction
- توضیحات
- سه سؤال کوتاه دربارهٔ تجربهٔ شما از خرید اخیر. کمتر از یک دقیقه وقت میگیرد.
- وضعیت
- open
سؤال
عمومی/v1/questionسؤالهای هر فرم — عمومی، چون بخشی از خود فرماند
survey_idفرممتنضروریpositionترتیبعددضروریkindنوعگزینهای= "short_text"textمتن سؤالمتنضروریhelp_textراهنمامتنchoicesگزینههاJSONis_requiredالزامیبولی= false
یک ردیف واقعی از دادهٔ نمونه(۴ ردیف)
- ترتیب
- ۱
- نوع
- rating
- متن سؤال
- چقدر احتمال دارد ما را به دیگران معرفی کنید؟
- راهنما
- از ۰ تا ۱۰
پاسخ
فقط صاحب رکورد/v1/responseیک بار پرکردن فرم — فقط برای خود پاسخدهنده و مدیر
respondent_idپاسخدهندهمتنsurvey_idفرممتنضروریreferenceکد پیگیریمتنsubmitted_atزمان ارسالتاریخis_completeتکمیلشدهبولی= false
یک ردیف واقعی از دادهٔ نمونه(۱ ردیف)
- کد پیگیری
- RS-1403-0007
- زمان ارسال
- 2026-07-27T14:05:00Z
- تکمیلشده
- بله
جواب
فقط صاحب رکورد/v1/answerجواب یک سؤال — با همان محدودهٔ پاسخی که به آن تعلق دارد
respondent_idپاسخدهندهمتنresponse_idپاسخمتنضروریquestion_idسؤالمتنضروریvalue_textمقدار متنیمتنvalue_numberمقدار عددیعددvalue_choicesگزینههای انتخابیJSON
یک ردیف واقعی از دادهٔ نمونه(۳ ردیف)
- مقدار عددی
- ۹
اولین درخواست
خواندن یک فرم و سؤالهایش
فرم و سؤالها عمومیاند — هر کسی با لینک میتواند بازشان کند، بدون ورود.
npm install @fikaro/clientimport { createClient } from "@fikaro/client";
const client = createClient({
project: "{{slug}}",
key: "{{publishable_key}}",
});
// فرم و سؤالهایش، بدون ورود
const { data: forms } = await client.from("survey").list({ filter: { status: "open" } });
const { data: questions } = await client.from("question").list({
filter: { survey_id: forms[0].id },
sort: "position",
});
// ثبت پاسخ نیازمند ورود است
await client.auth.login("respondent@example.com", "«رمزی که هنگام ساخت پروژه دیدید»");
const response = await client.from("response").create({ survey_id: forms[0].id });
await client.from("answer").create({
response_id: response.id,
question_id: questions[0].id,
value_number: 9,
});
کلید عمومی فرم و سؤالها را میخواند و همین برای رندرکردن فرم کافی است. ثبت پاسخ نیازمند ورود کاربر است تا هر پاسخ به صاحبش گره بخورد؛ پاسخدهنده فقط پاسخ خودش را میبیند و کاربری با نقش «مدیر» همهٔ پاسخها را.
قوانین آماده
- ثبت زمان ارسالتریگر شرطی
response - شمارش پاسخهای فرمتریگر شرطی
response - الزام گزینه برای سؤال چندگزینهایاعتبارسنجی
question
راهنماهای همراه این قالب
- رندرکردن فرم
GET /v1/question - ثبت پاسخ
POST /v1/response - دیدن نتایج
GET /v1/response
مدل داده
پروژه
/v1/projectفضای کاری مشترک — هر کاربر واردشده میبیند
nameناممتنضروریdescriptionتوضیحاتمتنcolorرنگمتن= "#6B7280"statusوضعیتگزینهای= "active"open_tasksوظایف بازعدد= 0
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- نام
- اپ موبایل نسخهٔ ۲
- توضیحات
- بازنویسی اپ با Flutter و اتصال به API جدید
- رنگ
- #2563EB
- وضعیت
- active
برچسب
/v1/tagبرچسبهای مشترک تیم
nameناممتنضروریcolorرنگمتن= "#9CA3AF"
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- نام
- باگ
- رنگ
- #DC2626
وظیفه
فقط صاحب رکورد/v1/taskصف کاری هر کاربر — عضو تیم وظایف خودش را میبیند، مدیر همه را
assignee_idمسئولمتنproject_idپروژهمتنضروریtitleعنوانمتنضروریdescriptionتوضیحاتمتنstatusوضعیتگزینهای= "todo"priorityاولویتگزینهای= "medium"due_dateمهلتتاریخblocked_reasonدلیل توقفمتنcompleted_atتاریخ تکمیلتاریخattachmentپیوستفایل
یک ردیف واقعی از دادهٔ نمونه(۴ ردیف)
- عنوان
- صفحهٔ ورود با شمارهٔ موبایل
- توضیحات
- ورود با کد پیامکی، شامل حالت خطا و شمارش معکوس ارسال مجدد.
- وضعیت
- done
- اولویت
- high
یادداشت وظیفه
فقط صاحب رکورد/v1/task_commentیادداشتهای روی وظیفه — با همان محدودهٔ خود وظیفه
author_idنویسندهمتنtask_idوظیفهمتنضروریbodyمتنمتنضروری
یک ردیف واقعی از دادهٔ نمونه(۲ ردیف)
- متن
- cursor را از هدر پاسخ میگیرم، نه از بدنه — سادهتر شد.
اولین درخواست
ورود و خواندن صف کاری
این قالب چیز عمومی ندارد — یک تختهٔ کاری داخلی است و اپش با صفحهٔ ورود باز میشود.
npm install @fikaro/clientimport { createClient } from "@fikaro/client";
const client = createClient({ project: "{{slug}}", key: "{{api_key}}" });
// بدون ورود چیزی خوانده نمیشود
await client.auth.login("dev@example.com", "«رمزی که هنگام ساخت پروژه دیدید»");
// صف کاری خودِ کاربر
const { data: myTasks } = await client.from("task").list({
filter: { status: "in_progress" },
sort: "-createdAt",
include: "project",
});
// پروژهها مشترکاند و برای همهٔ کاربران واردشده خوانده میشوند
const { data: projects } = await client.from("project").list({ filter: { status: "active" } });
کلید عمومی اینجا به کار نمیآید، چون هیچ موجودیتی عمومی نیست. هر کاربر پس از ورود فقط وظایف خودش را میبیند؛ کاربری با نقش «مدیر» وظایف همهٔ تیم را میبیند. پروژهها و برچسبها برای همهٔ کاربران واردشده مشترکاند.
قوانین آماده
- ثبت زمان تکمیلتریگر شرطی
task - شمارش وظایف باز پروژهتریگر شرطی
task - الزام دلیل برای وظیفهٔ متوقفاعتبارسنجی
task
راهنماهای همراه این قالب
- ورود کاربر
POST /v1/auth/login - صف کاری من
GET /v1/task - نمای مدیر
GET /v1/task - بستن یک وظیفه
PATCH /v1/task/{id}