Skip to content

Commit 8a9d069

Browse files
Merge pull request #82 from OpenFuturePlatform/key-master-fix
Key master fix
2 parents da48bc1 + e621e6b commit 8a9d069

30 files changed

+360
-104
lines changed

payment-chooser/build/resources/static/static/js/payment-chooser.js

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

payment-chooser/build/resources/static/static/js/payment-chooser.js.map

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

payment-chooser/src/index.js

+123-13
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@ import * as style from './style.css';
22

33
let widgetData;
44

5+
const spinner = document.getElementById("spinner");
6+
const orderKey = document.body.dataset.order;
7+
const host = document.body.dataset.host;
8+
const currency = document.body.dataset.currency;
9+
const OPEN_URL = `${host}/widget/payment/addresses/order/${orderKey}`;
10+
let timerId = 1;
511

6-
//get data from server
712
async function getAddressData(URI){
813
let response = await fetch(URI, {
914
method: 'GET',
@@ -15,14 +20,76 @@ async function getAddressData(URI){
1520
return await response.json();
1621
}
1722

23+
function fetchTransactionData() {
24+
spinner.setAttribute('hidden', '');
25+
$.ajax({
26+
url: OPEN_URL,
27+
type: 'get',
28+
success: function (data) {
29+
setTimeout(function () {
30+
spinner.removeAttribute('hidden');
31+
32+
}, 20000);
33+
loadTransactionData(data);
34+
},
35+
complete: function (data) {
36+
setTimeout(fetchTransactionData, 10000);
37+
}
38+
});
39+
}
40+
41+
function loadTransactionData(result) {
42+
43+
const amount = document.querySelector(".amount");
44+
const remaining = document.querySelector(".remaining");
45+
amount.innerHTML = `${result.orderAmount}`;
46+
//let leftAmount = Math.ceil(result.orderAmount - result.paid);
47+
let leftAmount = result.orderAmount - result.paid;
48+
remaining.innerHTML = `${leftAmount}`;
49+
50+
if ( result.orderAmount <= result.paid){
51+
clearInterval(timerId);
52+
const counter = document.getElementById("countdown");
53+
counter.setAttribute('class','completed')
54+
counter.innerHTML = "Order Completed";
55+
}
56+
57+
for (let blockchain of result.wallets) {
58+
const tbody = document.querySelector("."+`${blockchain.blockchain+blockchain.address}`);
59+
tbody.innerHTML = '';
60+
for (let trx of blockchain.transactions){
61+
let rowBody = document.createElement('tr');
62+
let td_1 = document.createElement('td');
63+
td_1.innerHTML = `${trx.hash}`;
64+
let td_2 = document.createElement('td');
65+
td_2.innerHTML = `${trx.from}`;
66+
let td_3 = document.createElement('td');
67+
td_3.innerHTML = `${trx.amount}`;
68+
let td_4 = document.createElement('td');
69+
td_4.innerHTML = `${trx.rate}`;
70+
71+
rowBody.appendChild(td_1);
72+
rowBody.appendChild(td_2);
73+
rowBody.appendChild(td_3);
74+
rowBody.appendChild(td_4);
75+
tbody.appendChild(rowBody);
76+
}
77+
}
78+
}
79+
1880
async function openPaymentWidget(){
19-
const orderKey = document.body.dataset.order;
20-
const host = document.body.dataset.host;
21-
const OPEN_URL = `${host}/widget/payment/addresses/order/${orderKey}`;
2281

2382
widgetData = await getAddressData(OPEN_URL);
2483
console.log(widgetData.orderDate);
25-
countdownTimer(new Date(`${widgetData.orderDate}`).getTime())
84+
85+
const amount = document.querySelector(".amount");
86+
const remaining = document.querySelector(".remaining");
87+
amount.innerHTML = `${widgetData.orderAmount}`;
88+
//let leftAmount = Math.ceil(widgetData.orderAmount - widgetData.paid);
89+
let leftAmount = widgetData.orderAmount - widgetData.paid;
90+
remaining.innerHTML = `${leftAmount}` ;
91+
92+
countdownTimer(new Date(`${widgetData.orderDate}`).getTime(), widgetData.orderAmount, widgetData.paid);
2693

2794
const accordion = document.querySelector(".accordion");
2895
let i = 1;
@@ -61,6 +128,7 @@ async function openPaymentWidget(){
61128
cardDiv.setAttribute('data-parent','#accordionExample');
62129
let cardDivBody = document.createElement('div');
63130
cardDivBody.setAttribute('class','card-body');
131+
cardDivBody.setAttribute('id',`${blockchain.address}`);
64132
let cardDivBodyQrCode = document.createElement('div');
65133

66134
let qrCodeId = 'qrcode'+i+'b';
@@ -76,11 +144,39 @@ async function openPaymentWidget(){
76144
cardDivBodyAddressHref.innerHTML = blockchain.address;
77145
cardDivBodyAddress.appendChild(cardDivBodyAddressHref);
78146
cardDivBody.appendChild(cardDivBodyAddress);
147+
148+
////// Transactions /////
149+
let cardDivBodyAddressTrx = document.createElement('div');
150+
cardDivBodyAddressTrx.setAttribute('class','table-responsive mb-2 mb-md-0');
151+
let cardDivBodyAddressTrxTable = document.createElement('table');
152+
cardDivBodyAddressTrxTable.setAttribute('class','table table-hover');
153+
let cardDivBodyAddressTrxTableHead = document.createElement('thead');
154+
cardDivBodyAddressTrxTableHead.setAttribute('class','thead-light');
155+
let row = document.createElement('tr');
156+
let heading_1 = document.createElement('th');
157+
heading_1.innerHTML = "Txn Hash";
158+
let heading_2 = document.createElement('th');
159+
heading_2.innerHTML = "From";
160+
let heading_3 = document.createElement('th');
161+
heading_3.innerHTML = "Value";
162+
let heading_4 = document.createElement('th');
163+
heading_4.innerHTML = "Rate";
164+
row.appendChild(heading_1);
165+
row.appendChild(heading_2);
166+
row.appendChild(heading_3);
167+
row.appendChild(heading_4);
168+
cardDivBodyAddressTrxTableHead.appendChild(row);
169+
let cardDivBodyAddressTrxTableBody = document.createElement('tbody');
170+
cardDivBodyAddressTrxTableBody.setAttribute('class',`${blockchain.blockchain+blockchain.address}`);
171+
cardDivBodyAddressTrxTable.appendChild(cardDivBodyAddressTrxTableHead);
172+
cardDivBodyAddressTrxTable.appendChild(cardDivBodyAddressTrxTableBody);
173+
cardDivBodyAddressTrx.appendChild(cardDivBodyAddressTrxTable);
174+
cardDivBody.appendChild(cardDivBodyAddressTrx);
175+
////////////////////////////////////////////////////
79176
cardDiv.appendChild(cardDivBody);
80177
card.appendChild(cardDiv);
81178

82179
accordion.appendChild(card);
83-
console.log(blockchain);
84180

85181
new QRCode(qrCodeId, {
86182
text: blockchain.address,
@@ -91,16 +187,24 @@ async function openPaymentWidget(){
91187
i++;
92188

93189
}
190+
191+
fetchTransactionData();
94192
}
95193

96194
function getBlockchainObject(blockchain){
97195
let IDs = {};
98-
if (blockchain.blockchain === "BTC"){
196+
if (blockchain.blockchain === "BitcoinBlockchain"){
99197
IDs['imgSrc'] = "/static/images/BTC.png";
100198
IDs['title'] = "Bitcoin";
101-
} else if (blockchain.blockchain === "ETH"){
199+
} else if (blockchain.blockchain === "EthereumBlockchain"){
102200
IDs['imgSrc'] = "/static/images/ETH.png";
103201
IDs['title'] = "Ethereum";
202+
} else if (blockchain.blockchain === "RopstenBlockchain"){
203+
IDs['imgSrc'] = "/static/images/ETH.png";
204+
IDs['title'] = "Ropsten";
205+
} else if(blockchain.blockchain === "BinanceTestnetBlockchain") {
206+
IDs['imgSrc'] = "/static/images/BNB.png";
207+
IDs['title'] = "Binance Test";
104208
} else {
105209
IDs['imgSrc'] = "/static/images/BNB.png";
106210
IDs['title'] = "Binance";
@@ -109,9 +213,9 @@ function getBlockchainObject(blockchain){
109213
return IDs;
110214
}
111215

112-
function countdownTimer(countDownDate){
216+
function countdownTimer(countDownDate, amount, paid){
113217

114-
let x = setInterval(function() {
218+
timerId = setInterval(function() {
115219

116220
let now = new Date().getTime();
117221
let distance = countDownDate - now;
@@ -120,11 +224,17 @@ function countdownTimer(countDownDate){
120224
let minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
121225
let seconds = Math.floor((distance % (1000 * 60)) / 1000);
122226

123-
document.getElementById("countdown").innerHTML = hours + ":" + minutes + ":" + seconds;
227+
const counter = document.getElementById("countdown");
228+
counter.innerHTML = hours + "h:" + minutes + "m:" + seconds+"s";
124229

125230
if (distance < 0) {
126-
clearInterval(x);
127-
document.getElementById("countdown").innerHTML = "EXPIRED";
231+
clearInterval(timerId);
232+
counter.innerHTML = "EXPIRED";
233+
}
234+
if (amount <= paid){
235+
clearInterval(timerId);
236+
counter.setAttribute('class','completed')
237+
counter.innerHTML = "Order Completed";
128238
}
129239
}, 1000);
130240
}

payment-chooser/src/style.css

+9
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ div, input.card-input, select.card-input {
5353

5454
.amount, .remaining{
5555
color: #007bff;
56+
text-align: left;
57+
}
58+
.completed{
59+
background: #28a745!important;
60+
color: #fff;
5661
}
5762

5863
#spinner:not([hidden]) {
@@ -112,4 +117,8 @@ div, input.card-input, select.card-input {
112117
}
113118
h5.mb-0{
114119
text-align: left;
120+
}
121+
122+
.align-items-center{
123+
text-align: left;
115124
}

src/main/kotlin/io/openfuture/api/annotation/resolver/CurrentUserArgumentResolver.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@ class CurrentUserArgumentResolver(
1515
) : HandlerMethodArgumentResolver {
1616

1717
override fun supportsParameter(parameter: MethodParameter): Boolean =
18-
parameter.hasParameterAnnotation(CurrentUser::class.java)
18+
parameter.hasParameterAnnotation(CurrentUser::class.java)
1919

20-
override fun resolveArgument(parameter: MethodParameter, mavContainer: ModelAndViewContainer?, webRequest: NativeWebRequest, binderFactory: WebDataBinderFactory?): Any? {
20+
override fun resolveArgument(
21+
parameter: MethodParameter,
22+
mavContainer: ModelAndViewContainer?,
23+
webRequest: NativeWebRequest,
24+
binderFactory: WebDataBinderFactory?
25+
): Any? {
2126
val authentication = SecurityContextHolder.getContext().authentication
2227
val user = authentication.principal as OidcUser
2328
return userService.findByGoogleId(user.subject)
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,36 @@
11
package io.openfuture.api.component.state
22

3-
import io.openfuture.api.domain.state.CreateStateWalletRequest
4-
import io.openfuture.api.domain.state.CreateStateWalletRequestMetadata
5-
import io.openfuture.api.domain.state.StateWalletDto
6-
import io.openfuture.api.domain.state.StateWalletTransactionDetail
3+
import io.openfuture.api.domain.key.KeyWalletDto
4+
import io.openfuture.api.domain.state.*
5+
import io.openfuture.api.domain.widget.PaymentWidgetResponse
76
import io.openfuture.api.entity.state.Blockchain
7+
import io.openfuture.api.util.getOrderKey
8+
import io.openfuture.api.util.getRandomNumber
89
import org.springframework.stereotype.Component
910
import org.springframework.web.client.RestTemplate
11+
import java.math.BigDecimal
1012

1113
@Component
1214
class DefaultStateApi(private val stateRestTemplate: RestTemplate) : StateApi {
1315

14-
override fun createWallet(address: String, webHook: String, blockchain: Blockchain): StateWalletDto {
15-
val request = CreateStateWalletRequest(address, webHook, blockchain)
16-
val response = stateRestTemplate.postForEntity("/wallets", request, StateWalletDto::class.java)
17-
return response.body!!
16+
override fun createWallet(address: String, webHook: String, blockchain: Blockchain): CreateStateWalletResponse {
17+
val request = CreateStateWalletRequestMetadata(
18+
webHook,
19+
listOf(KeyWalletDto(address, blockchain.getValue())),
20+
WalletMetaData(
21+
"0",
22+
"1000",
23+
"op_UxQr1LLdREboF",
24+
"USD",
25+
"open",
26+
false
27+
)
28+
)
29+
return stateRestTemplate.postForEntity("/wallets", request, CreateStateWalletResponse::class.java).body!!
1830
}
1931

20-
override fun createWalletWithMetadata(request: CreateStateWalletRequestMetadata) {
21-
stateRestTemplate.postForEntity("/wallets", request, Void::class.java)
32+
override fun createWalletWithMetadata(request: CreateStateWalletRequestMetadata): CreateStateWalletResponse {
33+
return stateRestTemplate.postForEntity("/wallets", request, CreateStateWalletResponse::class.java).body!!
2234
}
2335

2436
override fun deleteWallet(address: String, blockchain: Blockchain) {
@@ -31,9 +43,14 @@ class DefaultStateApi(private val stateRestTemplate: RestTemplate) : StateApi {
3143
return stateRestTemplate.getForEntity(url, StateWalletTransactionDetail::class.java).body!!
3244
}
3345

34-
override fun getAddressTransactionsByOrder(orderKey: String): StateWalletTransactionDetail {
46+
override fun getAddressTransactionsByOrder(orderKey: String): StateWalletTransaction {
3547
val url = "/wallets/transactions/order/${orderKey}"
36-
return stateRestTemplate.getForEntity(url, StateWalletTransactionDetail::class.java).body!!
48+
return stateRestTemplate.getForEntity(url, StateWalletTransaction::class.java).body!!
49+
}
50+
51+
override fun getPaymentDetailByOrder(orderKey: String): PaymentWidgetResponse {
52+
val url = "/orders/${orderKey}"
53+
return stateRestTemplate.getForEntity(url, PaymentWidgetResponse::class.java).body!!
3754
}
3855

3956
}
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package io.openfuture.api.component.state
22

3-
import io.openfuture.api.domain.state.CreateStateWalletRequestMetadata
4-
import io.openfuture.api.domain.state.StateWalletDto
5-
import io.openfuture.api.domain.state.StateWalletTransactionDetail
3+
import io.openfuture.api.domain.state.*
64
import io.openfuture.api.domain.transaction.TransactionDto
5+
import io.openfuture.api.domain.widget.PaymentWidgetResponse
76
import io.openfuture.api.entity.state.Blockchain
87

98
interface StateApi {
109

11-
fun createWallet(address: String, webHook: String, blockchain: Blockchain): StateWalletDto
10+
fun createWallet(address: String, webHook: String, blockchain: Blockchain): CreateStateWalletResponse
1211

13-
fun createWalletWithMetadata(request: CreateStateWalletRequestMetadata)
12+
fun createWalletWithMetadata(request: CreateStateWalletRequestMetadata): CreateStateWalletResponse
1413

1514
fun deleteWallet(address: String, blockchain: Blockchain)
1615

1716
fun getAddressTransactionsByAddress(address: String) : StateWalletTransactionDetail
1817

19-
fun getAddressTransactionsByOrder(orderKey: String) : StateWalletTransactionDetail
18+
fun getAddressTransactionsByOrder(orderKey: String) : StateWalletTransaction
19+
20+
fun getPaymentDetailByOrder(orderKey: String): PaymentWidgetResponse
2021
}

src/main/kotlin/io/openfuture/api/config/handler/AuthenticationSuccessHandler.kt

+5-3
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ import javax.servlet.http.HttpServletRequest
99
import javax.servlet.http.HttpServletResponse
1010

1111
class AuthenticationSuccessHandler(
12-
private val userService: UserService
12+
private val userService: UserService
1313
) : SavedRequestAwareAuthenticationSuccessHandler() {
1414

15-
override fun onAuthenticationSuccess(request: HttpServletRequest, response: HttpServletResponse,
16-
authentication: Authentication) {
15+
override fun onAuthenticationSuccess(
16+
request: HttpServletRequest, response: HttpServletResponse,
17+
authentication: Authentication
18+
) {
1719
val principal = authentication.principal as OidcUser
1820
userService.findByGoogleId(principal.subject) ?: userService.save(User(principal.subject))
1921
response.sendRedirect("/ethereum-scaffolds")

src/main/kotlin/io/openfuture/api/controller/api/ApplicationApiController.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class ApplicationApiController(
2727
}
2828

2929
@PostMapping
30-
fun save(@Valid @RequestBody request: ApplicationRequest, @CurrentUser user: User): Application =
30+
fun save(@Valid @RequestBody request: ApplicationRequest, @CurrentUser user: User): Application =
3131
service.save(request, user, digitalKeyGenerator.generateApplicationAccessKey())
3232

3333
@DeleteMapping

src/main/kotlin/io/openfuture/api/controller/api/ApplicationWalletApiController.kt

+8-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ class ApplicationWalletApiController(
2020
service.generateWallet(request, user)
2121

2222
@DeleteMapping
23-
fun delete(@RequestParam("applicationId") applicationId: String, @RequestParam("address") address: String): Boolean {
23+
fun delete(
24+
@RequestParam("applicationId") applicationId: String,
25+
@RequestParam("address") address: String
26+
): Boolean {
2427
service.deleteWallet(applicationId, address)
2528
return true
2629
}
@@ -31,7 +34,10 @@ class ApplicationWalletApiController(
3134
}
3235

3336
@PostMapping("/sign/address/{address}")
34-
fun generateSignature(@PathVariable("address") address: String, @Valid @RequestBody request: StateSignRequest): String {
37+
fun generateSignature(
38+
@PathVariable("address") address: String,
39+
@Valid @RequestBody request: StateSignRequest
40+
): String {
3541
return service.generateSignature(address, request)
3642
}
3743

0 commit comments

Comments
 (0)