正在显示
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 | +}) |
-
请 注册 或 登录 后发表评论