package roles const ( Owner = "owner" Admin = "admin" Editor = "editor" Member = "member" Viewer = "viewer" ) var rank = map[string]int{ Viewer: 0, Member: 1, Editor: 2, Admin: 3, Owner: 4, } func Rank(r string) int { return rank[r] } func ValidMemberRole(r string) bool { switch r { case Admin, Editor, Member, Viewer: return true } return false } func CanUpload(r string) bool { switch r { case Owner, Admin, Editor, Member: return true } return false } func CanComment(r string) bool { return CanUpload(r) } func CanDeleteAnyPhoto(r string) bool { return r == Owner || r == Admin } func CanDeleteOwnPhoto(r string) bool { return CanUpload(r) } func CanEditAlbum(r string) bool { return r == Owner || r == Admin } func CanManageShares(r string) bool { return r == Owner || r == Admin } func CanInvite(actorRole, targetRole string) bool { if actorRole == Editor { return targetRole == Member || targetRole == Viewer } if actorRole != Owner && actorRole != Admin { return false } if targetRole == Owner { return false } return Rank(targetRole) <= Rank(actorRole) } func CanChangeRole(actorRole, targetCurrent, newRole string) bool { if targetCurrent == Owner || newRole == Owner { return false } if !ValidMemberRole(newRole) { return false } switch actorRole { case Owner: return true case Admin: if targetCurrent == Admin { return false } return newRole == Editor || newRole == Member || newRole == Viewer default: return false } } func CanRemoveMember(actorRole, targetRole string) bool { if actorRole != Owner && actorRole != Admin { return false } if targetRole == Owner || targetRole == Admin { return false } return true }