123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- package service
- import (
- "context"
- "fmt"
- "github.com/pkg/errors"
- "golang.org/x/crypto/bcrypt"
- "gorm.io/gorm"
- "sghgogs.com/sghblog/authorization-service/domain/model/base"
- req "sghgogs.com/sghblog/authorization-service/domain/model/request"
- pb "sghgogs.com/sghblog/authorization-service/proto"
- "sghgogs.com/sghblog/authorization-service/utils/authutil"
- "sghgogs.com/sghblog/common"
- "sghgogs.com/sghblog/common/errorcode"
- "time"
- )
- func (s *Service) GetAdminUser(userId int64) (*pb.AdminUser, error) {
- var rsp pb.AdminUser
- if exists, err := s.Repository.IsAdminUserExists(userId); err != nil {
- return &rsp, errorcode.New("authorization service", err.Error(), 500)
- } else {
- if !exists {
- return &rsp, errorcode.New("authorization service", common.ErrorMessage[common.AccountDoesNotExist], 400)
- }
- }
- user, err := s.Repository.GetAdminUser(userId)
- if err != nil {
- return &rsp, errorcode.New("authorization service", err.Error(), 500)
- }
- var objUser pb.AdminUser
- common.SwapTo(user, &objUser)
- objUser.CreatedAt = ConvertTimeToInt64(user.CreatedAt)
- objUser.UpdatedAt = ConvertTimeToInt64(*user.UpdatedAt)
- objUser.Teams = base.TeamsToProto(user)
- objUser.Roles = base.RolesToProto(user)
- objUser.Status = user.Status
- return &objUser, nil
- }
- func (s *Service) ListAdminUsers(query *pb.ListAdminUsersRequest) ([]*pb.AdminUser, int64, error) {
- adminUsers, totalCount, err := s.Repository.ListAdminUsers(query)
- if err != nil {
- if errors.Is(err, gorm.ErrRecordNotFound) {
- return make([]*pb.AdminUser, 0), 0, nil // 记录不存在,角色不存在
- } else {
- return make([]*pb.AdminUser, 0), 0, err
- }
- }
- users := make([]*pb.AdminUser, 0)
- for _, item := range adminUsers {
- var user *pb.AdminUser
- common.SwapTo(item, &user)
- user.CreatedAt = ConvertTimeToInt64(item.CreatedAt)
- user.UpdatedAt = ConvertTimeToInt64(*item.UpdatedAt)
- user.Roles = base.RolesToProto(item)
- user.Teams = base.TeamsToProto(item)
- users = append(users, user)
- }
- return users, totalCount, nil
- }
- func (s *Service) RetrieveEnabledUsers() ([]*pb.AdminUser, error) {
- users := make([]*pb.AdminUser, 0)
- enabledUsers, err := s.Repository.RetrieveEnabledUsers()
- if err != nil {
- if errors.Is(err, gorm.ErrRecordNotFound) {
- return users, nil
- }
- return users, errorcode.New("authorization service", err.Error(), 500)
- }
- for _, user := range enabledUsers {
- users = append(users, &pb.AdminUser{
- Id: user.ID,
- Username: user.Username,
- })
- }
- return users, nil
- }
- // hashPassword 使用 bcrypt 对密码进行哈希
- func hashPassword(password string) (string, error) {
- hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
- if err != nil {
- return "", err
- }
- return string(hash), nil
- }
- func (s *Service) CreateAdminUser(adminUser *pb.CreateAdminUserRequest) error {
- nowTime := time.Now()
- password, _ := hashPassword(adminUser.Password)
- user := req.AdminUser{
- Username: adminUser.Username,
- Password: password,
- PhoneNumber: adminUser.PhoneNumber,
- Email: adminUser.Email,
- Avatar: adminUser.Avatar,
- Status: pb.StatusEnum_ENABLED,
- IsReserved: false,
- CreatedAt: nowTime,
- UpdatedAt: nil,
- }
- if err := s.Repository.CreateAdminUser(&user, adminUser.Roles, adminUser.Teams); err != nil {
- return errorcode.New("authorization service", err.Error(), 400)
- }
- return nil
- }
- func (s *Service) UpdateAdminUser(adminUser *pb.UpdateAdminUserRequest) error {
- // 获取权限ID作为锁的键
- lockKey := fmt.Sprintf("update_admin_user_%d", adminUser.Id)
- lock := authutil.JWTAuthService.Mu.NewMutex(lockKey)
- // 获取锁,保证原子性
- if err := lock.Lock(); err != nil {
- return err
- }
- defer lock.Unlock()
- if exists, err := s.Repository.IsAdminUserExists(adminUser.Id); err != nil {
- return errorcode.New("authorization service", err.Error(), 500)
- } else {
- if !exists {
- return errorcode.New("authorization service", common.ErrorMessage[common.AccountDoesNotExist], 400)
- }
- }
- if err := s.Repository.UpdateAdminUser(adminUser); err != nil {
- return errorcode.New("authorization service", err.Error(), 500)
- }
- return nil
- }
- func (s *Service) DeleteAdminUser(ctx context.Context, userID int64) error {
- // 获取权限ID作为锁的键
- lockKey := fmt.Sprintf("delete_admin_user_%d", userID)
- lock := authutil.JWTAuthService.Mu.NewMutex(lockKey)
- // 获取锁,保证原子性
- if err := lock.Lock(); err != nil {
- return err
- }
- defer lock.Unlock()
- if exists, err := s.Repository.IsAdminUserExists(userID); err != nil {
- return errorcode.New("authorization service", err.Error(), 500)
- } else {
- if !exists {
- return errorcode.New("authorization service", common.ErrorMessage[common.AccountDoesNotExist], 400)
- }
- }
- if err := s.Repository.DeleteAdminUser(userID); err != nil {
- return errorcode.New("authorization service", err.Error(), 500)
- }
- return nil
- }
- func (s *Service) ToggleAdminUser(user *pb.ToggleAdminUserRequest) error {
- // 获取权限ID作为锁的键
- lockKey := fmt.Sprintf("toggle_admin_user_%d", user.UserId)
- lock := authutil.JWTAuthService.Mu.NewMutex(lockKey)
- // 获取锁,保证原子性
- if err := lock.Lock(); err != nil {
- return err
- }
- defer lock.Unlock()
- if exists, err := s.Repository.IsAdminUserExists(user.UserId); err != nil {
- return errorcode.New("authorization service", err.Error(), 500)
- } else {
- if !exists {
- return errorcode.New("authorization service", common.ErrorMessage[common.AccountDoesNotExist], 400)
- }
- }
- if err := s.Repository.ToggleAdminUser(user); err != nil {
- return errorcode.New("authorization service", err.Error(), 500)
- }
- return nil
- }
|