|
|
@@ -184,6 +184,10 @@ func (us *UserService) Logout(u *model.User, token string) error {
|
|
184
|
184
|
|
|
185
|
185
|
// Delete 删除用户和oauth信息
|
|
186
|
186
|
func (us *UserService) Delete(u *model.User) error {
|
|
|
187
|
+ userCount := us.getAdminUserCount()
|
|
|
188
|
+ if userCount <= 1 {
|
|
|
189
|
+ return errors.New("The last admin user cannot be deleted")
|
|
|
190
|
+ }
|
|
187
|
191
|
tx := global.DB.Begin()
|
|
188
|
192
|
// 删除用户
|
|
189
|
193
|
if err := tx.Delete(u).Error; err != nil {
|
|
|
@@ -221,6 +225,15 @@ func (us *UserService) Delete(u *model.User) error {
|
|
221
|
225
|
|
|
222
|
226
|
// Update 更新
|
|
223
|
227
|
func (us *UserService) Update(u *model.User) error {
|
|
|
228
|
+ currentUser := us.InfoById(u.Id)
|
|
|
229
|
+ // 如果当前用户是管理员并且 IsAdmin 不为空,进行检查
|
|
|
230
|
+ if currentUser.IsAdmin != nil && *currentUser.IsAdmin {
|
|
|
231
|
+ adminCount := us.getAdminUserCount()
|
|
|
232
|
+ // 如果这是唯一的管理员,确保不能禁用或取消管理员权限
|
|
|
233
|
+ if adminCount <= 1 && (u.IsAdmin == nil || !*u.IsAdmin || u.Status == model.COMMON_STATUS_DISABLED) {
|
|
|
234
|
+ return errors.New("The last admin user cannot be disabled or demoted")
|
|
|
235
|
+ }
|
|
|
236
|
+ }
|
|
224
|
237
|
return global.DB.Model(u).Updates(u).Error
|
|
225
|
238
|
}
|
|
226
|
239
|
|
|
|
@@ -418,4 +431,18 @@ func (us *UserService) formatUsername(username string) string {
|
|
418
|
431
|
username = strings.ReplaceAll(username, " ", "")
|
|
419
|
432
|
username = strings.ToLower(username)
|
|
420
|
433
|
return username
|
|
|
434
|
+}
|
|
|
435
|
+
|
|
|
436
|
+// Helper functions, getUserCount
|
|
|
437
|
+func (us *UserService) getUserCount() int64 {
|
|
|
438
|
+ var count int64
|
|
|
439
|
+ global.DB.Model(&model.User{}).Count(&count)
|
|
|
440
|
+ return count
|
|
|
441
|
+}
|
|
|
442
|
+
|
|
|
443
|
+// helper functions, getAdminUserCount
|
|
|
444
|
+func (us *UserService) getAdminUserCount() int64 {
|
|
|
445
|
+ var count int64
|
|
|
446
|
+ global.DB.Model(&model.User{}).Where("is_admin = ?", true).Count(&count)
|
|
|
447
|
+ return count
|
|
421
|
448
|
}
|