// // Copyright (C) 2024 veypi // 2025-03-04 16:08:06 // Distributed under terms of the MIT license. // package auth import ( baseAuth "github.com/veypi/vbase/auth" "github.com/veypi/vbase/cfg" "github.com/veypi/vbase/libs/crypto" "github.com/veypi/vbase/models" "github.com/veypi/vigo" ) // me 获取当前用户信息 func me(x *vigo.X) (*UserInfo, error) { userID := baseAuth.GetUserID(x) if userID == "" { return nil, vigo.ErrUnauthorized } var user models.User if err := cfg.DB().First(&user, "id = ?", userID).Error; err != nil { return nil, vigo.ErrNotFound } return &UserInfo{ ID: user.ID, Username: user.Username, Nickname: user.Nickname, Email: user.Email, Avatar: user.Avatar, }, nil } // UpdateMeRequest 更新自己请求 type UpdateMeRequest struct { Nickname *string `json:"nickname,omitempty" src:"json" desc:"昵称"` Avatar *string `json:"avatar,omitempty" src:"json" desc:"头像"` Email *string `json:"email,omitempty" src:"json" desc:"邮箱"` } // updateMe 更新当前用户信息 func updateMe(x *vigo.X, req *UpdateMeRequest) (*UserInfo, error) { userID := baseAuth.GetUserID(x) if userID == "" { return nil, vigo.ErrUnauthorized } updates := make(map[string]any) if req.Nickname != nil { updates["nickname"] = *req.Nickname } if req.Avatar != nil { updates["avatar"] = *req.Avatar } if req.Email != nil { // 检查邮箱是否被其他用户使用 var count int64 cfg.DB().Model(&models.User{}).Where("email = ? AND id != ?", *req.Email, userID).Count(&count) if count > 0 { return nil, vigo.ErrInvalidArg.WithString("email already exists") } updates["email"] = *req.Email } if err := cfg.DB().Model(&models.User{}).Where("id = ?", userID).Updates(updates).Error; err != nil { return nil, vigo.ErrInternalServer.WithError(err) } return me(x) } // ChangePasswordRequest 修改密码请求 type ChangePasswordRequest struct { OldPassword string `json:"old_password" src:"json" desc:"旧密码"` NewPassword string `json:"new_password" src:"json" desc:"新密码"` } // changePassword 修改密码 func changePassword(x *vigo.X, req *ChangePasswordRequest) error { userID := baseAuth.GetUserID(x) if userID == "" { return vigo.ErrUnauthorized } var user models.User if err := cfg.DB().First(&user, "id = ?", userID).Error; err != nil { return vigo.ErrNotFound } // 验证旧密码 if !crypto.VerifyPassword(req.OldPassword, user.Password) { return vigo.ErrInvalidArg.WithString("old password is incorrect") } // 哈希新密码 hashedPassword, err := crypto.HashPassword(req.NewPassword, 12) if err != nil { return vigo.ErrInternalServer.WithError(err) } // 更新密码 if err := cfg.DB().Model(&user).Update("password", hashedPassword).Error; err != nil { return vigo.ErrInternalServer.WithError(err) } return nil }