summaryrefslogtreecommitdiff
path: root/merchant-terminal/src/main/java/net/taler/merchantpos/history/HistoryManager.kt
blob: 24c7a0c83f18b59f049963b69e5a7bf8fe017864 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
 * This file is part of GNU Taler
 * (C) 2020 Taler Systems S.A.
 *
 * GNU Taler is free software; you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 3, or (at your option) any later version.
 *
 * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
 */

package net.taler.merchantpos.history

import androidx.annotation.UiThread
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.android.volley.Request.Method.GET
import com.android.volley.RequestQueue
import com.android.volley.Response.Listener
import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import net.taler.common.Amount
import net.taler.common.Timestamp
import net.taler.merchantpos.LogErrorListener
import net.taler.merchantpos.config.ConfigManager
import net.taler.merchantpos.config.MerchantRequest
import org.json.JSONObject

data class HistoryItem(
    @JsonProperty("order_id")
    val orderId: String,
    val amount: Amount,
    val summary: String,
    val timestamp: Timestamp
) {
    @get:JsonIgnore
    val time = timestamp.ms
}

sealed class HistoryResult {
    object Error : HistoryResult()
    class Success(val items: List<HistoryItem>) : HistoryResult()
}

class HistoryManager(
    private val configManager: ConfigManager,
    private val queue: RequestQueue,
    private val mapper: ObjectMapper
) {

    private val mIsLoading = MutableLiveData(false)
    val isLoading: LiveData<Boolean> = mIsLoading

    private val mItems = MutableLiveData<HistoryResult>()
    val items: LiveData<HistoryResult> = mItems

    @UiThread
    internal fun fetchHistory() {
        mIsLoading.value = true
        val merchantConfig = configManager.merchantConfig!!
        val params = mapOf("instance" to merchantConfig.instance!!)
        val req = MerchantRequest(GET, merchantConfig, "history", params, null,
            Listener { onHistoryResponse(it) },
            LogErrorListener { onHistoryError() })
        queue.add(req)
    }

    @UiThread
    private fun onHistoryResponse(body: JSONObject) {
        mIsLoading.value = false
        val items = arrayListOf<HistoryItem>()
        val historyJson = body.getJSONArray("history")
        for (i in 0 until historyJson.length()) {
            val historyItem: HistoryItem = mapper.readValue(historyJson.getString(i))
            items.add(historyItem)
        }
        mItems.value = HistoryResult.Success(items)
    }

    @UiThread
    private fun onHistoryError() {
        mIsLoading.value = false
        mItems.value = HistoryResult.Error
    }

}