feat: tagの削除とwildcard伝播

This commit is contained in:
2025-12-04 06:23:16 +09:00
parent 58ad0e67c9
commit a6e951b48c
7 changed files with 22 additions and 32 deletions
@@ -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)
}