137 lines
4.0 KiB
Go
137 lines
4.0 KiB
Go
package user
|
|
|
|
import (
|
|
"context"
|
|
"server/internal/dao"
|
|
"server/internal/model"
|
|
"server/internal/model/do"
|
|
"server/internal/model/entity"
|
|
"server/internal/service"
|
|
"server/utility/ecode"
|
|
"server/utility/encrypt"
|
|
"server/utility/jwt"
|
|
"strings"
|
|
)
|
|
|
|
type sUser struct{}
|
|
|
|
func New() service.IUser {
|
|
return &sUser{}
|
|
}
|
|
func init() {
|
|
service.RegisterUser(New())
|
|
}
|
|
|
|
func (s *sUser) Login(ctx context.Context, in *model.UserLoginIn) (out *model.UserLoginOut, err error) {
|
|
user, err := dao.Users.Ctx(ctx).Where(do.Users{Email: in.Email}).One()
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("database_query_failed")
|
|
}
|
|
if user == nil {
|
|
return nil, ecode.Auth // 账户名或密码不正确
|
|
}
|
|
var entityUser entity.Users
|
|
if err = user.Struct(&entityUser); err != nil {
|
|
return nil, ecode.Fail.Sub("data_conversion_failed")
|
|
}
|
|
if !encrypt.ComparePassword(entityUser.PasswordHash, in.Password) {
|
|
return nil, ecode.Password // 密码不正确
|
|
}
|
|
token, err := jwt.GenerateToken(&jwt.TokenIn{UserId: entityUser.Id, Role: "user"})
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("token_generation_failed")
|
|
}
|
|
return &model.UserLoginOut{Token: token}, nil
|
|
}
|
|
|
|
func (s *sUser) Register(ctx context.Context, in *model.UserRegisterIn) (out *model.UserRegisterOut, err error) {
|
|
if in.Password != in.Password2 {
|
|
return nil, ecode.Password.Sub("password_mismatch")
|
|
}
|
|
exist, err := dao.Users.Ctx(ctx).Where(do.Users{Email: in.Email}).Count()
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("database_query_failed")
|
|
}
|
|
if exist > 0 {
|
|
return nil, ecode.EmailExist // 该邮箱已被注册
|
|
}
|
|
hash, err := encrypt.EncryptPassword(in.Password)
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("password_encryption_failed")
|
|
}
|
|
_, err = dao.Users.Ctx(ctx).Data(do.Users{
|
|
Email: in.Email,
|
|
PasswordHash: hash,
|
|
Username: strings.Split(in.Email, "@")[0],
|
|
}).Insert()
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("registration_failed")
|
|
}
|
|
return &model.UserRegisterOut{Success: true}, nil
|
|
}
|
|
|
|
func (s *sUser) Info(ctx context.Context, in *model.UserInfoIn) (out *model.UserInfoOut, err error) {
|
|
user, err := dao.Users.Ctx(ctx).Where(do.Users{Id: in.UserId}).One()
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("database_query_failed")
|
|
}
|
|
if user == nil {
|
|
return nil, ecode.Auth.Sub("user_not_found")
|
|
}
|
|
var entityUser entity.Users
|
|
if err = user.Struct(&entityUser); err != nil {
|
|
return nil, ecode.Fail.Sub("data_conversion_failed")
|
|
}
|
|
return &model.UserInfoOut{
|
|
UserId: entityUser.Id,
|
|
Username: entityUser.Username,
|
|
Email: entityUser.Email,
|
|
Avatar: entityUser.Avatar,
|
|
Points: entityUser.Points, // 如有积分表可补充
|
|
}, nil
|
|
}
|
|
|
|
func (s *sUser) Delete(ctx context.Context, in *model.UserDeleteIn) (out *model.UserDeleteOut, err error) {
|
|
// FIXME
|
|
|
|
return &model.UserDeleteOut{Success: true}, nil
|
|
}
|
|
|
|
func (s *sUser) Code(ctx context.Context, in *model.UserCodeIn) (out *model.UserCodeOut, err error) {
|
|
exist, err := dao.Users.Ctx(ctx).Where(do.Users{Email: in.Email}).Exist()
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("database_query_failed")
|
|
}
|
|
if !exist {
|
|
return nil, ecode.Params.Sub("email_not_found")
|
|
}
|
|
return &model.UserCodeOut{Success: true}, nil
|
|
}
|
|
|
|
func (s *sUser) EditPass(ctx context.Context, in *model.UserEditPassIn) (out *model.UserEditPassOut, err error) {
|
|
exist, err := dao.Users.Ctx(ctx).Where(do.Users{Email: in.Email}).Exist()
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("database_query_failed")
|
|
}
|
|
if !exist {
|
|
return nil, ecode.Params.Sub("email_not_found")
|
|
}
|
|
if in.Sign != "123456" {
|
|
return nil, ecode.Params.Sub("sign_error")
|
|
}
|
|
if in.Password != in.Password2 {
|
|
return nil, ecode.Password.Sub("password_mismatch")
|
|
}
|
|
hash, err := encrypt.EncryptPassword(in.Password)
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("password_encryption_failed")
|
|
}
|
|
_, err = dao.Users.Ctx(ctx).Where(do.Users{Email: in.Email}).Data(do.Users{PasswordHash: hash}).Update()
|
|
if err != nil {
|
|
return nil, ecode.Fail.Sub("password_update_failed")
|
|
}
|
|
return &model.UserEditPassOut{
|
|
Success: true,
|
|
}, nil
|
|
}
|