2020package com.linkedplanet.kotlinjiraclient.sdk
2121
2222import arrow.core.Either
23+ import com.atlassian.jira.bc.project.ProjectService
2324import com.atlassian.jira.component.ComponentAccessor
24- import com.atlassian.jira.config.IssueTypeManager
25+ import com.atlassian.jira.config.IssueTypeService
2526import com.atlassian.jira.issue.fields.screen.issuetype.IssueTypeScreenSchemeManager
2627import com.atlassian.jira.issue.issuetype.IssueType
2728import com.atlassian.jira.issue.operation.IssueOperations
2829import com.linkedplanet.kotlinjiraclient.api.error.JiraClientError
2930import com.linkedplanet.kotlinjiraclient.api.interfaces.JiraIssueTypeOperator
3031import com.linkedplanet.kotlinjiraclient.api.model.JiraIssueType
3132import com.linkedplanet.kotlinjiraclient.api.model.JiraIssueTypeAttribute
32- import com.linkedplanet.kotlinjiraclient.sdk.util.catchJiraClientError
33+ import com.linkedplanet.kotlinjiraclient.sdk.util.eitherAndCatch
34+ import com.linkedplanet.kotlinjiraclient.sdk.util.toEither
3335import javax.inject.Named
3436
3537@Named
3638object SdkJiraIssueTypeOperator : JiraIssueTypeOperator {
3739
38- private val projectManager by lazy { ComponentAccessor .getProjectManager() }
39- private val issueTypeManager by lazy { ComponentAccessor .getComponent(IssueTypeManager ::class .java) }
40- private val issueTypeScreenSchemeManager by lazy { ComponentAccessor .getComponent(IssueTypeScreenSchemeManager ::class .java) }
40+ private val projectService = ComponentAccessor .getComponent(ProjectService ::class .java)
41+ private val issueTypeService = ComponentAccessor .getComponent(IssueTypeService ::class .java)
42+ private val issueTypeScreenSchemeManager = ComponentAccessor .getComponent(IssueTypeScreenSchemeManager ::class .java)
43+ private val jiraAuthenticationContext = ComponentAccessor .getJiraAuthenticationContext()
44+
45+ private fun user () = jiraAuthenticationContext.loggedInUser
4146
4247 override suspend fun getAttributesOfIssueType (
4348 projectId : Number ,
4449 issueTypeId : Number
4550 ): Either <JiraClientError , List <JiraIssueTypeAttribute >> =
46- Either .catchJiraClientError {
47- val issueType = issueTypeManager.getIssueType(issueTypeId.toString())
51+ eitherAndCatch {
52+ val issueType = issueTypeService.getIssueType(user(), issueTypeId.toString()).orNull
53+ ? : return @getAttributesOfIssueType issueTypeNotFound(issueTypeId)
4854 val screenSchemes = issueTypeScreenSchemeManager.getIssueTypeScreenScheme(
49- projectManager.getProjectObj( projectId.toLong())
55+ projectService.getProjectById(user(), projectId.toLong()).toEither().bind().project
5056 )
5157 val screenScheme = screenSchemes.getEffectiveFieldScreenScheme(issueType)
5258 val createScreen = screenScheme.getFieldScreen(IssueOperations .CREATE_ISSUE_OPERATION )
@@ -58,16 +64,22 @@ object SdkJiraIssueTypeOperator : JiraIssueTypeOperator {
5864 fields
5965 }
6066
67+ private fun <T > issueTypeNotFound (issueTypeId : Number ): Either <JiraClientError , T > = Either .Left (
68+ JiraClientError (" IssueType not found" , " No IssueType with id:$issueTypeId found." , statusCode = 404 )
69+ )
70+
6171 override suspend fun getIssueType (issueTypeId : Number ): Either <JiraClientError , JiraIssueType ?> =
62- Either .catchJiraClientError {
63- issueTypeManager.getIssueType(issueTypeId.toString())?.let { it: IssueType ->
72+ eitherAndCatch {
73+ val issueType = issueTypeService.getIssueType(user(), issueTypeId.toString()).orNull
74+ ? : return @getIssueType issueTypeNotFound(issueTypeId)
75+ issueType.let { it: IssueType ->
6476 JiraIssueType (it.id, it.name)
6577 }
6678 }
6779
6880 override suspend fun getIssueTypes (projectId : Number ): Either <JiraClientError , List <JiraIssueType >> =
69- Either .catchJiraClientError {
70- projectManager.getProjectObj( projectId.toLong())?.issueTypes
81+ eitherAndCatch {
82+ projectService.getProjectById(user(), projectId.toLong()).toEither().bind().project ?.issueTypes
7183 ?.map { it: IssueType ->
7284 JiraIssueType (it.id, it.name)
7385 } ? : emptyList()
0 commit comments