@@ -28,6 +28,7 @@ import com.atlassian.jira.bc.projectroles.ProjectRoleService
2828import com.atlassian.jira.bc.user.search.DefaultAssigneeService
2929import com.atlassian.jira.permission.ProjectPermissions
3030import com.atlassian.jira.project.Project
31+ import com.atlassian.jira.project.ProjectManager
3132import com.atlassian.jira.security.JiraAuthenticationContext
3233import com.atlassian.jira.security.PermissionManager
3334import com.atlassian.jira.security.roles.ProjectRoleActors
@@ -43,6 +44,7 @@ import com.linkedplanet.kotlinjiraclient.sdk.util.withErrorCollection
4344
4445object 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