Filter user lists by role hierarchy
All checks were successful
build-and-deploy / build-deploy (push) Successful in 34s

This commit is contained in:
androidlover5842
2026-02-01 22:18:40 +05:30
parent f9929064fb
commit 4fc9be14c6
2 changed files with 44 additions and 3 deletions

View File

@@ -101,8 +101,14 @@ class Properties(
requirePrincipal(principal) requirePrincipal(principal)
propertyAccess.requireMember(propertyId, principal!!.userId) propertyAccess.requireMember(propertyId, principal!!.userId)
propertyAccess.requireAnyRole(propertyId, principal.userId, Role.ADMIN, Role.MANAGER) propertyAccess.requireAnyRole(propertyId, principal.userId, Role.ADMIN, Role.MANAGER)
val users = propertyUserRepo.findByIdPropertyId(propertyId) val actorUser = appUserRepo.findById(principal.userId).orElse(null)
return users.filter { it.id.userId != principal.userId }.map { val actorRoles = propertyUserRepo.findRolesByPropertyAndUser(propertyId, principal.userId)
val actorRank = rankForUser(actorUser?.superAdmin == true, actorRoles)
val users = propertyUserRepo.findByPropertyIdWithUser(propertyId)
return users
.filter { it.id.userId != principal.userId }
.filter { actorRank >= rankForUser(it.user.superAdmin, it.roles) }
.map {
PropertyUserResponse( PropertyUserResponse(
userId = it.id.userId!!, userId = it.id.userId!!,
propertyId = it.id.propertyId!!, propertyId = it.id.propertyId!!,
@@ -271,6 +277,20 @@ class Properties(
throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Unknown transport mode") throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Unknown transport mode")
} }
} }
private fun rankForUser(isSuperAdmin: Boolean, roles: Set<Role>): Int {
if (isSuperAdmin) return 500
return roles.maxOfOrNull { roleRank(it) } ?: 0
}
private fun roleRank(role: Role): Int {
return when (role) {
Role.ADMIN -> 400
Role.MANAGER -> 300
Role.STAFF, Role.HOUSEKEEPING, Role.FINANCE, Role.SUPERVISOR, Role.GUIDE -> 200
Role.AGENT -> 100
}
}
} }
private fun Property.toResponse(): PropertyResponse { private fun Property.toResponse(): PropertyResponse {

View File

@@ -56,13 +56,20 @@ class UserDirectory(
propertyAccess.requireMember(propertyId, resolved.userId) propertyAccess.requireMember(propertyId, resolved.userId)
propertyAccess.requireAnyRole(propertyId, resolved.userId, Role.ADMIN) propertyAccess.requireAnyRole(propertyId, resolved.userId, Role.ADMIN)
val actorUser = appUserRepo.findById(resolved.userId).orElse(null)
val actorRoles = propertyUserRepo.findRolesByPropertyAndUser(propertyId, resolved.userId)
val actorRank = rankForUser(actorUser?.superAdmin == true, actorRoles)
val digits = phone?.filter { it.isDigit() }.orEmpty() val digits = phone?.filter { it.isDigit() }.orEmpty()
val users = when { val users = when {
phone == null -> propertyUserRepo.findByPropertyIdWithUser(propertyId) phone == null -> propertyUserRepo.findByPropertyIdWithUser(propertyId)
digits.length < 6 -> return emptyList() digits.length < 6 -> return emptyList()
else -> propertyUserRepo.findByPropertyIdAndPhoneLike(propertyId, digits) else -> propertyUserRepo.findByPropertyIdAndPhoneLike(propertyId, digits)
} }
return users.filter { it.id.userId != resolved.userId }.map { return users
.filter { it.id.userId != resolved.userId }
.filter { actorRank >= rankForUser(it.user.superAdmin, it.roles) }
.map {
val user = it.user val user = it.user
PropertyUserDetailsResponse( PropertyUserDetailsResponse(
userId = it.id.userId!!, userId = it.id.userId!!,
@@ -75,4 +82,18 @@ class UserDirectory(
) )
} }
} }
private fun rankForUser(isSuperAdmin: Boolean, roles: Set<Role>): Int {
if (isSuperAdmin) return 500
return roles.maxOfOrNull { roleRank(it) } ?: 0
}
private fun roleRank(role: Role): Int {
return when (role) {
Role.ADMIN -> 400
Role.MANAGER -> 300
Role.STAFF, Role.HOUSEKEEPING, Role.FINANCE, Role.SUPERVISOR, Role.GUIDE -> 200
Role.AGENT -> 100
}
}
} }