| @@ -18,15 +18,18 @@ type Role struct { | |||||
| } | } | ||||
| type UserRole struct { | type UserRole struct { | ||||
| ID int64 `xorm:"pk autoincr"` | |||||
| RoleType RoleType | |||||
| UserId int64 `xorm:"INDEX"` | |||||
| ID int64 `xorm:"pk autoincr"` | |||||
| UserId int64 `xorm:"INDEX UNIQUE(uq_user_role)"` | |||||
| RoleType RoleType `xorm:"UNIQUE(uq_user_role)"` | |||||
| CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` | CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` | ||||
| } | } | ||||
| func NewUserRole(r UserRole) (int64, error) { | func NewUserRole(r UserRole) (int64, error) { | ||||
| return x.Insert(&r) | return x.Insert(&r) | ||||
| } | } | ||||
| func DeleteUserRole(roleType RoleType, userId int64) (int64, error) { | |||||
| return x.Where("role_type = ? and user_id = ?", roleType, userId).Delete(&UserRole{}) | |||||
| } | |||||
| func GetUserRoleByUserAndRole(userId int64, roleType RoleType) (*UserRole, error) { | func GetUserRoleByUserAndRole(userId int64, roleType RoleType) (*UserRole, error) { | ||||
| r := &UserRole{} | r := &UserRole{} | ||||
| @@ -62,7 +65,7 @@ func (err ErrRoleNotExists) Error() string { | |||||
| return fmt.Sprintf("role is not exists") | return fmt.Sprintf("role is not exists") | ||||
| } | } | ||||
| type AddRoleReq struct { | |||||
| type OperateRoleReq struct { | |||||
| UserName string `json:"user_name" binding:"Required"` | UserName string `json:"user_name" binding:"Required"` | ||||
| RoleType RoleType `json:"role_type" binding:"Required"` | RoleType RoleType `json:"role_type" binding:"Required"` | ||||
| } | } | ||||
| @@ -8,7 +8,7 @@ import ( | |||||
| "net/http" | "net/http" | ||||
| ) | ) | ||||
| func AddRole(ctx *context.APIContext, form models.AddRoleReq) { | |||||
| func AddUserRole(ctx *context.APIContext, form models.OperateRoleReq) { | |||||
| user, err := models.GetUserByName(form.UserName) | user, err := models.GetUserByName(form.UserName) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.JSON(http.StatusOK, response.OuterServerError("User not exists")) | ctx.JSON(http.StatusOK, response.OuterServerError("User not exists")) | ||||
| @@ -21,3 +21,16 @@ func AddRole(ctx *context.APIContext, form models.AddRoleReq) { | |||||
| } | } | ||||
| ctx.JSON(http.StatusOK, response.OuterSuccess()) | ctx.JSON(http.StatusOK, response.OuterSuccess()) | ||||
| } | } | ||||
| func DeleteUserRole(ctx *context.APIContext, form models.OperateRoleReq) { | |||||
| user, err := models.GetUserByName(form.UserName) | |||||
| if err != nil { | |||||
| ctx.JSON(http.StatusOK, response.OuterServerError("User not exists")) | |||||
| return | |||||
| } | |||||
| err = role.DeleteUserRole(user.ID, form.RoleType) | |||||
| if err != nil { | |||||
| ctx.JSON(http.StatusOK, response.OuterResponseError(err)) | |||||
| return | |||||
| } | |||||
| ctx.JSON(http.StatusOK, response.OuterSuccess()) | |||||
| } | |||||
| @@ -1190,7 +1190,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| }) | }) | ||||
| }) | }) | ||||
| m.Group("/role", func() { | m.Group("/role", func() { | ||||
| m.Post("", bind(models.AddRoleReq{}), admin.AddRole) | |||||
| m.Combo("").Post(bind(models.OperateRoleReq{}), admin.AddUserRole). | |||||
| Delete(bind(models.OperateRoleReq{}), admin.DeleteUserRole) | |||||
| }) | }) | ||||
| }, reqToken(), reqSiteAdmin()) | }, reqToken(), reqSiteAdmin()) | ||||
| @@ -2,6 +2,7 @@ package role | |||||
| import ( | import ( | ||||
| "code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
| pg "github.com/lib/pq" | |||||
| ) | ) | ||||
| func AddUserRole(userId int64, roleType models.RoleType) error { | func AddUserRole(userId int64, roleType models.RoleType) error { | ||||
| @@ -10,6 +11,24 @@ func AddUserRole(userId int64, roleType models.RoleType) error { | |||||
| return models.ErrRoleNotExists{} | return models.ErrRoleNotExists{} | ||||
| } | } | ||||
| _, err := models.NewUserRole(models.UserRole{UserId: userId, RoleType: roleType}) | _, err := models.NewUserRole(models.UserRole{UserId: userId, RoleType: roleType}) | ||||
| if err != nil { | |||||
| e := err.(*pg.Error) | |||||
| //23505 is postgrey error code for unique_violation | |||||
| //see https://www.postgresql.org/docs/current/errcodes-appendix.html | |||||
| //if unique_violation,user role record exists,just return | |||||
| if e.Code == "23505" { | |||||
| return nil | |||||
| } | |||||
| } | |||||
| return err | |||||
| } | |||||
| func DeleteUserRole(userId int64, roleType models.RoleType) error { | |||||
| role := GetRole(roleType) | |||||
| if role == nil { | |||||
| return models.ErrRoleNotExists{} | |||||
| } | |||||
| _, err := models.DeleteUserRole(roleType, userId) | |||||
| return err | return err | ||||
| } | } | ||||