summaryrefslogtreecommitdiff
path: root/merchant-terminal/src/main/java/net/taler/merchantpos/history/HistoryManager.kt
blob: 594e7cc5111c74b9d4d85db94093cc12e9485131 (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
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
 * 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 android.util.Log
import androidx.annotation.UiThread
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.android.volley.Request.Method.GET
import com.android.volley.Request.Method.POST
import com.android.volley.RequestQueue
import com.android.volley.Response.ErrorListener
import com.android.volley.Response.Listener
import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import net.taler.merchantpos.Amount
import net.taler.merchantpos.config.ConfigManager
import net.taler.merchantpos.config.MerchantRequest
import org.json.JSONObject

@JsonInclude(NON_EMPTY)
class Timestamp(
    @JsonProperty("t_ms")
    val ms: Long
)

data class HistoryItem(
    @JsonProperty("order_id")
    val orderId: String,
    @JsonProperty("amount")
    val amountStr: String,
    val summary: String,
    val timestamp: Timestamp
) {
    @get:JsonIgnore
    val amount: Amount by lazy { Amount.fromString(amountStr) }

    @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) },
            ErrorListener { 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
    }

}