admin_user.go 8.4 KB
package service

import (
	"crypto/sha1"
	"fmt"

	"gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/adminUser/command"
	"gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/adminUser/query"
	"gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/factory"
	"gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain"
	"gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/dao"
	"gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/lib"
)

//AdminUserService 管理员相关服务
type AdminUserService struct {
}

func NewAdminUserService(option map[string]interface{}) *AdminUserService {
	newAdminUserService := new(AdminUserService)
	return newAdminUserService
}

func (adminUserSrv AdminUserService) GetAdminUser(getAdminUserQuery *query.GetAdminUserQuery) (*domain.AdminUser, error) {
	//实际业务
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	}
	var (
		adminuserRepository domain.AdminUserRepository
		adminuser           *domain.AdminUser
	)
	if value, err := factory.CreateAdminUserRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	}); err != nil {
		return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		adminuserRepository = value
	}
	adminuser, err = adminuserRepository.FindOne(domain.AdminUserFindOneQuery{
		AccountEqual: getAdminUserQuery.AdminAccount,
		AdminUserId:  getAdminUserQuery.Id,
	})
	if err != nil {
		return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	}
	return adminuser, nil
}

func (adminUserSrv AdminUserService) SaveAdminUser(saveUserCmd *command.SaveAdminUserCommand) (*domain.AdminUser, error) {
	if err := saveUserCmd.ValidateCommand(); err != nil {
		return nil, lib.ThrowError(lib.ARG_ERROR, err.Error())
	}
	//实际业务
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	var (
		adminuserRepository domain.AdminUserRepository
		adminuser           *domain.AdminUser
	)
	if value, err := factory.CreateAdminUserRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	}); err != nil {
		return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		adminuserRepository = value
	}

	//获取权限
	var (
		permissionRepository domain.AdminPermissionRepository
		permissions          []domain.AdminPermission
	)
	if value, err := factory.CreateAdminPermissionRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	}); err != nil {
		return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		permissionRepository = value
	}
	permissions, err = permissionRepository.Find(map[string]interface{}{
		"IdsIn": saveUserCmd.PermissionId,
	})
	if err != nil {
		return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	}
	for i := range permissions {
		if permissions[i].Code == domain.PERMINSSION_ADMIN_USER {
			return nil, lib.ThrowError(lib.BUSINESS_ERROR, "操作异常")
		}
	}
	permissionBases := []domain.AdminPermissionBase{}

	for i := range permissions {
		p := domain.AdminPermissionBase{
			Id: permissions[i].Id, Code: permissions[i].Code,
		}
		permissionBases = append(permissionBases, p)
	}
	//账号是否有变更
	var accountChange bool
	if saveUserCmd.Id > 0 {
		//更新数据
		adminuser, err = adminuserRepository.FindOne(domain.AdminUserFindOneQuery{
			AdminUserId: saveUserCmd.Id,
		})
		if err != nil {
			return nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
		}
		if adminuser.Account != saveUserCmd.Account {
			accountChange = true
		}
		adminuser.Account = saveUserCmd.Account
		adminuser.AdminName = saveUserCmd.Name
		adminuser.IsUsable = saveUserCmd.IsUsable
		if !adminuser.IsDefault {
			adminuser.Permission = permissionBases
		}

	} else {
		//添加新数据
		accountChange = true
		defaultPwd := fmt.Sprintf("%x", sha1.Sum([]byte("123456")))
		adminuser = &domain.AdminUser{
			Id:         saveUserCmd.Id,
			Account:    saveUserCmd.Account,
			Password:   defaultPwd,
			AdminName:  saveUserCmd.Name,
			IsUsable:   saveUserCmd.IsUsable,
			Permission: permissionBases,
		}
	}
	if accountChange {
		//检查账号是否已存在
		var (
			adminuserDao *dao.AdminUserDao
		)
		if v, err := factory.CreateAdminUserkDao(map[string]interface{}{
			"transactionContext": transactionContext,
		}); err != nil {
			return nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
		} else {
			adminuserDao = v
		}
		ok, err := adminuserDao.AdminUserAccountExist(saveUserCmd.Account)
		if err != nil {
			return nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
		}
		if ok {
			return nil, lib.ThrowError(lib.BUSINESS_ERROR, "账号已存在")
		}
	}

	adminuser, err = adminuserRepository.Save(*adminuser)
	if err != nil {
		return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	}
	transactionContext.CommitTransaction()
	return adminuser, nil
}

func (adminUserSrv AdminUserService) PageListAdminUser(listAdminUserQuery *query.ListAdminUserQuery) ([]domain.AdminUser, int, error) {
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, 0, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	}
	var (
		adminuserRepository domain.AdminUserRepository
		adminusers          []domain.AdminUser
		cnt                 int
	)
	if value, err := factory.CreateAdminUserRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	}); err != nil {
		return nil, 0, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		adminuserRepository = value
	}
	adminusers, err = adminuserRepository.Find(domain.AdminUserFindQuery{
		AccountLike: listAdminUserQuery.AdminAccountMatch,
		Offset:      listAdminUserQuery.Offset,
		Limit:       listAdminUserQuery.Limit,
	})
	if err != nil {
		return nil, 0, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	}
	cnt, err = adminuserRepository.CountAll(domain.AdminUserFindQuery{
		AccountLike: listAdminUserQuery.AdminAccountMatch,
	})
	if err != nil {
		return nil, 0, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	}
	return adminusers, cnt, nil
}

func (adminUserSrv AdminUserService) UpdateAdminPassword(updatecmd command.UpdateAdminUserPwdCommand) error {
	if err := updatecmd.ValidateCommand(); err != nil {
		return lib.ThrowError(lib.ARG_ERROR, err.Error())
	}
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()

	var (
		adminuserDao *dao.AdminUserDao
	)
	if v, err := factory.CreateAdminUserkDao(map[string]interface{}{
		"transactionContext": transactionContext,
	}); err != nil {
		return lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	} else {
		adminuserDao = v
	}
	err = adminuserDao.UpdatePassword(updatecmd.Id, updatecmd.Password)
	if err != nil {
		return lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	}
	transactionContext.CommitTransaction()
	return nil
}

func (adminUserSrv AdminUserService) UpdateAdminIsUsable(uid int64, isUsable bool) error {
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	var (
		adminuserDao *dao.AdminUserDao
	)
	if v, err := factory.CreateAdminUserkDao(map[string]interface{}{
		"transactionContext": transactionContext,
	}); err != nil {
		return lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
	} else {
		adminuserDao = v
	}
	if ok, err := adminuserDao.AdminUserIsDefault(uid); err != nil {
		return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	} else if ok {
		return lib.ThrowError(lib.BUSINESS_ERROR, "请勿禁用超级管理员")
	}
	err = adminuserDao.UpdateIsUsable(uid, isUsable)
	if err != nil {
		return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
	}
	transactionContext.CommitTransaction()
	return nil
}