/
demo.go
192 lines (171 loc) · 4.73 KB
/
demo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
// Package service 服务
package service
import (
"context"
"errors"
"github.com/thoohv5/person/internal/provide/http"
"github.com/thoohv5/person/pkg/util/errgroup"
"github.com/thoohv5/person/app/interface/demo-interface/api/config"
"github.com/thoohv5/person/app/interface/demo-interface/api/http/request"
"github.com/thoohv5/person/app/interface/demo-interface/api/http/response"
"github.com/thoohv5/person/app/interface/demo-interface/internal/repository"
rDemo "github.com/thoohv5/person/app/interface/demo-interface/internal/repository/demo"
"github.com/thoohv5/person/internal/code"
"github.com/thoohv5/person/internal/model"
"github.com/thoohv5/person/internal/provide/logger"
"github.com/thoohv5/person/internal/provide/nats"
"github.com/thoohv5/person/pkg/log"
)
// demo 模板
type demo struct {
log log.Logger
conf config.Config
data repository.IRepository
producer nats.IProducer
}
// NewDemo 创建模板
func NewDemo(
logger log.Logger,
conf config.Config,
data repository.IRepository,
) IDemo {
return &demo{
log: logger,
conf: conf,
data: data,
}
}
// IDemo 模板
type IDemo interface {
// Create 创建
Create(ctx context.Context, param *request.DemoCreate) error
// Update 更新
Update(ctx context.Context, uriParam *request.DemoPkID, param *request.DemoUpdate) error
// List 列表
List(ctx context.Context, param *request.DemoList) ([]*response.DemoEntity, int32, error)
// Detail 详情
Detail(ctx context.Context, param *request.DemoPkID) (*rDemo.Demo, error)
// Delete 删除
Delete(ctx context.Context, param *request.DemoPkID) error
}
// Create 创建
func (d *demo) Create(ctx context.Context, param *request.DemoCreate) error {
// 创建
if err := d.data.GetDemo().Create(ctx, &rDemo.Demo{
Name: param.Name,
Age: param.Age,
State: param.State,
}); err != nil {
d.log.Errorc(ctx, "[demo Create] create db error", logger.FieldError(err))
return code.ErrOpDB
}
return nil
}
// Update 更新
func (d *demo) Update(ctx context.Context, uriParam *request.DemoPkID, param *request.DemoUpdate) error {
// 更新
if err := d.data.GetDemo().Update(ctx, model.Where(
rDemo.ID(uriParam.ID),
), &rDemo.Demo{
Name: param.Name,
Age: param.Age,
State: param.State,
}); err != nil {
d.log.Errorc(ctx, "[demo Update] update db error", logger.FieldError(err))
return code.ErrOpDB
}
return nil
}
// List 获取分页数据
func (d *demo) List(ctx context.Context, param *request.DemoList) ([]*response.DemoEntity, int32, error) {
ret := make([]*response.DemoEntity, 0)
total := int32(0)
// 条件
condition := model.Where(
rDemo.GetCommonQuery(http.BaseRequest{
PageNum: param.PageNum,
PageSize: param.PageSize,
SortField: param.SortField,
SortOrder: param.SortOrder,
Search: param.Search,
}),
// todo 条件
)
// 并发
eg := errgroup.WithContext(ctx)
// 总数
eg.Go(func(ctx context.Context) error {
if param.ExclusiveTotal {
return nil
}
cnt, err := d.data.GetDemo().Count(ctx, condition)
if err != nil {
d.log.Errorc(ctx, "[demo][List] count db error", logger.FieldError(err))
return code.ErrOpDB
}
if cnt == 0 {
return code.ErrOpCancel
}
total = cnt
return nil
})
// 列表
eg.Go(func(ctx context.Context) error {
if param.ExclusiveList {
return nil
}
list, err := d.data.GetDemo().List(ctx, condition)
if err != nil {
d.log.Errorc(ctx, "[demo][List] list db error", logger.FieldError(err))
return code.ErrOpDB
}
// model转化entity
entityList := make([]*response.DemoEntity, 0, len(list))
for _, item := range list {
entityList = append(entityList, d.toEntity(item))
}
ret = entityList
return nil
})
// 等待
if err := eg.Wait(); err != nil && !errors.Is(err, code.ErrOpCancel) {
return nil, 0, err
}
return ret, total, nil
}
// Detail 创建
func (d *demo) Detail(ctx context.Context, param *request.DemoPkID) (*rDemo.Demo, error) {
// 详情
data, err := d.data.GetDemo().Detail(ctx, model.Where(
rDemo.ID(param.ID),
))
if err != nil {
if model.IsNotErrNoRows(err) {
d.log.Errorc(ctx, "[demo Detail] detail db error", logger.FieldError(err))
return nil, code.ErrOpDB
}
return nil, code.ErrDataNotExist
}
return data, nil
}
// Delete 删除
func (d *demo) Delete(ctx context.Context, param *request.DemoPkID) error {
// 删除
if err := d.data.GetDemo().Delete(ctx, model.Where(
rDemo.ID(param.ID),
)); err != nil {
d.log.Errorc(ctx, "[demo Delete] delete db error", logger.FieldError(err))
return code.ErrOpDB
}
return nil
}
// 转换
func (d *demo) toEntity(item *rDemo.Demo) *response.DemoEntity {
return &response.DemoEntity{
ID: item.ID,
Name: item.Name,
State: item.State,
Age: item.Age,
CreateTime: item.CreatedTime,
}
}