This commit is contained in:
payacom
2026-09-13 21:32:36 +03:30
parent 90c5f94b57
commit c302aea177
49 changed files with 4063 additions and 920 deletions

View File

@@ -0,0 +1,107 @@
const bcrypt = require('bcryptjs')
const AdminModel = require('../../../models/AdminModel')
const { PANEL_PERMISSIONS, PANEL_PERMISSION_KEYS } = require('../../../utils/panelPermissions')
function sanitizeAdmin(admin) {
return {
_id: admin._id,
user_name: admin.user_name,
first_name: admin.first_name,
last_name: admin.last_name,
role: admin.role,
permissions: admin.permissions || [],
createdAt: admin.createdAt,
last_online: admin.last_online
}
}
const listAdmins = async (req, res, next) => {
try {
const admins = await AdminModel.find({}).sort({ createdAt: -1 })
res.status(200).json({
admins: admins.map(sanitizeAdmin),
availablePermissions: PANEL_PERMISSIONS
})
} catch (error) {
next(error)
}
}
const createAdmin = async (req, res, next) => {
try {
const { user_name, password, first_name, last_name, permissions } = req.body
if (!user_name || !password) {
return res.status(422).json({ error: true, message: 'نام کاربری و رمز عبور الزامی است' })
}
const userLow = String(user_name).toLowerCase().trim()
const existing = await AdminModel.findOne({ user_name: userLow })
if (existing) {
return res.status(409).json({ error: true, message: 'این نام کاربری قبلاً استفاده شده است' })
}
const validPermissions = Array.isArray(permissions)
? permissions.filter((p) => PANEL_PERMISSION_KEYS.has(p))
: []
const hashedPassword = await bcrypt.hash(password, 10)
const admin = await AdminModel.create({
user_name: userLow,
password: hashedPassword,
first_name: first_name || null,
last_name: last_name || null,
role: 'staff',
permissions: validPermissions,
createdBy: req.admin._id
})
res.status(201).json({ admin: sanitizeAdmin(admin) })
} catch (error) {
next(error)
}
}
const updateAdminPermissions = async (req, res, next) => {
try {
const { id } = req.params
const { permissions } = req.body
const admin = await AdminModel.findById(id)
if (!admin) return res.status(404).json({ error: true, message: 'کاربر پیدا نشد' })
if (admin.role === 'super_admin') {
return res.status(400).json({ error: true, message: 'دسترسی سوپرادمین قابل تغییر نیست' })
}
const validPermissions = Array.isArray(permissions)
? permissions.filter((p) => PANEL_PERMISSION_KEYS.has(p))
: []
admin.permissions = validPermissions
await admin.save()
res.status(200).json({ admin: sanitizeAdmin(admin) })
} catch (error) {
next(error)
}
}
const deleteAdmin = async (req, res, next) => {
try {
const { id } = req.params
const admin = await AdminModel.findById(id)
if (!admin) return res.status(404).json({ error: true, message: 'کاربر پیدا نشد' })
if (admin.role === 'super_admin') {
return res.status(400).json({ error: true, message: 'حذف سوپرادمین مجاز نیست' })
}
if (String(admin._id) === String(req.admin._id)) {
return res.status(400).json({ error: true, message: 'نمی‌توانید خودتان را حذف کنید' })
}
await AdminModel.deleteOne({ _id: id })
res.status(200).json({ message: 'کاربر پنل حذف شد' })
} catch (error) {
next(error)
}
}
module.exports = { listAdmins, createAdmin, updateAdminPermissions, deleteAdmin }