Skip to content

Commit ee2cfe4

Browse files
Merge pull request #78 from OpenFuturePlatform/key-master-fix
payment transaction widget with order key
2 parents 7326845 + d83ffbe commit ee2cfe4

File tree

17 files changed

+313
-112
lines changed

17 files changed

+313
-112
lines changed

src/main/kotlin/io/openfuture/api/component/state/DefaultStateApi.kt

+8-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.openfuture.api.domain.key.WalletMetaDto
44
import io.openfuture.api.domain.state.CreateStateWalletRequest
55
import io.openfuture.api.domain.state.CreateStateWalletRequestMetadata
66
import io.openfuture.api.domain.state.StateWalletDto
7+
import io.openfuture.api.domain.state.StateWalletTransactionDetail
78
import io.openfuture.api.domain.transaction.TransactionDto
89
import io.openfuture.api.entity.state.Blockchain
910
import org.springframework.stereotype.Component
@@ -28,9 +29,14 @@ class DefaultStateApi(private val stateRestTemplate: RestTemplate) : StateApi {
2829
stateRestTemplate.delete(url)
2930
}
3031

31-
override fun getAddressTransactions(address: String): Array<TransactionDto> {
32+
override fun getAddressTransactionsByAddress(address: String): StateWalletTransactionDetail {
3233
val url = "/wallets/transactions/address/${address}"
33-
return stateRestTemplate.getForEntity(url, Array<TransactionDto>::class.java).body!!
34+
return stateRestTemplate.getForEntity(url, StateWalletTransactionDetail::class.java).body!!
35+
}
36+
37+
override fun getAddressTransactionsByOrder(orderKey: String): StateWalletTransactionDetail {
38+
val url = "/wallets/transactions/order/${orderKey}"
39+
return stateRestTemplate.getForEntity(url, StateWalletTransactionDetail::class.java).body!!
3440
}
3541

3642
}

src/main/kotlin/io/openfuture/api/component/state/StateApi.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.openfuture.api.component.state
22

33
import io.openfuture.api.domain.state.CreateStateWalletRequestMetadata
44
import io.openfuture.api.domain.state.StateWalletDto
5+
import io.openfuture.api.domain.state.StateWalletTransactionDetail
56
import io.openfuture.api.domain.transaction.TransactionDto
67
import io.openfuture.api.entity.state.Blockchain
78

@@ -13,5 +14,7 @@ interface StateApi {
1314

1415
fun deleteWallet(address: String, blockchain: Blockchain)
1516

16-
fun getAddressTransactions(address: String) : Array<TransactionDto>
17+
fun getAddressTransactionsByAddress(address: String) : StateWalletTransactionDetail
18+
19+
fun getAddressTransactionsByOrder(orderKey: String) : StateWalletTransactionDetail
1720
}

src/main/kotlin/io/openfuture/api/controller/base/MainController.kt

+11-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,17 @@ class MainController(
2424
}
2525

