diff --git a/models/medal.go b/models/medal.go new file mode 100644 index 000000000..d2508b3b1 --- /dev/null +++ b/models/medal.go @@ -0,0 +1,103 @@ +package models + +import ( + "code.gitea.io/gitea/modules/timeutil" + "xorm.io/builder" +) + +type Medal struct { + ID int64 `xorm:"pk autoincr"` + Name string + LightedIcon string `xorm:"varchar(2048)"` + GreyedIcon string `xorm:"varchar(2048)"` + Url string `xorm:"varchar(2048)"` + CategoryId int64 + CreatedUnix timeutil.TimeStamp `xorm:"created"` + UpdatedUnix timeutil.TimeStamp `xorm:"updated"` + DeletedAt timeutil.TimeStamp `xorm:"deleted"` +} + +type GetMedalOpts struct { + MedalType MedalType +} + +type MedalAndCategory struct { + Medal Medal `xorm:"extends"` + Category MedalCategory `xorm:"extends"` +} + +func (*MedalAndCategory) TableName() string { + return "medal" +} + +func (m *MedalAndCategory) ToShow() *Medal4Show { + return &Medal4Show{ + ID: m.Medal.ID, + Name: m.Medal.Name, + LightedIcon: m.Medal.LightedIcon, + GreyedIcon: m.Medal.GreyedIcon, + Url: m.Medal.Url, + CategoryName: m.Category.Name, + CategoryId: m.Category.ID, + CreatedUnix: m.Medal.CreatedUnix, + UpdatedUnix: m.Medal.UpdatedUnix, + } +} + +type Medal4Show struct { + ID int64 + Name string + LightedIcon string + GreyedIcon string + Url string + CategoryName string + CategoryId int64 + CreatedUnix timeutil.TimeStamp + UpdatedUnix timeutil.TimeStamp +} + +func (m Medal4Show) ToDTO() Medal { + return Medal{ + Name: m.Name, + LightedIcon: m.LightedIcon, + GreyedIcon: m.GreyedIcon, + Url: m.Url, + CategoryId: m.CategoryId, + } +} + +func GetMedalList(opts GetMedalOpts) ([]*MedalAndCategory, error) { + var cond = builder.NewCond() + if opts.MedalType > 0 { + cond = cond.And(builder.Eq{"medal_category.type": opts.MedalType}) + } + + r := make([]*MedalAndCategory, 0) + if err := x.Join("INNER", "medal_category", "medal_category.ID = medal.category_id").Where(cond).OrderBy("medal.created_unix desc").Find(&r); err != nil { + return nil, err + } + return r, nil +} + +func AddMedal(m Medal) (int64, error) { + return x.Insert(&m) +} + +func UpdateMedalById(id int64, param Medal) (int64, error) { + return x.ID(id).Update(¶m) +} + +func DelMedal(id int64) (int64, error) { + return x.ID(id).Delete(&Medal{}) +} + +func GetMedalById(id int64) (*Medal, error) { + m := &Medal{} + has, err := x.ID(id).Get(m) + if err != nil { + return nil, err + } else if !has { + return nil, &ErrRecordNotExist{} + } + return m, nil +} diff --git a/models/medal_category.go b/models/medal_category.go new file mode 100644 index 000000000..3c8769650 --- /dev/null +++ b/models/medal_category.go @@ -0,0 +1,79 @@ +package models + +import "code.gitea.io/gitea/modules/timeutil" + +type MedalType int + +const ( + CustomizeMedal = iota + 1 + SystemMedal +) + +type MedalCategory struct { + ID int64 `xorm:"pk autoincr"` + Name string + Position int64 + Type MedalType + CreatedUnix timeutil.TimeStamp `xorm:"created"` + UpdatedUnix timeutil.TimeStamp `xorm:"updated"` + DeletedAt timeutil.TimeStamp `xorm:"deleted"` +} + +func (m *MedalCategory) ToShow() *MedalCategory4Show { + return &MedalCategory4Show{ + ID: m.ID, + Name: m.Name, + Position: m.Position, + Type: m.Type, + CreatedUnix: m.CreatedUnix, + } +} + +type MedalCategory4Show struct { + ID int64 `xorm:"pk autoincr"` + Name string + Position int64 + Type MedalType + CreatedUnix timeutil.TimeStamp `xorm:"created"` +} + +func (m MedalCategory4Show) ToDTO() MedalCategory { + return MedalCategory{ + ID: m.ID, + Name: m.Name, + Position: m.Position, + Type: m.Type, + CreatedUnix: m.CreatedUnix, + } +} + +func GetMedalCategoryList() ([]*MedalCategory, error) { + r := make([]*MedalCategory, 0) + if err := x.OrderBy("position asc,created_unix desc").Find(&r); err != nil { + return nil, err + } + return r, nil +} + +func AddMedalCategory(m MedalCategory) (int64, error) { + return x.Insert(&m) +} + +func UpdateMedalCategoryById(id int64, param MedalCategory) (int64, error) { + return x.ID(id).Update(¶m) +} + +func DelMedalCategory(id int64) (int64, error) { + return x.ID(id).Delete(&MedalCategory{}) +} + +func GetMedalCategoryById(id int64) (*MedalCategory, error) { + m := &MedalCategory{} + has, err := x.ID(id).Get(m) + if err != nil { + return nil, err + } else if !has { + return nil, &ErrRecordNotExist{} + } + return m, nil +} diff --git a/models/models.go b/models/models.go index 4c2079cd8..910bfde65 100755 --- a/models/models.go +++ b/models/models.go @@ -161,6 +161,8 @@ func init() { new(CloudbrainSpec), new(CloudbrainTemp), new(DatasetReference), + new(MedalCategory), + new(Medal), ) tablesStatistic = append(tablesStatistic, diff --git a/models/user_medal.go b/models/user_medal.go new file mode 100644 index 000000000..a4421df13 --- /dev/null +++ b/models/user_medal.go @@ -0,0 +1,10 @@ +package models + +import "code.gitea.io/gitea/modules/timeutil" + +type UserMedal struct { + ID int64 `xorm:"pk autoincr"` + UserId int64 `xorm:"index"` + MedalId int64 `xorm:"index"` + CreatedUnix timeutil.TimeStamp `xorm:"created"` +} diff --git a/routers/medal/category.go b/routers/medal/category.go new file mode 100644 index 000000000..b010af586 --- /dev/null +++ b/routers/medal/category.go @@ -0,0 +1,46 @@ +package medal + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/routers/response" + "code.gitea.io/gitea/services/medal" + "errors" + "net/http" +) + +func GetCategoryList(ctx *context.Context) { + r, err := medal.GetMedalCategoryList() + if err != nil { + log.Error("GetCategoryList error.%v", err) + ctx.JSON(http.StatusOK, response.ServerError(err.Error())) + return + } + m := make(map[string]interface{}) + m["List"] = r + ctx.JSON(http.StatusOK, response.SuccessWithData(m)) +} + +func OperateMedalCategory(ctx *context.Context, category models.MedalCategory4Show) { + action := ctx.Params(":action") + + var err error + switch action { + case "edit": + err = medal.EditMedalCategory(category, ctx.User) + case "new": + err = medal.AddMedalCategory(category, ctx.User) + case "del": + err = medal.DelMedalCategory(category.ID, ctx.User) + default: + err = errors.New("action type error") + } + + if err != nil { + log.Error("OperateMedalCategory error ,%v", err) + ctx.JSON(http.StatusOK, response.ServerError(err.Error())) + return + } + ctx.JSON(http.StatusOK, response.Success()) +} diff --git a/routers/medal/medal.go b/routers/medal/medal.go new file mode 100644 index 000000000..d0625a2b4 --- /dev/null +++ b/routers/medal/medal.go @@ -0,0 +1,46 @@ +package medal + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/routers/response" + "code.gitea.io/gitea/services/medal" + "errors" + "net/http" +) + +func GetCustomizeMedalList(ctx *context.Context) { + r, err := medal.GetMedalList(models.GetMedalOpts{MedalType: models.CustomizeMedal}) + if err != nil { + log.Error("GetCategoryList error.%v", err) + ctx.JSON(http.StatusOK, response.ServerError(err.Error())) + return + } + m := make(map[string]interface{}) + m["List"] = r + ctx.JSON(http.StatusOK, response.SuccessWithData(m)) +} + +func OperateMedal(ctx *context.Context, category models.Medal4Show) { + action := ctx.Params(":action") + + var err error + switch action { + case "edit": + err = medal.EditMedal(category, ctx.User) + case "new": + err = medal.AddMedal(category, ctx.User) + case "del": + err = medal.DelMedal(category.ID, ctx.User) + default: + err = errors.New("action type error") + } + + if err != nil { + log.Error("OperateCustomizeMedal error ,%v", err) + ctx.JSON(http.StatusOK, response.ServerError(err.Error())) + return + } + ctx.JSON(http.StatusOK, response.Success()) +} diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 66a357c79..5830edfdc 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -6,6 +6,7 @@ package routes import ( "bytes" + "code.gitea.io/gitea/routers/medal" "code.gitea.io/gitea/routers/reward/point" "code.gitea.io/gitea/routers/task" "code.gitea.io/gitea/services/reward" @@ -659,9 +660,20 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/task/config", func() { m.Get("/list", task.GetTaskConfigList) - m.Post("/add/batch", bindIgnErr(models.BatchLimitConfigVO{}), task.BatchAddTaskConfig) m.Post("/^:action(new|edit|del)$", bindIgnErr(models.TaskConfigWithLimit{}), task.OperateTaskConfig) }) + + m.Group("/medal", func() { + m.Group("/category", func() { + m.Get("/list", medal.GetCategoryList) + m.Post("/^:action(new|edit|del)$", bindIgnErr(models.MedalCategory4Show{}), medal.OperateMedalCategory) + }) + m.Group("/customize", func() { + m.Get("/list", medal.GetCustomizeMedalList) + }) + m.Post("/^:action(new|edit|del)$", bindIgnErr(models.Medal4Show{}), medal.OperateMedal) + }) + }, operationReq) // ***** END: Operation ***** diff --git a/services/admin/operate_log/operate_log.go b/services/admin/operate_log/operate_log.go index 7b72ec2e2..7f966db0c 100644 --- a/services/admin/operate_log/operate_log.go +++ b/services/admin/operate_log/operate_log.go @@ -4,6 +4,13 @@ import ( "code.gitea.io/gitea/models" ) +type LogBizType string + +const ( + MedalCategoryOperate LogBizType = "MedalCategoryOperate" + MedalOperate LogBizType = "MedalOperate" +) + func Log(log models.AdminOperateLog) error { _, err := models.InsertAdminOperateLog(log) return err @@ -12,3 +19,34 @@ func Log(log models.AdminOperateLog) error { func NewLogValues() *models.LogValues { return &models.LogValues{Params: make([]models.LogValue, 0)} } + +func Log4Add(bizType LogBizType, newValue interface{}, doerId int64, comment string) { + Log(models.AdminOperateLog{ + BizType: string(bizType), + OperateType: "add", + NewValue: NewLogValues().Add("new", newValue).JsonString(), + CreatedBy: doerId, + Comment: comment, + }) +} + +func Log4Edit(bizType LogBizType, oldValue interface{}, newValue interface{}, doerId int64, comment string) { + Log(models.AdminOperateLog{ + BizType: string(bizType), + OperateType: "edit", + NewValue: NewLogValues().Add("new", newValue).JsonString(), + OldValue: NewLogValues().Add("old", oldValue).JsonString(), + CreatedBy: doerId, + Comment: comment, + }) +} + +func Log4Del(bizType LogBizType, oldValue interface{}, doerId int64, comment string) { + Log(models.AdminOperateLog{ + BizType: string(bizType), + OperateType: "del", + OldValue: NewLogValues().Add("old", oldValue).JsonString(), + CreatedBy: doerId, + Comment: comment, + }) +} diff --git a/services/medal/category.go b/services/medal/category.go new file mode 100644 index 000000000..50f1b804e --- /dev/null +++ b/services/medal/category.go @@ -0,0 +1,64 @@ +package medal + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/admin/operate_log" + "errors" +) + +func GetMedalCategoryList() ([]*models.MedalCategory4Show, error) { + list, err := models.GetMedalCategoryList() + if err != nil { + return nil, err + } + if len(list) == 0 { + return nil, nil + } + r := make([]*models.MedalCategory4Show, len(list)) + for i := 0; i < len(list); i++ { + r[i] = list[i].ToShow() + } + + return r, nil +} + +func AddMedalCategory(m models.MedalCategory4Show, doer *models.User) error { + _, err := models.AddMedalCategory(m.ToDTO()) + if err != nil { + return err + } + operate_log.Log4Add(operate_log.MedalCategoryOperate, m, doer.ID, "新增了勋章分类") + return nil +} + +func EditMedalCategory(m models.MedalCategory4Show, doer *models.User) error { + if m.ID == 0 { + log.Error(" EditMedalCategory param error") + return errors.New("param error") + } + old, err := models.GetMedalCategoryById(m.ID) + if err != nil { + return err + } + _, err = models.UpdateMedalCategoryById(m.ID, m.ToDTO()) + if err != nil { + return err + } + operate_log.Log4Edit(operate_log.MedalCategoryOperate, old, m.ToDTO(), doer.ID, "修改了勋章分类") + return err +} + +func DelMedalCategory(id int64, doer *models.User) error { + if id == 0 { + log.Error(" DelMedalCategory param error") + return errors.New("param error") + } + old, err := models.GetMedalCategoryById(id) + if err != nil { + return err + } + _, err = models.DelMedalCategory(id) + operate_log.Log4Del(operate_log.MedalCategoryOperate, old, doer.ID, "删除了勋章分类") + return err +} diff --git a/services/medal/medal.go b/services/medal/medal.go new file mode 100644 index 000000000..967d7011f --- /dev/null +++ b/services/medal/medal.go @@ -0,0 +1,64 @@ +package medal + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/admin/operate_log" + "errors" +) + +func GetMedalList(opts models.GetMedalOpts) ([]*models.Medal4Show, error) { + list, err := models.GetMedalList(opts) + if err != nil { + return nil, err + } + if len(list) == 0 { + return nil, nil + } + r := make([]*models.Medal4Show, len(list)) + for i := 0; i < len(list); i++ { + r[i] = list[i].ToShow() + } + + return r, nil +} + +func AddMedal(m models.Medal4Show, doer *models.User) error { + _, err := models.AddMedal(m.ToDTO()) + if err != nil { + return err + } + operate_log.Log4Add(operate_log.MedalOperate, m, doer.ID, "新增了勋章") + return nil +} + +func EditMedal(m models.Medal4Show, doer *models.User) error { + if m.ID == 0 { + log.Error(" EditMedal param error") + return errors.New("param error") + } + old, err := models.GetMedalById(m.ID) + if err != nil { + return err + } + _, err = models.UpdateMedalById(m.ID, m.ToDTO()) + if err != nil { + return err + } + operate_log.Log4Edit(operate_log.MedalOperate, old, m.ToDTO(), doer.ID, "修改了勋章") + return err +} + +func DelMedal(id int64, doer *models.User) error { + if id == 0 { + log.Error(" DelMedal param error") + return errors.New("param error") + } + old, err := models.GetMedalById(id) + if err != nil { + return err + } + _, err = models.DelMedal(id) + operate_log.Log4Del(operate_log.MedalOperate, old, doer.ID, "删除了勋章") + return err +}