@@ -3,7 +3,9 @@ package v1
33import (
44 "github.com/gin-gonic/gin"
55 "github.com/golang-minibear2333/gin-blog/global"
6+ "github.com/golang-minibear2333/gin-blog/internal/service"
67 "github.com/golang-minibear2333/gin-blog/pkg/app"
8+ "github.com/golang-minibear2333/gin-blog/pkg/convert"
79 "github.com/golang-minibear2333/gin-blog/pkg/errcode"
810)
911
@@ -27,48 +29,102 @@ func (t Tag) Get(c *gin.Context) {}
2729// @Failure 500 {object} errcode.Error "内部错误"
2830// @Router /api/v1/tags [get]
2931func (t Tag ) List (c * gin.Context ) {
30- // 报错测试
31- // curl -X GET "http://localhost:8000/api/v1/tags?state=6" -H "accept: application/json"
32- param := struct {
33- Name string `form:"name" binding:"max=100"`
34- State uint8 `form:"state,default=1" binding:"oneof=0 1"`
35- }{}
32+ param := service.TagListRequest {}
3633 response := app .NewResponse (c )
34+ // 使用 internal/service/tag.go 内的结构体验证ctx请求带上的参数是否合法,并根据地域进行翻译报错
3735 valid , errs := app .BindAndValid (c , & param )
3836 if ! valid {
3937 global .Logger .Errorf ("app.BindAndValid errs: %v" , errs )
4038 response .ToErrorResponse (errcode .InvalidParams .WithDetails (errs .Errors ()... ))
4139 return
4240 }
43-
44- response .ToResponse (gin.H {})
41+ // 获取Service
42+ svc := service .New (c .Request .Context ())
43+ // 处理分页参数,防止出现异常
44+ pager := app.Pager {Page : app .GetPage (c ), PageSize : app .GetPageSize (c )}
45+ // 获取标签总数,这里不用传name时可以拉到所有标签,State代表禁用启用
46+ // TODO 这里查询列表有必要传入标签名吗?
47+ totalRows , err := svc .CountTag (& service.CountTagRequest {Name : param .Name , State : param .State })
48+ if err != nil {
49+ global .Logger .Errorf ("svc.CountTag err: %v" , err )
50+ response .ToErrorResponse (errcode .ErrorCountTagFail )
51+ return
52+ }
53+ // 获取标签列表
54+ tags , err := svc .GetTagList (& param , & pager )
55+ if err != nil {
56+ global .Logger .Errorf ("svc.GetTagList err: %v" , err )
57+ response .ToErrorResponse (errcode .ErrorGetTagListFail )
58+ return
59+ }
60+ // 返回标签列表成规定的格式
61+ response .ToResponseList (tags , totalRows )
4562 return
4663}
4764
48- // Create tag create
4965// @Summary 新增标签
5066// @Produce json
5167// @Param name body string true "标签名称" minlength(3) maxlength(100)
52- // @Param state body int false "状态 " Enums(0, 1) default(1)
68+ // @Param state body int false "是否启用(0 为禁用、1 为启用) " Enums(0, 1) default(1)
5369// @Param created_by body string true "创建者" minlength(3) maxlength(100)
5470// @Success 200 {object} model.Tag "成功"
5571// @Failure 400 {object} errcode.Error "请求错误"
5672// @Failure 500 {object} errcode.Error "内部错误"
5773// @Router /api/v1/tags [post]
58- func (t Tag ) Create (c * gin.Context ) {}
74+ func (t Tag ) Create (c * gin.Context ) {
75+ param := service.CreateTagRequest {}
76+ response := app .NewResponse (c )
77+ valid , errs := app .BindAndValid (c , & param )
78+ if ! valid {
79+ global .Logger .Errorf ("app.BindAndValid errs: %v" , errs )
80+ response .ToErrorResponse (errcode .InvalidParams .WithDetails (errs .Errors ()... ))
81+ return
82+ }
83+
84+ svc := service .New (c .Request .Context ())
85+ err := svc .CreateTag (& param )
86+ if err != nil {
87+ global .Logger .Errorf ("svc.CreateTag err: %v" , err )
88+ response .ToErrorResponse (errcode .ErrorCreateTagFail )
89+ return
90+ }
91+
92+ response .ToResponse (gin.H {})
93+ return
94+ }
5995
6096// Update tag update
6197// @Summary 更新标签
6298// @Produce json
6399// @Param id path int true "标签 ID"
64100// @Param name body string false "标签名称" minlength(3) maxlength(100)
65- // @Param state body int false "状态 " Enums(0, 1) default(1)
101+ // @Param state body int false "是否启用(0 为禁用、1 为启用) " Enums(0, 1) default(1)
66102// @Param modified_by body string true "修改者" minlength(3) maxlength(100)
67103// @Success 200 {object} model.Tag "成功"
68104// @Failure 400 {object} errcode.Error "请求错误"
69105// @Failure 500 {object} errcode.Error "内部错误"
70106// @Router /api/v1/tags/{id} [put]
71- func (t Tag ) Update (c * gin.Context ) {}
107+ func (t Tag ) Update (c * gin.Context ) {
108+ param := service.UpdateTagRequest {ID : convert .StrTo (c .Param ("id" )).MustUInt32 ()}
109+ response := app .NewResponse (c )
110+ valid , errs := app .BindAndValid (c , & param )
111+ if ! valid {
112+ global .Logger .Errorf ("app.BindAndValid errs: %v" , errs )
113+ response .ToErrorResponse (errcode .InvalidParams .WithDetails (errs .Errors ()... ))
114+ return
115+ }
116+
117+ svc := service .New (c .Request .Context ())
118+ err := svc .UpdateTag (& param )
119+ if err != nil {
120+ global .Logger .Errorf ("svc.UpdateTag err: %v" , err )
121+ response .ToErrorResponse (errcode .ErrorUpdateTagFail )
122+ return
123+ }
124+
125+ response .ToResponse (gin.H {})
126+ return
127+ }
72128
73129// Delete tag delete
74130// @Summary 删除标签
@@ -78,4 +134,25 @@ func (t Tag) Update(c *gin.Context) {}
78134// @Failure 400 {object} errcode.Error "请求错误"
79135// @Failure 500 {object} errcode.Error "内部错误"
80136// @Router /api/v1/tags/{id} [delete]
81- func (t Tag ) Delete (c * gin.Context ) {}
137+ func (t Tag ) Delete (c * gin.Context ) {
138+ param := service.DeleteTagRequest {ID : convert .StrTo (c .Param ("id" )).MustUInt32 ()}
139+ response := app .NewResponse (c )
140+ valid , errs := app .BindAndValid (c , & param )
141+ if ! valid {
142+ // TODO 这些代码重复太多次有办法抽出来吗?
143+ global .Logger .Errorf ("app.BindAndValid errs: %v" , errs )
144+ response .ToErrorResponse (errcode .InvalidParams .WithDetails (errs .Errors ()... ))
145+ return
146+ }
147+
148+ svc := service .New (c .Request .Context ())
149+ err := svc .DeleteTag (& param )
150+ if err != nil {
151+ global .Logger .Errorf ("svc.DeleteTag err: %v" , err )
152+ response .ToErrorResponse (errcode .ErrorDeleteTagFail )
153+ return
154+ }
155+
156+ response .ToResponse (gin.H {})
157+ return
158+ }
0 commit comments