4.1.3
This commit is contained in:
107
controllers/panel/adminUsers/adminUsersController.js
Normal file
107
controllers/panel/adminUsers/adminUsersController.js
Normal 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 }
|
||||
Reference in New Issue
Block a user