diff --git a/models/role.go b/models/role.go index 9f2686c51..4e977ae34 100644 --- a/models/role.go +++ b/models/role.go @@ -18,15 +18,18 @@ type Role 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"` } func NewUserRole(r UserRole) (int64, error) { 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) { r := &UserRole{} @@ -62,7 +65,7 @@ func (err ErrRoleNotExists) Error() string { return fmt.Sprintf("role is not exists") } -type AddRoleReq struct { +type OperateRoleReq struct { UserName string `json:"user_name" binding:"Required"` RoleType RoleType `json:"role_type" binding:"Required"` } diff --git a/routers/api/v1/admin/role.go b/routers/api/v1/admin/role.go index a713f2e18..6ec8f6335 100644 --- a/routers/api/v1/admin/role.go +++ b/routers/api/v1/admin/role.go @@ -8,7 +8,7 @@ import ( "net/http" ) -func AddRole(ctx *context.APIContext, form models.AddRoleReq) { +func AddUserRole(ctx *context.APIContext, form models.OperateRoleReq) { user, err := models.GetUserByName(form.UserName) if err != nil { 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()) } +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()) +} diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 0eac9b02c..b239c1bda 100755 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -1190,7 +1190,8 @@ func RegisterRoutes(m *macaron.Macaron) { }) }) 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()) diff --git a/services/role/user_role.go b/services/role/user_role.go index 5db6bbca0..14df4180e 100644 --- a/services/role/user_role.go +++ b/services/role/user_role.go @@ -2,6 +2,7 @@ package role import ( "code.gitea.io/gitea/models" + pg "github.com/lib/pq" ) func AddUserRole(userId int64, roleType models.RoleType) error { @@ -10,6 +11,24 @@ func AddUserRole(userId int64, roleType models.RoleType) error { return models.ErrRoleNotExists{} } _, 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 }