2626
@GetMapping("/widget/transactions/address/{address}")
27-
fun payment(@PathVariable address: String, model: ModelMap): String {
28-
model["address"] = address
27+
fun transactionByAddress(@PathVariable address: String, model: ModelMap): String {
28+
model["value"] = address
29+
model["type"] = "address"
30+
model["host"] = widgetProperties.host
31+
return "tracker"
32+
}
33+
34+
@GetMapping("/widget/transactions/order/{orderKey}")
35+
fun transactionByOrder(@PathVariable orderKey: String, model: ModelMap): String {
36+
model["value"] = orderKey
37+
model["type"] = "order"
2938
model["host"] = widgetProperties.host
3039
return "tracker"
3140
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.openfuture.api.controller.widget
22

3-
import io.openfuture.api.domain.transaction.TransactionDto
3+
import io.openfuture.api.domain.state.StateWalletTransactionDetail
44
import io.openfuture.api.service.ApplicationWalletService
55
import org.springframework.web.bind.annotation.*
66

@@ -11,7 +11,12 @@ class TransactionWidgetController(
1111
private val service : ApplicationWalletService
1212
) {
1313
@GetMapping("/{address}")
14-
fun get(@PathVariable address: String): Array<TransactionDto> {
15-
return service.getAddressTransactions(address)
14+
fun getTransactionsByAddress(@PathVariable address: String): StateWalletTransactionDetail {
15+
return service.getAddressTransactionsByAddress(address)
16+
}
17+
18+
@GetMapping("/order-key/{orderKey}")
19+
fun getTransactionsByOrder(@PathVariable orderKey: String): StateWalletTransactionDetail {
20+
return service.getAddressTransactionsByOrder(orderKey)
1621
}
1722
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.openfuture.api.domain.state
2+
3+
import io.openfuture.api.domain.transaction.TransactionDto
4+
import java.math.BigDecimal
5+
6+
data class StateWalletTransactionDetail(
7+
var orderKey: String,
8+
var amount: BigDecimal,
9+
var totalPaid: BigDecimal = BigDecimal.ZERO,
10+
var rate: BigDecimal,
11+
val transactions: List<TransactionDto>
12+
)

src/main/kotlin/io/openfuture/api/service/DefaultApplicationWalletService.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import io.openfuture.api.domain.key.CreateKeyRequest
77
import io.openfuture.api.domain.key.GenerateWalletRequest
88
import io.openfuture.api.domain.key.KeyWalletDto
99
import io.openfuture.api.domain.state.StateSignRequest
10+
import io.openfuture.api.domain.state.StateWalletTransactionDetail
1011
import io.openfuture.api.domain.transaction.TransactionDto
1112
import io.openfuture.api.entity.auth.User
1213
import io.openfuture.api.entity.state.Blockchain
@@ -43,8 +44,12 @@ class DefaultApplicationWalletService(
4344
stateApi.deleteWallet(address, Blockchain.Ethereum)
4445
}
4546

46-
override fun getAddressTransactions(address: String): Array<TransactionDto> {
47-
return stateApi.getAddressTransactions(address)
47+
override fun getAddressTransactionsByAddress(address: String): StateWalletTransactionDetail {
48+
return stateApi.getAddressTransactionsByAddress(address)
49+
}
50+
51+
override fun getAddressTransactionsByOrder(orderKey: String): StateWalletTransactionDetail {
52+
return stateApi.getAddressTransactionsByOrder(orderKey)
4853
}
4954

5055
override fun generateSignature(address: String, request: StateSignRequest): String {

src/main/kotlin/io/openfuture/api/service/Service.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import io.openfuture.api.domain.key.KeyWalletDto
99
import io.openfuture.api.domain.key.WalletApiCreateRequest
1010
import io.openfuture.api.domain.scaffold.*
1111
import io.openfuture.api.domain.state.StateSignRequest
12+
import io.openfuture.api.domain.state.StateWalletTransactionDetail
1213
import io.openfuture.api.domain.transaction.TransactionDto
1314
import io.openfuture.api.entity.application.Application
1415
import io.openfuture.api.entity.auth.User
@@ -112,7 +113,9 @@ interface ApplicationWalletService {
112113

113114
fun deleteWallet(applicationId: String, address: String)
114115

115-
fun getAddressTransactions(address: String) : Array<TransactionDto>
116+
fun getAddressTransactionsByAddress(address: String) : StateWalletTransactionDetail
117+
118+
fun getAddressTransactionsByOrder(orderKey: String) : StateWalletTransactionDetail
116119

117120
fun generateSignature(address: String, request: StateSignRequest): String
118121
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.openfuture.api.controller.widget
2+
3+
import io.openfuture.api.config.ControllerTests
4+
import io.openfuture.api.domain.state.StateWalletTransactionDetail
5+
import io.openfuture.api.entity.scaffold.EthereumScaffold
6+
import io.openfuture.api.service.ApplicationWalletService
7+
import org.junit.Test
8+
import org.mockito.BDDMockito
9+
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
10+
import org.springframework.boot.test.mock.mockito.MockBean
11+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
12+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
13+
import org.springframework.test.web.servlet.result.MockMvcResultMatchers
14+
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.content
15+
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
16+
import java.math.BigDecimal
17+
import java.util.*
18+
19+
@WebMvcTest(TransactionWidgetController::class)
20+
class TransactionWidgetControllerTest: ControllerTests() {
21+
22+
@MockBean
23+
private lateinit var service : ApplicationWalletService
24+
25+
@Test
26+
fun getTest() {
27+
val detail = createDummy()
28+
29+
BDDMockito.given(service.getAddressTransactionsByAddress("address")).willReturn(detail)
30+
31+
/* mvc.perform(get("/widget/transactions/address" ))
32+
33+
.andExpect(status().isOk)
34+
.andExpect(content().json(expectDataJson(detail), true))*/
35+
}
36+
37+
private fun expectDataJson(stateWalletTransactionDetail: StateWalletTransactionDetail) = """
38+
{
39+
"orderKey": ${stateWalletTransactionDetail.orderKey},
40+
"amount": ${stateWalletTransactionDetail.amount},
41+
"totalPaid": ${stateWalletTransactionDetail.totalPaid},
42+
"rate": "${stateWalletTransactionDetail.rate}",
43+
"transactions": ${stateWalletTransactionDetail.transactions}
44+
}
45+
""".trimIndent()
46+
47+
private fun createDummy() = StateWalletTransactionDetail("wc_order_JTj1BJyvtl9j3", BigDecimal.ZERO, BigDecimal.ZERO,BigDecimal.ZERO, listOf())
48+
}

tracker/README.md

+4-10
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
1-
# Open-widget
2-
This is a payment widget that you can embed to your site for processing payments from customers in the Cryptocurrency via [OPEN Platform](https://api.openfuture.io/) API.
3-
4-
This widget requires [Metamask Wallet](https://metamask.io/).
1+
# Open-transaction-widget
2+
This is a payment transaction track widget that you can embed to your site for tracking payments from customers.
53

64
[![](http://joxi.net/VrwNex4COodeMA.png)]()
75

86
### How to use a widget
97

108
Paste the code below to a location at your site where you'd like to use this widget and set the width and height parameters.
11-
You also have to put your scaffold address in the src element: 'https://api.openfuture.io/widget/your_scaffold_address'
9+
You also have to put your scaffold address in the src element: 'https://api.openfuture.io/widget/transactions/address/your_wallet_address'
1210
The best solution is to do it dynamically, especially if you have created a lot of scaffolds.
1311

1412

1513
```html
16-
<iframe id="open-widget-iframe" src="https://api.openfuture.io/widget/your_scaffold_address_here" width="400" height="600" scrolling="no" frameborder="0" allowfullscreen></iframe>
14+
<iframe id="open-widget-iframe" src="https://api.openfuture.io/widget/transactions/address/your_address_here" width="400" height="600" scrolling="no" frameborder="0" allowfullscreen></iframe>
1715

1816
```
1917

20-
21-
The widget can contain a maximum of 9 fields of 3 types (string, number, boolean).
22-
Field names and types are set in a [personal OPEN-platform account](https://api.openfuture.io/scaffolds/new) during a smart contract creation.
23-

tracker/build/index.html

+56-2
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,68 @@
55
<meta name="viewport"
66
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
77
<meta http-equiv="X-UA-Compatible" content="ie=edge">
8-
<meta http-equiv="refresh" content="15" />
8+
<!--<meta http-equiv="refresh" content="15" />-->
99
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
1010
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js"></script>
1111
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js"></script>
1212
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
13+
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
14+
<script src="https://common.olemiss.edu/_js/datatables/media/js/jquery.dataTables.js"></script>
1315
<title></title>
1416
</head>
15-
<body data-address="${address}" data-host="${host}">
17+
<body data-value="${address}" data-host="${host}" data-type="${type}">
18+
19+
<div class="container">
20+
<header class="mb-4">
21+
<nav class="navbar navbar-expand-lg navbar-light bg-light">
22+
<div class="container-fluid">
23+
<a href="https://www.openfuture.io/"><img src="https://api.openfuture.io/img/landing_new/logo.svg"></a>
24+
</div>
25+
</nav>
26+
</header>
27+
<div class="row mb-4">
28+
<div class="col-md-6 mb-3 mb-md-0">
29+
<div class="card h-100">
30+
<div class="card-header d-flex justify-content-between align-items-center">
31+
<h2 class="card-header-title">Overview</h2>
32+
</div>
33+
<div class="card-body">
34+
<div class="row align-items-center">
35+
<div class="col-md-4 mb-1 mb-md-0">Amount:</div>
36+
<div class="col-md-8 amount">0.677271</div>
37+
</div>
38+
<hr class="hr-space">
39+
<div class="row">
40+
<div class="col-md-4 mb-1 mb-md-0">Remaining:</div>
41+
<div class="col-md-8 remaining">0.677171</div>
42+
</div>
43+
</div>
44+
</div>
45+
</div>
46+
</div>
47+
<div hidden id="spinner"></div>
48+
<div class="card">
49+
<div class="card-header">Transactions</div>
50+
<div class="card-body">
51+
<div class="table-responsive mb-2 mb-md-0">
52+
<table class="table table-hover">
53+
<thead class="thead-light">
54+
<tr>
55+
<th>Txn Hash</th>
56+
<th>From</th>
57+
<th>To</th>
58+
<th>Value</th>
59+
<th>Blockchain</th>
60+
</tr>
61+
</thead>
62+
<tbody class="transactions">
63+
</tbody>
64+
</table>
65+
</div>
66+
</div>
67+
</div>
68+
</div>
69+
1670
<script src="${host}/static/js/payment-widget.js"></script>
1771
</body>
1872
</html>

tracker/build/resources/static/static/js/payment-widget.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tracker/build/resources/static/static/js/payment-widget.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tracker/build/resources/templates/tracker.ftl

+56-2
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,68 @@
55
<meta name="viewport"
66
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
77
<meta http-equiv="X-UA-Compatible" content="ie=edge">
8-
<meta http-equiv="refresh" content="15" />
8+
<!--<meta http-equiv="refresh" content="15" />-->
99
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
1010
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js"></script>
1111
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js"></script>
1212
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
13+
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
14+
<script src="https://common.olemiss.edu/_js/datatables/media/js/jquery.dataTables.js"></script>
1315
<title></title>
1416
</head>
15-
<body data-address="${address}" data-host="${host}">
17+
<body data-value="${address}" data-host="${host}" data-type="${type}">
18+
19+
<div class="container">
20+
<header class="mb-4">
21+
<nav class="navbar navbar-expand-lg navbar-light bg-light">
22+
<div class="container-fluid">
23+
<a href="https://www.openfuture.io/"><img src="https://api.openfuture.io/img/landing_new/logo.svg"></a>
24+
</div>
25+
</nav>
26+
</header>
27+
<div class="row mb-4">
28+
<div class="col-md-6 mb-3 mb-md-0">
29+
<div class="card h-100">
30+
<div class="card-header d-flex justify-content-between align-items-center">
31+
<h2 class="card-header-title">Overview</h2>
32+
</div>
33+
<div class="card-body">
34+
<div class="row align-items-center">
35+
<div class="col-md-4 mb-1 mb-md-0">Amount:</div>
36+
<div class="col-md-8 amount">0.677271</div>
37+
</div>
38+
<hr class="hr-space">
39+
<div class="row">
40+
<div class="col-md-4 mb-1 mb-md-0">Remaining:</div>
41+
<div class="col-md-8 remaining">0.677171</div>
42+
</div>
43+
</div>
44+
</div>
45+
</div>
46+
</div>
47+
<div hidden id="spinner"></div>
48+
<div class="card">
49+
<div class="card-header">Transactions</div>
50+
<div class="card-body">
51+
<div class="table-responsive mb-2 mb-md-0">
52+
<table class="table table-hover">
53+
<thead class="thead-light">
54+
<tr>
55+
<th>Txn Hash</th>
56+
<th>From</th>
57+
<th>To</th>
58+
<th>Value</th>
59+
<th>Blockchain</th>
60+
</tr>
61+
</thead>
62+
<tbody class="transactions">
63+
</tbody>
64+
</table>
65+
</div>
66+
</div>
67+
</div>
68+
</div>
69+
1670
<script src="${host}/static/js/payment-widget.js"></script>
1771
</body>
1872
</html>

tracker/build/static/js/payment-widget.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tracker/build/static/js/payment-widget.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)