Skip to content

Commit 4bf320a

Browse files
authored
优化用户登录开通会员 (ecodeclub#78)
1. 修复会员校验的 BUG 2. 调整 Consumer 的初始化过程
1 parent 54be7c9 commit 4bf320a

File tree

28 files changed

+430
-489
lines changed

28 files changed

+430
-489
lines changed

Makefile

+2-1
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,5 @@ e2e_down:
3939

4040
.PHONY: mock
4141
mock:
42-
mockgen -destination=test/mocks/session.mock.go -package=mocks github.com/ecodeclub/ginx/session Session
42+
@mockgen -destination=internal/test/mocks/session_provider.mock.go -package=mocks -typed=true github.com/ecodeclub/ginx/session Provider
43+
@mockgen -destination=internal/test/mocks/session.mock.go -package=mocks -typed=true github.com/ecodeclub/ginx/session Session

README.md

+7
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@
1717
## 缓存的 key 设计
1818
基本上遵循了:`webook:$module:xxxxxxx` 的形式。即第一段是 webook,代表本体;第二段是 webook 内部的 module,代表模块。后面的就是 key,可以进一步细分。
1919

20+
## HTTP 响应码
21+
- 大多数情况下是 200
22+
- 未登录是 401
23+
- 没有权限是 403
24+
25+
> 这里比较蛋疼的是 401 和 403 的语义。所以我也没什么好纠结的,只是做一个简单的区分
26+
2027
## 错误码
2128
- user - 01
2229
- question - 02

config/config.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,6 @@ kafka:
2121
- kafka:9092
2222
topics:
2323
- name: payment_successful
24+
partitions: 2
25+
- name: user_registration_events
2426
partitions: 2

go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ go 1.21.0
55
require (
66
github.com/ecodeclub/ecache v0.0.0-20240111145855-75679834beca
77
github.com/ecodeclub/ekit v0.0.9-0.20240331142359-871f65136a9b
8-
github.com/ecodeclub/ginx v0.0.0-20240405140433-b236eb60dad0
9-
github.com/ecodeclub/mq-api v0.0.0-20231030023724-b3c489cdada2
8+
github.com/ecodeclub/ginx v0.0.0-20240407090958-53f744f58112
9+
github.com/ecodeclub/mq-api v0.0.0-20240406140940-b7e27bcf1d5f
1010
github.com/ecodeclub/webook-private v0.0.0-20240328102016-f96c72f49853
1111
github.com/ego-component/egorm v1.1.1
1212
github.com/gin-contrib/cors v1.5.0

go.sum

+4-4
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,10 @@ github.com/ecodeclub/ecache v0.0.0-20240111145855-75679834beca h1:qksXJxULYYX+3Z
144144
github.com/ecodeclub/ecache v0.0.0-20240111145855-75679834beca/go.mod h1:faDaVWB0J1EfgyY6e7Z40EWv65Asu4FrtlWVDAOBRiM=
145145
github.com/ecodeclub/ekit v0.0.9-0.20240331142359-871f65136a9b h1:E2+ixsdn65iQdIBWEC0afanMV0P9/vcaTUq9aLWOTzk=
146146
github.com/ecodeclub/ekit v0.0.9-0.20240331142359-871f65136a9b/go.mod h1:rEGubThvxoIQT/qnbVBkZgSvYwgKrY/dtwEWKRTmgeY=
147-
github.com/ecodeclub/ginx v0.0.0-20240405140433-b236eb60dad0 h1:Wsgg2xMCb/feluO6xF4l3PGbL6k6kmQMO1t9fxS8nTw=
148-
github.com/ecodeclub/ginx v0.0.0-20240405140433-b236eb60dad0/go.mod h1:PCGcpNNuknwamOKIEkRwfwKngqg4syGydrONSIxb08w=
149-
github.com/ecodeclub/mq-api v0.0.0-20231030023724-b3c489cdada2 h1:qTDaGwQeYTEgFCOfDBDC4bkpDYYXvyTDRu8cq316g5Y=
150-
github.com/ecodeclub/mq-api v0.0.0-20231030023724-b3c489cdada2/go.mod h1:mRlnirjJILt4xJ6WaG6XdwNq8HyEVK3v/4bOlIb96ts=
147+
github.com/ecodeclub/ginx v0.0.0-20240407090958-53f744f58112 h1:ACg5ZgxFTK0NyBA8LVz428UefC3Suzwx3SQnIgWdzO8=
148+
github.com/ecodeclub/ginx v0.0.0-20240407090958-53f744f58112/go.mod h1:PCGcpNNuknwamOKIEkRwfwKngqg4syGydrONSIxb08w=
149+
github.com/ecodeclub/mq-api v0.0.0-20240406140940-b7e27bcf1d5f h1:zcGm4r2zvI0k8WiQQizeUvSt1ZDOHks2rDo9/0oxpOw=
150+
github.com/ecodeclub/mq-api v0.0.0-20240406140940-b7e27bcf1d5f/go.mod h1:M+2owQhSRoGyX15L0rUdoSvUDvTOuexquG/605wqYtI=
151151
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
152152
github.com/ego-component/egorm v1.1.1 h1:0jcaEY1MwTZMzX4GOsXpzox5VafuMFjlMbX8Opqndu4=
153153
github.com/ego-component/egorm v1.1.1/go.mod h1:BqF8f0GsWpV2DFAKL/vFiSfrocX+t3KCYzz3GnoJnrY=

internal/cases/internal/integration/handler_test.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"fmt"
2222
"net/http"
23+
"strconv"
2324
"testing"
2425
"time"
2526

@@ -75,8 +76,11 @@ func (s *HandlerTestSuite) SetupSuite() {
7576
handler.PublicRoutes(server.Engine)
7677
server.Use(func(ctx *gin.Context) {
7778
ctx.Set("_session", session.NewMemorySession(session.Claims{
78-
Uid: uid,
79-
Data: map[string]string{"creator": "true", "memberDDL": "2099-01-01 23:59:59"},
79+
Uid: uid,
80+
Data: map[string]string{
81+
"creator": "true",
82+
"memberDDL": strconv.FormatInt(time.Now().Add(time.Hour).UnixMilli(), 10),
83+
},
8084
}))
8185
})
8286
handler.PrivateRoutes(server.Engine)

internal/member/internal/event/consumer.go

+32-25
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"context"
1919
"encoding/json"
2020
"fmt"
21+
"time"
2122

2223
"github.com/ecodeclub/mq-api"
2324
"github.com/ecodeclub/webook/internal/member/internal/domain"
@@ -26,20 +27,37 @@ import (
2627
)
2728

2829
type RegistrationEventConsumer struct {
29-
svc service.Service
30-
consumer mq.Consumer
31-
startAtFunc func() int64
32-
endAtFunc func() int64
33-
logger *elog.Component
30+
svc service.Service
31+
consumer mq.Consumer
32+
endAt int64
33+
logger *elog.Component
3434
}
3535

36-
func NewRegistrationEventConsumer(svc service.Service, consumer mq.Consumer, startAtFunc func() int64, endAtFunc func() int64) *RegistrationEventConsumer {
36+
func NewRegistrationEventConsumer(svc service.Service,
37+
q mq.MQ) (*RegistrationEventConsumer, error) {
38+
const groupID = "member"
39+
consumer, err := q.Consumer(userRegistrationEvents, groupID)
40+
if err != nil {
41+
return nil, err
42+
}
3743
return &RegistrationEventConsumer{
38-
svc: svc,
39-
consumer: consumer,
40-
startAtFunc: startAtFunc,
41-
endAtFunc: endAtFunc,
42-
logger: elog.DefaultLogger}
44+
svc: svc,
45+
consumer: consumer,
46+
endAt: time.Date(2024, 6, 30, 23, 59, 59, 0, time.UTC).UnixMilli(),
47+
logger: elog.DefaultLogger,
48+
}, nil
49+
}
50+
51+
// Start 后面要考虑借助 ctx 来优雅退出
52+
func (c *RegistrationEventConsumer) Start(ctx context.Context) {
53+
go func() {
54+
for {
55+
er := c.Consume(ctx)
56+
if er != nil {
57+
c.logger.Error("消费注册事件失败", elog.FieldErr(er))
58+
}
59+
}
60+
}()
4361
}
4462

4563
func (c *RegistrationEventConsumer) Consume(ctx context.Context) error {
@@ -53,23 +71,12 @@ func (c *RegistrationEventConsumer) Consume(ctx context.Context) error {
5371
if err != nil {
5472
return fmt.Errorf("解析消息失败: %w", err)
5573
}
56-
57-
_, err = c.svc.GetMembershipInfo(ctx, evt.Uid)
58-
if err == nil {
59-
return fmt.Errorf("用户会员记录已存在")
60-
}
61-
62-
startAt := c.startAtFunc()
63-
endAt := c.endAtFunc()
64-
if endAt <= startAt {
65-
return fmt.Errorf("超过注册优惠截止日期")
66-
}
67-
6874
_, err = c.svc.CreateNewMembership(ctx, domain.Member{
6975
UID: evt.Uid,
70-
StartAt: c.startAtFunc(),
71-
EndAt: c.endAtFunc(),
76+
StartAt: time.Now().UnixMilli(),
77+
EndAt: c.endAt,
7278
})
79+
7380
if err != nil {
7481
c.logger.Error("创建会员记录失败",
7582
elog.FieldErr(err),

internal/member/internal/event/event.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@
1414

1515
package event
1616

17+
const userRegistrationEvents = "user_registration_events"
18+
1719
type RegistrationEvent struct {
1820
Uid int64 `json:"uid"`
1921
}
20-
21-
func (RegistrationEvent) Topic() string {
22-
return "user_registration_events"
23-
}

0 commit comments

Comments
 (0)