diff --git a/android/backend-api/src/main/kotlin/com/github/ai/split/api/ErrorMessageDto.kt b/android/backend-api/src/main/kotlin/com/github/ai/split/api/ErrorMessageDto.kt index 22d2969..bd69993 100644 --- a/android/backend-api/src/main/kotlin/com/github/ai/split/api/ErrorMessageDto.kt +++ b/android/backend-api/src/main/kotlin/com/github/ai/split/api/ErrorMessageDto.kt @@ -5,5 +5,7 @@ import kotlinx.serialization.Serializable @Serializable data class ErrorMessageDto( val message: String?, - val stacktrace: String + val exception: String, + val stacktraceBase64: String, + val stacktraceLines: List ) \ No newline at end of file diff --git a/backend/api/src/main/scala/com/github/ai/split/api/ErrorMessageDto.scala b/backend/api/src/main/scala/com/github/ai/split/api/ErrorMessageDto.scala index ae79f91..5f2a94f 100644 --- a/backend/api/src/main/scala/com/github/ai/split/api/ErrorMessageDto.scala +++ b/backend/api/src/main/scala/com/github/ai/split/api/ErrorMessageDto.scala @@ -4,7 +4,9 @@ import zio.json.{DeriveJsonEncoder, JsonEncoder} case class ErrorMessageDto( message: Option[String], - stacktrace: String + exception: String, + stacktraceBase64: String, + stacktraceLines: List[String] ) object ErrorMessageDto { diff --git a/backend/app/src/main/scala/com/github/ai/split/utils/ResponseExtensions.scala b/backend/app/src/main/scala/com/github/ai/split/utils/ResponseExtensions.scala index bc9e591..11d94cc 100644 --- a/backend/app/src/main/scala/com/github/ai/split/utils/ResponseExtensions.scala +++ b/backend/app/src/main/scala/com/github/ai/split/utils/ResponseExtensions.scala @@ -3,9 +3,12 @@ package com.github.ai.split.utils import com.github.ai.split.api.ErrorMessageDto import com.github.ai.split.entity.exception.DomainError import com.github.ai.split.utils.* -import zio.http.{Response, Status} +import zio.http.{Body, Response, Status} import zio.json.* +import java.nio.charset.StandardCharsets.UTF_8 +import java.nio.charset.{Charset, StandardCharsets} +import java.util.Base64 import scala.annotation.tailrec extension (exception: DomainError) { @@ -21,14 +24,22 @@ extension (exception: DomainError) { } val stacktrace = exceptionToPrint.stackTraceToString() + val encodedStacktrace = Base64.getEncoder.encodeToString(stacktrace.getBytes(UTF_8)) + val stacktraceLines = stacktrace + .split("\n") + .map(_.replaceAll("\t", " ")) + .toList + val response = ErrorMessageDto( - message = if (hasMessage) exception.message else None, - stacktrace = stacktrace + message = if (hasMessage) exception.message.map(_.trim) else None, + exception = exceptionToPrint.toString.trim, + stacktraceBase64 = encodedStacktrace, + stacktraceLines = stacktraceLines ) Response.error( status = Status.BadRequest, - message = response.toJsonPretty + "\n" + body = Body.fromString(response.toJsonPretty, UTF_8) ) }