loadComponent('JsonRequestClient');
$this->loadComponent('GradidoNumber');
//$this->loadComponent('JsonRpcRequestClient');
//$this->Auth->allow(['add', 'edit']);
$this->Auth->allow([
'index', 'sendCoins', 'createCoins', 'getBalance',
'listTransactions','listGDTTransactions', 'getDecayStartBlock'
]);
}
public function index()
{
if($this->request->is('get')) {
$method = $this->request->getQuery('method');
switch($method) {
}
return $this->returnJson(['state' => 'error', 'msg' => 'unknown method for get', 'details' => $method]);
}
else if($this->request->is('post')) {
$jsonData = $this->request->input('json_decode');
//var_dump($jsonData);
if($jsonData == NULL || !isset($jsonData->method)) {
return $this->returnJson(['state' => 'error', 'msg' => 'parameter error']);
}
$method = $jsonData->method;
switch($method) {
}
return $this->returnJson(['state' => 'error', 'msg' => 'unknown method for post', 'details' => $method]);
}
return $this->returnJson(['state' => 'error', 'msg' => 'no post or get']);
}
private function checkAndCopyRequiredFields($fields, &$param, $data = null) {
if($data == null) {
$data = $this->request->input('json_decode');
}
foreach($fields as $field) {
if(is_array($field)) {
$one_exist = false;
foreach($field as $oneField) {
if(isset($data->$oneField)) {
$param[$oneField] = $data->$oneField;
$one_exist = true;
break;
}
}
if(!$one_exist) {
return ['state' => 'error', 'msg' => 'missing field of set', 'details' => $field];
}
} else {
if(!isset($data->$field)) {
return ['state' => 'error', 'msg' => 'missing field', 'details' => $field . ' not found'];
} else {
$param[$field] = $data->$field;
}
}
}
return true;
}
private function rewriteKeys(&$data, $replaceKeys)
{
foreach(array_keys($replaceKeys) as $key) {
$newKey = $replaceKeys[$key];
if(isset($data->$key)) {
$data->$newKey = $data->$key;
unset($data->$key);
}
}
}
private function parseParameterForCreateTransaction(&$param, $data = null)
{
if($data == null) {
$data = $this->request->input('json_decode');
}
$session_id = 0;
if(isset($data->session_id)) {
$session_id = $data->session_id;
}
$login_request_result = $this->requestLogin($session_id, false);
if($login_request_result !== true) {
return $login_request_result;
}
$session = $this->getRequest()->getSession();
$param['session_id'] = $session->read('session_id');
$param['blockchain_type'] = $this->blockchainType;
$this->rewriteKeys($data, ['email' => 'target_email', 'username' => 'target_username', 'pubkey' => 'target_pubkey']);
$required_fields = $this->checkAndCopyRequiredFields(['amount', ['target_email', 'target_username', 'target_pubkey']], $param, $data);
if($required_fields !== true) {
return $required_fields;
}
if(floatval($param['amount']) <= 0.0) {
return ['state' => 'error', 'msg' => 'amount is invalid', 'details' => $param['amount']];
}
$param['amount'] = $this->GradidoNumber->parseInputNumberToCentNumber($param['amount']);
if(isset($data->memo)) {
$param['memo'] = $data->memo;
}
if(isset($data->auto_sign)) {
$param['auto_sign'] = boolval($data->auto_sign);
}
return true;
}
public function sendCoins()
{
/*
* {
"session_id" : -127182,
"amount": 2000000,
"email": "max.musterman@gmail.de",
"memo":"Thank you :)",
"group": "gdd1",
"auto_sign": true
*/
if(!$this->request->is('post')) {
return $this->returnJson(['state' => 'error', 'msg' => 'no post']);
}
$data = $this->request->input('json_decode');
$params = [];
$result = $this->parseParameterForCreateTransaction($params, $data);
if($result !== true) {
return $this->returnJson($result);
}
if(!isset($params['memo']) || strlen($params['memo']) < 5 || strlen($params['memo']) > 150) {
return $this->returnJson(['state' => 'error', 'msg' => 'memo is not set or not in expected range [5;150]']);
}
$params['transaction_type'] = 'transfer';
$requestAnswear = $this->JsonRequestClient->sendRequest(json_encode($params), '/createTransaction');
if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) {
$session = $this->getRequest()->getSession();
$pendingTransactionCount = $session->read('Transactions.pending');
if($pendingTransactionCount == null) {
$pendingTransactionCount = 1;
} else {
$pendingTransactionCount++;
}
$session->write('Transactions.pending', $pendingTransactionCount);
//echo "pending: " . $pendingTransactionCount;
return $this->returnJson(['state' => 'success']);
} else {
/*
* if request contain unknown parameter format, shouldn't happen't at all
* {"state": "error", "msg": "parameter format unknown"}
* if json parsing failed
* {"state": "error", "msg": "json exception", "details":"exception text"}
* if session_id is zero or not set
* {"state": "error", "msg": "session_id invalid"}
* if session id wasn't found on login server, if server was restartet or user logged out (also per timeout, default: 15 minutes)
* {"state": "error", "msg": "session not found"}
* if session hasn't active user, shouldn't happen't at all, login-server should be checked if happen
* {"state": "code error", "msg":"user is zero"}
* if transaction type not known
* {"state": "error", "msg":"transaction_type unknown"}
* if receiver wasn't known to Login-Server
* {"state": "not found", "msg":"receiver not found"}
* if receiver account disabled, and therefor cannto receive any coins
* {"state": "disabled", "msg":"receiver is disabled"}
* if transaction was okay and will be further proccessed
* {"state":"success"}
*/
$answear_data = $requestAnswear['data'];
return $this->returnJson($answear_data);
}
}
public function createCoins()
{
/*
* "session_id" : -127182,
* "email": "max.musterman@gmail.de",
* "amount": 10000000,
* "target_date":"2021-02-19T13:25:36+00:00",
* "memo":"AGE",
* "auto_sign": true
*/
if(!$this->request->is('post')) {
return $this->returnJson(['state' => 'error', 'msg' => 'no post']);
}
$data = $this->request->input('json_decode');
$params = [];
$result = $this->parseParameterForCreateTransaction($params, $data);
if($result !== true) {
return $this->returnJson($result);
}
$required_fields = $this->checkAndCopyRequiredFields(['target_date'], $params, $data);
if($required_fields !== true) {
return $this->returnJson($required_fields);
}
$params['transaction_type'] = 'creation';
$requestAnswear = $this->JsonRequestClient->sendRequest(json_encode($params), '/createTransaction');
if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) {
$session = $this->getRequest()->getSession();
$pendingTransactionCount = $session->read('Transactions.pending');
if($pendingTransactionCount == null) {
$pendingTransactionCount = 1;
} else {
$pendingTransactionCount++;
}
$session->write('Transactions.pending', $pendingTransactionCount);
//echo "pending: " . $pendingTransactionCount;
return $this->returnJson(['state' => 'success']);
} else {
/*
* if request contain unknown parameter format, shouldn't happen't at all
* {"state": "error", "msg": "parameter format unknown"}
* if json parsing failed
* {"state": "error", "msg": "json exception", "details":"exception text"}
* if session_id is zero or not set
* {"state": "error", "msg": "session_id invalid"}
* if session id wasn't found on login server, if server was restartet or user logged out (also per timeout, default: 15 minutes)
* {"state": "error", "msg": "session not found"}
* if session hasn't active user, shouldn't happen't at all, login-server should be checked if happen
* {"state": "code error", "msg":"user is zero"}
* if transaction type not known
* {"state": "error", "msg":"transaction_type unknown"}
* if receiver wasn't known to Login-Server
* {"state": "not found", "msg":"receiver not found"}
* if receiver account disabled, and therefor cannto receive any coins
* {"state": "disabled", "msg":"receiver is disabled"}
* if transaction was okay and will be further proccessed
* {"state":"success"}
*/
$answear_data = $requestAnswear['data'];
return $this->returnJson($answear_data);
}
}
public function getBalance($session_id = 0)
{
$this->viewBuilder()->setLayout('ajax');
$login_result = $this->requestLogin($session_id, false);
if($login_result !== true) {
$this->set('body', $login_result);
return;
}
$session = $this->getRequest()->getSession();
$user = $session->read('StateUser');
$state_balances_table = TableRegistry::getTableLocator()->get('StateBalances');
$state_balances_table->updateBalances($user['id']);
$state_balance = $state_balances_table->find()->where(['state_user_id' => $user['id']])->first();
$now = new FrozenTime();
if(!$state_balance) {
$body = [
'state' => 'success',
'balance' => 0,
'decay' => 0
];
} else {
$body = [
'state' => 'success',
'balance' => $state_balance->amount,
'decay' => $state_balance->partDecay($now),
];
}
$body['decay_date'] = $now;
$this->set('body', $body);
}
public function listTransactions($page = 1, $count = 25, $orderDirection = 'ASC', $session_id = 0)
{
$this->viewBuilder()->setLayout('ajax');
$startTime = microtime(true);
$login_result = $this->requestLogin($session_id, false);
if($login_result !== true) {
return $this->returnJson($login_result);
}
$session = $this->getRequest()->getSession();
$user = $session->read('StateUser');
$stateBalancesTable = TableRegistry::getTableLocator()->get('StateBalances');
$stateUserTransactionsTable = TableRegistry::getTableLocator()->get('StateUserTransactions');
$transactionsTable = TableRegistry::getTableLocator()->get('Transactions');
$stateBalancesTable->updateBalances($user['id']);
$gdtSum = 0;
$gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi');
if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) {
$gdtSum = intval($gdtEntries['data']['sum']);
} else {
$this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id'] ? $user['id'] : 0);
}
//echo "count: $count, page: $page
";
$limit = $count;
$offset = 0;
$skip_first_transaction = false;
if($page == 1) {
$limit--;
} else {
$offset = (( $page - 1 ) * $count) - 1;
}
if($offset) {
$limit++;
$skip_first_transaction = true;
if($orderDirection == 'ASC') {
$offset--;
}
}
//echo "limit: $limit, offset: $offset, skip first transaction: $skip_first_transaction
";
$stateUserTransactionsQuery = $stateUserTransactionsTable
->find()
->where(['state_user_id' => $user['id']])
->order(['balance_date' => $orderDirection])
->contain([])
->limit($limit)
//->page($page)
->offset($offset)
;
$decay = true;
if($page > 1) {
$decay = false;
}
$transactions = [];
$transactions_from_db = $stateUserTransactionsQuery->toArray();
if(count($transactions_from_db)) {
if($orderDirection == 'DESC') {
$transactions_from_db = array_reverse($transactions_from_db);
}
$transactions = $transactionsTable->listTransactionsHumanReadable($transactions_from_db, $user, $decay, $skip_first_transaction);
//echo "transactions count: " . count($transactions) . "
";
if($orderDirection == 'DESC') {
$transactions = array_reverse($transactions);
}
}
$state_balance = $stateBalancesTable->find()->where(['state_user_id' => $user['id']])->first();
$body = [
'state' => 'success',
'transactions' => $transactions,
'transactionExecutingCount' => $session->read('Transactions.executing'),
'count' => $stateUserTransactionsQuery->count(),
'gdtSum' => $gdtSum,
'timeUsed' => microtime(true) - $startTime
];
$now = new FrozenTime();
$body['decay_date'] = $now;
if(!$state_balance) {
$body['balance'] = 0.0;
$body['decay'] = 0.0;
} else {
$body['balance'] = $state_balance->amount;
$body['decay'] = $stateBalancesTable->calculateDecay($state_balance->amount, $state_balance->record_date, $now);
}
$this->set('body', $body);
}
public function listGDTTransactions($page = 1, $count = 25, $orderDirection = 'ASC', $session_id = 0)
{
$timeBegin = microtime(true);
$gdtSum = 0;
$gdtCount = -1;
$this->viewBuilder()->setLayout('ajax');
$login_result = $this->requestLogin($session_id, false);
if($login_result !== true) {
return $this->returnJson($login_result);
}
$session = $this->getRequest()->getSession();
$user = $session->read('StateUser');
if(!$user) {
return $this->returnJson(['state' => 'error', 'msg' => 'user not found', 'details' => 'exist a valid session cookie?']);
}
$gdtEntries = $this->JsonRequestClient->sendRequestGDT([
'email' => $user['email'],
'page' => $page,
'count' => $count,
'orderDirection' => $orderDirection
], 'GdtEntries' . DS . 'listPerEmailApi');
$transactions = [];
$result = ['state' => 'success'];
if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) {
$gdtSum = 0;
if(isset($gdtEntries['data']['gdtSumPerEmail'])) {
foreach($gdtEntries['data']['gdtSumPerEmail'] as $email => $sum) {
$gdtSum += floatval($sum/100.0);
}
}
$result['sum'] = $gdtSum;
if(isset($gdtEntries['data']['count'])) {
$result['count'] = intval($gdtEntries['data']['count']);
}
if(isset($gdtEntries['data']['ownEntries'])) {
$result['ownEntries'] = $gdtEntries['data']['ownEntries'];
}
if(isset($gdtEntries['data']['publisherPath'])) {
$result['publisherPath'] = $gdtEntries['data']['publisherPath'];
}
if(isset($gdtEntries['data']['connectEntrys'])) {
$result['connectEntrys'] = $gdtEntries['data']['connectEntrys'];
}
} else {
if($user) {
$this->addAdminError('StateBalancesController', 'ajaxGdtOverview', $gdtEntries, $user['id']);
} else {
$this->addAdminError('StateBalancesController', 'ajaxGdtOverview', $gdtEntries, 0);
}
}
$timeEnd = microtime(true);
$result['timeUsed'] = ($timeEnd - $timeBegin) . ' s';
return $this->returnJson($result);
}
public function getDecayStartBlock()
{
$transactionsTable = TableRegistry::getTableLocator()->get('Transactions');
$decayStartBlock = $transactionsTable->find()->where(['transaction_type_id' => 9]);
if(!$decayStartBlock->count()) {
return $this->returnJson(['state' => 'error', 'msg' => 'not found']);
}
return $this->returnJson(['state' => 'success', 'decay_start' => $decayStartBlock->first()->received]);
}
private function acquireAccessToken($session_id)
{
}
}