--- // Admin: one user. Their role, their permissions (grants, for moderators) and account actions, each in its own section. import Base from '../../../layouts/Base.astro'; import Icon from '../../../components/Icon.astro'; import AdminNav from '../../../components/AdminNav.astro'; import { api } from '../../../lib/api'; import { asUser, COOKIE } from '../../../lib/auth'; import { ud } from '../../../lib/urdu'; import { ROLE, ROLE_HINT, SCOPE, CONTENT, ACTION, ago } from '../../../lib/roles'; const me = Astro.locals.user; if (!me) return Astro.redirect(`/signin?next=${Astro.url.pathname}`); if (me.role !== 'admin') return new Response('صرف ایڈمن کے لیے', { status: 403 }); const token = Astro.cookies.get(COOKIE)!.value, id = Number(Astro.params.id) || 0; const poets: any[] = (await api('/api/poets')) ?? []; let error = '', done = '', tempPassword = ''; if (Astro.request.method === 'POST') { const f = await Astro.request.formData(), act = String(f.get('act')); let target = String(f.get('target') ?? '').trim(); // a poet may be picked by name; the API takes a page link const byName = poets.find((p) => p.name === target || p.nickname === target); if (byName) target = byName.url; const r = act === 'reset' ? await asUser(token, `/api/admin/users/${id}/password`, {}) : act === 'disable' || act === 'enable' ? await asUser(token, `/api/admin/users/${id}/disable`, { disabled: act === 'disable' }) : act === 'role' ? await asUser(token, `/api/admin/users/${id}/role`, { role: f.get('role') }) : act === 'delete' ? await asUser(token, `/api/admin/users/${id}/delete`, {}) : act === 'revoke' ? await asUser(token, `/api/admin/grants/${Number(f.get('grant'))}/delete`, {}) : act === 'grant' ? await asUser(token, `/api/admin/users/${id}/grants`, { scope: f.get('scope'), target, content: f.getAll('content'), actions: f.getAll('actions') }) : { ok: false, data: { error: 'نامعلوم عمل' } }; if (!r.ok) error = r.data.error ?? 'کچھ غلط ہو گیا'; else if (act === 'delete') return Astro.redirect('/admin'); else if (act === 'reset') tempPassword = r.data.password; else done = { disable: 'اکاؤنٹ معطل کر دیا گیا', enable: 'اکاؤنٹ بحال کر دیا گیا', role: 'کردار بدل دیا گیا', revoke: 'اجازت واپس لے لی گئی', grant: 'اجازت دے دی گئی' }[act] ?? ''; } const res = await asUser(token, `/api/admin/users/${id}/grants`); if (res.status === 404) return new Response('صارف نہیں ملا', { status: 404 }); const { user, grants } = res.data; const isMod = user.role.startsWith('mod-'), self = user.id === me.id; const initial = [...(user.full_name || user.email)][0]?.toUpperCase(); ---

صارفین

{user.full_name || {user.email}}

{user.full_name && }

{ROLE[user.role] ?? user.role} {user.disabled_at && معطل} {self && آپ}

شمولیت {ago(user.created_at)} · آخری لاگ ان {ago(user.last_sign_in)}

{error && } {done &&

{done}

} {tempPassword && (

عارضی پاس ورڈ (صرف ایک بار دکھایا جا رہا ہے):

{tempPassword}

یہ پاس ورڈ صارف کو دیں؛ وہ لاگ ان کر کے اپنے اکاؤنٹ کے صفحے سے اسے بدل لیں۔

)}

کردار

{self ?

اپنا کردار خود نہیں بدل سکتے۔

: (
{Object.entries(ROLE).map(([k, v]) => ( ))}
)}
{isMod && (

اجازتیں {ud(grants.length)}

{grants.length === 0 &&

ابھی کوئی اجازت نہیں: یہ موڈریٹر کچھ نہیں بدل سکتا۔ نیچے سے اجازت دیں۔

}
نئی اجازت
کہاں
{Object.entries(SCOPE).map(([k, v], i) => )}
{poets.map((p) =>
کیا
{Object.entries(CONTENT).map(([k, v]) => )}
لغت صرف "تمام شعرا" کے ساتھ
کون سے کام
{Object.entries(ACTION).map(([k, v]) => )}

)} {!isMod && !self &&

اجازتیں موڈریٹرز کے لیے ہیں: اوپر سے کردار "موڈریٹر" کریں۔

}

اکاؤنٹ

{!self && (

اکاؤنٹ اور اس کا تمام ڈیٹا (محفوظ شدہ، ذخیرۂ الفاظ) مستقل طور پر حذف۔ واپسی ممکن نہیں۔

)}