diff --git a/app/app.go b/app/app.go index 3094d64..54a6312 100644 --- a/app/app.go +++ b/app/app.go @@ -11,6 +11,7 @@ import ( "gofiber.study.skcks.cn/common/utils" "gofiber.study.skcks.cn/controller" "gofiber.study.skcks.cn/global" + "gofiber.study.skcks.cn/middleware" "gofiber.study.skcks.cn/services" ) @@ -32,6 +33,7 @@ func Run() { reloadNanoId(global.Config) global.App = reloadApp(global.Config) + middleware.NewCasbin(global.App, global.DataSources) if err := global.App.Listen(global.Config.Server.Addr); err != nil { logger.Log.Fatalf("[x] [Fiber] 致命错误: %s", err) diff --git a/app/datasources.go b/app/datasources.go index 08ac802..22245e6 100644 --- a/app/datasources.go +++ b/app/datasources.go @@ -6,7 +6,6 @@ import ( "gofiber.study.skcks.cn/common/logger" "gofiber.study.skcks.cn/common/utils" "gofiber.study.skcks.cn/global" - "gofiber.study.skcks.cn/middleware" "xorm.io/xorm" ) @@ -29,6 +28,4 @@ func reloadDataSources(c *config.BasicConfig) { if c.Mysql.AutoSync && !fiber.IsChild() { global.SyncModelToDataSource() } - - middleware.NewCasbin(global.DataSources) } diff --git a/controller/topical/topical.go b/controller/topical/topical.go index 0bcc6db..9de25d9 100644 --- a/controller/topical/topical.go +++ b/controller/topical/topical.go @@ -52,6 +52,38 @@ func (c *Controller) CreateTopical() { return ctx.JSON(errorx.ParseError(err)) } - return ctx.JSON(response.NewResponse("")) + return ctx.JSON(response.NewResponse("主题创建成功")) + }) +} + +// DeleteTopical 删除主题 +// +// @Summary 删除主题 +// @Description 删除主题 +// @Tags Topical +// @Accept json +// @Produce json +// @Param vo query topical.DeleteTopicalDTO true "DeleteTopicalDTO" +// @Success 200 {object} response.Response{data=string} +// @Failure default {object} errorx.CodeErrorResponse +// @Router /topical/delete [delete] +// @Security Token +func (c *Controller) DeleteTopical() { + c.Router.Delete("/delete", func(ctx *fiber.Ctx) error { + var dto = &topical2.DeleteTopicalDTO{} + + _ = ctx.QueryParser(dto) + + err := global.ValidateStruct(dto) + if err != nil { + return ctx.JSON(errorx.ParseError(err)) + } + + err = topical.Services.DeleteTopical(*dto) + if err != nil { + return ctx.JSON(errorx.ParseError(err)) + } + + return ctx.JSON(response.NewResponse("主题删除成功")) }) } diff --git a/docs/docs.go b/docs/docs.go index 338c348..abc71e5 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -865,6 +865,59 @@ const docTemplate = `{ } } }, + "/topical/delete": { + "delete": { + "security": [ + { + "Token": [] + } + ], + "description": "删除主题", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Topical" + ], + "summary": "删除主题", + "parameters": [ + { + "type": "string", + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/response.Response" + }, + { + "type": "object", + "properties": { + "data": { + "type": "string" + } + } + } + ] + } + }, + "default": { + "description": "", + "schema": { + "$ref": "#/definitions/errorx.CodeErrorResponse" + } + } + } + } + }, "/user/account": { "get": { "security": [ diff --git a/docs/swagger.json b/docs/swagger.json index 82c9179..1e2e55a 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -857,6 +857,59 @@ } } }, + "/topical/delete": { + "delete": { + "security": [ + { + "Token": [] + } + ], + "description": "删除主题", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Topical" + ], + "summary": "删除主题", + "parameters": [ + { + "type": "string", + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/response.Response" + }, + { + "type": "object", + "properties": { + "data": { + "type": "string" + } + } + } + ] + } + }, + "default": { + "description": "", + "schema": { + "$ref": "#/definitions/errorx.CodeErrorResponse" + } + } + } + } + }, "/user/account": { "get": { "security": [ diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 204cdad..9dd7513 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -654,6 +654,36 @@ paths: summary: 创建主题 tags: - Topical + /topical/delete: + delete: + consumes: + - application/json + description: 删除主题 + parameters: + - in: query + name: id + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + allOf: + - $ref: '#/definitions/response.Response' + - properties: + data: + type: string + type: object + default: + description: "" + schema: + $ref: '#/definitions/errorx.CodeErrorResponse' + security: + - Token: [] + summary: 删除主题 + tags: + - Topical /user/account: get: consumes: diff --git a/middleware/casbin.go b/middleware/casbin.go index 97a437d..47c647b 100644 --- a/middleware/casbin.go +++ b/middleware/casbin.go @@ -20,7 +20,7 @@ const ( CasBinSeparator = "::" ) -func NewCasbin(engine *xorm.EngineGroup) { +func NewCasbin(app *fiber.App, engine *xorm.EngineGroup) { casbinModels := make([]models.CasbinModel, 0) err := engine.Find(&casbinModels) if err != nil { @@ -48,7 +48,7 @@ func NewCasbin(engine *xorm.EngineGroup) { } // 初始化 role::root 组权限 - initRootGroupPermission(e) + initRootGroupPermission(app, e) global.Enforcer = e @@ -57,10 +57,15 @@ func NewCasbin(engine *xorm.EngineGroup) { }) } -func initRootGroupPermission(e *casbin.Enforcer) { +func initRootGroupPermission(app *fiber.App, e *casbin.Enforcer) { // 添加/修改 组策略 // role::root 组 继承 root 的权限 _, _ = e.AddGroupingPolicy("role::root", "user::root") + for _, routes := range app.Stack() { + for _, route := range routes { + _, _ = e.AddPolicy("role::root", DefaultSystem, route.Path, route.Method) + } + } } func CasbinMiddleWare(c *fiber.Ctx) error { diff --git a/model/topical/dto.go b/model/topical/dto.go index 75a2f47..ccee6d3 100644 --- a/model/topical/dto.go +++ b/model/topical/dto.go @@ -1,6 +1,10 @@ package topical type CreateTopicalDTO struct { - Title string - Content string + Title string `json:"title" validate:"required"` + Content string `json:"content" validate:"required"` +} + +type DeleteTopicalDTO struct { + Id string `json:"id" example:"123456" validate:"required"` } diff --git a/services/topical/topical.go b/services/topical/topical.go index 33ac4c8..607fc9e 100644 --- a/services/topical/topical.go +++ b/services/topical/topical.go @@ -1,7 +1,9 @@ package topical import ( + "errors" "gofiber.study.skcks.cn/global" + "gofiber.study.skcks.cn/logger" "gofiber.study.skcks.cn/model/generic/models" "gofiber.study.skcks.cn/model/topical" "strconv" @@ -16,6 +18,10 @@ func InitService() { Services = &Service{} } +var ( + NotExist = errors.New("主题不存在") +) + func (s *Service) CreateTopical(dto topical.CreateTopicalDTO, userId string) error { id, _ := global.SonyFlake.NextID() _, err := global.DataSources.Insert(&models.Topical{ @@ -33,3 +39,27 @@ func (s *Service) CreateTopical(dto topical.CreateTopicalDTO, userId string) err return nil } + +func (s *Service) DeleteTopical(dto topical.DeleteTopicalDTO) error { + t := &models.Topical{ + Id: dto.Id, + } + + logger.Logger().Infof("%#v", t) + + exist, err := global.DataSources.Get(t) + if err != nil { + return err + } + + if !exist { + return NotExist + } + + _, err = global.DataSources.Limit(1).Delete(t) + if err != nil { + return err + } + + return nil +}