| @@ -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 | |||
| } | |||
| @@ -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 | |||
| } | |||
| @@ -161,6 +161,8 @@ func init() { | |||
| new(CloudbrainSpec), | |||
| new(CloudbrainTemp), | |||
| new(DatasetReference), | |||
| new(MedalCategory), | |||
| new(Medal), | |||
| ) | |||
| tablesStatistic = append(tablesStatistic, | |||
| @@ -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"` | |||
| } | |||
| @@ -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()) | |||
| } | |||
| @@ -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()) | |||
| } | |||
| @@ -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 ***** | |||
| @@ -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, | |||
| }) | |||
| } | |||
| @@ -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 | |||
| } | |||
| @@ -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 | |||
| } | |||