Skip to content

Commit b1a3e4d

Browse files
authored
Merge pull request #22 from linked-planet/feature/improve_errors
Feature/improve errors
2 parents 24dcc4a + e09e3db commit b1a3e4d

File tree

13 files changed

+51
-27
lines changed

13 files changed

+51
-27
lines changed

kotlin-atlassian-client-core-common/src/main/kotlin/com/linkedplanet/kotlinatlassianclientcore/common/api/Page.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,12 @@ open class Page<T> (
5656
return "Page(items=$items, totalItems=$totalItems, totalPages=$totalPages, currentPageIndex=$currentPageIndex, pageSize=$pageSize)"
5757
}
5858

59+
fun <T> copy(items: List<T>): Page<T> =
60+
Page(
61+
items = items,
62+
totalItems = this.totalItems,
63+
totalPages = this.totalPages,
64+
currentPageIndex = this.currentPageIndex,
65+
pageSize = this.pageSize,
66+
)
5967
}

kotlin-atlassian-client-core-common/src/main/kotlin/com/linkedplanet/kotlinatlassianclientcore/common/error/AtlassianClientError.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ import javax.validation.constraints.NotNull
2727
open class AtlassianClientError(
2828
@field:NotNull val error: String,
2929
@field:NotNull val message: String,
30-
@field:NotNull val stacktrace: String = ""
30+
@field:NotNull val stacktrace: String = "",
31+
val statusCode: Int? = null
3132
) {
3233

3334
override fun equals(other: Any?): Boolean {
@@ -37,6 +38,7 @@ open class AtlassianClientError(
3738
if (error != other.error) return false
3839
if (message != other.message) return false
3940
if (stacktrace != other.stacktrace) return false
41+
if (statusCode != other.statusCode) return false
4042

4143
return true
4244
}
@@ -45,11 +47,12 @@ open class AtlassianClientError(
4547
var result = error.hashCode()
4648
result = 31 * result + message.hashCode()
4749
result = 31 * result + stacktrace.hashCode()
50+
result = 31 * result + (statusCode ?: 0)
4851
return result
4952
}
5053

5154
override fun toString(): String {
52-
return "AtlassianClientError(error='$error', message='$message', stacktrace='$stacktrace')"
55+
return "AtlassianClientError(error='$error', message='$message', stacktrace='$stacktrace', httpStatusCode=$statusCode)"
5356
}
5457

5558
companion object

kotlin-insight-client/kotlin-insight-client-api/src/main/kotlin/com/linkedplanet/kotlininsightclient/api/error/InsightClientError.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ import io.swagger.v3.oas.annotations.media.Schema
4747
sealed class InsightClientError(
4848
error: String,
4949
message: String,
50-
stacktrace: String = ""
51-
) : AtlassianClientError(error, message, stacktrace) {
50+
stacktrace: String = "",
51+
statusCode: Int? = null
52+
) : AtlassianClientError(error, message, stacktrace, statusCode) {
5253

5354
companion object {
5455
private const val internalErrorString = "Jira/Insight hat ein internes Problem festgestellt"
@@ -81,6 +82,9 @@ open class OtherInsightClientError(error: String, message: String) : InsightClie
8182
/**
8283
* Somewhere inside an HTTP connection failed.
8384
*/
84-
class HttpInsightClientError(val statusCode: Int, error: String, message: String) : InsightClientError(error,
85-
"$message StatusCode:$statusCode"
85+
class HttpInsightClientError(statusCode: Int, error: String, message: String) :
86+
InsightClientError(
87+
error = error,
88+
message = "$message StatusCode:$statusCode",
89+
statusCode = statusCode
8690
)

kotlin-jira-client/kotlin-jira-client-api/src/main/kotlin/com/linkedplanet/kotlinjiraclient/api/error/JiraClientError.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ import com.linkedplanet.kotlinatlassianclientcore.common.error.AtlassianClientEr
2525
open class JiraClientError(
2626
error: String,
2727
message: String,
28-
stacktrace: String = ""
29-
) : AtlassianClientError(error, message, stacktrace) {
28+
stacktrace: String = "",
29+
statusCode: Int? = null // http status code equivalent
30+
) : AtlassianClientError(error, message, stacktrace, statusCode) {
3031

3132
companion object
3233
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ class HttpJiraUserOperator(private val context: HttpJiraClientContext) : JiraUse
132132

133133
else -> JiraClientError(
134134
"Unknown actor type",
135-
"Actor type ${actor.type} for actor ${actor.name} is not known."
135+
"Actor type ${actor.type} for actor ${actor.name} is not known.",
136+
statusCode = 404
136137
).left()
137138
}
138139

kotlin-jira-client/kotlin-jira-client-http/src/main/kotlin/com/linkedplanet/kotlinjiraclient/http/util/JiraClientErrorExtension.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ import com.linkedplanet.kotlinhttpclient.error.HttpDomainError
2323
import com.linkedplanet.kotlinjiraclient.api.error.JiraClientError
2424

2525
fun JiraClientError.Companion.fromHttpDomainError(e: HttpDomainError): JiraClientError =
26-
JiraClientError(e.error, e.message, "HttpStatusCode-${e.statusCode}")
26+
JiraClientError(e.error, e.message, "HttpStatusCode-${e.statusCode}", statusCode = e.statusCode)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ object SdkJiraIssueLinkOperator : JiraIssueLinkOperator {
5757
}
5858

5959
private fun issueLinkTypeNotFound(relationName: String): Either<JiraClientError, Unit> = Either.Left(
60-
JiraClientError("IssueLinkType not found", "No IssueLinkType named $relationName found.")
60+
JiraClientError("IssueLinkType not found", "No IssueLinkType named $relationName found.", statusCode = 404)
6161
)
6262

6363
override suspend fun deleteIssueLink(linkId: String): Either<JiraClientError, Unit> =

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

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ import kotlin.math.ceil
5454
object SdkJiraIssueOperator : JiraIssueOperator<SdkJiraField> {
5555
override var RESULTS_PER_PAGE: Int = 10
5656

57-
private val issueService by lazy { ComponentAccessor.getIssueService() }
58-
private val customFieldManager by lazy { ComponentAccessor.getCustomFieldManager() }
59-
private val searchService: SearchService by lazy { ComponentAccessor.getComponent(SearchService::class.java) }
60-
private val jiraAuthenticationContext by lazy { ComponentAccessor.getJiraAuthenticationContext() }
61-
private val jqlParser by lazy { ComponentAccessor.getComponent(JqlQueryParser::class.java) }
62-
private val applicationProperties by lazy { ComponentAccessor.getApplicationProperties() }
63-
private val webResourceUrlProvider by lazy { ComponentAccessor.getWebResourceUrlProvider() }
57+
private val issueService = ComponentAccessor.getIssueService()
58+
private val customFieldManager = ComponentAccessor.getCustomFieldManager()
59+
private val searchService: SearchService = ComponentAccessor.getComponent(SearchService::class.java)
60+
private val jiraAuthenticationContext = ComponentAccessor.getJiraAuthenticationContext()
61+
private val jqlParser = ComponentAccessor.getComponent(JqlQueryParser::class.java)
62+
private val applicationProperties = ComponentAccessor.getApplicationProperties()
63+
private val webResourceUrlProvider = ComponentAccessor.getWebResourceUrlProvider()
6464
private val issueJsonConverter = IssueJsonConverter()
6565

6666
private fun user() = jiraAuthenticationContext.loggedInUser
@@ -146,7 +146,10 @@ object SdkJiraIssueOperator : JiraIssueOperator<SdkJiraField> {
146146
val httpStatusSuffix = worstReason?.let { " (${it.httpStatusCode})" } ?: ""
147147
return JiraClientError(
148148
errorTitle,
149-
errorCollection.errorMessages.joinToString() + httpStatusSuffix
149+
errorCollection.errorMessages.joinToString(",\n")
150+
+ errorCollection.errors.map { "'$it.key':${it.value}" }.joinToString(",\n")
151+
+ httpStatusSuffix,
152+
statusCode = worstReason?.httpStatusCode
150153
)
151154
}
152155

@@ -217,7 +220,7 @@ object SdkJiraIssueOperator : JiraIssueOperator<SdkJiraField> {
217220
private suspend fun <T> issueToConcreteType(
218221
issue: Issue,
219222
parser: suspend (JsonObject, Map<String, String>) -> Either<JiraClientError, T>
220-
): Either<JiraClientError, T> {
223+
): Either<JiraClientError, T> = Either.catchJiraClientError {
221224
val jsonIssue: JsonObject = issueJsonConverter.createJsonIssue(issue)
222225
val customFieldMap = customFieldManager.getCustomFieldObjects(issue).associate { it.name to it.id }
223226
return parser(jsonIssue, customFieldMap)
@@ -229,8 +232,8 @@ object SdkJiraIssueOperator : JiraIssueOperator<SdkJiraField> {
229232
parser: suspend (JsonObject, Map<String, String>) -> Either<JiraClientError, T>
230233
): Either<JiraClientError, Page<T>> = either {
231234
val user = userOrError().bind()
232-
val query = jqlParser.parseQuery(jql)
233-
val search = searchService.search(user, query, pagerFilter)
235+
val query = Either.catchJiraClientError { jqlParser.parseQuery(jql) }.bind()
236+
val search = Either.catchJiraClientError { searchService.search(user, query, pagerFilter) }.bind()
234237
val issues = search.results
235238
.map { issue -> issueToConcreteType(issue, parser) }
236239
.bindAll()

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ object SdkJiraTransitionOperator : JiraTransitionOperator {
7070
}
7171

7272
private fun createTransitionIdNoIntError(transitionId: String) =
73-
JiraClientError("Illegal Argument", "Transition with id $transitionId must be of type Int.")
73+
JiraClientError("Illegal Argument",
74+
"Transition with id $transitionId must be of type Int.",
75+
statusCode = 400
76+
)
7477

7578
private fun createParams(comment: String? = null): IssueInputParameters? =
7679
issueService.newIssueInputParameters().apply {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ object SdkJiraUserOperator : JiraUserOperator {
8989

9090
private fun createProjectNotFoundError(projectKey: String) = JiraClientError(
9191
"Project not found",
92-
"No Project with projectKey $projectKey found."
92+
"No Project with projectKey $projectKey found.",
93+
statusCode = 404
9394
)
9495

9596
private fun ApplicationUser.hasPermissionWithName(permissionName: String, project: Project): Boolean {

0 commit comments

Comments
 (0)