Skip to content

实现会员模块+重构用户模块+实现会员检查gin中间件#68

Merged
longyue0521 merged 16 commits into
ecodeclub:devfrom
longyue0521:feat_member
Apr 6, 2024
Merged

实现会员模块+重构用户模块+实现会员检查gin中间件#68
longyue0521 merged 16 commits into
ecodeclub:devfrom
longyue0521:feat_member

Conversation

@longyue0521
Copy link
Copy Markdown
Collaborator

@longyue0521 longyue0521 commented Apr 4, 2024

  • 注册成功后, 用户模块异步发送消息, 会员消费消息并开通会员
    • 待确认,因为是异步,发送消息后,睡1s尽最大努力在后续操作可以拿到会员截止日期, 如果不允许睡眠,注册后JWT中可能没有会员截止日期
  • 会员权限检查问题, 规则在jwt中找memberDDL, 值为“”表示未购买会员, 不为“”时根据memberDDL与当前时间比较来判断会员是否生效(时间均为Local()),已在下列位置添加会员权限校验:
    • question handler中的Permission方法
    • case handler中的Permission方法
  • 用户购买会员后如何将会员截止日加入JWT的问题
    • 用户注册成功, 在生成JWT时, 会员模块可能未处理完, 所以JWT中可能无会员截止日期
    • 用户购买成功, 需要替换用户的JWT, 是不是可以增加一个“会员权益页”或者“商品购买成功”页, 在获取这个页面的内容的时候, 重新为用户生成JWT. 总结下来就是我们需要一个时机,拿到控制权为用户重新生成JWT, 替换JWT的代码我暂时写在用户模块的MemberBenefits方法中
  • 代码构建问题
    • kafka客户端选择问题, 当前用mq-api提供的抽象, 是否需要替换为sarama
    • consumer和producer是在app层面初始化, 还是在模块层面初始化, 当前是在模块内拿到mq, 然后各个模块其内部按需创建
    • topic由谁来创建, 生产者/消费者? 还是在app全局? 当前是由生产者在wire中创建的,消费者根据冗余的事件结构体的Topic方法来消费

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 4, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (09e2ddd) to head (a9baaa5).

Additional details and impacted files
@@            Coverage Diff            @@
##               dev       #68   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            1         2    +1     
  Lines           12        42   +30     
=========================================
+ Hits            12        42   +30     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@flycash
Copy link
Copy Markdown
Contributor

flycash commented Apr 4, 2024

  1. 暂时来说,用户注册那里不需要考虑 sleep 1s,因为我们有一个基本的机制就是如果发现用户没有会员权限,是要去实时查询,你可以认为 JWT 是一个加速机制,但不是一个“事实”。即便是因为消息队列延迟导致会员没有及时开通,也没什么关系,毕竟这个是一个白嫖的;
  2. 会员校验参考登录校验,利用 GIN 的中间件的顺序。也就是开放 API - 需登录 API - 需会员 API,在登录校验之后,再加一个会员校验。而位于会员校验和登录校验之间的合并请求,就可以认为是只需要登录,但是不需要会员的;
  3. 用户购买成功之后,会刷新 JWT。同样也不需要特别担忧这个,JWT 发现没有会员资格的时候,需要实时查询。如果实时查询发现有会员,也会刷新 JWT。
  4. mq 保持使用 mq-api,在 app 层面上初始化并且注入;
  5. 离线创建 topic。也就是既不是生产者,也不是消费者。在实践中,生产者创建 topic 比较常见,但是在一些特定的情况下,topic 需要多少个分区,是需要考虑消费者的。我们目前暂时可以认为,所有的消息都只有三个分区。三个分区是因为后续如果考虑到容错,我应该会考虑部署三个实例;

Signed-off-by: longyue0521 <longyueli0521@gmail.com>
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
Comment thread internal/member/internal/event/consumer.go Outdated
Comment thread internal/member/internal/event/consumer.go Outdated
Comment thread internal/member/internal/repository/dao/member.go Outdated
Comment thread internal/user/internal/web/handler.go Outdated
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
@longyue0521
Copy link
Copy Markdown
Collaborator Author

longyue0521 commented Apr 5, 2024

@flycash 请帮我看一下, 这个会员权限验证的实现方式是否可行, 思路:

internal/pkg/membership/validator.go 中的validator在app层面构建, 然后注入到需要会员权限检查的模块, 在模块内部使用如下方式来集成:

	server.POST("/case/save", ginx.S(h.Permission), ginx.S(h.validator.Membership), ginx.BS[SaveReq](h.Save))

因为模块内的Private路由有时部分需要会员权限检查, 所以没有采用在初始化gin的时候使用Use注册.

我还为ginx提了一个PR ecodeclub/ginx#23 请看一下

Signed-off-by: longyue0521 <longyueli0521@gmail.com>
@flycash
Copy link
Copy Markdown
Contributor

flycash commented Apr 5, 2024

这个可以进一步分化的。应该是类似这样的代码:

func (h *handler) PrivateRoutes()
func (h *handler) MemberRoutes()
func (h *handler) PublicRoutes()

而后在 gin 初始化里面:

h1.PublicRoutes()
h2.PublicRoutes()
h1.PrivateRoutes()
h2.PublicRoutes()
h3.MemberRoutes()
h4.MemberRoutes()

目前来看我们的权限控制还不是特别复杂,所以可以进一步这样分离。

而后万一在将来我们需要进一步检测权限,再来重构。

@flycash
Copy link
Copy Markdown
Contributor

flycash commented Apr 5, 2024

现在的 Permission 我后面是要重构的,所以你可以不用动它,我要抽取出来作为一个 admin,启用另外一个 gin.Engine,监听不同的端口。

@flycash
Copy link
Copy Markdown
Contributor

flycash commented Apr 5, 2024

会员检测这里,你只修改你现在要改的那些,后面再额外提一个合并请求上来

Comment thread internal/member/internal/repository/dao/member.go Outdated
Comment thread internal/cases/internal/web/handler.go Outdated
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
@longyue0521 longyue0521 changed the title [WIP] 实现会员模块并改造用户、问题、案例等相关模块 实现会员模块+重构用户模块+实现会员检查gin中间件 Apr 6, 2024
Signed-off-by: longyue0521 <longyueli0521@gmail.com>
@longyue0521 longyue0521 merged commit 2f71687 into ecodeclub:dev Apr 6, 2024
@longyue0521 longyue0521 deleted the feat_member branch April 6, 2024 04:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants