feat(auth): نقش سوم «creator» — نویسندهٔ محتوا با دسترسی محدود

- بک‌اند: ستون role برای admin_users (admin/creator) + author_id برای مقاله‌ها
- نقش‌گارد روی کل روتر مدیریتی: creator فقط لیست/ساخت/خواندن/ویرایش
  پیش‌نویس‌های «خودش» را می‌بیند؛ بقیهٔ مسیرهای مدیریتی ۴۰۳
- ساخت توسط creator همیشه پیش‌نویس است و ویرایشش هرگز منتشر نمی‌شود
  (حتی تلاش برای publish در payload نادیده گرفته می‌شود)
- حذف/ترتیب‌بندی/پیام‌ها/خبرنامه/سایر بخش‌ها برای creator ممنوع
- لاگین نقش را برمی‌گرداند؛ پنل: AdminBar نویسنده فقط «نوشتن مقاله» +
  زبان ویرایش + رمز + خروج دارد؛ دکمه‌های انتشار/حذف مقاله فقط برای admin
- ورود creator مستقیم به صفحهٔ نوشتن مقاله هدایت می‌شود
This commit is contained in:
aramesh-site deploy
2026-09-29 08:38:16 +00:00
parent 1b571387df
commit 79813ff52c
10 changed files with 167 additions and 33 deletions
+5 -1
View File
@@ -134,7 +134,7 @@ const STATUS_TEXT: Record<string, string> = {
* مسیرها: /admin/write (مقاله جدید) و /admin/write/:id (ویرایش).
*/
export function ArticleWritePage() {
const { isAuthenticated, saveStatus, runSave, editLang, toggleEditLang } = useAdmin()
const { isAuthenticated, saveStatus, runSave, editLang, toggleEditLang, role } = useAdmin()
const { id } = useParams<{ id: string }>()
const navigate = useNavigate()
const { data, updateSite } = useSiteData()
@@ -396,6 +396,7 @@ export function ArticleWritePage() {
</span>
{createdId && (
<>
{role === 'admin' && (
<button
type="button"
onClick={() => queueSave({ status: draft.status === 'draft' ? 'published' : 'draft' })}
@@ -407,6 +408,7 @@ export function ArticleWritePage() {
>
{draft.status === 'draft' ? 'انتشار در سایت' : 'تبدیل به پیش‌نویس'}
</button>
)}
<Link
to={`${editLang === 'en' ? '/en' : ''}/blog/${draft.slug}`}
data-admin-link
@@ -415,6 +417,7 @@ export function ArticleWritePage() {
<EyeIcon className="h-3.5 w-3.5" />
دیدن در سایت
</Link>
{role === 'admin' && (
<button
type="button"
onClick={remove}
@@ -424,6 +427,7 @@ export function ArticleWritePage() {
>
<Trash2Icon className="h-3.5 w-3.5" />
</button>
)}
</>
)}
</div>