Merge branch 'dev' of http://gitlab.fjmaimaimai.com/mmm-go-pp/partner01 into feat/order-domain
merge
正在显示
36 个修改的文件
包含
1678 行增加
和
7 行删除
| @@ -21,9 +21,7 @@ metadata: | @@ -21,9 +21,7 @@ metadata: | ||
| 21 | - ref: status | 21 | - ref: status |
| 22 | required: true | 22 | required: true |
| 23 | - ref: adminType | 23 | - ref: adminType |
| 24 | - required: true | ||
| 25 | - - ref: status | ||
| 26 | - required: true | 24 | + required: true |
| 27 | - ref: accessPartners | 25 | - ref: accessPartners |
| 28 | required: true | 26 | required: true |
| 29 | - ref: createAt | 27 | - ref: createAt |
| @@ -5,6 +5,7 @@ go 1.16 | @@ -5,6 +5,7 @@ go 1.16 | ||
| 5 | require ( | 5 | require ( |
| 6 | github.com/ajg/form v1.5.1 // indirect | 6 | github.com/ajg/form v1.5.1 // indirect |
| 7 | github.com/beego/beego/v2 v2.0.1 | 7 | github.com/beego/beego/v2 v2.0.1 |
| 8 | + github.com/dgrijalva/jwt-go v3.2.0+incompatible | ||
| 8 | github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect | 9 | github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect |
| 9 | github.com/fatih/structs v1.1.0 // indirect | 10 | github.com/fatih/structs v1.1.0 // indirect |
| 10 | github.com/gavv/httpexpect v2.0.0+incompatible | 11 | github.com/gavv/httpexpect v2.0.0+incompatible |
| @@ -44,6 +44,7 @@ github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGii | @@ -44,6 +44,7 @@ github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGii | ||
| 44 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | 44 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
| 45 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | 45 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= |
| 46 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | 46 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
| 47 | +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= | ||
| 47 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= | 48 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= |
| 48 | github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= | 49 | github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= |
| 49 | github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= | 50 | github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= |
pkg/application/auth/command/access_token.go
0 → 100644
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + | ||
| 6 | + "github.com/beego/beego/v2/core/validation" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type AccessTokenCommand struct { | ||
| 10 | + // Attribute描述 | ||
| 11 | + AuthCode string `json:"authCode,omitempty"` | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +func (accessTokenCommand *AccessTokenCommand) Valid(validation *validation.Validation) { | ||
| 15 | + | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (accessTokenCommand *AccessTokenCommand) ValidateCommand() error { | ||
| 19 | + valid := validation.Validation{} | ||
| 20 | + b, err := valid.Valid(accessTokenCommand) | ||
| 21 | + if err != nil { | ||
| 22 | + return err | ||
| 23 | + } | ||
| 24 | + if !b { | ||
| 25 | + for _, validErr := range valid.Errors { | ||
| 26 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 27 | + } | ||
| 28 | + } | ||
| 29 | + return nil | ||
| 30 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + | ||
| 6 | + "github.com/beego/beego/v2/core/validation" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type ChangePasswordCommand struct { | ||
| 10 | + // 旧密码 | ||
| 11 | + OldPwd string `json:"oldPwd,omitempty"` | ||
| 12 | + // 新密码 | ||
| 13 | + NewPwd string `json:"newPwd,omitempty"` | ||
| 14 | + // 确认密码 | ||
| 15 | + ConfirmPwd string `json:"confirmPwd,omitempty"` | ||
| 16 | + // 手机号 | ||
| 17 | + Phone string `json:"phone,omitempty"` | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func (changePasswordCommand *ChangePasswordCommand) Valid(validation *validation.Validation) { | ||
| 21 | + | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +func (changePasswordCommand *ChangePasswordCommand) ValidateCommand() error { | ||
| 25 | + valid := validation.Validation{} | ||
| 26 | + b, err := valid.Valid(changePasswordCommand) | ||
| 27 | + if err != nil { | ||
| 28 | + return err | ||
| 29 | + } | ||
| 30 | + if !b { | ||
| 31 | + for _, validErr := range valid.Errors { | ||
| 32 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 33 | + } | ||
| 34 | + } | ||
| 35 | + return nil | ||
| 36 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + | ||
| 6 | + "github.com/beego/beego/v2/core/validation" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type LoginByCompanyCommand struct { | ||
| 10 | + // 1.高管 2.合伙人 4:游客 | ||
| 11 | + UserType int `json:"userType" valid:"Required"` | ||
| 12 | + // 凭证 | ||
| 13 | + Credentials string `json:"credentials" valid:"Required"` | ||
| 14 | + // 用户id | ||
| 15 | + UserId int64 `json:"userId" valid:"Required"` | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (loginByCompanyCommand *LoginByCompanyCommand) Valid(validation *validation.Validation) { | ||
| 19 | + | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +func (loginByCompanyCommand *LoginByCompanyCommand) ValidateCommand() error { | ||
| 23 | + valid := validation.Validation{} | ||
| 24 | + b, err := valid.Valid(loginByCompanyCommand) | ||
| 25 | + if err != nil { | ||
| 26 | + return err | ||
| 27 | + } | ||
| 28 | + if !b { | ||
| 29 | + for _, validErr := range valid.Errors { | ||
| 30 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 31 | + } | ||
| 32 | + } | ||
| 33 | + return nil | ||
| 34 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + | ||
| 6 | + "github.com/beego/beego/v2/core/validation" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type RefreshTokenCommand struct { | ||
| 10 | + // refreshToken | ||
| 11 | + RefreshToken string `json:"refreshToken,omitempty"` | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +func (refreshTokenCommand *RefreshTokenCommand) Valid(validation *validation.Validation) { | ||
| 15 | + | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (refreshTokenCommand *RefreshTokenCommand) ValidateCommand() error { | ||
| 19 | + valid := validation.Validation{} | ||
| 20 | + b, err := valid.Valid(refreshTokenCommand) | ||
| 21 | + if err != nil { | ||
| 22 | + return err | ||
| 23 | + } | ||
| 24 | + if !b { | ||
| 25 | + for _, validErr := range valid.Errors { | ||
| 26 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 27 | + } | ||
| 28 | + } | ||
| 29 | + return nil | ||
| 30 | +} |
pkg/application/auth/command/revoke.go
0 → 100644
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + | ||
| 6 | + "github.com/beego/beego/v2/core/validation" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type RevokeCommand struct { | ||
| 10 | +} | ||
| 11 | + | ||
| 12 | +func (revokeCommand *RevokeCommand) Valid(validation *validation.Validation) { | ||
| 13 | + validation.SetError("CustomValid", "未实现的自定义认证") | ||
| 14 | +} | ||
| 15 | + | ||
| 16 | +func (revokeCommand *RevokeCommand) ValidateCommand() error { | ||
| 17 | + valid := validation.Validation{} | ||
| 18 | + b, err := valid.Valid(revokeCommand) | ||
| 19 | + if err != nil { | ||
| 20 | + return err | ||
| 21 | + } | ||
| 22 | + if !b { | ||
| 23 | + for _, validErr := range valid.Errors { | ||
| 24 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 25 | + } | ||
| 26 | + } | ||
| 27 | + return nil | ||
| 28 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + | ||
| 6 | + "github.com/beego/beego/v2/core/validation" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type SendSmsCodeCommand struct { | ||
| 10 | + // 手机号 | ||
| 11 | + Phone string `json:"phone,omitempty"` | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +func (sendSmsCodeCommand *SendSmsCodeCommand) Valid(validation *validation.Validation) { | ||
| 15 | + validation.SetError("CustomValid", "未实现的自定义认证") | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (sendSmsCodeCommand *SendSmsCodeCommand) ValidateCommand() error { | ||
| 19 | + valid := validation.Validation{} | ||
| 20 | + b, err := valid.Valid(sendSmsCodeCommand) | ||
| 21 | + if err != nil { | ||
| 22 | + return err | ||
| 23 | + } | ||
| 24 | + if !b { | ||
| 25 | + for _, validErr := range valid.Errors { | ||
| 26 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 27 | + } | ||
| 28 | + } | ||
| 29 | + return nil | ||
| 30 | +} |
pkg/application/auth/query/login.go
0 → 100644
| 1 | +package query | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + | ||
| 6 | + "github.com/beego/beego/v2/core/validation" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +type LoginQuery struct { | ||
| 10 | + // 手机号 | ||
| 11 | + Phone string `json:"phone,omitempty"` | ||
| 12 | + // signInPassword(密码登录) 或 signInCaptcha(验证码登录)或signInCredentials(凭证登录) | ||
| 13 | + GrantType string `json:"grantType,omitempty"` | ||
| 14 | + // 密码(grantType = signInPassword) | ||
| 15 | + Password string `json:"password,omitempty"` | ||
| 16 | + // 验证码(grantType = signInCaptcha) | ||
| 17 | + Captcha string `json:"captcha,omitempty"` | ||
| 18 | + // 凭证(grantType = signInCredentials) | ||
| 19 | + Credentials string `json:"credentials,omitempty"` | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +func (loginQuery *LoginQuery) Valid(validation *validation.Validation) { | ||
| 23 | + | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +func (loginQuery *LoginQuery) ValidateQuery() error { | ||
| 27 | + valid := validation.Validation{} | ||
| 28 | + b, err := valid.Valid(loginQuery) | ||
| 29 | + if err != nil { | ||
| 30 | + return err | ||
| 31 | + } | ||
| 32 | + if !b { | ||
| 33 | + for _, validErr := range valid.Errors { | ||
| 34 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
| 35 | + } | ||
| 36 | + } | ||
| 37 | + return nil | ||
| 38 | +} |
pkg/application/auth/service/auth.go
0 → 100644
| 1 | +package service | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/linmadan/egglib-go/core/application" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/auth/command" | ||
| 6 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/auth/query" | ||
| 7 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/factory" | ||
| 8 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain" | ||
| 9 | + "math/rand" | ||
| 10 | + "strconv" | ||
| 11 | + "strings" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +// 认证服务 | ||
| 15 | +type AuthService struct { | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +// 用户按公司登录 | ||
| 19 | +func (authService *AuthService) AccessToken(accessTokenCommand *command.AccessTokenCommand) (interface{}, error) { | ||
| 20 | + if err := accessTokenCommand.ValidateCommand(); err != nil { | ||
| 21 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 22 | + } | ||
| 23 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 24 | + if err != nil { | ||
| 25 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 26 | + } | ||
| 27 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 28 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 29 | + } | ||
| 30 | + defer func() { | ||
| 31 | + transactionContext.RollbackTransaction() | ||
| 32 | + }() | ||
| 33 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 34 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 35 | + } | ||
| 36 | + var claim = &domain.UserTokenClaim{} | ||
| 37 | + var result bool | ||
| 38 | + if result, err = domain.ValidToken(accessTokenCommand.AuthCode, claim); err != nil || !result { | ||
| 39 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 40 | + } | ||
| 41 | + userId := claim.UserId | ||
| 42 | + companyId := claim.CompanyId | ||
| 43 | + rspMapData := map[string]interface{}{ | ||
| 44 | + "accessToken": domain.SignToken(int64(userId), companyId), | ||
| 45 | + "refreshToken": domain.SignToken(int64(userId), companyId), | ||
| 46 | + } | ||
| 47 | + return rspMapData, nil | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +// 修改手机号密码 | ||
| 51 | +func (authService *AuthService) ChangePassword(changePasswordCommand *command.ChangePasswordCommand) (interface{}, error) { | ||
| 52 | + if err := changePasswordCommand.ValidateCommand(); err != nil { | ||
| 53 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 54 | + } | ||
| 55 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 56 | + if err != nil { | ||
| 57 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 58 | + } | ||
| 59 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 60 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 61 | + } | ||
| 62 | + defer func() { | ||
| 63 | + transactionContext.RollbackTransaction() | ||
| 64 | + }() | ||
| 65 | + var ( | ||
| 66 | + userAuth *domain.UserAuth | ||
| 67 | + ) | ||
| 68 | + UserAuthRepository, _ := factory.CreateUserAuthRepository(map[string]interface{}{"transactionContext": transactionContext}) | ||
| 69 | + userAuth, err = UserAuthRepository.FindOne(map[string]interface{}{"phone": changePasswordCommand.Phone}) | ||
| 70 | + if err != nil { | ||
| 71 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 72 | + } | ||
| 73 | + if !strings.EqualFold(userAuth.PhoneAuth.Password, changePasswordCommand.OldPwd) { | ||
| 74 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "密码有误!") | ||
| 75 | + } | ||
| 76 | + if err = userAuth.Update(map[string]interface{}{"password": changePasswordCommand.NewPwd}); err != nil { | ||
| 77 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 78 | + } | ||
| 79 | + if _, err = UserAuthRepository.Save(userAuth); err != nil { | ||
| 80 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 81 | + } | ||
| 82 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 83 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 84 | + } | ||
| 85 | + return nil, nil | ||
| 86 | +} | ||
| 87 | + | ||
| 88 | +// 用户登录 返回有权限的公司列表 | ||
| 89 | +func (authService *AuthService) Login(loginQuery *query.LoginQuery) (interface{}, error) { | ||
| 90 | + if err := loginQuery.ValidateQuery(); err != nil { | ||
| 91 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 92 | + } | ||
| 93 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 94 | + if err != nil { | ||
| 95 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 96 | + } | ||
| 97 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 98 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 99 | + } | ||
| 100 | + defer func() { | ||
| 101 | + transactionContext.RollbackTransaction() | ||
| 102 | + }() | ||
| 103 | + | ||
| 104 | + var ( | ||
| 105 | + userAuth *domain.UserAuth | ||
| 106 | + users []*domain.User | ||
| 107 | + rspMapData = make(map[string]interface{}) | ||
| 108 | + userCompanies []interface{} | ||
| 109 | + ) | ||
| 110 | + UserAuthRepository, _ := factory.CreateUserAuthRepository(map[string]interface{}{"transactionContext": transactionContext}) | ||
| 111 | + UserRepository, _ := factory.CreateUserRepository(map[string]interface{}{"transactionContext": transactionContext}) | ||
| 112 | + switch loginQuery.GrantType { | ||
| 113 | + case "signInPassword": | ||
| 114 | + if len(loginQuery.Password) == 0 { | ||
| 115 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "密码不能为空!") | ||
| 116 | + } | ||
| 117 | + userAuth, err = UserAuthRepository.FindOne(map[string]interface{}{"phone": loginQuery.Phone}) | ||
| 118 | + if err != nil { | ||
| 119 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 120 | + } | ||
| 121 | + if !strings.EqualFold(userAuth.PhoneAuth.Password, loginQuery.Password) { | ||
| 122 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "密码有误!") | ||
| 123 | + } | ||
| 124 | + case "signInCaptcha": | ||
| 125 | + case "signInCredentials": | ||
| 126 | + default: | ||
| 127 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "undefined grantType:"+loginQuery.GrantType) | ||
| 128 | + } | ||
| 129 | + _, users, err = UserRepository.Find(map[string]interface{}{"inUserIds": userAuth.Users, "status": domain.StatusEnable}) | ||
| 130 | + | ||
| 131 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 132 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 133 | + } | ||
| 134 | + credentials := "cred:" + strconv.Itoa(rand.Int()) | ||
| 135 | + rspMapData["credentials"] = credentials | ||
| 136 | + CompanyRepository, _ := factory.CreateCompanyRepository(map[string]interface{}{"transactionContext": transactionContext}) | ||
| 137 | + for i := range users { | ||
| 138 | + company, _ := CompanyRepository.FindOne(map[string]interface{}{"companyId": users[i].CompanyId, "status": domain.StatusEnable}) | ||
| 139 | + if company == nil { | ||
| 140 | + continue | ||
| 141 | + } | ||
| 142 | + item := map[string]interface{}{ | ||
| 143 | + "user": users[i], | ||
| 144 | + "company": company, | ||
| 145 | + } | ||
| 146 | + userCompanies = append(userCompanies, item) | ||
| 147 | + } | ||
| 148 | + return map[string]interface{}{"userCompanies": userCompanies, "credentials": credentials}, nil | ||
| 149 | +} | ||
| 150 | + | ||
| 151 | +// 用户按公司登录 | ||
| 152 | +func (authService *AuthService) LoginByCompany(loginByCompanyCommand *command.LoginByCompanyCommand) (interface{}, error) { | ||
| 153 | + if err := loginByCompanyCommand.ValidateCommand(); err != nil { | ||
| 154 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 155 | + } | ||
| 156 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 157 | + if err != nil { | ||
| 158 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 159 | + } | ||
| 160 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 161 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 162 | + } | ||
| 163 | + defer func() { | ||
| 164 | + transactionContext.RollbackTransaction() | ||
| 165 | + }() | ||
| 166 | + | ||
| 167 | + //todo:valid/refresh credentials | ||
| 168 | + if len(loginByCompanyCommand.Credentials) == 0 { | ||
| 169 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "credentials expire") | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + var user *domain.User | ||
| 173 | + UserRepository, _ := factory.CreateUserRepository(map[string]interface{}{"transactionContext": transactionContext}) | ||
| 174 | + user, err = UserRepository.FindOne(map[string]interface{}{"userId": loginByCompanyCommand.UserId, "userType": loginByCompanyCommand.UserType}) | ||
| 175 | + if err != nil { | ||
| 176 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 177 | + } | ||
| 178 | + CompanyRepository, _ := factory.CreateCompanyRepository(map[string]interface{}{"transactionContext": transactionContext}) | ||
| 179 | + company, err := CompanyRepository.FindOne(map[string]interface{}{"companyId": user.CompanyId, "status": domain.StatusEnable}) | ||
| 180 | + if err != nil { | ||
| 181 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 182 | + } | ||
| 183 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 184 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 185 | + } | ||
| 186 | + authCode := domain.SignToken(user.UserId, company.CompanyId) | ||
| 187 | + return map[string]interface{}{"user": user, "company": company, "authCode": authCode}, nil | ||
| 188 | +} | ||
| 189 | + | ||
| 190 | +// 更新授权令牌accessToken | ||
| 191 | +func (authService *AuthService) RefreshToken(refreshTokenCommand *command.RefreshTokenCommand) (interface{}, error) { | ||
| 192 | + if err := refreshTokenCommand.ValidateCommand(); err != nil { | ||
| 193 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 194 | + } | ||
| 195 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 196 | + if err != nil { | ||
| 197 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 198 | + } | ||
| 199 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 200 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 201 | + } | ||
| 202 | + defer func() { | ||
| 203 | + transactionContext.RollbackTransaction() | ||
| 204 | + }() | ||
| 205 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 206 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 207 | + } | ||
| 208 | + var claim = &domain.UserTokenClaim{} | ||
| 209 | + var result bool | ||
| 210 | + if result, err = domain.ValidToken(refreshTokenCommand.RefreshToken, claim); err != nil || !result { | ||
| 211 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 212 | + } | ||
| 213 | + userId := claim.UserId | ||
| 214 | + companyId := claim.CompanyId | ||
| 215 | + rspMapData := map[string]interface{}{ | ||
| 216 | + "accessToken": domain.SignToken(int64(userId), companyId), | ||
| 217 | + "refreshToken": domain.SignToken(int64(userId), companyId), | ||
| 218 | + } | ||
| 219 | + return rspMapData, nil | ||
| 220 | +} | ||
| 221 | + | ||
| 222 | +// 注销登录 | ||
| 223 | +func (authService *AuthService) Revoke(revokeCommand *command.RevokeCommand) (interface{}, error) { | ||
| 224 | + if err := revokeCommand.ValidateCommand(); err != nil { | ||
| 225 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 226 | + } | ||
| 227 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 228 | + if err != nil { | ||
| 229 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 230 | + } | ||
| 231 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 232 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 233 | + } | ||
| 234 | + defer func() { | ||
| 235 | + transactionContext.RollbackTransaction() | ||
| 236 | + }() | ||
| 237 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 238 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 239 | + } | ||
| 240 | + return nil, nil | ||
| 241 | +} | ||
| 242 | + | ||
| 243 | +// 发送验证码 | ||
| 244 | +func (authService *AuthService) SendSmsCode(sendSmsCodeCommand *command.SendSmsCodeCommand) (interface{}, error) { | ||
| 245 | + if err := sendSmsCodeCommand.ValidateCommand(); err != nil { | ||
| 246 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 247 | + } | ||
| 248 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 249 | + if err != nil { | ||
| 250 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 251 | + } | ||
| 252 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 253 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 254 | + } | ||
| 255 | + defer func() { | ||
| 256 | + transactionContext.RollbackTransaction() | ||
| 257 | + }() | ||
| 258 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 259 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 260 | + } | ||
| 261 | + return nil, nil | ||
| 262 | +} | ||
| 263 | + | ||
| 264 | +func NewAuthService(options map[string]interface{}) *AuthService { | ||
| 265 | + newAuthService := &AuthService{} | ||
| 266 | + return newAuthService | ||
| 267 | +} |
| @@ -45,3 +45,19 @@ func CreateGoodsRepository(options map[string]interface{}) (domain.GoodsReposito | @@ -45,3 +45,19 @@ func CreateGoodsRepository(options map[string]interface{}) (domain.GoodsReposito | ||
| 45 | } | 45 | } |
| 46 | return repository.NewGoodsRepository(transactionContext) | 46 | return repository.NewGoodsRepository(transactionContext) |
| 47 | } | 47 | } |
| 48 | + | ||
| 49 | +func CreateUserRepository(options map[string]interface{}) (domain.UserRepository, error) { | ||
| 50 | + var transactionContext *pg.TransactionContext | ||
| 51 | + if value, ok := options["transactionContext"]; ok { | ||
| 52 | + transactionContext = value.(*pg.TransactionContext) | ||
| 53 | + } | ||
| 54 | + return repository.NewUserRepository(transactionContext) | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +func CreateCompanyRepository(options map[string]interface{}) (domain.CompanyRepository, error) { | ||
| 58 | + var transactionContext *pg.TransactionContext | ||
| 59 | + if value, ok := options["transactionContext"]; ok { | ||
| 60 | + transactionContext = value.(*pg.TransactionContext) | ||
| 61 | + } | ||
| 62 | + return repository.NewCompanyRepository(transactionContext) | ||
| 63 | +} |
pkg/domain/auth.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/dgrijalva/jwt-go" | ||
| 5 | + eggJwt "github.com/linmadan/egglib-go/utils/jwt" | ||
| 6 | + "time" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +const ( | ||
| 10 | + secret = "$^%$Rdefault&*^(*&" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +const ( | ||
| 14 | + AccessTokenExpire = 3600 | ||
| 15 | +) | ||
| 16 | + | ||
| 17 | +type UserTokenClaim struct { | ||
| 18 | + jwt.StandardClaims | ||
| 19 | + UserId int64 `json:"userId"` | ||
| 20 | + CompanyId int64 `json:"companyId"` | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +func NewUserTokenClaim(userId, companyId int64, expire int64) UserTokenClaim { | ||
| 24 | + return UserTokenClaim{ | ||
| 25 | + UserId: userId, | ||
| 26 | + CompanyId: companyId, | ||
| 27 | + StandardClaims: jwt.StandardClaims{ExpiresAt: expire}, | ||
| 28 | + } | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +func SignToken(userId int64, companyId int64) string { | ||
| 32 | + claim := NewUserTokenClaim(int64(userId), companyId, time.Now().Add(time.Second*AccessTokenExpire).Unix()) | ||
| 33 | + token, _ := eggJwt.Sign(claim, secret, "") | ||
| 34 | + return token | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +func ValidToken(token string, claims *UserTokenClaim) (bool, error) { | ||
| 38 | + result, c, err := eggJwt.Valid(token, claims, secret) | ||
| 39 | + claims = c.Claims.(*UserTokenClaim) | ||
| 40 | + return result, err | ||
| 41 | +} |
pkg/domain/company.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import "time" | ||
| 4 | + | ||
| 5 | +// 公司信息 | ||
| 6 | +type Company struct { | ||
| 7 | + // 公司Id | ||
| 8 | + CompanyId int64 `json:"companyId"` | ||
| 9 | + // 公司信息 | ||
| 10 | + CompanyInfo *CompanyInfo `json:"companyInfo"` | ||
| 11 | + // 创建时间 | ||
| 12 | + CreateAt time.Time `json:"createAt"` | ||
| 13 | + // 更新时间 | ||
| 14 | + UpdateAt time.Time `json:"updateAt"` | ||
| 15 | + // 删除时间 | ||
| 16 | + DeleteAt time.Time `json:"deleteAt"` | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +type CompanyRepository interface { | ||
| 20 | + Save(company *Company) (*Company, error) | ||
| 21 | + Remove(company *Company) (*Company, error) | ||
| 22 | + FindOne(queryOptions map[string]interface{}) (*Company, error) | ||
| 23 | + Find(queryOptions map[string]interface{}) (int64, []*Company, error) | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +func (company *Company) Identify() interface{} { | ||
| 27 | + if company.CompanyId == 0 { | ||
| 28 | + return nil | ||
| 29 | + } | ||
| 30 | + return company.CompanyId | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | +func (company *Company) Update(data map[string]interface{}) error { | ||
| 34 | + if companyId, ok := data["companyId"]; ok { | ||
| 35 | + company.CompanyId = companyId.(int64) | ||
| 36 | + } | ||
| 37 | + if companyId, ok := data["companyId"]; ok { | ||
| 38 | + company.CompanyInfo.CompanyId = companyId.(int64) | ||
| 39 | + } | ||
| 40 | + if name, ok := data["name"]; ok { | ||
| 41 | + company.CompanyInfo.Name = name.(string) | ||
| 42 | + } | ||
| 43 | + if abbreviation, ok := data["abbreviation"]; ok { | ||
| 44 | + company.CompanyInfo.Abbreviation = abbreviation.(string) | ||
| 45 | + } | ||
| 46 | + if logo, ok := data["logo"]; ok { | ||
| 47 | + company.CompanyInfo.Logo = logo.(string) | ||
| 48 | + } | ||
| 49 | + if phone, ok := data["phone"]; ok { | ||
| 50 | + company.CompanyInfo.Phone = phone.(string) | ||
| 51 | + } | ||
| 52 | + if status, ok := data["status"]; ok { | ||
| 53 | + company.CompanyInfo.Status = status.(int64) | ||
| 54 | + } | ||
| 55 | + if remarks, ok := data["remarks"]; ok { | ||
| 56 | + company.CompanyInfo.Remarks = remarks.(string) | ||
| 57 | + } | ||
| 58 | + if enable, ok := data["enable"]; ok { | ||
| 59 | + company.CompanyInfo.Enable = enable.(int64) | ||
| 60 | + } | ||
| 61 | + return nil | ||
| 62 | +} |
pkg/domain/company_info.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +// 公司信息 | ||
| 4 | +type CompanyInfo struct { | ||
| 5 | + // 公司Id | ||
| 6 | + CompanyId int64 `json:"companyId"` | ||
| 7 | + // 公司名称 | ||
| 8 | + Name string `json:"name"` | ||
| 9 | + // 公司简称 | ||
| 10 | + Abbreviation string `json:"abbreviation"` | ||
| 11 | + // 公司logo | ||
| 12 | + Logo string `json:"logo"` | ||
| 13 | + // 公司联系电话 | ||
| 14 | + Phone string `json:"phone"` | ||
| 15 | + // 状态 1正常 2禁用 | ||
| 16 | + Status int64 `json:"status"` | ||
| 17 | + // 备注 | ||
| 18 | + Remarks string `json:"remarks"` | ||
| 19 | + // 是否有效【1:有效】【2:无效】 | ||
| 20 | + Enable int64 `json:"enable"` | ||
| 21 | + // 公司主管理员 | ||
| 22 | + Admin *UserInfo `json:"admin"` | ||
| 23 | +} |
pkg/domain/user.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import "time" | ||
| 4 | + | ||
| 5 | +const ( | ||
| 6 | + StatusEnable int64 = 1 | ||
| 7 | + StatusDisable int64 = 2 | ||
| 8 | +) | ||
| 9 | +const ( | ||
| 10 | + SuperAdministrator = 1 | ||
| 11 | + EnterpriseAdministrator = 10 | ||
| 12 | + NormalUser = 100 | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +// UserType | ||
| 16 | +const ( | ||
| 17 | + Manager = 1 | ||
| 18 | + Partner = 2 | ||
| 19 | + Guest = 3 | ||
| 20 | +) | ||
| 21 | + | ||
| 22 | +// 用户实体 | ||
| 23 | +type User struct { | ||
| 24 | + // 用户id | ||
| 25 | + UserId int64 `json:"userId"` | ||
| 26 | + // 1.高管 2.合伙人 4:游客 | ||
| 27 | + UserType int `json:"userType"` | ||
| 28 | + // 用户权限 | ||
| 29 | + Permissions []int `json:"permissions"` | ||
| 30 | + // 公司Id | ||
| 31 | + CompanyId int64 `json:"companyId"` | ||
| 32 | + // 用户信息 | ||
| 33 | + UserInfo *UserInfo `json:"userInfo"` | ||
| 34 | + // 合伙人信息 | ||
| 35 | + PartnerInfo *PartnerInfo `json:"partnerInfo"` | ||
| 36 | + // 状态 1正常 2禁用 | ||
| 37 | + Status int64 `json:"status"` | ||
| 38 | + // 管理员类型 1.超级管理员 10:企业管理员 100:普通用户 | ||
| 39 | + AdminType int `json:"adminType"` | ||
| 40 | + // 合伙人列表 用户类型为高管时有效 | ||
| 41 | + AccessPartners []int64 `json:"accessPartners"` | ||
| 42 | + // 创建时间 | ||
| 43 | + CreateAt time.Time `json:"createAt"` | ||
| 44 | + // 更新时间 | ||
| 45 | + UpdateAt time.Time `json:"updateAt"` | ||
| 46 | + // 删除时间 | ||
| 47 | + DeleteAt time.Time `json:"deleteAt"` | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +type UserRepository interface { | ||
| 51 | + Save(user *User) (*User, error) | ||
| 52 | + Remove(user *User) (*User, error) | ||
| 53 | + FindOne(queryOptions map[string]interface{}) (*User, error) | ||
| 54 | + Find(queryOptions map[string]interface{}) (int64, []*User, error) | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +func (user *User) Identify() interface{} { | ||
| 58 | + if user.UserId == 0 { | ||
| 59 | + return nil | ||
| 60 | + } | ||
| 61 | + return user.UserId | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +func (user *User) Update(data map[string]interface{}) error { | ||
| 65 | + if userId, ok := data["userId"]; ok { | ||
| 66 | + user.UserId = userId.(int64) | ||
| 67 | + } | ||
| 68 | + if userType, ok := data["userType"]; ok { | ||
| 69 | + user.UserType = userType.(int) | ||
| 70 | + } | ||
| 71 | + if permissions, ok := data["permissions"]; ok { | ||
| 72 | + user.Permissions = permissions.([]int) | ||
| 73 | + } | ||
| 74 | + if companyId, ok := data["companyId"]; ok { | ||
| 75 | + user.CompanyId = companyId.(int64) | ||
| 76 | + } | ||
| 77 | + if isPrincipal, ok := data["isPrincipal"]; ok { | ||
| 78 | + user.UserInfo.IsPrincipal = isPrincipal.(bool) | ||
| 79 | + } | ||
| 80 | + if uid, ok := data["uid"]; ok { | ||
| 81 | + user.UserInfo.Uid = uid.(int64) | ||
| 82 | + } | ||
| 83 | + if userAccount, ok := data["userAccount"]; ok { | ||
| 84 | + user.UserInfo.UserAccount = userAccount.(string) | ||
| 85 | + } | ||
| 86 | + if userAvatarUrl, ok := data["userAvatarUrl"]; ok { | ||
| 87 | + user.UserInfo.UserAvatarUrl = userAvatarUrl.(string) | ||
| 88 | + } | ||
| 89 | + if userName, ok := data["userName"]; ok { | ||
| 90 | + user.UserInfo.UserName = userName.(string) | ||
| 91 | + } | ||
| 92 | + if email, ok := data["email"]; ok { | ||
| 93 | + user.UserInfo.Email = email.(string) | ||
| 94 | + } | ||
| 95 | + if gender, ok := data["gender"]; ok { | ||
| 96 | + user.UserInfo.Gender = gender.(int) | ||
| 97 | + } | ||
| 98 | + if entryTime, ok := data["entryTime"]; ok { | ||
| 99 | + user.UserInfo.EntryTime = entryTime.(time.Time) | ||
| 100 | + } | ||
| 101 | + if extension, ok := data["extension"]; ok { | ||
| 102 | + user.UserInfo.Extension = extension.(string) | ||
| 103 | + } | ||
| 104 | + if workplace, ok := data["workplace"]; ok { | ||
| 105 | + user.UserInfo.Workplace = workplace.(string) | ||
| 106 | + } | ||
| 107 | + if privateNumber, ok := data["privateNumber"]; ok { | ||
| 108 | + user.UserInfo.PrivateNumber = privateNumber.(string) | ||
| 109 | + } | ||
| 110 | + if jobNumber, ok := data["jobNumber"]; ok { | ||
| 111 | + user.UserInfo.JobNumber = jobNumber.(string) | ||
| 112 | + } | ||
| 113 | + if partnerAccount, ok := data["partnerAccount"]; ok { | ||
| 114 | + user.PartnerInfo.PartnerAccount = partnerAccount.(string) | ||
| 115 | + } | ||
| 116 | + if partnerName, ok := data["partnerName"]; ok { | ||
| 117 | + user.PartnerInfo.PartnerName = partnerName.(string) | ||
| 118 | + } | ||
| 119 | + if regionName, ok := data["regionName"]; ok { | ||
| 120 | + user.PartnerInfo.RegionInfo.RegionName = regionName.(string) | ||
| 121 | + } | ||
| 122 | + if status, ok := data["status"]; ok { | ||
| 123 | + user.PartnerInfo.Status = status.(int64) | ||
| 124 | + } | ||
| 125 | + return nil | ||
| 126 | +} |
pkg/domain/user_info.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import "time" | ||
| 4 | + | ||
| 5 | +// 用户信息值对象 | ||
| 6 | +type UserInfo struct { | ||
| 7 | + // 是否是公司负责人 | ||
| 8 | + IsPrincipal bool `json:"isPrincipal"` | ||
| 9 | + // 统一用户id | ||
| 10 | + Uid int64 `json:"uid"` | ||
| 11 | + // 用户账号 | ||
| 12 | + UserAccount string `json:"userAccount"` | ||
| 13 | + // 用户头像URL | ||
| 14 | + UserAvatarUrl string `json:"userAvatarUrl"` | ||
| 15 | + // 用户名称 | ||
| 16 | + UserName string `json:"userName"` | ||
| 17 | + // 邮件地址 | ||
| 18 | + Email string `json:"email"` | ||
| 19 | + // 性别 | ||
| 20 | + Gender int `json:"gender"` | ||
| 21 | + // 入职时间 | ||
| 22 | + EntryTime time.Time `json:"entryTime"` | ||
| 23 | + // 分机 | ||
| 24 | + Extension string `json:"extension"` | ||
| 25 | + // 工作地 | ||
| 26 | + Workplace string `json:"workplace"` | ||
| 27 | + // 私人电话 | ||
| 28 | + PrivateNumber string `json:"privateNumber"` | ||
| 29 | + // 工号 | ||
| 30 | + JobNumber string `json:"jobNumber"` | ||
| 31 | +} |
| @@ -29,6 +29,8 @@ func init() { | @@ -29,6 +29,8 @@ func init() { | ||
| 29 | &models.UserAuth{}, | 29 | &models.UserAuth{}, |
| 30 | &models.Goods{}, | 30 | &models.Goods{}, |
| 31 | &models.Order{}, | 31 | &models.Order{}, |
| 32 | + &models.User{}, | ||
| 33 | + &models.Company{}, | ||
| 32 | } { | 34 | } { |
| 33 | err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ | 35 | err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ |
| 34 | Temp: false, | 36 | Temp: false, |
pkg/infrastructure/pg/models/company.go
0 → 100644
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain" | ||
| 5 | + "time" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +type Company struct { | ||
| 9 | + tableName string `pg:"companys,alias:company"` | ||
| 10 | + // 公司Id | ||
| 11 | + CompanyId int64 `pg:",pk"` | ||
| 12 | + // 公司信息 | ||
| 13 | + CompanyInfo *domain.CompanyInfo | ||
| 14 | + // 创建时间 | ||
| 15 | + CreateAt time.Time | ||
| 16 | + // 更新时间 | ||
| 17 | + UpdateAt time.Time | ||
| 18 | + // 删除时间 | ||
| 19 | + DeleteAt time.Time | ||
| 20 | +} |
pkg/infrastructure/pg/models/user.go
0 → 100644
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain" | ||
| 5 | + "time" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +type User struct { | ||
| 9 | + tableName string `pg:"users,alias:users"` | ||
| 10 | + // 用户id | ||
| 11 | + UserId int64 `pg:",pk"` | ||
| 12 | + // 1.高管 2.合伙人 4:游客 | ||
| 13 | + UserType int | ||
| 14 | + // 用户权限 | ||
| 15 | + Permissions []int `pg:",array"` | ||
| 16 | + // 公司Id | ||
| 17 | + CompanyId int64 | ||
| 18 | + // 用户信息 | ||
| 19 | + UserInfo *domain.UserInfo | ||
| 20 | + // 合伙人信息 | ||
| 21 | + PartnerInfo *domain.PartnerInfo | ||
| 22 | + // 状态 1正常 2禁用 | ||
| 23 | + Status int64 | ||
| 24 | + // 管理员类型 1.超级管理员 10:企业管理员 100:普通用户 | ||
| 25 | + AdminType int | ||
| 26 | + // 合伙人列表 用户类型为高管时有效 | ||
| 27 | + AccessPartners []int64 `pg:",array"` | ||
| 28 | + // 创建时间 | ||
| 29 | + CreateAt time.Time | ||
| 30 | + // 更新时间 | ||
| 31 | + UpdateAt time.Time | ||
| 32 | + // 删除时间 | ||
| 33 | + DeleteAt time.Time | ||
| 34 | +} |
| @@ -6,9 +6,9 @@ import ( | @@ -6,9 +6,9 @@ import ( | ||
| 6 | ) | 6 | ) |
| 7 | 7 | ||
| 8 | type UserAuth struct { | 8 | type UserAuth struct { |
| 9 | - tableName string `pg:"user_auth"` | 9 | + tableName string `pg:"user_auth,alias:user_auth"` |
| 10 | // 用户认证编号 | 10 | // 用户认证编号 |
| 11 | - UserAuthId int64 | 11 | + UserAuthId int64 `pg:",pk"` |
| 12 | // 用户id列表 | 12 | // 用户id列表 |
| 13 | Users []int64 `pg:",array"` | 13 | Users []int64 `pg:",array"` |
| 14 | // 手机认证 | 14 | // 手机认证 |
pkg/infrastructure/pg/transform/company.go
0 → 100644
| 1 | +package transform | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func TransformToCompanyDomainModelFromPgModels(companyModel *models.Company) (*domain.Company, error) { | ||
| 9 | + return &domain.Company{ | ||
| 10 | + CompanyId: companyModel.CompanyId, | ||
| 11 | + CompanyInfo: companyModel.CompanyInfo, | ||
| 12 | + CreateAt: companyModel.CreateAt, | ||
| 13 | + UpdateAt: companyModel.UpdateAt, | ||
| 14 | + DeleteAt: companyModel.DeleteAt, | ||
| 15 | + }, nil | ||
| 16 | +} |
pkg/infrastructure/pg/transform/user.go
0 → 100644
| 1 | +package transform | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func TransformToUserDomainModelFromPgModels(userModel *models.User) (*domain.User, error) { | ||
| 9 | + return &domain.User{ | ||
| 10 | + UserId: userModel.UserId, | ||
| 11 | + UserType: userModel.UserType, | ||
| 12 | + Permissions: userModel.Permissions, | ||
| 13 | + CompanyId: userModel.CompanyId, | ||
| 14 | + UserInfo: userModel.UserInfo, | ||
| 15 | + PartnerInfo: userModel.PartnerInfo, | ||
| 16 | + Status: userModel.Status, | ||
| 17 | + AdminType: userModel.AdminType, | ||
| 18 | + AccessPartners: userModel.AccessPartners, | ||
| 19 | + CreateAt: userModel.CreateAt, | ||
| 20 | + UpdateAt: userModel.UpdateAt, | ||
| 21 | + DeleteAt: userModel.DeleteAt, | ||
| 22 | + }, nil | ||
| 23 | +} |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/go-pg/pg/v10" | ||
| 6 | + | ||
| 7 | + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | ||
| 8 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 9 | + "github.com/linmadan/egglib-go/utils/snowflake" | ||
| 10 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain" | ||
| 11 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models" | ||
| 12 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/transform" | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +type CompanyRepository struct { | ||
| 16 | + transactionContext *pgTransaction.TransactionContext | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +func (repository *CompanyRepository) nextIdentify() (int64, error) { | ||
| 20 | + IdWorker, err := snowflake.NewIdWorker(1) | ||
| 21 | + if err != nil { | ||
| 22 | + return 0, err | ||
| 23 | + } | ||
| 24 | + id, err := IdWorker.NextId() | ||
| 25 | + return id, err | ||
| 26 | +} | ||
| 27 | +func (repository *CompanyRepository) Save(company *domain.Company) (*domain.Company, error) { | ||
| 28 | + sqlBuildFields := []string{ | ||
| 29 | + "company_id", | ||
| 30 | + "company_info", | ||
| 31 | + "create_at", | ||
| 32 | + "update_at", | ||
| 33 | + "delete_at", | ||
| 34 | + } | ||
| 35 | + insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) | ||
| 36 | + insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields) | ||
| 37 | + returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) | ||
| 38 | + updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "company_id") | ||
| 39 | + updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields) | ||
| 40 | + tx := repository.transactionContext.PgTx | ||
| 41 | + if company.Identify() == nil { | ||
| 42 | + companyId, err := repository.nextIdentify() | ||
| 43 | + if err != nil { | ||
| 44 | + return company, err | ||
| 45 | + } else { | ||
| 46 | + company.CompanyId = companyId | ||
| 47 | + } | ||
| 48 | + if _, err := tx.QueryOne( | ||
| 49 | + pg.Scan( | ||
| 50 | + &company.CompanyId, | ||
| 51 | + &company.CompanyInfo, | ||
| 52 | + &company.CreateAt, | ||
| 53 | + &company.UpdateAt, | ||
| 54 | + &company.DeleteAt, | ||
| 55 | + ), | ||
| 56 | + fmt.Sprintf("INSERT INTO companys (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet), | ||
| 57 | + company.CompanyId, | ||
| 58 | + company.CompanyInfo, | ||
| 59 | + company.CreateAt, | ||
| 60 | + company.UpdateAt, | ||
| 61 | + company.DeleteAt, | ||
| 62 | + ); err != nil { | ||
| 63 | + return company, err | ||
| 64 | + } | ||
| 65 | + } else { | ||
| 66 | + if _, err := tx.QueryOne( | ||
| 67 | + pg.Scan( | ||
| 68 | + &company.CompanyId, | ||
| 69 | + &company.CompanyInfo, | ||
| 70 | + &company.CreateAt, | ||
| 71 | + &company.UpdateAt, | ||
| 72 | + &company.DeleteAt, | ||
| 73 | + ), | ||
| 74 | + fmt.Sprintf("UPDATE companys SET %s WHERE company_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet), | ||
| 75 | + company.CompanyId, | ||
| 76 | + company.CompanyInfo, | ||
| 77 | + company.CreateAt, | ||
| 78 | + company.UpdateAt, | ||
| 79 | + company.DeleteAt, | ||
| 80 | + company.Identify(), | ||
| 81 | + ); err != nil { | ||
| 82 | + return company, err | ||
| 83 | + } | ||
| 84 | + } | ||
| 85 | + return company, nil | ||
| 86 | +} | ||
| 87 | +func (repository *CompanyRepository) Remove(company *domain.Company) (*domain.Company, error) { | ||
| 88 | + tx := repository.transactionContext.PgTx | ||
| 89 | + companyModel := new(models.Company) | ||
| 90 | + companyModel.CompanyId = company.Identify().(int64) | ||
| 91 | + if _, err := tx.Model(companyModel).WherePK().Delete(); err != nil { | ||
| 92 | + return company, err | ||
| 93 | + } | ||
| 94 | + return company, nil | ||
| 95 | +} | ||
| 96 | +func (repository *CompanyRepository) FindOne(queryOptions map[string]interface{}) (*domain.Company, error) { | ||
| 97 | + tx := repository.transactionContext.PgTx | ||
| 98 | + companyModel := new(models.Company) | ||
| 99 | + query := sqlbuilder.BuildQuery(tx.Model(companyModel), queryOptions) | ||
| 100 | + query.SetWhereByQueryOption("company.company_id = ?", "companyId") | ||
| 101 | + query.SetWhereByQueryOption(`company.company_info @>'{"status":?}'`, "status") | ||
| 102 | + if err := query.First(); err != nil { | ||
| 103 | + if err.Error() == "pg: no rows in result set" { | ||
| 104 | + return nil, fmt.Errorf("没有此资源") | ||
| 105 | + } else { | ||
| 106 | + return nil, err | ||
| 107 | + } | ||
| 108 | + } | ||
| 109 | + if companyModel.CompanyId == 0 { | ||
| 110 | + return nil, nil | ||
| 111 | + } else { | ||
| 112 | + return transform.TransformToCompanyDomainModelFromPgModels(companyModel) | ||
| 113 | + } | ||
| 114 | +} | ||
| 115 | +func (repository *CompanyRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.Company, error) { | ||
| 116 | + tx := repository.transactionContext.PgTx | ||
| 117 | + var companyModels []*models.Company | ||
| 118 | + companys := make([]*domain.Company, 0) | ||
| 119 | + query := sqlbuilder.BuildQuery(tx.Model(&companyModels), queryOptions) | ||
| 120 | + query.SetOffsetAndLimit(20) | ||
| 121 | + query.SetOrderDirect("company_id", "DESC") | ||
| 122 | + if count, err := query.SelectAndCount(); err != nil { | ||
| 123 | + return 0, companys, err | ||
| 124 | + } else { | ||
| 125 | + for _, companyModel := range companyModels { | ||
| 126 | + if company, err := transform.TransformToCompanyDomainModelFromPgModels(companyModel); err != nil { | ||
| 127 | + return 0, companys, err | ||
| 128 | + } else { | ||
| 129 | + companys = append(companys, company) | ||
| 130 | + } | ||
| 131 | + } | ||
| 132 | + return int64(count), companys, nil | ||
| 133 | + } | ||
| 134 | +} | ||
| 135 | +func NewCompanyRepository(transactionContext *pgTransaction.TransactionContext) (*CompanyRepository, error) { | ||
| 136 | + if transactionContext == nil { | ||
| 137 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 138 | + } else { | ||
| 139 | + return &CompanyRepository{ | ||
| 140 | + transactionContext: transactionContext, | ||
| 141 | + }, nil | ||
| 142 | + } | ||
| 143 | +} |
| @@ -53,7 +53,7 @@ func (repository *UserAuthRepository) Save(userAuth *domain.UserAuth) (*domain.U | @@ -53,7 +53,7 @@ func (repository *UserAuthRepository) Save(userAuth *domain.UserAuth) (*domain.U | ||
| 53 | &userAuth.CreateAt, | 53 | &userAuth.CreateAt, |
| 54 | &userAuth.UpdateAt, | 54 | &userAuth.UpdateAt, |
| 55 | ), | 55 | ), |
| 56 | - fmt.Sprintf("INSERT INTO user_auths (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet), | 56 | + fmt.Sprintf("INSERT INTO user_auth (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet), |
| 57 | userAuth.UserAuthId, | 57 | userAuth.UserAuthId, |
| 58 | pg.Array(userAuth.Users), | 58 | pg.Array(userAuth.Users), |
| 59 | userAuth.PhoneAuth, | 59 | userAuth.PhoneAuth, |
| @@ -71,7 +71,7 @@ func (repository *UserAuthRepository) Save(userAuth *domain.UserAuth) (*domain.U | @@ -71,7 +71,7 @@ func (repository *UserAuthRepository) Save(userAuth *domain.UserAuth) (*domain.U | ||
| 71 | &userAuth.CreateAt, | 71 | &userAuth.CreateAt, |
| 72 | &userAuth.UpdateAt, | 72 | &userAuth.UpdateAt, |
| 73 | ), | 73 | ), |
| 74 | - fmt.Sprintf("UPDATE user_auths SET %s WHERE user_auth_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet), | 74 | + fmt.Sprintf("UPDATE user_auth SET %s WHERE user_auth_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet), |
| 75 | userAuth.UserAuthId, | 75 | userAuth.UserAuthId, |
| 76 | pg.Array(userAuth.Users), | 76 | pg.Array(userAuth.Users), |
| 77 | userAuth.PhoneAuth, | 77 | userAuth.PhoneAuth, |
| @@ -98,6 +98,9 @@ func (repository *UserAuthRepository) FindOne(queryOptions map[string]interface{ | @@ -98,6 +98,9 @@ func (repository *UserAuthRepository) FindOne(queryOptions map[string]interface{ | ||
| 98 | userAuthModel := new(models.UserAuth) | 98 | userAuthModel := new(models.UserAuth) |
| 99 | query := sqlbuilder.BuildQuery(tx.Model(userAuthModel), queryOptions) | 99 | query := sqlbuilder.BuildQuery(tx.Model(userAuthModel), queryOptions) |
| 100 | query.SetWhereByQueryOption("user_auth.user_auth_id = ?", "userAuthId") | 100 | query.SetWhereByQueryOption("user_auth.user_auth_id = ?", "userAuthId") |
| 101 | + if v, ok := queryOptions["phone"]; ok { | ||
| 102 | + query.Where(fmt.Sprintf(`user_auth.phone_auth @>'{"phone":"%v"}'`, v)) | ||
| 103 | + } | ||
| 101 | if err := query.First(); err != nil { | 104 | if err := query.First(); err != nil { |
| 102 | if err.Error() == "pg: no rows in result set" { | 105 | if err.Error() == "pg: no rows in result set" { |
| 103 | return nil, fmt.Errorf("没有此资源") | 106 | return nil, fmt.Errorf("没有此资源") |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/go-pg/pg/v10" | ||
| 6 | + | ||
| 7 | + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | ||
| 8 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 9 | + "github.com/linmadan/egglib-go/utils/snowflake" | ||
| 10 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain" | ||
| 11 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models" | ||
| 12 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/transform" | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +type UserRepository struct { | ||
| 16 | + transactionContext *pgTransaction.TransactionContext | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +func (repository *UserRepository) nextIdentify() (int64, error) { | ||
| 20 | + IdWorker, err := snowflake.NewIdWorker(1) | ||
| 21 | + if err != nil { | ||
| 22 | + return 0, err | ||
| 23 | + } | ||
| 24 | + id, err := IdWorker.NextId() | ||
| 25 | + return id, err | ||
| 26 | +} | ||
| 27 | +func (repository *UserRepository) Save(user *domain.User) (*domain.User, error) { | ||
| 28 | + sqlBuildFields := []string{ | ||
| 29 | + "user_id", | ||
| 30 | + "user_type", | ||
| 31 | + "permissions", | ||
| 32 | + "company_id", | ||
| 33 | + "user_info", | ||
| 34 | + "partner_info", | ||
| 35 | + "status", | ||
| 36 | + "admin_type", | ||
| 37 | + "access_partners", | ||
| 38 | + "create_at", | ||
| 39 | + "update_at", | ||
| 40 | + "delete_at", | ||
| 41 | + } | ||
| 42 | + insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) | ||
| 43 | + insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields) | ||
| 44 | + returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) | ||
| 45 | + updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "user_id") | ||
| 46 | + updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields) | ||
| 47 | + tx := repository.transactionContext.PgTx | ||
| 48 | + if user.Identify() == nil { | ||
| 49 | + userId, err := repository.nextIdentify() | ||
| 50 | + if err != nil { | ||
| 51 | + return user, err | ||
| 52 | + } else { | ||
| 53 | + user.UserId = userId | ||
| 54 | + } | ||
| 55 | + if _, err := tx.QueryOne( | ||
| 56 | + pg.Scan( | ||
| 57 | + &user.UserId, | ||
| 58 | + &user.UserType, | ||
| 59 | + pg.Array(&user.Permissions), | ||
| 60 | + &user.CompanyId, | ||
| 61 | + &user.UserInfo, | ||
| 62 | + &user.PartnerInfo, | ||
| 63 | + &user.Status, | ||
| 64 | + &user.AdminType, | ||
| 65 | + pg.Array(&user.AccessPartners), | ||
| 66 | + &user.CreateAt, | ||
| 67 | + &user.UpdateAt, | ||
| 68 | + &user.DeleteAt, | ||
| 69 | + ), | ||
| 70 | + fmt.Sprintf("INSERT INTO users (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet), | ||
| 71 | + user.UserId, | ||
| 72 | + user.UserType, | ||
| 73 | + pg.Array(user.Permissions), | ||
| 74 | + user.CompanyId, | ||
| 75 | + user.UserInfo, | ||
| 76 | + user.PartnerInfo, | ||
| 77 | + user.Status, | ||
| 78 | + user.AdminType, | ||
| 79 | + pg.Array(user.AccessPartners), | ||
| 80 | + user.CreateAt, | ||
| 81 | + user.UpdateAt, | ||
| 82 | + user.DeleteAt, | ||
| 83 | + ); err != nil { | ||
| 84 | + return user, err | ||
| 85 | + } | ||
| 86 | + } else { | ||
| 87 | + if _, err := tx.QueryOne( | ||
| 88 | + pg.Scan( | ||
| 89 | + &user.UserId, | ||
| 90 | + &user.UserType, | ||
| 91 | + pg.Array(&user.Permissions), | ||
| 92 | + &user.CompanyId, | ||
| 93 | + &user.UserInfo, | ||
| 94 | + &user.PartnerInfo, | ||
| 95 | + &user.Status, | ||
| 96 | + &user.AdminType, | ||
| 97 | + pg.Array(&user.AccessPartners), | ||
| 98 | + &user.CreateAt, | ||
| 99 | + &user.UpdateAt, | ||
| 100 | + &user.DeleteAt, | ||
| 101 | + ), | ||
| 102 | + fmt.Sprintf("UPDATE users SET %s WHERE user_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet), | ||
| 103 | + user.UserId, | ||
| 104 | + user.UserType, | ||
| 105 | + pg.Array(user.Permissions), | ||
| 106 | + user.CompanyId, | ||
| 107 | + user.UserInfo, | ||
| 108 | + user.PartnerInfo, | ||
| 109 | + user.Status, | ||
| 110 | + user.AdminType, | ||
| 111 | + pg.Array(user.AccessPartners), | ||
| 112 | + user.CreateAt, | ||
| 113 | + user.UpdateAt, | ||
| 114 | + user.DeleteAt, | ||
| 115 | + user.Identify(), | ||
| 116 | + ); err != nil { | ||
| 117 | + return user, err | ||
| 118 | + } | ||
| 119 | + } | ||
| 120 | + return user, nil | ||
| 121 | +} | ||
| 122 | +func (repository *UserRepository) Remove(user *domain.User) (*domain.User, error) { | ||
| 123 | + tx := repository.transactionContext.PgTx | ||
| 124 | + userModel := new(models.User) | ||
| 125 | + userModel.UserId = user.Identify().(int64) | ||
| 126 | + if _, err := tx.Model(userModel).WherePK().Delete(); err != nil { | ||
| 127 | + return user, err | ||
| 128 | + } | ||
| 129 | + return user, nil | ||
| 130 | +} | ||
| 131 | +func (repository *UserRepository) FindOne(queryOptions map[string]interface{}) (*domain.User, error) { | ||
| 132 | + tx := repository.transactionContext.PgTx | ||
| 133 | + userModel := new(models.User) | ||
| 134 | + query := sqlbuilder.BuildQuery(tx.Model(userModel), queryOptions) | ||
| 135 | + query.SetWhereByQueryOption("users.user_id = ?", "userId") | ||
| 136 | + query.SetWhereByQueryOption("users.status = ?", "status") | ||
| 137 | + query.SetWhereByQueryOption("users.user_type = ?", "userType") | ||
| 138 | + if v, ok := queryOptions["inUserIds"]; ok { | ||
| 139 | + query.Where("users.user_id in (?)", pg.Array(v)) | ||
| 140 | + } | ||
| 141 | + if err := query.First(); err != nil { | ||
| 142 | + if err.Error() == "pg: no rows in result set" { | ||
| 143 | + return nil, fmt.Errorf("没有此资源") | ||
| 144 | + } else { | ||
| 145 | + return nil, err | ||
| 146 | + } | ||
| 147 | + } | ||
| 148 | + if userModel.UserId == 0 { | ||
| 149 | + return nil, nil | ||
| 150 | + } else { | ||
| 151 | + return transform.TransformToUserDomainModelFromPgModels(userModel) | ||
| 152 | + } | ||
| 153 | +} | ||
| 154 | +func (repository *UserRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.User, error) { | ||
| 155 | + tx := repository.transactionContext.PgTx | ||
| 156 | + var userModels []*models.User | ||
| 157 | + users := make([]*domain.User, 0) | ||
| 158 | + query := sqlbuilder.BuildQuery(tx.Model(&userModels), queryOptions) | ||
| 159 | + query.SetOffsetAndLimit(20) | ||
| 160 | + query.SetOrderDirect("user_id", "DESC") | ||
| 161 | + if count, err := query.SelectAndCount(); err != nil { | ||
| 162 | + return 0, users, err | ||
| 163 | + } else { | ||
| 164 | + for _, userModel := range userModels { | ||
| 165 | + if user, err := transform.TransformToUserDomainModelFromPgModels(userModel); err != nil { | ||
| 166 | + return 0, users, err | ||
| 167 | + } else { | ||
| 168 | + users = append(users, user) | ||
| 169 | + } | ||
| 170 | + } | ||
| 171 | + return int64(count), users, nil | ||
| 172 | + } | ||
| 173 | +} | ||
| 174 | +func NewUserRepository(transactionContext *pgTransaction.TransactionContext) (*UserRepository, error) { | ||
| 175 | + if transactionContext == nil { | ||
| 176 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 177 | + } else { | ||
| 178 | + return &UserRepository{ | ||
| 179 | + transactionContext: transactionContext, | ||
| 180 | + }, nil | ||
| 181 | + } | ||
| 182 | +} |
| 1 | +package controllers | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/linmadan/egglib-go/web/beego" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/auth/command" | ||
| 6 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/auth/query" | ||
| 7 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/auth/service" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +type AuthController struct { | ||
| 11 | + beego.BaseController | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +func (controller *AuthController) Login() { | ||
| 15 | + authService := service.NewAuthService(nil) | ||
| 16 | + loginQuery := &query.LoginQuery{} | ||
| 17 | + controller.Unmarshal(loginQuery) | ||
| 18 | + data, err := authService.Login(loginQuery) | ||
| 19 | + controller.Response(data, err) | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +func (controller *AuthController) LoginByCompany() { | ||
| 23 | + authService := service.NewAuthService(nil) | ||
| 24 | + loginByCompanyCommand := &command.LoginByCompanyCommand{} | ||
| 25 | + controller.Unmarshal(loginByCompanyCommand) | ||
| 26 | + data, err := authService.LoginByCompany(loginByCompanyCommand) | ||
| 27 | + controller.Response(data, err) | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +func (controller *AuthController) AccessToken() { | ||
| 31 | + authService := service.NewAuthService(nil) | ||
| 32 | + accessTokenCommand := &command.AccessTokenCommand{} | ||
| 33 | + controller.Unmarshal(accessTokenCommand) | ||
| 34 | + data, err := authService.AccessToken(accessTokenCommand) | ||
| 35 | + controller.Response(data, err) | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +func (controller *AuthController) RefreshToken() { | ||
| 39 | + authService := service.NewAuthService(nil) | ||
| 40 | + refreshTokenCommand := &command.RefreshTokenCommand{} | ||
| 41 | + controller.Unmarshal(refreshTokenCommand) | ||
| 42 | + data, err := authService.RefreshToken(refreshTokenCommand) | ||
| 43 | + controller.Response(data, err) | ||
| 44 | +} | ||
| 45 | + | ||
| 46 | +func (controller *AuthController) SendSmsCode() { | ||
| 47 | + authService := service.NewAuthService(nil) | ||
| 48 | + sendSmsCodeCommand := &command.SendSmsCodeCommand{} | ||
| 49 | + controller.Unmarshal(sendSmsCodeCommand) | ||
| 50 | + data, err := authService.SendSmsCode(sendSmsCodeCommand) | ||
| 51 | + controller.Response(data, err) | ||
| 52 | +} | ||
| 53 | + | ||
| 54 | +func (controller *AuthController) Revoke() { | ||
| 55 | + authService := service.NewAuthService(nil) | ||
| 56 | + revokeCommand := &command.RevokeCommand{} | ||
| 57 | + controller.Unmarshal(revokeCommand) | ||
| 58 | + data, err := authService.Revoke(revokeCommand) | ||
| 59 | + controller.Response(data, err) | ||
| 60 | +} | ||
| 61 | + | ||
| 62 | +func (controller *AuthController) ChangePassword() { | ||
| 63 | + authService := service.NewAuthService(nil) | ||
| 64 | + changePasswordCommand := &command.ChangePasswordCommand{} | ||
| 65 | + controller.Unmarshal(changePasswordCommand) | ||
| 66 | + data, err := authService.ChangePassword(changePasswordCommand) | ||
| 67 | + controller.Response(data, err) | ||
| 68 | +} |
pkg/port/beego/routers/auth_router.go
0 → 100644
| 1 | +package routers | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/beego/beego/v2/server/web" | ||
| 5 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego/controllers" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func init() { | ||
| 9 | + web.Router("/auths/login", &controllers.AuthController{}, "Post:Login") | ||
| 10 | + web.Router("/auths/loginByCompany", &controllers.AuthController{}, "Post:LoginByCompany") | ||
| 11 | + web.Router("/auths/accessToken", &controllers.AuthController{}, "Post:AccessToken") | ||
| 12 | + web.Router("/auths/refreshToken", &controllers.AuthController{}, "Post:RefreshToken") | ||
| 13 | + web.Router("/auths/sendSmsCode", &controllers.AuthController{}, "Post:SendSmsCode") | ||
| 14 | + web.Router("/auths/revoke", &controllers.AuthController{}, "Post:Revoke") | ||
| 15 | + web.Router("/auths/changePhonePassword", &controllers.AuthController{}, "Post:ChangePassword") | ||
| 16 | +} |
| 1 | +package auth | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +var _ = Describe("用户按公司登录", func() { | ||
| 12 | + //var Id int64 | ||
| 13 | + //return | ||
| 14 | + BeforeEach(func() { | ||
| 15 | + //_, err := pG.DB.QueryOne( | ||
| 16 | + // pg.Scan(&Id), | ||
| 17 | + // "INSERT INTO s () VALUES () RETURNING _id", | ||
| 18 | + //) | ||
| 19 | + //Expect(err).NotTo(HaveOccurred()) | ||
| 20 | + }) | ||
| 21 | + Describe("用户按公司登录", func() { | ||
| 22 | + Context("", func() { | ||
| 23 | + It("", func() { | ||
| 24 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 25 | + body := map[string]interface{}{ | ||
| 26 | + "authCode": domain.SignToken(1, 1000), | ||
| 27 | + } | ||
| 28 | + httpExpect.POST("/auths/accessToken"). | ||
| 29 | + WithJSON(body). | ||
| 30 | + Expect(). | ||
| 31 | + Status(http.StatusOK). | ||
| 32 | + JSON(). | ||
| 33 | + Object(). | ||
| 34 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 35 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 36 | + ContainsKey("data").Value("data").Object() | ||
| 37 | + }) | ||
| 38 | + }) | ||
| 39 | + }) | ||
| 40 | + AfterEach(func() { | ||
| 41 | + //_, err := pG.DB.Exec("DELETE FROM s WHERE true") | ||
| 42 | + //Expect(err).NotTo(HaveOccurred()) | ||
| 43 | + }) | ||
| 44 | +}) |
| 1 | +package auth | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "net/http" | ||
| 5 | + "net/http/httptest" | ||
| 6 | + "testing" | ||
| 7 | + | ||
| 8 | + "github.com/beego/beego/v2/server/web" | ||
| 9 | + . "github.com/onsi/ginkgo" | ||
| 10 | + . "github.com/onsi/gomega" | ||
| 11 | + _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg" | ||
| 12 | + _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego" | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +func TestAuth(t *testing.T) { | ||
| 16 | + RegisterFailHandler(Fail) | ||
| 17 | + RunSpecs(t, "Beego Port Auth Correlations Test Case Suite") | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +var handler http.Handler | ||
| 21 | +var server *httptest.Server | ||
| 22 | + | ||
| 23 | +var _ = BeforeSuite(func() { | ||
| 24 | + handler = web.BeeApp.Handlers | ||
| 25 | + server = httptest.NewServer(handler) | ||
| 26 | +}) | ||
| 27 | + | ||
| 28 | +var _ = AfterSuite(func() { | ||
| 29 | + server.Close() | ||
| 30 | +}) |
| 1 | +package auth | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/go-pg/pg/v10" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | + . "github.com/onsi/gomega" | ||
| 10 | + pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +var _ = Describe("修改手机号密码", func() { | ||
| 14 | + var Id int64 | ||
| 15 | + BeforeEach(func() { | ||
| 16 | + _, err := pG.DB.QueryOne( | ||
| 17 | + pg.Scan(&Id), | ||
| 18 | + `INSERT INTO user_auth (user_auth_id,users,phone_auth) VALUES (1,ARRAY [1],'{"phone":"18800000001","password":"password"}') RETURNING user_auth_id`, | ||
| 19 | + ) | ||
| 20 | + Expect(err).NotTo(HaveOccurred()) | ||
| 21 | + }) | ||
| 22 | + Describe("修改手机号密码", func() { | ||
| 23 | + Context("", func() { | ||
| 24 | + It("", func() { | ||
| 25 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 26 | + body := map[string]interface{}{ | ||
| 27 | + "oldPwd": "password", | ||
| 28 | + "newPwd": "newPassword", | ||
| 29 | + "confirmPwd": "newPassword", | ||
| 30 | + "phone": "18800000001", | ||
| 31 | + } | ||
| 32 | + httpExpect.POST("/auths/changePhonePassword"). | ||
| 33 | + WithJSON(body). | ||
| 34 | + Expect(). | ||
| 35 | + Status(http.StatusOK). | ||
| 36 | + JSON(). | ||
| 37 | + Object(). | ||
| 38 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 39 | + ContainsKey("msg").ValueEqual("msg", "ok") | ||
| 40 | + //ContainsKey("data").Value("data").Object() | ||
| 41 | + }) | ||
| 42 | + }) | ||
| 43 | + }) | ||
| 44 | + AfterEach(func() { | ||
| 45 | + _, err := pG.DB.Exec("DELETE FROM user_auth WHERE true") | ||
| 46 | + Expect(err).NotTo(HaveOccurred()) | ||
| 47 | + }) | ||
| 48 | +}) |
| 1 | +package auth | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/go-pg/pg/v10" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | + . "github.com/onsi/gomega" | ||
| 10 | + pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +var _ = Describe("用户按公司登录", func() { | ||
| 14 | + var Id int64 | ||
| 15 | + BeforeEach(func() { | ||
| 16 | + _, err := pG.DB.QueryOne( | ||
| 17 | + pg.Scan(&Id), | ||
| 18 | + "INSERT INTO users (user_id,user_type,company_id) VALUES (1,1,1000) RETURNING user_id", | ||
| 19 | + ) | ||
| 20 | + _, err = pG.DB.QueryOne( | ||
| 21 | + pg.Scan(&Id), | ||
| 22 | + `INSERT INTO companys (company_id,company_info) VALUES (1000,'{"company_id":1000,"name":"company","status":1}') RETURNING company_id`, | ||
| 23 | + ) | ||
| 24 | + _, err = pG.DB.QueryOne( | ||
| 25 | + pg.Scan(&Id), | ||
| 26 | + `INSERT INTO user_auth (user_auth_id,users,phone_auth) VALUES (1,ARRAY [1],'{"phone":"18800000001","password":"password"}') RETURNING user_auth_id`, | ||
| 27 | + ) | ||
| 28 | + Expect(err).NotTo(HaveOccurred()) | ||
| 29 | + }) | ||
| 30 | + Describe("用户按公司登录", func() { | ||
| 31 | + Context("", func() { | ||
| 32 | + It("", func() { | ||
| 33 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 34 | + body := map[string]interface{}{ | ||
| 35 | + "userType": 1, | ||
| 36 | + "credentials": "string", | ||
| 37 | + "userId": 1, | ||
| 38 | + } | ||
| 39 | + httpExpect.POST("/auths/loginByCompany"). | ||
| 40 | + WithJSON(body). | ||
| 41 | + Expect(). | ||
| 42 | + Status(http.StatusOK). | ||
| 43 | + JSON(). | ||
| 44 | + Object(). | ||
| 45 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 46 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 47 | + ContainsKey("data").Value("data").Object() | ||
| 48 | + }) | ||
| 49 | + }) | ||
| 50 | + }) | ||
| 51 | + AfterEach(func() { | ||
| 52 | + _, err := pG.DB.Exec("DELETE FROM users WHERE true") | ||
| 53 | + _, err = pG.DB.Exec("DELETE FROM companys WHERE true") | ||
| 54 | + _, err = pG.DB.Exec("DELETE FROM user_auth WHERE true") | ||
| 55 | + Expect(err).NotTo(HaveOccurred()) | ||
| 56 | + }) | ||
| 57 | +}) |
test/integration/beego/auth/login_test.go
0 → 100644
| 1 | +package auth | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/go-pg/pg/v10" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | + . "github.com/onsi/gomega" | ||
| 10 | + pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +var _ = Describe("用户登录 返回有权限的公司列表", func() { | ||
| 14 | + var Id int64 | ||
| 15 | + BeforeEach(func() { | ||
| 16 | + _, err := pG.DB.QueryOne( | ||
| 17 | + pg.Scan(&Id), | ||
| 18 | + "INSERT INTO users (user_id,user_type,company_id) VALUES (1,1,1000) RETURNING user_id", | ||
| 19 | + ) | ||
| 20 | + _, err = pG.DB.QueryOne( | ||
| 21 | + pg.Scan(&Id), | ||
| 22 | + `INSERT INTO companys (company_id,company_info) VALUES (1000,'{"company_id":1000,"name":"company"}') RETURNING company_id`, | ||
| 23 | + ) | ||
| 24 | + _, err = pG.DB.QueryOne( | ||
| 25 | + pg.Scan(&Id), | ||
| 26 | + `INSERT INTO user_auth (user_auth_id,users,phone_auth) VALUES (1,ARRAY [1],'{"phone":"18800000001","password":"password"}') RETURNING user_auth_id`, | ||
| 27 | + ) | ||
| 28 | + Expect(err).NotTo(HaveOccurred()) | ||
| 29 | + }) | ||
| 30 | + Describe("用户登录 返回有权限的公司列表", func() { | ||
| 31 | + Context("", func() { | ||
| 32 | + It("", func() { | ||
| 33 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 34 | + body := map[string]interface{}{ | ||
| 35 | + "phone": "18800000001", | ||
| 36 | + "grantType": "signInPassword", | ||
| 37 | + "password": "password", | ||
| 38 | + "captcha": "", | ||
| 39 | + "credentials": "", | ||
| 40 | + } | ||
| 41 | + httpExpect.POST("/auths/login"). | ||
| 42 | + WithJSON(body). | ||
| 43 | + Expect(). | ||
| 44 | + Status(http.StatusOK). | ||
| 45 | + JSON(). | ||
| 46 | + Object(). | ||
| 47 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 48 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 49 | + ContainsKey("data").Value("data").Object() | ||
| 50 | + }) | ||
| 51 | + }) | ||
| 52 | + }) | ||
| 53 | + AfterEach(func() { | ||
| 54 | + _, err := pG.DB.Exec("DELETE FROM users WHERE true") | ||
| 55 | + _, err = pG.DB.Exec("DELETE FROM companys WHERE true") | ||
| 56 | + _, err = pG.DB.Exec("DELETE FROM user_auth WHERE true") | ||
| 57 | + Expect(err).NotTo(HaveOccurred()) | ||
| 58 | + }) | ||
| 59 | +}) |
| 1 | +package auth | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +var _ = Describe("更新授权令牌accessToken", func() { | ||
| 12 | + //return | ||
| 13 | + //var Id int64 | ||
| 14 | + BeforeEach(func() { | ||
| 15 | + //_, err := pG.DB.QueryOne( | ||
| 16 | + // pg.Scan(&Id), | ||
| 17 | + // "INSERT INTO s () VALUES () RETURNING _id", | ||
| 18 | + //) | ||
| 19 | + //Expect(err).NotTo(HaveOccurred()) | ||
| 20 | + }) | ||
| 21 | + Describe("更新授权令牌accessToken", func() { | ||
| 22 | + Context("", func() { | ||
| 23 | + It("", func() { | ||
| 24 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 25 | + body := map[string]interface{}{ | ||
| 26 | + "refreshToken": domain.SignToken(1, 1000), | ||
| 27 | + } | ||
| 28 | + httpExpect.POST("/auths/refreshToken"). | ||
| 29 | + WithJSON(body). | ||
| 30 | + Expect(). | ||
| 31 | + Status(http.StatusOK). | ||
| 32 | + JSON(). | ||
| 33 | + Object(). | ||
| 34 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 35 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 36 | + ContainsKey("data").Value("data").Object() | ||
| 37 | + }) | ||
| 38 | + }) | ||
| 39 | + }) | ||
| 40 | + AfterEach(func() { | ||
| 41 | + //_, err := pG.DB.Exec("DELETE FROM s WHERE true") | ||
| 42 | + //Expect(err).NotTo(HaveOccurred()) | ||
| 43 | + }) | ||
| 44 | +}) |
test/integration/beego/auth/revoke_test.go
0 → 100644
| 1 | +package auth | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/go-pg/pg/v10" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | + . "github.com/onsi/gomega" | ||
| 10 | + pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +var _ = Describe("注销登录", func() { | ||
| 14 | + return | ||
| 15 | + var Id int64 | ||
| 16 | + BeforeEach(func() { | ||
| 17 | + _, err := pG.DB.QueryOne( | ||
| 18 | + pg.Scan(&Id), | ||
| 19 | + "INSERT INTO s () VALUES () RETURNING _id", | ||
| 20 | + ) | ||
| 21 | + Expect(err).NotTo(HaveOccurred()) | ||
| 22 | + }) | ||
| 23 | + Describe("注销登录", func() { | ||
| 24 | + Context("", func() { | ||
| 25 | + It("", func() { | ||
| 26 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 27 | + body := map[string]interface{}{} | ||
| 28 | + httpExpect.POST("/auths/revoke"). | ||
| 29 | + WithJSON(body). | ||
| 30 | + Expect(). | ||
| 31 | + Status(http.StatusOK). | ||
| 32 | + JSON(). | ||
| 33 | + Object(). | ||
| 34 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 35 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 36 | + ContainsKey("data").Value("data").Object() | ||
| 37 | + }) | ||
| 38 | + }) | ||
| 39 | + }) | ||
| 40 | + AfterEach(func() { | ||
| 41 | + _, err := pG.DB.Exec("DELETE FROM s WHERE true") | ||
| 42 | + Expect(err).NotTo(HaveOccurred()) | ||
| 43 | + }) | ||
| 44 | +}) |
| 1 | +package auth | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/go-pg/pg/v10" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | + . "github.com/onsi/gomega" | ||
| 10 | + pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +var _ = Describe("发送验证码", func() { | ||
| 14 | + return | ||
| 15 | + var Id int64 | ||
| 16 | + BeforeEach(func() { | ||
| 17 | + _, err := pG.DB.QueryOne( | ||
| 18 | + pg.Scan(&Id), | ||
| 19 | + "INSERT INTO s () VALUES () RETURNING _id", | ||
| 20 | + ) | ||
| 21 | + Expect(err).NotTo(HaveOccurred()) | ||
| 22 | + }) | ||
| 23 | + Describe("发送验证码", func() { | ||
| 24 | + Context("", func() { | ||
| 25 | + It("", func() { | ||
| 26 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 27 | + body := map[string]interface{}{ | ||
| 28 | + "phone": "string", | ||
| 29 | + } | ||
| 30 | + httpExpect.POST("/auths/sendSmsCode"). | ||
| 31 | + WithJSON(body). | ||
| 32 | + Expect(). | ||
| 33 | + Status(http.StatusOK). | ||
| 34 | + JSON(). | ||
| 35 | + Object(). | ||
| 36 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 37 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 38 | + ContainsKey("data").Value("data").Object() | ||
| 39 | + }) | ||
| 40 | + }) | ||
| 41 | + }) | ||
| 42 | + AfterEach(func() { | ||
| 43 | + _, err := pG.DB.Exec("DELETE FROM s WHERE true") | ||
| 44 | + Expect(err).NotTo(HaveOccurred()) | ||
| 45 | + }) | ||
| 46 | +}) |
-
请 注册 或 登录 后发表评论