56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
|
|
package commonservice
|
|||
|
|
|
|||
|
|
import "gorm.io/gorm"
|
|||
|
|
|
|||
|
|
// TeamRole 查询用户在团队中的角色;非成员返回空串。
|
|||
|
|
func TeamRole(db *gorm.DB, teamID, userID int64) (string, error) {
|
|||
|
|
if teamID <= 0 || userID <= 0 {
|
|||
|
|
return "", nil
|
|||
|
|
}
|
|||
|
|
var role string
|
|||
|
|
err := db.Table("team_members").Select("role").
|
|||
|
|
Where("team_id = ? AND user_id = ?", teamID, userID).
|
|||
|
|
Scan(&role).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return "", err
|
|||
|
|
}
|
|||
|
|
return role, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TeamRoleRank 角色权重:owner=3 admin=2 member=1。
|
|||
|
|
func TeamRoleRank(role string) int {
|
|||
|
|
switch role {
|
|||
|
|
case "owner":
|
|||
|
|
return 3
|
|||
|
|
case "admin":
|
|||
|
|
return 2
|
|||
|
|
case "member":
|
|||
|
|
return 1
|
|||
|
|
}
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// IsTeamAdmin 该用户是否为团队 owner/admin。
|
|||
|
|
func IsTeamAdmin(db *gorm.DB, teamID, userID int64) bool {
|
|||
|
|
if teamID <= 0 || userID <= 0 {
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
var n int64
|
|||
|
|
db.Table("team_members").
|
|||
|
|
Where("team_id = ? AND user_id = ? AND role IN ('owner','admin')", teamID, userID).
|
|||
|
|
Count(&n)
|
|||
|
|
return n > 0
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// RequireTeamRole 校验最低角色,返回实际角色。
|
|||
|
|
func RequireTeamRole(db *gorm.DB, teamID, userID int64, min string) (string, error) {
|
|||
|
|
role, err := TeamRole(db, teamID, userID)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", err
|
|||
|
|
}
|
|||
|
|
if TeamRoleRank(role) < TeamRoleRank(min) {
|
|||
|
|
return role, Forbidden("TEAM_FORBIDDEN")
|
|||
|
|
}
|
|||
|
|
return role, nil
|
|||
|
|
}
|