2020package com.linkedplanet.kotlinjiraclient.sdk
2121
2222import arrow.core.Either
23- import com.atlassian.jira.bc.issue.IssueService
23+ import com.atlassian.jira.bc.issue.link.IssueLinkService
2424import com.atlassian.jira.component.ComponentAccessor
25+ import com.atlassian.jira.issue.link.Direction
2526import com.atlassian.jira.issue.link.IssueLinkTypeManager
2627import com.linkedplanet.kotlinjiraclient.api.error.JiraClientError
2728import com.linkedplanet.kotlinjiraclient.api.interfaces.JiraIssueLinkOperator
@@ -30,32 +31,34 @@ import com.linkedplanet.kotlinjiraclient.sdk.util.toEither
3031
3132object SdkJiraIssueLinkOperator : JiraIssueLinkOperator {
3233
33- private val issueService: IssueService = ComponentAccessor .getIssueService()
34- private val issueLinkManager = ComponentAccessor .getIssueLinkManager( )
34+ private val issueService = ComponentAccessor .getIssueService()
35+ private val issueLinkService = ComponentAccessor .getComponent( IssueLinkService :: class .java )
3536 private val issueLinkTypeManager = ComponentAccessor .getComponent(IssueLinkTypeManager ::class .java)
3637 private val jiraAuthenticationContext = ComponentAccessor .getJiraAuthenticationContext()
3738
3839 private fun user () = jiraAuthenticationContext.loggedInUser
40+ private const val DISPATCH_EVENT : Boolean = true // default dispatch behaviour for this operator
3941
4042 override suspend fun createIssueLink (
4143 inwardIssueKey : String ,
4244 outwardIssueKey : String ,
4345 relationName : String
4446 ): Either <JiraClientError , Unit > =
4547 eitherAndCatch {
46- val inwardSourceIssue = issueService.getIssue(user(), inwardIssueKey).toEither().bind().issue
47- val outwardIssue = issueService.getIssue(user(), outwardIssueKey).toEither().bind().issue
48+ val user = user()
49+ val inwardSourceIssue = issueService.getIssue(user, inwardIssueKey).toEither().bind().issue
50+ val outwardIssue = issueService.getIssue(user, outwardIssueKey).toEither().bind().issue
4851 val linkType = issueLinkTypeManager.getIssueLinkTypesByName(relationName).firstOrNull()
4952 ? : return issueLinkTypeNotFound(relationName)
50- val sequence: Long? = null // For UI ordering. Sequence on links does not matter
51-
52- issueLinkManager.createIssueLink(
53- inwardSourceIssue.id,
54- outwardIssue.id,
53+ val validate = issueLinkService.validateAddIssueLinks(
54+ user,
55+ outwardIssue,
5556 linkType.id,
56- sequence,
57- user()
58- )
57+ Direction .OUT ,
58+ listOf (inwardSourceIssue.key),
59+ DISPATCH_EVENT
60+ ).toEither().bind()
61+ issueLinkService.addIssueLinks(user, validate)
5962 }
6063
6164 private fun issueLinkTypeNotFound (relationName : String ): Either <JiraClientError , Unit > = Either .Left (
@@ -64,7 +67,10 @@ object SdkJiraIssueLinkOperator : JiraIssueLinkOperator {
6467
6568 override suspend fun deleteIssueLink (linkId : String ): Either <JiraClientError , Unit > =
6669 eitherAndCatch {
67- val issueLink = issueLinkManager.getIssueLink(linkId.toLong())
68- issueLinkManager.removeIssueLink(issueLink, user())
70+ val user = user()
71+ val issueLink = issueLinkService.getIssueLink(linkId.toLong(), user).toEither().bind().issueLink
72+ val issue = issueService.getIssue(user, issueLink.destinationId).toEither().bind().issue
73+ val validate = issueLinkService.validateDelete(user, issue, issueLink).toEither().bind()
74+ issueLinkService.delete(validate)
6975 }
7076}
0 commit comments