createProductLogic.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package product
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "encoding/hex"
  6. "fmt"
  7. "time"
  8. "perms-system-server/internal/consts"
  9. authHelper "perms-system-server/internal/logic/auth"
  10. productModel "perms-system-server/internal/model/product"
  11. "perms-system-server/internal/model/productmember"
  12. userModel "perms-system-server/internal/model/user"
  13. "perms-system-server/internal/response"
  14. "perms-system-server/internal/svc"
  15. "perms-system-server/internal/types"
  16. "github.com/zeromicro/go-zero/core/logx"
  17. "github.com/zeromicro/go-zero/core/stores/sqlx"
  18. "golang.org/x/crypto/bcrypt"
  19. )
  20. type CreateProductLogic struct {
  21. logx.Logger
  22. ctx context.Context
  23. svcCtx *svc.ServiceContext
  24. }
  25. func NewCreateProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateProductLogic {
  26. return &CreateProductLogic{
  27. Logger: logx.WithContext(ctx),
  28. ctx: ctx,
  29. svcCtx: svcCtx,
  30. }
  31. }
  32. func (l *CreateProductLogic) CreateProduct(req *types.CreateProductReq) (resp *types.CreateProductResp, err error) {
  33. if err := authHelper.RequireSuperAdmin(l.ctx); err != nil {
  34. return nil, err
  35. }
  36. _, findErr := l.svcCtx.SysProductModel.FindOneByCode(l.ctx, req.Code)
  37. if findErr == nil {
  38. return nil, response.ErrConflict("产品编码已存在")
  39. }
  40. appKey, err := generateRandomHex(32)
  41. if err != nil {
  42. return nil, err
  43. }
  44. appSecret, err := generateRandomHex(64)
  45. if err != nil {
  46. return nil, err
  47. }
  48. now := time.Now().Unix()
  49. adminUsername := fmt.Sprintf("admin_%s", req.Code)
  50. adminPassword, err := generateRandomHex(8)
  51. if err != nil {
  52. return nil, err
  53. }
  54. hashedPwd, err := bcrypt.GenerateFromPassword([]byte(adminPassword), bcrypt.DefaultCost)
  55. if err != nil {
  56. return nil, err
  57. }
  58. var productId int64
  59. err = l.svcCtx.SysProductModel.TransactCtx(l.ctx, func(ctx context.Context, session sqlx.Session) error {
  60. result, err := l.svcCtx.SysProductModel.InsertWithTx(ctx, session, &productModel.SysProduct{
  61. Code: req.Code,
  62. Name: req.Name,
  63. AppKey: appKey,
  64. AppSecret: appSecret,
  65. Remark: req.Remark,
  66. Status: consts.StatusEnabled,
  67. CreateTime: now,
  68. UpdateTime: now,
  69. })
  70. if err != nil {
  71. return err
  72. }
  73. productId, _ = result.LastInsertId()
  74. userResult, err := l.svcCtx.SysUserModel.InsertWithTx(ctx, session, &userModel.SysUser{
  75. Username: adminUsername,
  76. Password: string(hashedPwd),
  77. Nickname: fmt.Sprintf("%s管理员", req.Name),
  78. IsSuperAdmin: consts.IsSuperAdminNo,
  79. MustChangePassword: consts.MustChangePasswordYes,
  80. Status: consts.StatusEnabled,
  81. CreateTime: now,
  82. UpdateTime: now,
  83. })
  84. if err != nil {
  85. return err
  86. }
  87. userId, _ := userResult.LastInsertId()
  88. _, err = l.svcCtx.SysProductMemberModel.InsertWithTx(ctx, session, &productmember.SysProductMember{
  89. ProductCode: req.Code,
  90. UserId: userId,
  91. MemberType: consts.MemberTypeAdmin,
  92. Status: consts.StatusEnabled,
  93. CreateTime: now,
  94. UpdateTime: now,
  95. })
  96. return err
  97. })
  98. if err != nil {
  99. return nil, err
  100. }
  101. return &types.CreateProductResp{
  102. Id: productId,
  103. Code: req.Code,
  104. AppKey: appKey,
  105. AppSecret: appSecret,
  106. AdminUser: adminUsername,
  107. AdminPassword: adminPassword,
  108. }, nil
  109. }
  110. func generateRandomHex(length int) (string, error) {
  111. b := make([]byte, length)
  112. if _, err := rand.Read(b); err != nil {
  113. return "", fmt.Errorf("generate random bytes failed: %w", err)
  114. }
  115. return hex.EncodeToString(b)[:length], nil
  116. }