feat: tagの削除とwildcard伝播
This commit is contained in:
@@ -70,15 +70,6 @@ class MutablePermissionTree internal constructor(
|
||||
draft.registration = value
|
||||
}
|
||||
|
||||
val tags: MutableSet<String>
|
||||
get() = draft.tags
|
||||
|
||||
fun tag(value: String) {
|
||||
if (value.isNotBlank()) {
|
||||
draft.tags += value.trim()
|
||||
}
|
||||
}
|
||||
|
||||
fun child(id: String, value: Boolean = true) {
|
||||
require(id.isNotBlank()) { "Child id must not be blank." }
|
||||
val permissionId = PermissionId.of("${this.id.value}.${id.lowercase()}")
|
||||
@@ -158,7 +149,6 @@ class MutablePermissionTree internal constructor(
|
||||
description = draft.description,
|
||||
defaultValue = draft.defaultValue,
|
||||
children = draft.children.toMutableMap(),
|
||||
tags = draft.tags.toMutableSet(),
|
||||
wildcard = draft.wildcard,
|
||||
registration = draft.registration
|
||||
)
|
||||
|
||||
@@ -13,8 +13,7 @@ data class PermissionNode(
|
||||
val description: String? = null,
|
||||
val defaultValue: PermissionDefault = PermissionDefault.FALSE,
|
||||
val children: Map<PermissionId, Boolean> = emptyMap(),
|
||||
val tags: Set<String> = emptySet(),
|
||||
val wildcard: Boolean = false,
|
||||
val wildcard: Boolean = true,
|
||||
val registration: NodeRegistration = NodeRegistration.PERMISSION
|
||||
) {
|
||||
init {
|
||||
|
||||
@@ -7,8 +7,7 @@ internal data class PermissionNodeDraft(
|
||||
var description: String? = null,
|
||||
var defaultValue: PermissionDefault = PermissionDefault.FALSE,
|
||||
val children: MutableMap<PermissionId, Boolean> = linkedMapOf(),
|
||||
val tags: MutableSet<String> = linkedSetOf(),
|
||||
var wildcard: Boolean = false,
|
||||
var wildcard: Boolean = true,
|
||||
var registration: NodeRegistration = NodeRegistration.PERMISSION
|
||||
) {
|
||||
fun toNode(): PermissionNode =
|
||||
@@ -17,7 +16,6 @@ internal data class PermissionNodeDraft(
|
||||
description = description,
|
||||
defaultValue = defaultValue,
|
||||
children = children.toMap(),
|
||||
tags = tags.toSet(),
|
||||
wildcard = wildcard,
|
||||
registration = registration
|
||||
)
|
||||
@@ -29,7 +27,6 @@ internal data class PermissionNodeDraft(
|
||||
description = node.description,
|
||||
defaultValue = node.defaultValue,
|
||||
children = node.children.toMutableMap(),
|
||||
tags = node.tags.toMutableSet(),
|
||||
wildcard = node.wildcard,
|
||||
registration = node.registration
|
||||
)
|
||||
|
||||
@@ -25,9 +25,6 @@ class TreeSnapshot internal constructor(
|
||||
digest.update(childId.value.toByteArray())
|
||||
digest.update(if (flag) 1 else 0)
|
||||
}
|
||||
node.tags.sorted().forEach { tag ->
|
||||
digest.update(tag.toByteArray())
|
||||
}
|
||||
digest.update(if (node.wildcard) 1 else 0)
|
||||
digest.update(node.registration.name.toByteArray())
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@ internal object WildcardAugmentor {
|
||||
|
||||
nodes.values.forEach { node ->
|
||||
if (!node.wildcard) return@forEach
|
||||
if (node.id.value.endsWith(".*")) return@forEach
|
||||
|
||||
val wildcardId = parentWildcardId(node.id) ?: return@forEach
|
||||
val existing = result[wildcardId]
|
||||
@@ -25,7 +24,6 @@ internal object WildcardAugmentor {
|
||||
description = "Wildcard for ${wildcardId.value}",
|
||||
defaultValue = node.defaultValue,
|
||||
children = updatedChildren,
|
||||
tags = setOf("wildcard"),
|
||||
wildcard = false
|
||||
)
|
||||
} else if (!alreadyPresent) {
|
||||
@@ -33,6 +31,21 @@ internal object WildcardAugmentor {
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure wildcard permissions include descendant wildcard nodes so granting parent.* cascades.
|
||||
val wildcardEntries = result
|
||||
.filterKeys { it.value.endsWith(".*") }
|
||||
.entries
|
||||
.sortedBy { it.key.value.length } // parents before grandparents not necessary but deterministic
|
||||
|
||||
wildcardEntries.forEach { (childWildcardId, _) ->
|
||||
val parentWildcardId = parentWildcardId(childWildcardId) ?: return@forEach
|
||||
val parent = result[parentWildcardId] ?: return@forEach
|
||||
val updatedChildren = parent.children.toMutableMap()
|
||||
if (updatedChildren[childWildcardId] == true) return@forEach
|
||||
updatedChildren[childWildcardId] = true
|
||||
result[parentWildcardId] = parent.copy(children = updatedChildren)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
@@ -34,12 +34,6 @@ class PermissionNodeBuilder internal constructor(
|
||||
draft.registration = value
|
||||
}
|
||||
|
||||
fun tag(value: String) {
|
||||
if (value.isNotBlank()) {
|
||||
draft.tags += value.trim()
|
||||
}
|
||||
}
|
||||
|
||||
fun child(id: String, value: Boolean = true) {
|
||||
treeBuilder.childRelative(draft, id, value)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user