Files
ExpenseCount/app/Controller/AppController.php
2026-06-25 13:03:45 +06:00

674 lines
20 KiB
PHP

<?php
/**
* Application level Controller
*
* This file is application-wide controller file. You can put all
* application-wide controller-related methods here.
*
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @package app.Controller
* @since CakePHP(tm) v 0.2.9
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
App::uses('Controller', 'Controller');
/**
* Application Controller
*
* Add your application-wide methods in the class below, your controllers
* will inherit them.
*
* @package app.Controller
* @link http://book.cakephp.org/2.0/en/controllers.html#the-app-controller
*/
class AppController extends Controller {
public $firebase;
public $components = array('Session','Cookie');
//platform= 1/2/3; 1=iOS,2=Android,3=Windows
public $operation_type = array('ADD'=>1,'EDIT'=>2,'DELETE'=>3);
public function beforeFilter() {
//This line will be implemented where I will change language.
//$this->Session->write('Config.language', 'fra');
$this->firebase = '';
if ($this->Session->check('Config.language')) {
//echo "cuurent_session";exit;
$lang = $this->Session->read('Config.language');
if($lang != Configure::read('Config.language')){
Configure::write('Config.language', $this->Session->read('Config.language'));
}
} else if($this->Cookie->check('Config.expcount.language')){
//echo "cuurent_cookie";exit;
$language = $this->Cookie->read('Config.expcount.language');
$this->Session->write("Config.language",$language);
Configure::write('Config.language',$language);
}
$this->set("current_lang",Configure::read('Config.language'));
}
public function getClientIp(){
$ipaddress = '';
if (isset($_SERVER['HTTP_CLIENT_IP']))
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
$ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
$ipaddress = $_SERVER['REMOTE_ADDR'];
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
public function getUserAgent(){
$maxlength = 80;
$userAgent = (isset($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';
if(strlen($userAgent) < 80){
$maxlength = strlen($userAgent);
}
return substr($userAgent, 0, $maxlength);;
}
public function objectToArray($d) {
if (is_object($d))
$d = get_object_vars($d);
return is_array($d) ? array_map(__METHOD__, $d) : $d;
}
public function getSystemCurrentIntTime(){
date_default_timezone_set("UTC");
return time();
}
public function getSystemCurrentTimeStamp(){
date_default_timezone_set("UTC");
return date("Y-m-d H:i:s");
}
public function setDefaultTimeStamp(){
date_default_timezone_set("UTC");
}
public function getIntToStrDate($intDate){
return date("d-M-Y",$intDate);
}
public function isValidNewExpenseDate($newExpenseDate){
$result = true;
$newExpenseDateArray = explode('-', $newExpenseDate);
if(count($newExpenseDateArray) != 3){
$result = false;
} else {
$month = strtolower($newExpenseDateArray[1]);
$monthArray = array("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
if(!in_array($month,$monthArray)){
$result = false;
}
}
return $result;
}
public function getStrToIntDate($strDate){
list($day, $month, $year) = explode('-', $strDate);
$month = strtolower($month);
if($month == "jan"){
$month = "01";
} else if($month == "feb"){
$month = "02";
} else if($month == "mar"){
$month = "03";
} else if($month == "apr"){
$month = "04";
} else if($month == "may"){
$month = "05";
} else if($month == "jun"){
$month = "06";
} else if($month == "jul"){
$month = "07";
} else if($month == "aug"){
$month = "08";
} else if($month == "sep"){
$month = "09";
} else if($month == "oct"){
$month = "10";
} else if($month == "nov"){
$month = "11";
} else if($month == "dec"){
$month = "12";
}
return (string)mktime(0, 0, 0, $month, $day, $year);
}
public function getExpenseCreationDate($intDate){
$intDateArray = explode("-",$intDate);
if(count($intDateArray)>1){
return $intDate;
} else {
return date("Y-m-d H:i:s", $intDate);
}
}
public function getExpenseCreationStrToIntDate($strDate){
$strDateArray = explode(" ",$strDate);
list($year, $month, $day) = explode('-', $strDateArray[0]);
list($hour, $min, $sec) = explode(':', $strDateArray[1]);
return mktime($hour, $min, $sec, $month, $day, $year);
}
public function isValidExpenseUniqueURL($unique_url, $firstValue){
if( substr($unique_url, 0, 1) == $firstValue)
return true;
else
return false;
}
public function isValidToken($access_token, $device_id, $random_number){
$unique_number = $device_id.$random_number; // device id + six digit random number
$salt = 'Nop@ss%!*-+@s=_17';
$generated_token = hash('sha256', $unique_number . $salt);
if($access_token == $generated_token){
return true;
} else {
return false;
}
}
public function getUserToken($device_id, $random_number){
$unique_number = $device_id.$random_number; // device id + six digit random number
$salt = 'Nop@ss%!*-+@s=_17';
return hash('sha256', $unique_number . $salt);
}
public function getResetPasswordToken($device_id, $random_number, $email){
$unique_number = $device_id.$random_number.$email; // device id + six digit random number + email
$salt = 'Nomatter%!*-+@s=_17';
return hash('sha256', $unique_number . $salt);
}
public function isItemAlreadyAdded($dbExpenseList,$currentItemUniqueId){
$result = false;
if(!empty($dbExpenseList) && !empty($currentItemUniqueId)){
foreach($dbExpenseList as $key=>$value){
if(!empty($value["syn_add_unique_id"]) && $value["syn_add_unique_id"] == $currentItemUniqueId){
$result = true;
break;
}
}
}
return $result;
}
public function getSource($detect){
$source = 2;
if ($detect->isAndroid()) {
$source = 4;
} else if($detect->isIphone()){
$source = 5;
} else if($detect->isWindows()){
$source = 6;
}
return $source;
}
public function getCaptchaResponse($captcha)
{
// echo RECAPTCH_SECRET_KEY;exit;
$secretKey = RECAPTCH_SECRET_KEY;
$verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secretKey.'&response='.$captcha);
$responseData = json_decode($verifyResponse);
return $responseData;
}
public function setDefaultWhat($expenseList){
$result = array();
if(!empty($expenseList)) {
foreach($expenseList as $key=>$value ) {
if(isset($value["what"]))
$value["what"] = trim($value["what"]);
if(isset($value["what"]) && empty($value["what"])) {
$value["what"] = "N/A";
}
$result[$key] = $value;
}
}
return $result;
}
public function updateFirebase($unique_url)
{
require_once "../../lib/firebase/vendor/autoload.php";
// $startime = time();
$expense_type = substr($unique_url, 0 , 1);
$expense_name = '';
if($expense_type == 1) {
$expense_name = "GroupExpense";
} elseif ($expense_type == 2) {
$expense_name = "MessExpense";
} elseif ($expense_type == 3) {
$expense_name = "FamilyExpense";
}
$db_dir = $expense_name.'/'.$unique_url;
$serviceAccount = \Kreait\Firebase\ServiceAccount::fromJsonFile('../../go_ser_pri.json');
$firebase = (new \Kreait\Firebase\Factory())
->withServiceAccount($serviceAccount)
->create();
$database = $firebase->getDatabase();
$newPost = $database
->getReference(FIREBASE_DB_PATH);
$current_row = $newPost->getChild($db_dir.'/ver'); //FamilyExpense/3Po9rHbzvdZO0n4
$current_ver = $current_row->getValue();
$update_ver = $current_ver + 1;
$current_row->set($update_ver);
//$time_diff = time() - $startime;
// echo "time : ".$time_diff."<br>";
}
public function processValidation($method = 'POST')
{
$status = "-1";
$status_desc = "FAILED";
$error = "";
$secretKey = "";
$data = array();
if($method == 'GET') {
$object = $this->request->query;
} else{
$object = $this->request->input('json_decode');
}
if (!empty($object)) {
$data = $this->objectToArray($object);
}
//check maintenance mood
if (MAINTENANCE_MOOD) {
$status = "035";
$status_desc = "Service is in maintenance mood. Please try again later.";
$error = $status;
} else if (empty($data)) {
$status = "031";
$status_desc = "Invalid JSON input sent";
} else {
if ($status == "-1") {
if (!$this->isValidToken($data["access_token"], $data["device_id"], $data["random_number"])) {
$status = "057"; // token is not valid
$status_desc = "TOKEN IS NOT VALID. Please provide access_token, device_id and random_number ";
} else {
$status = "";
$status_desc = "PASS";
}
}
}
return array($data, $status, $status_desc, $error);
}
public function apiLogAppCrashData($data, $status, $status_desc)
{
$this->loadModel('LogAppCrashes');
$crash["unique_url"] = "";
$crash["error_code"] = $status;
$crash["error_desc"] = $status_desc;
$crash["request"] = serialize($data);
$crash["response"] = ""; //serialize($latestExpenseData);
$crash["crash_date"] = $this->getSystemCurrentTimeStamp();
$crash["ip"] = $this->getClientIp();
$crash["device_info"] = $this->getUserAgent();
$this->LogAppCrashes->insertLogAppCrashes($crash);
}
public function processResponse($error, $data, $status, $status_desc)
{
$input["status"] = $status;
$input["status_desc"] = $status_desc;
if (!empty($error) || $status != "+000") {
$input["input"] = $data;
$input['error'] = $error;
$this->apiLogAppCrashData($data, $status, $status_desc);
}
$this->set(array(
'response' => $input,
'_serialize' => array('response')
));
}
public function isExistFirebaseUser($user_id)
{
$result = false;
$firebaseUser = array();
$this->initializeFirebase();
$firebaseUser = $this->firebase->getAuth()->getUser($user_id);
if(!empty($firebaseUser)){
$result = true;
}
return array($result,$firebaseUser);
}
public function validateUser($user_id) {
//check validity
$error = "";
$error_desc = "";
$userObj = array();
$this->loadModel('User');
list($result, $userObj) = $this->User->isExistUserById($user_id);
if(IS_FIREBASE_ACTIVATED){
if(!$result){
list($result, $userObj) = $this->isExistFirebaseUser($user_id);
}
}
if(!$result){
$error = "-997";
$error_desc = "User not exist!";
}
return array($error, $error_desc, $userObj);
}
public function validateUniqueUrl($url) {
//check validity
$error = "";
$error_desc = "";
$expObj = array();
if (empty($error)) {
$this->loadModel('Expense');
$expInfo = $this->Expense->findByUniqueUrl($url);
if(!$expInfo){
$error = "-997";
$error_desc = "Unique_url not exist!";
}
}
return array($error, $error_desc,$expObj);
}
public function systemGeneratedUniqueId($user_id,$expense_type)
{
return $expense_type.'-'.$user_id.'-'.time().'-'.rand(1000,9999);
}
public function isValidUserProfile($profile_id, $profile_type)
{
$this->loadModel('User');
return $this->User->isUserExistByProfile( $profile_id, $profile_type);
}
public function addUserGroupDuringExpenseCreate($user_id, $unique_url, $expense_type)
{
$result = array();
$status = '';
$status_desc = '';
$newUserGroup = array();
$this->loadModel('UserGroup');
$this->loadModel('User');
$userObj = $this->User->getUserByUserId($user_id);
if(sizeof($userObj)) {
$existUserGroup = $this->UserGroup->isExistUserGroup($user_id, $unique_url);
if(empty($existUserGroup[0])) {
$inputData['user_id'] = $user_id;
$inputData['unique_url'] = $unique_url;
$inputData['participant_id'] = '1_0';
$result[] = $this->UserGroup->add($inputData);
} else {
$status = "12";
$status_desc = "UserGroup is Exist";
}
// increment the version in firebase
$this->userGroupUpdateOnFirebase($user_id, $expense_type);
} else {
$status = "13";
$status_desc = "User is invalid";
}
return array($status, $status_desc, $result);
}
public function isForceUpgradeRequire($version_recceived, $version_expected) {
return intval($version_recceived) < intval($version_expected);
}
public function initializeFirebase() {
require_once "../../lib/firebase/vendor/autoload.php";
$serviceAccount = \Kreait\Firebase\ServiceAccount::fromJsonFile(FIREBASE_SERVICE_ACCOUNT_CREDENTIALS);
$this->firebase = (new \Kreait\Firebase\Factory())
->withServiceAccount($serviceAccount)
->create();
}
function callAPI($api_url, $request_method = "GET", $post_fields = '') {
if (!empty($api_url)) {
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $api_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => $request_method,
CURLOPT_POSTFIELDS => $post_fields,
CURLOPT_HTTPHEADER => array(
"accept: application/json",
"content-type: application/json"
)
));
$response = curl_exec($curl);
$err = curl_error($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($httpcode == 200) {
return $response;
} else {
return "Something went wrong";
}
}
return false;
}
function callGETAPI($api_url) {
if (!empty($api_url)) {
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $api_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
// CURLOPT_POSTFIELDS => $post_fields,
CURLOPT_HTTPHEADER => array(
"accept: application/json",
"content-type: application/json"
)
));
$response = curl_exec($curl);
$err = curl_error($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($httpcode == 200) {
return $response;
} else {
return "Something went wrong";
}
}
return false;
}
function deviceData(){
$data["device_id"] = session_id();
$data["random_number"] = rand(1000, 9999);
$data["access_token"] = $this->getUserToken($data["device_id"], $data["random_number"]);
return $data;
}
public function setCookie($data, $unique_url, $UpdateFlag = null){
//set cookie for my expenses
$this->autoRender = false;
$new_cookie = ['title'=>$data['title'],'unique_url'=>$unique_url, 'create_date'=>$data['create_date']];
$prev_cookie[] = $new_cookie;
if($this->Cookie->read('Expenses') != "") {
$prev_cookie = $this->Cookie->read('Expenses');
if($UpdateFlag){
$key = array_search($unique_url, array_column($prev_cookie, 'unique_url'));
$prev_cookie[$key]['title'] = $data['title'];
setcookie("CakeCookie[Expenses]", json_encode($prev_cookie), time() + (86400 * 1000), "/");
}else{
array_push($prev_cookie, $new_cookie);
}
}
if(!$UpdateFlag){
$this->Cookie->write('Expenses', $prev_cookie, false, '24000 hours');
}
}
public function isPaid($uid)
{
$this->loadModel('User');
$user = $this->User->findById($uid);
if (!empty($user) && !empty($user['User']['user_subscription_id'])) {
$this->loadModel('UserSubscription');
$userSub = $this->UserSubscription->findById($user['User']['user_subscription_id']);
$currtDate = strtotime(date('Y-m-d H:i:s'));
$userSubDate = strtotime($userSub['UserSubscription']['valid_to']);
if ($userSubDate >= $currtDate) {
return true;
}
}
return false;
}
public function userGroupUpdateOnFirebase($userId, $expenseType) {
/*
* expensecount-312c7/root/{env}/myProfileUser/{expenseType}/{userId}/ver
* env: prod, dev
* userId: myProfile user_id
* expenseType: GroupExpense, MessExpense, FamilyExpense
*/
require_once "../../lib/firebase/vendor/autoload.php";
$serviceAccount = \Kreait\Firebase\ServiceAccount::fromJsonFile('../../go_ser_pri.json');
$this->firebase = (new \Kreait\Firebase\Factory())
->withServiceAccount($serviceAccount)
->create();
$database = $this->firebase->getDatabase();
$newPost = $database->getReference(FIREBASE_DB_PATH);
$current_row = $newPost->getChild('/myProfileUser/'.$expenseType.'/'.$userId.'/ver');
$current_ver = $current_row->getValue();
if(!isset($current_ver)) {
$update_ver = 1;
} else {
$update_ver = $current_ver + 1;
}
$current_row->set($update_ver);
}
public function validateDeleteParticipant($ParticipantArray){
$error = "";
if(empty($ParticipantArray)){
$error = "8";
}
if($error == ""){
foreach($ParticipantArray as $key=>$value){
if (!array_key_exists('expense_id', $value)||!array_key_exists('id', $value)) {
$error = "9";
break;
}
$idArray[$key] = $value["id"];
}
}
//check id duplicacy
if($error == ""){
$previousLength = count($idArray);
$idArray = array_unique($idArray);
if($previousLength != count($idArray)){
$error = "10";
}
}
return $error;
}
}