@@ -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 | ||||
} | } | ||||