Files
story/internal/identity/permissions.go
T

80 lines
2.6 KiB
Go

package identity
import "sort"
type Role string
type Capability string
const (
RoleOwner Role = "owner"
RoleAdmin Role = "admin"
RoleEditor Role = "editor"
RoleViewer Role = "viewer"
)
const (
CapabilityHouseholdRead Capability = "household.read"
CapabilityHouseholdManage Capability = "household.manage"
CapabilityMemberManage Capability = "member.manage"
CapabilityOwnershipTransfer Capability = "ownership.transfer"
CapabilitySubjectRead Capability = "subject.read"
CapabilitySubjectWrite Capability = "subject.write"
CapabilityConversationRead Capability = "conversation.read"
CapabilityStoryReview Capability = "story.review"
CapabilityDeviceManage Capability = "device.manage"
CapabilityFirmwareManage Capability = "firmware.manage"
CapabilityRecordingPlay Capability = "recording.play"
CapabilityRecordingDownload Capability = "recording.download"
CapabilityPrivacyRead Capability = "privacy.read"
CapabilityPrivacyManage Capability = "privacy.manage"
)
var roleCapabilities = map[Role]map[Capability]struct{}{
RoleOwner: capabilitySet(
CapabilityHouseholdRead, CapabilityHouseholdManage, CapabilityMemberManage,
CapabilityOwnershipTransfer, CapabilitySubjectRead, CapabilitySubjectWrite,
CapabilityConversationRead, CapabilityStoryReview, CapabilityDeviceManage,
CapabilityFirmwareManage, CapabilityPrivacyRead, CapabilityPrivacyManage,
),
RoleAdmin: capabilitySet(
CapabilityHouseholdRead, CapabilityHouseholdManage, CapabilityMemberManage,
CapabilitySubjectRead, CapabilitySubjectWrite, CapabilityConversationRead,
CapabilityStoryReview, CapabilityDeviceManage,
CapabilityFirmwareManage, CapabilityPrivacyRead,
),
RoleEditor: capabilitySet(
CapabilityHouseholdRead, CapabilitySubjectRead, CapabilitySubjectWrite,
CapabilityConversationRead, CapabilityStoryReview, CapabilityDeviceManage,
),
RoleViewer: capabilitySet(
CapabilityHouseholdRead, CapabilitySubjectRead, CapabilityConversationRead,
),
}
func Can(role Role, capability Capability) bool {
capabilities, ok := roleCapabilities[role]
if !ok {
return false
}
_, ok = capabilities[capability]
return ok
}
func CapabilitiesForRole(role Role) []Capability {
set := roleCapabilities[role]
result := make([]Capability, 0, len(set))
for capability := range set {
result = append(result, capability)
}
sort.Slice(result, func(i, j int) bool { return result[i] < result[j] })
return result
}
func capabilitySet(capabilities ...Capability) map[Capability]struct{} {
set := make(map[Capability]struct{}, len(capabilities))
for _, capability := range capabilities {
set[capability] = struct{}{}
}
return set
}