feat: add user deactivation and vendor BLE protocol
这个提交包含在:
@@ -153,6 +153,37 @@ router.get('/users/:user_id', requireAdmin, wrap(async (req, res) => {
|
||||
res.json(ok(result))
|
||||
}))
|
||||
|
||||
router.post('/users/:user_id/unbind', requireAdmin, wrap(async (req, res) => {
|
||||
const userId = req.params.user_id
|
||||
const targetUser = await userDao.findById(userId)
|
||||
if (!targetUser) return res.json(fail(1004, 'USER_NOT_FOUND'))
|
||||
const deviceId = req.body.device_id ? String(req.body.device_id).trim() : null
|
||||
const result = await bindingDao.unbindByUser(userId, deviceId)
|
||||
await logDao.write({
|
||||
admin_id: req.admin.admin_id,
|
||||
user_id: userId,
|
||||
action: 'admin_user_unbind',
|
||||
detail: '后台解绑用户设备: user=' + userId + ', device=' + (deviceId || 'all'),
|
||||
ip: req.ip
|
||||
})
|
||||
res.json(ok({ message: 'success', affected_rows: result.affectedRows || 0 }))
|
||||
}))
|
||||
|
||||
router.post('/users/:user_id/deactivate', requireAdmin, wrap(async (req, res) => {
|
||||
const userId = req.params.user_id
|
||||
const targetUser = await userDao.findById(userId)
|
||||
if (!targetUser) return res.json(fail(1004, 'USER_NOT_FOUND'))
|
||||
const result = await userDao.deactivate(userId)
|
||||
await logDao.write({
|
||||
admin_id: req.admin.admin_id,
|
||||
user_id: userId,
|
||||
action: 'admin_user_deactivate',
|
||||
detail: '后台注销用户: user=' + userId + ', unbound=' + result.unboundRows,
|
||||
ip: req.ip
|
||||
})
|
||||
res.json(ok({ message: 'success', unbound_rows: result.unboundRows }))
|
||||
}))
|
||||
|
||||
// --- Subscriptions ---
|
||||
|
||||
router.get('/subscriptions', requireAdmin, wrap(async (req, res) => {
|
||||
|
||||
在新工单中引用
屏蔽一个用户