blob: 9aa1906003705b07190f7d388d8e01ef2733b782 [file] [log] [blame]
package org.mifos.openbanking.data.datasources.network
import io.ktor.client.*
import io.ktor.client.features.*
import io.ktor.client.request.*
import io.ktor.http.ContentType
import io.ktor.http.content.*
import kotlinx.serialization.json.Json
import org.mifos.openbanking.base.Response
import org.mifos.openbanking.domain.usecase.createTransactionRequest.CreateTransactionRequestRequest
import org.mifos.openbanking.domain.usecase.createTransactionRequest.CreateTransactionRequestResponse
import org.mifos.openbanking.domain.usecase.fetchTransactionById.FetchTransactionByIdRequest
import org.mifos.openbanking.domain.usecase.fetchTransactionById.FetchTransactionByIdResponse
import org.mifos.openbanking.domain.usecase.fetchTransactionById.Transaction
import org.mifos.openbanking.domain.usecase.fetchTransactionRequests.FetchTransactionRequestsRequest
import org.mifos.openbanking.domain.usecase.fetchTransactionRequests.FetchTransactionRequestsResponse
import org.mifos.openbanking.domain.usecase.fetchTransactions.FetchTransactionsRequest
import org.mifos.openbanking.domain.usecase.fetchTransactions.FetchTransactionsResponse
class TransactionApi {
private val client = HttpClient()
suspend fun createTransactionRequest(request: CreateTransactionRequestRequest): Response<CreateTransactionRequestResponse> {
try {
val content = "{" +
" \"to\": {" +
" \"bank_id\": \"${request.destinationBankId}\"," +
" \"account_id\": \"${request.destinationAccountId}\"" +
" }," +
" \"value\": {" +
" \"currency\": \"${request.currency}\"," +
" \"amount\": \"${request.amount}\"" +
" }," +
" \"description\": \"${request.description}\"" +
"}"
val response = client.post<String>(
urlString = API_HOST + createTransactionRequestPath(
request.sourceBankId,
request.sourceAccountId
)
) {
headers {
append("Authorization", "DirectLogin token=${request.token}")
}
body = TextContent(content, contentType = ContentType.Application.Json)
}
return Response.Success(CreateTransactionRequestResponse())
} catch (exp: ClientRequestException) {
return Response.Error(exp)
} catch (exp: Exception) {
return Response.Error(exp)
}
}
suspend fun fetchTransactionRequests(request: FetchTransactionRequestsRequest): Response<FetchTransactionRequestsResponse> {
try {
val response = client.get<String>(
API_HOST + fetchTransactionRequestsPath(
request.bankId,
request.accountId
)
) {
headers {
append("Authorization", "DirectLogin token=${request.token}")
}
}
val transactionRequestsList =
Json.nonstrict.parse(FetchTransactionRequestsResponse.serializer(), response)
return Response.Success(transactionRequestsList)
} catch (exp: ClientRequestException) {
return Response.Error(exp)
} catch (exp: Exception) {
return Response.Error(exp)
}
}
suspend fun fetchTransactionById(request: FetchTransactionByIdRequest): Response<FetchTransactionByIdResponse> {
try {
val response = client.get<String>(
API_HOST + fetchTransactionByIdPath(
request.bankId,
request.accountId,
request.transactionId
)
) {
headers {
append("Authorization", "DirectLogin token=${request.token}")
}
}
val transaction =
Json.nonstrict.parse(Transaction.serializer(), response)
return Response.Success(FetchTransactionByIdResponse(transaction))
} catch (exp: ClientRequestException) {
return Response.Error(exp)
} catch (exp: Exception) {
return Response.Error(exp)
}
}
suspend fun fetchTransactions(request: FetchTransactionsRequest): Response<FetchTransactionsResponse> {
try {
val response = client.get<String>(
API_HOST + fetchTransactionsPath(
request.bankId,
request.accountId,
request.sort,
request.limit,
request.offset,
request.fromDate,
request.toDate
)
) {
headers {
append("Authorization", "DirectLogin token=${request.token}")
}
}
val fetchTransactionsResponse =
Json.nonstrict.parse(FetchTransactionsResponse.serializer(), response)
return Response.Success(fetchTransactionsResponse)
} catch (exp: ClientRequestException) {
return Response.Error(exp)
} catch (exp: Exception) {
return Response.Error(exp)
}
}
}