补充事务说明
This commit is contained in:
parent
6df56cbe96
commit
33699fad93
@ -83,4 +83,6 @@ WORKSPACE_DIR="/Users/xxxx/Projects/go-course/go17/vblog"
|
||||
|
||||
### 业务模块的实现
|
||||
|
||||
TDD (Test Drive Development)
|
||||
TDD (Test Drive Development)
|
||||
|
||||
+ 用户模块
|
@ -19,8 +19,24 @@ func (u *UserServiceImpl) DescribeUser(context.Context, *user.DescribeUserReques
|
||||
}
|
||||
|
||||
// Registry implements user.Service.
|
||||
func (u *UserServiceImpl) Registry(context.Context, *user.RegistryRequest) (*user.User, error) {
|
||||
panic("unimplemented")
|
||||
func (u *UserServiceImpl) Registry(ctx context.Context, in *user.RegistryRequest) (*user.User, error) {
|
||||
ins, err := user.New(in)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 无事务的模式
|
||||
// datasource.DB().Transaction(func(tx *gorm.DB) error {
|
||||
// ctx := datasource.WithTransactionCtx(ctx)
|
||||
// // 1.
|
||||
// svcA.Call(ctx)
|
||||
// // 2.
|
||||
// svcB.Call(ctx)
|
||||
// // 3.
|
||||
// svcC.Call(ctx)
|
||||
// })
|
||||
|
||||
return ins, nil
|
||||
}
|
||||
|
||||
// ResetPassword implements user.Service.
|
||||
@ -29,7 +45,10 @@ func (u *UserServiceImpl) ResetPassword(context.Context, *user.ResetPasswordRequ
|
||||
}
|
||||
|
||||
// UnRegistry implements user.Service.
|
||||
func (u *UserServiceImpl) UnRegistry(context.Context, *user.UnRegistryRequest) {
|
||||
func (u *UserServiceImpl) UnRegistry(ctx context.Context, in *user.UnRegistryRequest) {
|
||||
// datasource.GetTransactionFromCtx(ctx)
|
||||
// datasource.DB()
|
||||
// datasource.DBFromCtx()
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
|
@ -3,9 +3,21 @@ package user
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/infraboard/mcube/v2/exception"
|
||||
"github.com/infraboard/mcube/v2/ioc/config/validator"
|
||||
"gitlab.com/go-course-project/go17/vblog/utils"
|
||||
)
|
||||
|
||||
func New(in *RegistryRequest) (*User, error) {
|
||||
if err := in.Validate(); err != nil {
|
||||
return nil, exception.NewBadRequest("参数校验失败: %s", err)
|
||||
}
|
||||
return &User{
|
||||
ResourceMeta: *utils.NewResourceMeta(),
|
||||
RegistryRequest: *in,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type User struct {
|
||||
// 存放到数据里的对象的远数据信息
|
||||
utils.ResourceMeta
|
||||
@ -15,15 +27,19 @@ type User struct {
|
||||
|
||||
type RegistryRequest struct {
|
||||
// 用户名
|
||||
Username string `json:"username" gorm:"column:username;unique;index"`
|
||||
Username string `json:"username" gorm:"column:username;unique;index" validate:"required"`
|
||||
// 密码
|
||||
Password string `json:"password" gorm:"column:username;type:varchar(255)"`
|
||||
Password string `json:"password" gorm:"column:username;type:varchar(255)" validate:"required"`
|
||||
// Profile 信息
|
||||
Profile
|
||||
// 用户状态
|
||||
Status
|
||||
}
|
||||
|
||||
func (r *RegistryRequest) Validate() error {
|
||||
return validator.Validate(r)
|
||||
}
|
||||
|
||||
type Profile struct {
|
||||
// 头像
|
||||
Avatar string `json:"avatar" gorm:"column:avatar;type:varchar(255)"`
|
||||
|
37
vblog/docs/transation.drawio
Normal file
37
vblog/docs/transation.drawio
Normal file
@ -0,0 +1,37 @@
|
||||
<mxfile host="65bd71144e">
|
||||
<diagram id="u9_ob_htgBlG7QGFx-zW" name="第 1 页">
|
||||
<mxGraphModel dx="1147" dy="647" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="2" value="&nbsp;事务" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="120" y="150" width="430" height="60" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="3" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="120" y="280" width="120" height="240" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="11" style="edgeStyle=none;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="4" target="3">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="270" y="280" width="120" height="240" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="10" style="edgeStyle=none;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="5" target="4">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="5" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="430" y="280" width="120" height="240" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="6" value="A" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="120" y="250" width="60" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="8" value="B" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
||||
<mxGeometry x="270" y="250" width="30" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="9" value="C" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
||||
<mxGeometry x="430" y="250" width="30" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
@ -2,6 +2,12 @@ package utils
|
||||
|
||||
import "time"
|
||||
|
||||
func NewResourceMeta() *ResourceMeta {
|
||||
return &ResourceMeta{
|
||||
CreatedAt: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
type ResourceMeta struct {
|
||||
// 资源Id
|
||||
Id uint `json:"id" gorm:"primaryKey;column:id"`
|
||||
|
Loading…
x
Reference in New Issue
Block a user