Skip to content

Commit c291887

Browse files
authored
Merge pull request #23 from linked-planet/feature/add_jira_attribute_schema
Feature/add jira attribute schema
2 parents 9874cc3 + a59b91c commit c291887

File tree

4 files changed

+58
-11
lines changed
  • kotlin-jira-client
    • kotlin-jira-client-api/src/main/kotlin/com/linkedplanet/kotlinjiraclient/api/model
    • kotlin-jira-client-http/src/main/kotlin/com/linkedplanet/kotlinjiraclient/http/model
    • kotlin-jira-client-sdk/src/main/kotlin/com/linkedplanet/kotlinjiraclient/sdk
    • kotlin-jira-client-test-base/src/main/kotlin/com/linkedplanet/kotlinjiraclient

4 files changed

+58
-11
lines changed

kotlin-jira-client/kotlin-jira-client-api/src/main/kotlin/com/linkedplanet/kotlinjiraclient/api/model/Model.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,16 @@ data class JiraIssueType(
4343

4444
data class JiraIssueTypeAttribute(
4545
val id: String,
46-
val name: String
46+
val name: String,
47+
val schema: JiraIssueTypeAttributeSchema
48+
)
49+
50+
data class JiraIssueTypeAttributeSchema(
51+
val type: String, // "date" see com.atlassian.jira.issue.fields.rest.json.JsonType
52+
val items: String?, // unclear what this is
53+
val system: String?, // only used if its a system field, e.g. "assignee"
54+
val custom: String?, // e.g. com.atlassian.jira.plugin.system.customfieldtypes:datepicker
55+
val customId: Long? // e.g. 10202
4756
)
4857

4958
data class JiraIssue(

kotlin-jira-client/kotlin-jira-client-http/src/main/kotlin/com/linkedplanet/kotlinjiraclient/http/model/HttpModel.kt

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,34 @@ fun List<HttpJiraIssueType>.toJiraIssueTypes(): List<JiraIssueType> =
9393
map { it.toJiraIssueType() }
9494

9595
data class HttpJiraIssueTypeAttribute(
96+
val required: Boolean,
97+
val schema: HttpJiraIssueTypeAttributeJsonSchema?,
9698
val name: String,
97-
val fieldId: String
99+
val fieldId: String,
100+
val hasDefaultValue: Boolean,
98101
) {
99102
fun toJiraIssueTypeAttribute() =
100-
JiraIssueTypeAttribute(fieldId, name)
103+
JiraIssueTypeAttribute(
104+
fieldId,
105+
name,
106+
JiraIssueTypeAttributeSchema(
107+
schema?.type ?: "Any",
108+
schema?.items,
109+
schema?.system,
110+
schema?.custom,
111+
schema?.customId,
112+
)
113+
)
101114
}
102115

116+
data class HttpJiraIssueTypeAttributeJsonSchema(
117+
val type: String, // "date" see com.atlassian.jira.issue.fields.rest.json.JsonType
118+
val items: String?, // unclear what this is
119+
val system: String?, // only used if its a system field, e.g. "assignee"
120+
val custom: String?, // e.g. com.atlassian.jira.plugin.system.customfieldtypes:datepicker
121+
val customId: Long? // e.g. 10202
122+
)
123+
103124
fun List<HttpJiraIssueTypeAttribute>.toJiraIssueTypeAttributes(): List<JiraIssueTypeAttribute> =
104125
map { it.toJiraIssueTypeAttribute() }
105126

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,17 @@ import arrow.core.Either
2323
import com.atlassian.jira.bc.project.ProjectService
2424
import com.atlassian.jira.component.ComponentAccessor
2525
import com.atlassian.jira.config.IssueTypeService
26+
import com.atlassian.jira.issue.fields.rest.RestAwareField
27+
import com.atlassian.jira.issue.fields.screen.FieldScreenLayoutItem
28+
import com.atlassian.jira.issue.fields.screen.FieldScreenTab
2629
import com.atlassian.jira.issue.fields.screen.issuetype.IssueTypeScreenSchemeManager
2730
import com.atlassian.jira.issue.issuetype.IssueType
2831
import com.atlassian.jira.issue.operation.IssueOperations
2932
import com.linkedplanet.kotlinjiraclient.api.error.JiraClientError
3033
import com.linkedplanet.kotlinjiraclient.api.interfaces.JiraIssueTypeOperator
3134
import com.linkedplanet.kotlinjiraclient.api.model.JiraIssueType
3235
import com.linkedplanet.kotlinjiraclient.api.model.JiraIssueTypeAttribute
36+
import com.linkedplanet.kotlinjiraclient.api.model.JiraIssueTypeAttributeSchema
3337
import com.linkedplanet.kotlinjiraclient.sdk.util.eitherAndCatch
3438
import com.linkedplanet.kotlinjiraclient.sdk.util.toEither
3539
import javax.inject.Named
@@ -56,9 +60,21 @@ object SdkJiraIssueTypeOperator : JiraIssueTypeOperator {
5660
)
5761
val screenScheme = screenSchemes.getEffectiveFieldScreenScheme(issueType)
5862
val createScreen = screenScheme.getFieldScreen(IssueOperations.CREATE_ISSUE_OPERATION)
59-
val fields = createScreen.tabs.flatMap { screenTab ->
60-
screenTab.fieldScreenLayoutItems.map { layoutItem ->
61-
JiraIssueTypeAttribute(layoutItem.orderableField.id, layoutItem.orderableField.name)
63+
val fields = createScreen.tabs.flatMap { screenTab: FieldScreenTab ->
64+
screenTab.fieldScreenLayoutItems.map { layoutItem: FieldScreenLayoutItem ->
65+
val orderableField = layoutItem.orderableField
66+
val schema = (orderableField as? RestAwareField)?.jsonSchema
67+
JiraIssueTypeAttribute(
68+
id = orderableField.id,
69+
name = orderableField.name,
70+
schema = JiraIssueTypeAttributeSchema(
71+
schema?.type ?: "Any",
72+
schema?.items,
73+
schema?.system,
74+
schema?.custom,
75+
schema?.customId,
76+
)
77+
)
6278
}
6379
}
6480
fields

kotlin-jira-client/kotlin-jira-client-test-base/src/main/kotlin/com/linkedplanet/kotlinjiraclient/JiraIssueTypeOperatorTest.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ package com.linkedplanet.kotlinjiraclient
2222
import com.linkedplanet.kotlinjiraclient.api.model.JiraIssueTypeAttribute
2323
import com.linkedplanet.kotlinjiraclient.util.orFail
2424
import kotlinx.coroutines.runBlocking
25-
import org.hamcrest.CoreMatchers.equalTo
25+
import org.hamcrest.CoreMatchers.*
2626
import org.hamcrest.MatcherAssert.assertThat
2727
import org.junit.Test
2828

@@ -51,16 +51,17 @@ interface JiraIssueTypeOperatorTest<JiraFieldType> : BaseTestConfigProvider<Jira
5151
issueTypeId
5252
)
5353
}.orFail()
54-
val expectedAttributes = listOf(
54+
val expectedAttributes = arrayOf(
5555
"Epic Link", "Summary", "Issue Type", "Reporter", "Component/s", "Description",
5656
"Fix Version/s", "Priority", "Labels", "Attachment", "Linked Issues", "Assignee",
5757
"Sprint", "InsightObject"
5858
) // Newer Jira does not include "Project
5959

6060
val attributeNames = attributes.map(JiraIssueTypeAttribute::name)
6161
assertThat(attributeNames.size, equalTo(attributes.size))
62-
expectedAttributes.forEach {
63-
assertThat("Attributes does not contain: $it", attributeNames.contains(it), equalTo(true))
64-
}
62+
assertThat(attributeNames, hasItems(*expectedAttributes))
63+
64+
assertThat(attributes.firstOrNull { it.name == "Reporter" }?.schema?.type, equalTo("user"))
65+
assertThat(attributes.firstOrNull { it.name == "Summary" }?.schema?.type, equalTo("string"))
6566
}
6667
}

0 commit comments

Comments
 (0)