Skip to content

Commit 9ad503a

Browse files
committed
add single user permission checks for SDK
1 parent d0efb1c commit 9ad503a

File tree

1 file changed

+28
-0
lines changed
  • kotlin-jira-client/kotlin-jira-client-sdk/src/main/kotlin/com/linkedplanet/kotlinjiraclient/sdk

1 file changed

+28
-0
lines changed

kotlin-jira-client/kotlin-jira-client-sdk/src/main/kotlin/com/linkedplanet/kotlinjiraclient/sdk/SdkJiraUserOperator.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.atlassian.jira.bc.projectroles.ProjectRoleService
2828
import com.atlassian.jira.bc.user.search.DefaultAssigneeService
2929
import com.atlassian.jira.permission.ProjectPermissions
3030
import com.atlassian.jira.project.Project
31+
import com.atlassian.jira.project.ProjectManager
3132
import com.atlassian.jira.security.JiraAuthenticationContext
3233
import com.atlassian.jira.security.PermissionManager
3334
import com.atlassian.jira.security.roles.ProjectRoleActors
@@ -43,6 +44,7 @@ import com.linkedplanet.kotlinjiraclient.sdk.util.withErrorCollection
4344

4445
object SdkJiraUserOperator : JiraUserOperator {
4546

47+
private val projectManager: ProjectManager by getComponent()
4648
private val projectService: ProjectService by getComponent()
4749
private val permissionManager: PermissionManager by getComponent()
4850
private val userUtil: UserUtil by getComponent()
@@ -53,6 +55,26 @@ object SdkJiraUserOperator : JiraUserOperator {
5355

5456
private fun user() = jiraAuthenticationContext.loggedInUser
5557

58+
/**
59+
* Check if a single user is project admin for the given project.
60+
* This is only available through the Sdk Operator as it is quite inefficient to do this multiple times over http.
61+
*/
62+
fun isProjectAdmin(applicationUser: ApplicationUser, projectId: Long): Either<JiraClientError, Boolean> = either {
63+
val project = projectManager.getProjectObj(projectId)
64+
?: return createProjectNotFoundError(projectId).left()
65+
applicationUser.hasPermissionWithName(ProjectPermissions.ADMINISTER_PROJECTS.permissionKey(), project)
66+
}
67+
68+
/**
69+
* Check if a single user is assignable to the given project.
70+
* This is only available through the Sdk Operator as it is quite inefficient to do this multiple times over http.
71+
*/
72+
fun isAssignable(applicationUser: ApplicationUser, projectId: Long): Either<JiraClientError, Boolean> = either {
73+
val project = projectManager.getProjectObj(projectId)
74+
?: return createProjectNotFoundError(projectId).left()
75+
defaultAssigneeService.isAssignable(project, applicationUser)
76+
}
77+
5678
override suspend fun getAssignableUsersByProjectKey(projectKey: String): Either<JiraClientError, List<JiraUser>> =
5779
eitherAndCatch {
5880
val project =
@@ -102,6 +124,12 @@ object SdkJiraUserOperator : JiraUserOperator {
102124
statusCode = 404
103125
)
104126

127+
private fun createProjectNotFoundError(projectId: Long) = JiraClientError(
128+
"Project not found",
129+
"No Project with projectId $projectId found.",
130+
statusCode = 404
131+
)
132+
105133
private fun ApplicationUser.hasPermissionWithName(permissionName: String, project: Project): Boolean {
106134
val permission =
107135
permissionManager.allProjectPermissions.firstOrNull { it.key == permissionName } ?: return false

0 commit comments

Comments
 (0)