1,'Archived' => 2];
public function initialize() {
$this->app_version = "1"; // 1= old app; 2=new app; date related
$this->setDefaultTimeStamp();
}
public function beforeFilter()
{
parent::beforeFilter(); // TODO: Change the autogenerated stub
}
public function beforeRender() {
parent::beforeRender();
$this->layout = 'visitor';
if ($this->Session->check("homecontroller_layout")) {
//$this->layout = '';
$this->Session->delete("homecontroller_layout");
}
}
public function getProfile() {
}
public function updateProfile() {
}
// signup API
public function signup() {
$status = "-1";
$status_desc = "FAILED";
$error = "";
$secretKey = "";
$data = array();
$invalidGroups = array();
$userObj = NULL;
$googleOrAppleSignUp = false;
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
//check maintenance mood
if (MAINTENANCE_MOOD) {
$status = "35";
$status_desc = "Service is in maintenance mood. Please try again later.";
$error = $status;
} else if (empty($data)) {
$status = "31";
$status_desc = "Invalid JSON input sent";
} else {
if ($status == "-1") {
if (!$this->isValidToken($data["access_token"], $data["device_id"], $data["random_number"])) {
$status = "57"; // token is not valid
$status_desc = "TOKEN's ARE NOT VALID";
}
}
if ($status == "-1") {
list($status, $status_desc, $userObj) = $this->validateRegisterForm($data);
}
}
if (empty($status)) {
// register the user into database
$data["ip"] = $this->getClientIp();
$data["device_info"] = $this->getUserAgent();
$data["create_date"] = $this->getSystemCurrentTimeStamp();
$data["update_date"] = $this->getSystemCurrentTimeStamp();
$device_id = session_id();
$random_number = rand(10000000, 99999999);
$verificationToken = $this->getResetPasswordToken($device_id, $random_number, $data['profile_id']);
$existUser = $this->User->isUserExist($data["profile_id"]);
if (isset($existUser[0]) && empty($existUser[0])) {
if (!isset($data['password'])) {
$googleOrAppleSignUp = true;
} else {
// temporary check for quick fix; currently web doesn't encode the password
if($this->is_base64_encoded($data['password'])) {
$data['password'] = base64_decode($data['password'], false);
}
//$data['password'] = base64_decode($data['password'], false);
}
$data['password'] = md5($data['password']);
if ($this->User->insertUser($data)) {
//set Verification Token
$this->User->setVerificationTokenByProfileId($data['profile_id'], $verificationToken);
//insert into user_groups
if (isset($data["groups"])) {
$groups = $data["groups"];
$user_id = $this->User->id;
$groupData = array();
foreach ($groups as $key => $value) {
if (isset($value["unique_url"]) && isset($value["participant_id"])) {
$groupData[$key]["user_id"] = $user_id;
$groupData[$key]["unique_url"] = $value["unique_url"];
$groupData[$key]["participant_id"] = $value["participant_id"];
} else {
$invalidGroups[$key] = $value;
}
}
if (!empty($groupData)) {
$this->loadModel('UserGroup');
$this->UserGroup->saveMany($groupData);
}
}
$userObj = $this->User->getUserByProfileId($data["profile_id"]);
$verificationUrl = HTTP_SITE_URL . '/users/verify?vt=' . $verificationToken . '&p=' . $userObj['User']['profile_id'];
if(IS_EMAIL_SEND_DURING_USER_REGISTRATION && $googleOrAppleSignUp == false) {
$params = array();
$params["first_name"] = $userObj['User']['first_name'];
$params["profile_id"] = $userObj['User']['profile_id'];
$params["email_to"] = $userObj['User']['profile_id'];
$params["email_from"] = SUPPORT_EMAIL;
$params["subject"] = 'ExpenseCount verification link';
$params["link"] = $verificationUrl;
$params["template"] = 'user_verification';
$params["verification_token"] = $verificationToken;
$this->sendEmail($params);
}
if(IS_USER_WALLET_ACTIVE) {
$inputData = array();
$inputData["user_id"] = $userObj['User']['id'];
$inputData["currency_id"] = 1; // 1 = USD
$inputData["balance"] = 0;
$inputData["withdrawable_balance"] = 0;
$inputData["non_withdrawable_balance"] = 0;
$inputData["status"] = 1; // 0 = Inactive, 1= Active
$inputData["created_date"] = $this->getSystemCurrentTimeStamp();
$inputData["updated_date"] = $this->getSystemCurrentTimeStamp();
$this->Wallet->add($inputData);
}
$status = "+000";
$status_desc = "SUCCESS";
} else {
$status = "22";
$status_desc = "User Data Saving Failed!";
}
} else {
if ($existUser[1]['User']['is_verified'] == 0) {
$status = "-995";
$status_desc = "Email is exist but not verified!
Resend the verification link? Click here.>
";
} else {
$status = "-996";
$status_desc = "Email is exist! Try with another email.";
}
}
} else if ($status == 60) {
$status = "+000";
$status_desc = "SUCCESS";
}
unset($userObj['User']['password']);
if($googleOrAppleSignUp == true) {
$input["user"] = $userObj["User"];
}
$input["status"] = $status;
$input["status_desc"] = $status_desc;
if (!empty($error) || $status != "+000") {
unset($data['password']);
$input["input"] = $data;
$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);
}
$input["invalid_groups"] = $invalidGroups;
$this->set(array(
'response' => $input,
'_serialize' => array('response')
));
}
// signin API
public function signin() {
$status = "-1";
$status_desc = "FAILED";
$error = "";
$secretKey = "";
$data = array();
$userObj = NULL;
$object = $this->request->input('json_decode');
$googleSignin = false;
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if (!isset($data['password'])) {
$data['password'] = 'googleSignIn';
$googleSignin = true;
} else {
// temporary check for quick fix; currently web doesn't encode the password
if($this->is_base64_encoded($data['password'])) {
$data['password'] = base64_decode($data['password'], false);
}
$data['password'] = md5($data['password']);
}
if (isset($data['email'])) {
$data['profile_id'] = $data['email'];
}
//check maintenance mood
if (MAINTENANCE_MOOD) {
$status = "35";
$status_desc = "Service is in maintenance mood. Please try again later.";
$error = $status;
} else if (empty($data)) {
$status = "31";
$status_desc = "Invalid JSON input sent";
} else {
if ($status == "-1") {
if (!$this->isValidToken($data["access_token"], $data["device_id"], $data["random_number"])) {
$status = "57"; // token is not valid
$status_desc = "TOKEN IS NOT VALID. Please provide access_token, device_id and random_number ";
}
}
if ($status == "-1") {
list($status, $status_desc, $userObj) = $this->validateRegisterForm($data);
}
}
if (empty($status)) {
$userObj = $this->User->getUserByProfileId($data["profile_id"]);
if (!isset($userObj['User'])) {
$status = "-999";
$status_desc = "No User Found";
} else if ($googleSignin == false && $userObj['User']['password'] != $data["password"]) {
$status = "-998";
$status_desc = "Email or password is incorrect!";
} else if ($googleSignin == false && $userObj['User']['is_verified'] != 1) {
$status = "-997";
$status_desc = "Email not verified";
} else {
list($status, $status_desc, $userGroupData) = $this->getUserGroup($userObj['User']['id']);
$archivedGroupData = $this->getArchivedUserGroup($userObj['User']['id']);
if (IS_FIREBASE_ACTIVATED) {
$firebaseUserGroup = $this->userGroupFromFirebase($data['profile_id']);
$userGroupData = $this->combineUserGroupWithFirebase($userGroupData, $firebaseUserGroup);
}
if (!empty($userGroupData)) {
$input["groups"] = $userGroupData;
$input["archived_groups"] = $archivedGroupData;
}
$status = "+000";
$status_desc = "Login in successful.";
unset($userObj['User']['password']);
$input["user"] = $userObj['User'];
}
}
$input["status"] = $status;
$input["status_desc"] = $status_desc;
if (!empty($error) || $status != "+000") {
$input["input"] = $data;
$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);
}
$this->set(array(
'response' => $input,
'_serialize' => array('response')
));
}
// resend varificaton link email
public function resendemail() {
if (isset($this->request->query['p'])) {
$data['profile_id'] = $this->request->query['p'];
$existUser = $this->User->isUserExist($this->request->query['p']);
if (isset($existUser[0]) && !empty($existUser[0])) {
// generate a new token
$device_id = session_id();
$random_number = rand(100000, 999999);
$verificationToken = $this->getResetPasswordToken($device_id, $random_number, $data['profile_id']);
//set the new verification token
$this->User->setVerificationTokenByProfileId($data['profile_id'], $verificationToken);
$userObj = $this->User->getUserByProfileId($data["profile_id"]);
$verificationUrl = HTTP_SITE_URL . '/users/verify?vt=' . $verificationToken . '&p=' . $userObj['User']['profile_id'];
$params = array();
$params["first_name"] = $userObj['User']['first_name'];
$params["profile_id"] = $userObj['User']['profile_id'];
$params["email_to"] = $userObj['User']['profile_id'];
$params["email_from"] = SUPPORT_EMAIL;
$params["subject"] = 'ExpenseCount verification link';
$params["link"] = $verificationUrl;
$params["template"] = 'user_verification';
$params["verification_token"] = $verificationToken;
$this->sendEmail($params);
$status_desc = "Verification email send successfully! Please check your inbox.";
} else {
$status_desc = "User not found!";
}
}
$this->set('status_desc', $status_desc);
}
// forgotpassword API
public function forgotpassword() {
$status = "-1";
$status_desc = "FAILED";
$error = "";
$secretKey = "";
$data = array();
$userObj = NULL;
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
//check maintenance mood
if (MAINTENANCE_MOOD) {
$status = "35";
$status_desc = "Service is in maintenance mood. Please try again later.";
$error = $status;
} else if (empty($data)) {
$status = "31";
$status_desc = "Invalid JSON input sent";
} else {
if ($status == "-1") {
if (!$this->isValidToken($data["access_token"], $data["device_id"], $data["random_number"])) {
$status = "57"; // token is not valid
$status_desc = "TOKEN IS NOT VALID. Please provide access_token, device_id and random_number ";
}
}
if ($status == -1) {
list($status, $status_desc, $userObj) = $this->validateForgotpassForm($data);
}
}
if (empty($status)) {
$user = $this->User->isUserExist($data["profile_id"]);
if (isset($user[0]) && !empty($user[0])) {
$device_id = session_id();
$random_number = rand(100000, 999999);
$resetPassToken = $this->getResetPasswordToken($device_id, $random_number, $data["profile_id"]);
$resetPassTokenExpireDateTime = date('Y-m-d h:i:s', strtotime(USER_RESET_PASSWORD_EXPIRE_WITHIN_TIME, strtotime($this->getSystemCurrentTimeStamp())));
if ($this->User->setPassTokenByProfileId($data["profile_id"], $resetPassToken, $resetPassTokenExpireDateTime)) {
$userObj = $this->User->getUserByProfileId($data["profile_id"]);
if ($userObj['User']['is_verified'] == 0 && !empty($userObj['User']['password'])) {
$status = "-997";
$status_desc = "Email not verified;"; // Or probably signedUp with Gmail/AppleID
} else {
$resetPassUrl = HTTP_SITE_URL . '/users/resetpass/' . $resetPassToken;
if(IS_EMAIL_SEND_DURING_RESET_PASSWORD) {
$params = array();
$params["first_name"] = $userObj['User']['first_name'];
$params["profile_id"] = $userObj['User']['profile_id'];
$params["email_to"] = $userObj['User']['profile_id'];
$params["email_from"] = SUPPORT_EMAIL;
$params["subject"] = 'ExpenseCount Reset Password';
$params["link"] = $resetPassUrl;
$params["template"] = 'reset_password';
$params["token_str"] = $resetPassToken;
$this->sendEmail($params);
}
$status = "+000";
$status_desc = "SUCCESS.";
}
} else {
$status = "-998";
$status_desc = "Password doesn't reset!";
}
} else {
$status = "-996";
$status_desc = "User Not found!";
}
}
unset($userObj['User']['password']);
$input["user"] = $userObj["User"];
$input["status"] = $status;
$input["status_desc"] = $status_desc;
if (!empty($error) || $status != "+000") {
unset($input["user"]);
$input["input"] = $data;
$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);
}
$this->set(array(
'response' => $input,
'_serialize' => array('response')
));
}
// resendVerifyEmail API
public function resendverifyemail() {
$status = "";
$status_desc = "FAILED";
$error = "";
$secretKey = "";
$data = array();
$invalidGroups = array();
$userObj = NULL;
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
//check maintenance mood
if (MAINTENANCE_MOOD) {
$status = "35";
$status_desc = "Service is in maintenance mood. Please try again later.";
$error = $status;
} else if (empty($data)) {
$status = "31";
$status_desc = "Invalid JSON input sent";
} else {
if (!$this->isValidToken($data["access_token"], $data["device_id"], $data["random_number"])) {
$status = "57"; // token is not valid
$status_desc = "TOKEN IS NOT VALID. Please provide access_token, device_id and random_number ";
}
if (empty($status)) {
list($status, $status_desc) = $this->validateResendEmailVerifyForm($data);
}
}
if (empty($status)) {
$existUser = $this->User->isUserExist($data["profile_id"]);
if (isset($existUser[0]) && !empty($existUser[0])) {
// generate a new token
$device_id = session_id();
$random_number = rand(100000, 999999);
$verificationToken = $this->getResetPasswordToken($device_id, $random_number, $data['profile_id']);
//set the new verification token
$this->User->setVerificationTokenByProfileId($data['profile_id'], $verificationToken);
$userObj = $this->User->getUserByProfileId($data["profile_id"]);
$verificationUrl = HTTP_SITE_URL . '/users/verify?vt=' . $verificationToken . '&p=' . $userObj['User']['profile_id'];
$params = array();
$params["first_name"] = $userObj['User']['first_name'];
$params["profile_id"] = $userObj['User']['profile_id'];
$params["email_to"] = $userObj['User']['profile_id'];
$params["email_from"] = SUPPORT_EMAIL;
$params["subject"] = 'ExpenseCount verification link';
$params["link"] = $verificationUrl;
$params["template"] = 'user_verification';
$params["verification_token"] = $verificationToken;
$this->sendEmail($params);
$status = "+000";
$status_desc = "SUCCESS";
} else {
$status = "-996";
$status_desc = "User not found!";
}
}
$input["status"] = $status;
$input["status_desc"] = $status_desc;
if (!empty($error) || $status != "+000") {
$input["input"] = $data;
$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);
}
$this->set(array(
'response' => $input,
'_serialize' => array('response')
));
}
private function validateUserField($data)
{
//check validity
$error = "";
$error_desc = "";
if (empty($error)) {
if ( !array_key_exists('user_id', $data)
) {
$error = "6";
$error_desc = "user_id is required";
}
}
return array($error, $error_desc);
}
private function validateGroupAddField($data)
{
//check validity
$error = "";
$error_desc = "";
if (empty($error)) {
if ( !array_key_exists('user_id', $data)
|| !array_key_exists('unique_url', $data)
) {
$error = "6";
$error_desc = "user_id and unique_url are required";
}
}
return array($error, $error_desc);
}
private function validateGroupDeleteField($data)
{
//check validity
$error = "";
$error_desc = "";
if (empty($error)) {
if ( !array_key_exists('user_id', $data)
|| !array_key_exists('unique_url', $data)
) {
$error = "6";
$error_desc = "user_id and unique_url are required";
}
}
return array($error, $error_desc);
}
private function getUserGroup($user_id){
$userGroupData = array();
$this->loadModel('UserGroup');
$this->loadModel('Expense');
$conditions = array('UserGroup.user_id' => $user_id,'UserGroup.status' => 1);
$fields = array('UserGroup.unique_url','UserGroup.participant_id','Expense.id', 'Expense.title','Expense.create_date');
$userGroups = $this->UserGroup->listWithExpense($fields, $conditions);
$status = "+000";
$status_desc = "SUCCESS.";
return array($status, $status_desc, $userGroups);
}
private function getArchivedUserGroup($user_id){
$userGroupData = array();
$this->loadModel('UserGroup');
$this->loadModel('Expense');
$conditions = array('UserGroup.user_id' => $user_id,'UserGroup.status' => 2);
$fields = array('UserGroup.unique_url','UserGroup.participant_id','Expense.id', 'Expense.title','Expense.create_date');
return $this->UserGroup->listWithExpense($fields, $conditions);
}
// user groups API
public function groups()
{
list($data, $status, $status_desc, $error) = $this->processValidation('GET');
if (empty($status)) {
list($status, $status_desc) = $this->validateUserField($data);
}
if (empty($status)) {
list($status, $status_desc, $userObj) = $this->validateUser($data['user_id']);
}
$input = array();
if (empty($status)) {
list($status, $status_desc, $userGroupData) = $this->getUserGroup($data['user_id']);
if(IS_FIREBASE_ACTIVATED){
if(!isset($data['expense_type'])) {
$data['expense_type'] = '';
}
$firebaseUserGroup = $this->userGroupFromFirebase($userObj['profile_id'], $data['expense_type']);
$userGroupData = $this->combineUserGroupWithFirebase($userGroupData,$firebaseUserGroup);
}
if(!empty($userGroupData)){
$input["data"] = $userGroupData;
}else{
$input["data"] = [];
}
}
$this->processResponse($input, $data, $status, $status_desc);
}
// user groups add API; for array of groups
public function groupsAdd() {
$data = array();
$invalidGroups = array();
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if(!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
}
if (empty($data["user_id"])) {
$status = "-994";
$status_desc = "user_id is required!";
}
$expense_type = '';
if (empty($status)) {
$user = $this->User->getUserByUserId($data["user_id"]);
if (!empty($user)) {
//insert into user_groups
if (isset($data["groups"])) {
$groups = $data["groups"];
$userDd = $user["User"];
$user_id = $userDd["id"];
$groupData = array();
foreach ($groups as $key => $value) {
if (isset($value["unique_url"])) {
$this->loadModel('UserGroup');
$usergroup = $this->UserGroup->isExistUserGroup($user_id, $value["unique_url"]);
if (!$usergroup[0]) { // add only if not exist in database
$groupData[$key]["user_id"] = $user_id;
$groupData[$key]["unique_url"] = $value["unique_url"];
if (isset($value["participant_id"])) {
$groupData[$key]["participant_id"] = $value["participant_id"];
}
}
if (empty($expense_type)) {
$expense_type = substr($value["unique_url"], 0 , 1);
}
} else {
$invalidGroups[$key] = $value;
}
}
if (!empty($groupData)) {
$this->loadModel('UserGroup');
$this->UserGroup->saveMany($groupData);
}
$status = "+000";
$status_desc = "SUCCESS";
// increment the version in firebase
$expense_name = 'GroupExpense';
if ($expense_type == 2) {
$expense_name = "MessExpense";
} elseif ($expense_type == 3) {
$expense_name = "FamilyExpense";
}
$this->userGroupUpdateOnFirebase($user_id, $expense_name);
} else {
$status = "-995";
$status_desc = "Groups data is not provided";
}
} else {
$status = "-996";
$status_desc = "User not exists";
}
}
if (!empty($error) || $status != "+000") {
$input["input"] = $data;
$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);
}
$input["invalid_groups"] = $invalidGroups;
$this->processResponse($input, $data, $status, $status_desc);
}
// user group add API
public function groupadd()
{
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if(!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
}
if (empty($status)) {
list($status, $status_desc) = $this->validateGroupAddField($data);
}
if (empty($status)) {
list($status, $status_desc, $userObj) = $this->validateUser($data['user_id']);
}
// Commenting this code; bcz if group is archieved than adding a group might failed!
// if (empty($status)) {
// $this->loadModel('Expense');
// $isExpExist = $this->Expense->find('first', array(
// 'conditions' => array('Expense.unique_url' => $data['unique_url'])
// ));
// if(empty($isExpExist)){
// $status = "-992";
// $status_desc = "unique_url is not Exist in Expense table.";
// }
// }
$input = array();
if (empty($status)) {
$this->loadModel('UserGroup');
$usergroup = $this->UserGroup->isExistUserGroup($data['user_id'],$data['unique_url']);
if (!$usergroup[0]) {
$param = array();
$param['user_id'] = $data['user_id'];
$param['unique_url'] = $data['unique_url'];
$param['participant_id'] = $data['participant_id'];
$newUserGroup = $this->UserGroup->add($param);
if (!empty($newUserGroup[1])) {
$input["data"] = $newUserGroup[1];
}
$status = "+000";
$status_desc = "SUCCESS.";
// increment the version in firebase
$expense_name = 'GroupExpense';
$expense_type = substr($data["unique_url"], 0 , 1);
if ($expense_type == 2) {
$expense_name = "MessExpense";
} elseif ($expense_type == 3) {
$expense_name = "FamilyExpense";
}
$this->userGroupUpdateOnFirebase($data['user_id'], $expense_name);
} else {
$status = "-992";
$status_desc = "User Group is Exist.";
}
}
$this->processResponse($input, $data, $status, $status_desc);
}
// user group update API
public function groupRestore()
{
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if(!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
}
if (empty($status)) {
list($status, $status_desc) = $this->validateGroupAddField($data);
}
if (empty($status)) {
list($status, $status_desc, $userObj) = $this->validateUser($data['user_id']);
}
$input = array();
if (empty($status)) {
$this->loadModel('UserGroup');
$usergroup = $this->UserGroup->isExistUserGroup($data['user_id'],$data['unique_url']);
if ($usergroup[0]) {
if(!empty($data['participant_id'])) {
$updateFields['participant_id'] = '"' . $data['participant_id'] . '"';
}
if(!empty($data['status'])) {
$updateFields['status'] = $data['status'] ;
}
$updateConditions = array(
'user_id' => $data['user_id'],
'unique_url' => $data['unique_url']
);
if($this->UserGroup->updateUG($updateFields,$updateConditions)){
$status = "+000";
$status_desc = "User Group has been updated successfully";
}
} else {
$status = "-991";
$status_desc = "User Group is not Exist.";
}
}
$this->processResponse($input, $data, $status, $status_desc);
}
// user group delete API
public function groupdelete()
{
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if(!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
if (empty($status)) {
list($status, $status_desc) = $this->validateGroupDeleteField($data);
}
}
if (empty($status)) {
list($status, $status_desc, $userObj) = $this->validateUser($data['user_id']);
}
$input = array();
if (empty($status)) {
$this->loadModel('UserGroup');
$usergroup = $this->UserGroup->isExistUserGroup($data['user_id'],$data['unique_url']);
if ($usergroup[0]) {
$deleteConditions = array(
'user_id' => $data['user_id'],
'unique_url' => $data['unique_url']
);
if($this->UserGroup->deleteUG($deleteConditions)){
$status = "+000";
$status_desc = "User Group has been deleted successfully";
}
// increment the version in firebase
$expense_name = 'GroupExpense';
$expense_type = substr($data["unique_url"], 0 , 1);
if ($expense_type == 2) {
$expense_name = "MessExpense";
} elseif ($expense_type == 3) {
$expense_name = "FamilyExpense";
}
$this->userGroupUpdateOnFirebase($data['user_id'], $expense_name);
} else {
$status = "-991";
$status_desc = "User Group is not Exist.";
}
}
$this->processResponse($input, $data, $status, $status_desc);
}
protected function combineUserGroupWithFirebase($userGroupData,$firebaseUserGroup)
{
$userGroupUniqueUrlArray = array();
$fugArr = array();
if(!empty($userGroupData)){
foreach($userGroupData as $key => $val){
$userGroupUniqueUrlArray[] = $val['unique_url'];
}
}
if(!empty($firebaseUserGroup)){
foreach($firebaseUserGroup as $expTypeKey => $expType){
foreach($expType as $k1 => $item){
if(!in_array($item,$userGroupUniqueUrlArray)){
$tmp['unique_url'] = $item;
$tmp['participant_id'] = '';
$fugArr[] = $tmp;
}
}
}
}
$userGroupData = array_merge($userGroupData,$fugArr);
return $userGroupData;
}
public function prelogin() {
$this->layout = "auth";
}
public function prereset() {
$this->layout = "auth";
}
public function verify() {
if (isset($this->request->query['p'])) {
$profile_id = trim($this->request->query['p']);
$verificationToken = trim($this->request->query['vt']);
$user = $this->User->isUserExistByVerificationToken($profile_id, $verificationToken);
if (isset($user[0]) && !empty($user[0])) {
$this->autoRender = false;
$this->User->resetVerificationTokenByProfileId($profile_id);
$this->Session->write('verification', true);
$this->redirect('/users/login');
}
}
}
function register() {
$postData = array();
$message = '';
$this->Session->write('system.message', $message);
if (isset($this->request->data['singupbtn']) && isset($this->request->data['captcha'])) {
if(isset($_COOKIE['ecc']) && $_COOKIE['ecc'] == $this->request->data['captcha']){
$apiResponse = array();
$this->request->data['profile_type'] = 1; // 1 for email, 2 for Gmail Signin
$data = $this->preparingRegistrationInput($this->request->data);
$apiResponse = $this->callAPI(HTTP_SITE_URL . "/users/signup.json", 'POST', json_encode($data));
$apiResponseArr = json_decode($apiResponse, true);
$profile_id = $data['profile_id'];
if (isset($apiResponseArr['response']['status']) && ($apiResponseArr['response']['status'] == '+000')) {
if (IS_FIREBASE_ACTIVATED) {
$data['email'] = $data['profile_id'];
unset($data['profile_id']);
$postData = $this->registerInFirebase($data);
}
}
if ((isset($apiResponseArr['response']['status']) && ($apiResponseArr['response']['status'] == '+000')) || !empty($postData)) {
// $verificationURL = HTTP_SITE_URL . '/users/verify?p='. $apiResponseArr['response']['user']['User']['profile_id'] . '&vt=' .$apiResponseArr['response']['user']['User']['verification_token'];
$this->redirect('/users/prelogin');
} else {
$message = '' . $apiResponseArr['response']['status_desc'] . '
';
$this->Session->write('system.message', $message);
}
} else {
$message = '' . 'Captcha doesn\'t not match' . '
';
$this->Session->write('system.message', $message);
}
}
}
private function preparingRegistrationInput($requestData) {
$name = explode(' ', $requestData['name']);
$data['first_name'] = (isset($name[0])) ? $name[0] : '';
$data["nick_name"] = (isset($name[0])) ? $name[0] : '';
unset($name[0]);
$data['last_name'] = implode(' ', $name);
$data['profile_id'] = $requestData['email'];
//$data['password'] = md5($requestData['password']);
$data['password'] = $requestData['password'];
$data['action'] = 'register';
$data['profile_type'] = $requestData['profile_type']; //1=email, 2 = facebook_id, 3= phone_number
$data["device_id"] = session_id();
$data["random_number"] = rand(1000, 9999);
$data["access_token"] = $this->getUserToken($data["device_id"], $data["random_number"]);
$data["preferences"] = "1|0|1";
$data["is_verified"] = "0";
return $data;
}
private function preparingLoginInput($requestData) {
$data['profile_id'] = $requestData['email'];
if(isset($requestData['password'])) {
$data['password'] = $requestData['password'];
}
$data['action'] = 'login';
$data['profile_type'] = 1; //1=email, 2 = facebook_id, 3= phone_number
$data["device_id"] = session_id();
$data["random_number"] = rand(1000, 9999);
$data["access_token"] = $this->getUserToken($data["device_id"], $data["random_number"]);
return $data;
}
private function userGroupFromFirebase($email,$expense_type = '') {
/*
* expensecount-312c7/root/{env}/users/{userId}/{url}/rs/{status}
* env: prod, dev
* userId: firebase user id
* ulr: groups unique url
* status: 0 = deleted, 1 = active
* you don't need to returns the deleted items
*/
switch ($expense_type){
case 1:
$expenseType = 'ge';
break;
case 2:
$expenseType = 'me';
break;
case 3:
$expenseType = 'fe';
break;
default:
$expenseType = '';
}
$this->initializeFirebase();
$database = $this->firebase->getDatabase();
$user = $this->firebase->getAuth()->getUserByEmail($email);
$newPost = $database->getReference(FIREBASE_DB_PATH);
$current_row = $newPost->getChild('users/'.$user->uid);
$current_ver = $current_row->getValue();
$newGroup = array();
if ($expenseType != '') {
if( !empty($current_ver[$expenseType]) ) {
foreach($current_ver[$expenseType] as $k => $item){
if( isset($item['rs']) && ($item['rs']==1) ) {
$newGroup[$expenseType][] = $k;
}
}
}
} else {
foreach($current_ver as $expTypeKey => $expType){
foreach($expType as $k1 => $item){
if( isset($item['rs']) && ($item['rs']==1) ) {
$newGroup[$expTypeKey][] = $k1;
}
}
}
}
return $newGroup;
}
private function registerInFirebase($requestData) {
$this->initializeFirebase();
return $this->firebase->getAuth()->createUserWithEmailAndPassword($requestData['email'], $requestData['password']);
}
public function loginInFirebase($data) {
$this->initializeFirebase();
return $this->firebase->getAuth()->verifyPassword($data['email'], $data['password']);
}
public function login() {
$this->layout = "auth";
$message = '';
$userData = array();
$this->Session->write('system.message', '');
if (isset($this->request->data['singinbtn']) || (!isset($this->request->data['password']) && isset($this->request->data['email']))) {
$data = $this->preparingLoginInput($this->request->data);
if(!isset($this->request->data['password'])) {
$this->autoRender = false;
}
$apiResponse = $this->callAPI(HTTP_SITE_URL . "/users/signin.json", 'POST', json_encode($data));
$apiResponseArr = json_decode($apiResponse, true);
if (isset($apiResponseArr['response']['status']) && ($apiResponseArr['response']['status'] == '+000')) {
$this->Cookie->delete('Expenses'); // clear the cookie before setting a new one if it already exists
if(isset($this->request->data['remme']) && ($this->request->data['remme'] == 'on') ) {
$cookie_name = "ecc_auto_login";
$cookie_value = $this->request->data['email'];
setcookie($cookie_name, $cookie_value, strtotime(REMEMBER_ME_EXPIRE_WITHIN_TIME), "/");
}
$this->Session->write('userData', $apiResponseArr['response']['user']);
$message = '' . $apiResponseArr['response']['status_desc'] . '
';
$this->Session->write('system.message', $message);
$this->Session->write('system.is_now_login', true);
if(isset($this->request->data['password'])) {
$this->redirect('/pages/myExpenses');
} else {
return true;
}
} else {
if (IS_FIREBASE_ACTIVATED) {
$data['email'] = $data['profile_id'];
unset($data['profile_id']);
$userData = $this->loginInFirebase($data);
$userData->id = $userData->uid;
}
if (!empty($userData)) {
if(isset($this->request->data['remme']) && ($this->request->data['remme'] == 'on') ) {
$cookie_name = "ecc_auto_login";
$cookie_value = $this->request->data['email'];
setcookie($cookie_name, $cookie_value, strtotime(REMEMBER_ME_EXPIRE_WITHIN_TIME), "/");
}
$this->Session->write('userData', $this->objectToArray($userData));
$message = '' . 'Login is Successful' . '
';
$this->Session->write('system.message', $message);
$this->Session->write('system.is_now_login', true);
$this->redirect('/pages/myExpenses');
} else {
$message = '' . __("LBL_INCORRECT_EMAIL") . '
';
$this->Session->write('system.message', $message);
if(!isset($this->request->data['password'])) {
return $message;
}
}
}
} else {
if(isset($_COOKIE['ecc_auto_login'])){
$profile_id = $_COOKIE['ecc_auto_login'];
$userObj = $this->User->isUserExist($profile_id);
if($userObj[0]){
$this->Session->write('userData', $userObj[1]['User']);
$this->redirect('/pages/myExpenses');
}
}
$this->set('verification',$this->Session->read('verification'));
$this->Session->write('verification',false);
}
}
public function logout() {
$message = '';
$this->autoRender = true;
$this->Session->write('system.message', '');
$session_user_id = ($this->Session->read('userData.id')) ? $this->Session->read('userData.id') : 0;
if ($session_user_id != '') {
$this->Cookie->delete('Expenses');
setcookie("ecc_auto_login", "", (time() - 3600), "/");
$this->Session->delete('userData');
$message = '' . __("LBL_LOGOUT_MESSAGE") . '
';
$this->Session->write('system.message', $message);
$this->Session->write('system.is_now_login', false);
$this->redirect('/users/login');
}
}
private function preparingForgotpassInput($requestData) {
$data['profile_id'] = trim($requestData['email']);
$data['action'] = 'forgotpass';
$data['profile_type'] = 1; //0=email, 1=gmail, 2=facebook, 3=phone
$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 forgotpass() {
$this->layout = "auth";
$message = '';
$this->Session->write('system.message', $message);
if (isset($this->request->data['forgotpassbtn'])) {
$apiResponse = array();
$data = $this->preparingForgotpassInput($this->request->data);
$apiResponse = $this->callAPI(HTTP_SITE_URL . "/users/forgotpassword.json", 'POST', json_encode($data));
$apiResponseArr = json_decode($apiResponse, true);
if (isset($apiResponseArr['response']['status']) && ($apiResponseArr['response']['status'] == '+000')) {
// $resetPassURL = HTTP_SITE_URL . '/users/resetpass/' . $apiResponseArr['response']['user']['User']['resetPassToken'];
$this->redirect('/users/prereset');
} else {
$message = '' . $apiResponseArr['response']['status_desc'] . '
';
$this->Session->write('system.message', $message);
}
}
}
public function resetpass($resetPassToken) {
$this->layout = "auth";
$user = $this->User->isUserExistByResetPassToken($resetPassToken);
$this->set(compact('resetPassToken'));
$this->Session->write('system.message', '');
if (isset($user[0]) && !empty($user[0])) {
if (isset($this->request->data['resetpassbtn'])) {
$password = trim($this->request->data['password']);
$confirm_password = trim($this->request->data['confirm_password']);
if ($password == $confirm_password) {
$profile_id = $user[1]['User']['profile_id'];
$resetpass_token_expire_date = $user[1]['User']['resetpass_token_expire_date'];
// $this->getSystemCurrentTimeStamp();
if ($this->getSystemCurrentTimeStamp() < $resetpass_token_expire_date) {
if ($this->User->setPasswordByProfileId($profile_id, md5($password))) {
$this->User->resetPassTokenByProfileId($profile_id);
$message = '' . 'Password has changed' . '
';
$this->Session->write('system.message', $message);
$this->redirect('/users/login');
}
}
} else {
$message = '' . 'Your Password doesn\'t match' . '
';
$this->Session->write('system.message', $message);
$this->redirect($this->referer());
}
}
} else {
$message = '' . 'Your Token is wrong' . '
';
$this->Session->write('system.message', $message);
$this->redirect($this->referer());
}
}
public function assignGroup() {
}
public function unAssignGroup() {
}
public function subscribe() {
}
// action should be "login" , "register", "social_media"
private function validateRegisterForm($data) {
//check validity
$error = "";
$error_desc = "";
$action = "";
$userObj = NULL;
if (empty($data)) {
$error = "005";
$error_desc = "input data array is empty";
}
//Check action field
if (empty($error) && isset($data["action"])) {
$action = $data["action"];
} else {
$error = "061";
$error_desc = "action field is required as parameter";
}
if ($action == "login") {
if (empty($error)) {
if (!array_key_exists('profile_type', $data)
|| !array_key_exists('profile_id', $data)
|| !array_key_exists('password', $data)
|| !array_key_exists('access_token', $data)
|| !array_key_exists('device_id', $data)
|| !array_key_exists('random_number', $data)
) {
$error = "6";
$error_desc = "missing some data!";
}
}
} else if ($action == "register") {
if (empty($error)) {
if (!array_key_exists('profile_type', $data)
|| !array_key_exists('profile_id', $data)
|| !array_key_exists('access_token', $data)
|| !array_key_exists('device_id', $data)
|| !array_key_exists('random_number', $data)
) {
$error = "6";
$error_desc = "profile_type, profile_id, access_token, device_id, random_number and preferences are required";
}
if (isset($data["password"]) && !array_key_exists('password', $data)) {
$error = "6";
$error_desc = "password is required";
}
}
} else if ($action == "social_media") {
if (empty($error)) {
if (!array_key_exists('profile_id', $data)
|| !array_key_exists('access_token', $data)
|| !array_key_exists('device_id', $data)
|| !array_key_exists('random_number', $data)
|| !array_key_exists('preferences', $data)
) {
$error = "6";
$error_desc = "profile_type,profile_id,access_token,device_id,random_number and preferences are required";
}
}
if (empty($error)) {
list($is_user_exist, $userObj) = $this->User->isUserExist($data["profile_id"]);
if ($is_user_exist) {
$error = "60";
$error_desc = "User Already Exist";
} else {
//Insert User Record
$form["first_name"] = "";
$form["last_name"] = "";
$form["profile_type"] = trim($data["profile_type"]);
;
$form["profile_id"] = trim($data["profile_id"]);
$form["preferences"] = trim($data["preferences"]);
$form["is_verified"] = 1;
$form["nick_name"] = "";
$crash["ip"] = $this->getClientIp();
$crash["device_info"] = $this->getUserAgent();
$form["create_date"] = $this->getSystemCurrentTimeStamp();
$form["update_date"] = $this->getSystemCurrentTimeStamp();
}
}
}
if (empty($error)) {
if (($action != "login") && ($action != "register") &&
(mb_strlen(trim($data["first_name"]), 'UTF-8') < 1 || mb_strlen(trim($data["first_name"]), 'UTF-8') > 30 ||
mb_strlen(trim($data["last_name"]), 'UTF-8') < 1 || mb_strlen(trim($data["last_name"]), 'UTF-8') > 30 )) {
$error = "7";
} else if (mb_strlen(trim($data["profile_type"]), 'UTF-8') != 1) {
$error = "7";
} else if (isset($data["password"]) && mb_strlen(trim($data["password"]), 'UTF-8') < 4) {
$error = "7";
}
}
return array($error, $error_desc, $userObj);
}
// action should be "forgotpass"
private function validateForgotpassForm($data) {
//check validity
$error = "";
$error_desc = "";
$action = "";
$userObj = NULL;
if (empty($data)) {
$error = "5";
}
//Check action field
if (empty($error) && isset($data["action"])) {
$action = $data["action"];
} else {
$error = "61";
$error_desc = "action field is required as parameter";
}
if ($action == "forgotpass") {
}
if (empty($error)) {
if (mb_strlen(trim($data["profile_type"]), 'UTF-8') != 1) {
$error = "7";
$error_desc = "profile type is not valid";
}
}
return array($error, $error_desc, $userObj);
}
private function validateResendEmailVerifyForm($data) {
$error = "";
$error_desc = "";
if (!isset($data['profile_id'])) {
$error = "8";
$error_desc = "profile_id is not valid!";
}
if (!filter_var($data['profile_id'], FILTER_VALIDATE_EMAIL)) {
$error = "9";
$error_desc = "profile_id is not valid!";
}
if (mb_strlen(trim($data["profile_type"]), 'UTF-8') != 1) {
$error = "7";
$error_desc = "profile type is not valid!";
}
return array($error, $error_desc);
}
private function decryptPassword($encryptedPass) {
$password = "";
return $password;
}
private function sendEmail($data) {
// $data = array();
// $data["email_from"] = $params['email_from'];
// $data["email_to"] = $params['email_to'];
// $data["template"] = $params['template'];
// $data["subject"] = $params['subject'];
// $data["profile_id"] = $params['profile_id'];
// $data["link"] = $params['link'];
$default = array(
'host' => Configure::read('expensecount.email.smtp.host'),
'port' => 587,
'auth' => 'plain',
'username' => Configure::read('expensecount.email.smtp.username'),
'password' => Configure::read('expensecount.email.smtp.password'),
'tsl' => false,
'transport' => 'Smtp',
'from' => array(Configure::read('expensecount.email.smtp.from') => 'ExpenseCount'),
'returnPath' => Configure::read('expensecount.email.smtp.from'),
'layout' => false,
'emailFormat' => 'html',
//'template' => 'only_text',
'charset' => 'utf-8',
'headerCharset' => 'utf-8',
);
App::uses('CakeEmail', 'Network/Email');
//echo $Email->
$Email = new CakeEmail($default);
$Email->to(array($data["email_to"]));
$Email->emailFormat('html');
$Email->template($data["template"], null)->viewVars(array('data' => $data));
$Email->subject($data["subject"]);
$Email->replyTo($data["email_from"]);
$Email->replyTo($data["email_from"]);
$Email->from(array(Configure::read('expensecount.email.smtp.from') => "ExpenseCount.com"));
// $Email->smtpOptions = $default;
$Email->delivery = 'Smtp';
$Email->send();
}
public function googlesignin()
{
$this->autoRender = false;
$result = 'fail';
if($this->request->is('ajax')){
$this->request->data['profile_type'] = 2; // 1 for email, 2 for Gmail Signin
$this->request->data['password'] = $this->request->data['profileId'];
$data = $this->preparingRegistrationInput($this->request->data);
$data["ip"] = $this->getClientIp();
$data["device_info"] = $this->getUserAgent();
$data["create_date"] = $this->getSystemCurrentTimeStamp();
$data["update_date"] = $this->getSystemCurrentTimeStamp();
$existUser = $this->User->isUserExistByProfile($data["profile_id"], $data["profile_type"]);
if (isset($existUser[0]) && empty($existUser[0])) {
if ($this->User->insertUser($data)) {
$result = 'success';
$this->User->setVerificationTokenByProfileId($data['profile_id'], $this->request->data['id_token']);
$data['verification_token'] = $this->request->data['id_token'];
$this->Session->write('userData', $data);
}
} elseif(($existUser[0] == true) && is_array($existUser[1])) {
$this->Session->write('userData', $existUser[1]);
$result = 'success';
}
}
echo json_encode($result);
}
function captcha33($rand){
$this->autoRender = false;
// session_start();
//You can customize your captcha settings here
$captcha_code = '';
$captcha_image_height = 50;
$captcha_image_width = 120;
$total_characters_on_image = 4;
//The characters that can be used in the CAPTCHA code.
//avoid all confusing characters and numbers (For example: l, 1 and i)
$possible_captcha_letters = 'bcdfghjkmnpqrstvwxyz23456789';
$captcha_font = 'E:\SERVER\xampp_7.0.22\htdocs\test\expensecountv2\app\webroot\arial.ttf';//'monofont.ttf';./arial.ttf
$random_captcha_dots = 50;
$random_captcha_lines = 25;
$captcha_text_color = "0x142864";
$captcha_noise_color = "0x142864";
$count = 0;
while ($count < $total_characters_on_image) {
$captcha_code .= substr(
$possible_captcha_letters,
mt_rand(0, strlen($possible_captcha_letters)-1),
1);
$count++;
}
$captcha_font_size = $captcha_image_height * 0.65;
$captcha_image = @imagecreate(
$captcha_image_width,
$captcha_image_height
);
/* setting the background, text and noise colours here */
$background_color = imagecolorallocate(
$captcha_image,
255,
155,
255
);
$array_text_color = $this->hextorgb($captcha_text_color);
$captcha_text_color = imagecolorallocate(
$captcha_image,
$array_text_color['red'],
$array_text_color['green'],
$array_text_color['blue']
);
$array_noise_color = $this->hextorgb($captcha_noise_color);
$image_noise_color = imagecolorallocate(
$captcha_image,
$array_noise_color['red'],
$array_noise_color['green'],
$array_noise_color['blue']
);
/* Generate random dots in background of the captcha image */
for( $count=0; $count<$random_captcha_dots; $count++ ) {
imagefilledellipse(
$captcha_image,
mt_rand(0,$captcha_image_width),
mt_rand(0,$captcha_image_height),
2,
3,
$image_noise_color
);
}
/* Generate random lines in background of the captcha image */
for( $count=0; $count<$random_captcha_lines; $count++ ) {
imageline(
$captcha_image,
mt_rand(0,$captcha_image_width),
mt_rand(0,$captcha_image_height),
mt_rand(0,$captcha_image_width),
mt_rand(0,$captcha_image_height),
$image_noise_color
);
}
/* Create a text box and add 6 captcha letters code in it */
$text_box = imagettfbbox(
$captcha_font_size,
0,
$captcha_font,
$captcha_code
);
$x = ($captcha_image_width - $text_box[4])/2;
$y = ($captcha_image_height - $text_box[5])/2;
imagettftext(
$captcha_image,
$captcha_font_size,
0,
$x,
$y,
$captcha_text_color,
$captcha_font,
$captcha_code
);
/* Show captcha image in the html page */
// defining the image type to be shown in browser widow
header('Content-Type: image/jpeg');
imagejpeg($captcha_image); //showing the image
imagedestroy($captcha_image); //destroying the image instance
// $_SESSION['captcha'] = $captcha_code;
$this->Session->write('captcha',$captcha_code);
}
function hextorgb33 ($hexstring){
$integar = hexdec($hexstring);
return array("red" => 0xFF & ($integar >> 0x10),
"green" => 0xFF & ($integar >> 0x8),
"blue" => 0xFF & $integar);
}
// user delete API
public function delete()
{
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if(!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
}
if (empty($status)) {
list($status, $status_desc, $userObj) = $this->validateUser($data['user_id']);
}
$input = array();
if (empty($status)) {
$this->loadModel('User');
$this->loadModel('UserGroup');
$this->loadModel('PermissionTable');
$this->loadModel('PushToken');
if($this->User->delete($data['user_id'])){
$status = "+000";
$status_desc = "Profile has been deleted successfully";
$deleteConditions = array(
'user_id' => $data['user_id']
);
$isUsergroupExist = $this->UserGroup->find('count', array(
'conditions' => $deleteConditions
));
if ($isUsergroupExist) {
$this->UserGroup->deleteUG($deleteConditions);
}
$isPermissionExist = $this->PermissionTable->find('count', $deleteConditions);
if ($isPermissionExist) {
$this->PermissionTable->deleteByCondition($deleteConditions);
}
$isPushTokenExist = $this->PushToken->find('count', $deleteConditions);
if ($isPushTokenExist) {
$this->PushToken->deleteByCondition($deleteConditions);
}
}
}
$this->processResponse($input, $data, $status, $status_desc);
}
//signle method for select/add/delete groups
public function groupsOperation()
{
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
$status = '';
$status_desc = '';
$error = null;
$input = [];
$doFirebaseVersionIncrement = false;
/* ---------- PROCESS VALIDATION ---------- */
if (!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
}
/* ---------- USER VALIDATION ---------- */
if (empty($status)) {
list($err, $err_desc, $user) = $this->validateUser($data['user_id']);
if (!empty($err)) {
$status = $err;
$status_desc = $err_desc;
}
}
if (!isset($data["expense_type"])) {
$status = "-1";
$status_desc = "expense_type not provided!";
}
$user = $this->User->getUserByUserId($data["user_id"]);
if (empty($user) && empty($user['User'])) {
$status = "-1";
$status_desc = "User not found!";
}
$this->loadModel('UserGroup');
//add user groups
if (empty($status)) {
$user = $this->User->getUserByUserId($data["user_id"]);
if (!empty($user)) {
//insert into user_groups
if (isset($data["AddGroups"])) {
$groups = $data["AddGroups"];
$userDd = $user["User"];
$user_id = $userDd["id"];
$groupData = array();
foreach ($groups as $key => $value) {
if ($value) {
$this->loadModel('UserGroup');
$usergroup = $this->UserGroup->isExistUserGroup($user_id, $value);
if (!$usergroup[0]) { // add only if not exist in database
$groupData[$key]["user_id"] = $user_id;
$groupData[$key]["unique_url"] = $value;
}
}
}
if (!empty($groupData)) {
$this->loadModel('UserGroup');
$this->UserGroup->saveMany($groupData);
$doFirebaseVersionIncrement = true;
}
}
}
}
//delete user groups
if (empty($status)) {
if (!empty($data["DeleteGroups"])) {
foreach ($data["DeleteGroups"] as $key => $value) {
$deleteConditions = array(
'user_id' => $user['User']['id'],
'unique_url' => $value
);
$this->UserGroup->deleteUG($deleteConditions);
$doFirebaseVersionIncrement = true;
}
}
}
//archive user groups
if (empty($status)) {
if (!empty($data["ArchiveGroups"])) {
foreach ($data["ArchiveGroups"] as $key => $value) {
$updateFields['status'] = $this->group_status['Archived'];
$updateConditions = array(
'user_id' => $user['User']['id'],
'unique_url' => $value
);
if ($this->UserGroup->updateUG($updateFields, $updateConditions)) {
$doFirebaseVersionIncrement = true;
}
}
}
}
//select groups
if (empty($status)) {
$this->loadModel('UserGroup');
$this->loadModel('Expense');
$conditions = array('UserGroup.user_id' => $user['User']['id'],
'UserGroup.status' => $this->group_status['Active'],
'Expense.expense_type'=>$data['expense_type']
);
$fields = array('UserGroup.unique_url','UserGroup.participant_id','Expense.id', 'Expense.title','Expense.create_date');
$status = "+000";
$status_desc = "SUCCESS";
$input["groups"] = $this->UserGroup->groupListWithExpense($fields, $conditions);
$conditions = array('UserGroup.user_id' => $user['User']['id'],
'UserGroup.status' => $this->group_status['Archived'],
'Expense.expense_type'=>$data['expense_type']
);
$input["archivedGroups"] = $this->UserGroup->listWithExpense($fields, $conditions);
// increment the version in firebase
if($doFirebaseVersionIncrement) {
$expense_name = '';
$expense_type = $data["expense_type"];
if($expense_type == 1) {
$expense_name = "GroupExpense";
} elseif ($expense_type == 2) {
$expense_name = "MessExpense";
} elseif ($expense_type == 3) {
$expense_name = "FamilyExpense";
}
$this->userGroupUpdateOnFirebase($user_id, $expense_name);
}
$this->set(array(
'response' => $input,
'_serialize' => array('response')
));
}
$this->processResponseForGroups($input, $data, $status, $status_desc);
}
public function processResponseForGroups($responseData, $requestData, $status, $status_desc, $error = null)
{
$response = [
'status' => $status,
'status_desc' => $status_desc
];
// Always attach response payload (groups)
if (!empty($responseData)) {
$response = array_merge($response, $responseData);
}
// Failure → attach request input
if ($status !== "+000") {
$response['input'] = $requestData;
$response['error'] = $error;
$this->apiLogAppCrashData($requestData, $status, $status_desc);
}
$this->set([
'response' => $response,
'_serialize' => ['response']
]);
}
// get categories API
public function getCategories()
{
list($data, $status, $status_desc, $error) = $this->processValidation('GET');
if (empty($status)) {
list($status, $status_desc) = $this->validateUserField($data);
}
if (empty($status)) {
list($status, $status_desc, $userObj) = $this->validateUser($data['user_id']);
}
if (empty($status)) {
if(!$this->isPaid($data['user_id'])){
$status = '-992';
$status_desc = 'This feature is only for paid user!';
}
}
$input = array();
if (empty($status)) {
list($status, $status_desc, $CategoryData) = $this->getUserCategories($data['unique_url']);
if(!empty($CategoryData)){
foreach ($CategoryData as $CatData){
$returnData[] = $CatData['Category'];
}
$input["categories"] = $returnData;
}else{
$input["categories"] = [];
}
}
$this->processResponse($input, $data, $status, $status_desc);
}
private function getUserCategories($unique_url){
$CategoryData = array();
$this->loadModel('Category');
$conditions = array('Category.unique_url' => $unique_url);
$fields = array('Category.id','Category.name','Category.icon_id','Category.version');
$CategoryData = $this->Category->find('all', array(
'fields' => $fields,
'conditions' => $conditions
));
$status = "+000";
$status_desc = "SUCCESS.";
return array($status, $status_desc, $CategoryData);
}
private function validateCategoryAddField($data)
{
//check validity
$error = "";
$error_desc = "";
if (empty($error)) {
if ( !array_key_exists('name', $data['Categories'])
|| !array_key_exists('icon_id', $data['Categories'])
//|| !array_key_exists('participant_id', $data)
) {
$error = "6";
$error_desc = "name and icon_id are required";
}
}
return array($error, $error_desc);
}
public function addCategories()
{
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if(!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
}
if (empty($status)) {
list($status, $status_desc) = $this->validateCategoryAddField($data);
}
if (empty($status)) {
list($status, $status_desc, $userObj) = $this->validateUser($data['user_id']);
}
if (empty($status)) {
if(!$this->isPaid($data['user_id'])){
$status = '-992';
$status_desc = 'This feature is only for paid user!';
}
}
if(!preg_match('/^[a-z0-9 .\_]+$/i', $data['Categories']['name'])){
$status = '-6';
$status_desc = 'Allow only letters(Unicode), digits, dot (.), space, underscore(_).';
}
$input = array();
if (empty($status)) {
$this->loadModel('Category');
$isExist = $this->Category->findByNameAndUniqueUrl($data['Categories']['name'],$data['unique_url']);
if (!$isExist) {
$param = array();
$param['name'] = $data['Categories']['name'];
$param['unique_url'] = $data['unique_url'];
$param['icon_id'] = $data['Categories']['icon_id'];
$param['version'] = 1;
$category = $this->Category->save($param);
if (!empty($category)) {
list($status, $status_desc, $CategoryData) = $this->getUserCategories($data['unique_url']);
if (!empty($CategoryData)) {
foreach ($CategoryData as $CatData) {
$returnData[] = $CatData['Category'];
}
$input["categories"] = $returnData;
} else {
$input["categories"] = [];
}
}
// $status = "+000";
// $status_desc = "SUCCESS.";
} else {
$status = "-992";
$status_desc = "Category is Exist.";
}
}
$this->processResponse($input, $data, $status, $status_desc);
}
public function updateCategories()
{
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if(!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
}
if (empty($status)) {
list($status, $status_desc) = $this->validateCategoryAddField($data);
}
if (empty($status)) {
list($status, $status_desc, $userObj) = $this->validateUser($data['user_id']);
}
if (empty($status)) {
if(!$this->isPaid($data['user_id'])){
$status = '-992';
$status_desc = 'This feature is only for paid user!';
}
}
if(!preg_match('/^[a-z0-9 .\_]+$/i', $data['Categories']['name'])){
$status = '-6';
$status_desc = 'Allow only letters(Unicode), digits, dot (.), space, underscore(_).';
}
$input = array();
if (empty($status)) {
$this->loadModel('Category');
$isExist = $this->Category->findByIdAndUniqueUrl($data['Categories']['id'],$data['unique_url']);
if($data['Categories']['version'] < $isExist['Category']['version']){
$status = '-992';
$status_desc = 'conflicts';
}
if ($data['Categories']['name'] != $isExist['Category']['name']) {
$isUnique = $this->Category->findByNameAndUniqueUrl($data['Categories']['name'], $data['unique_url']);
if ($isUnique) {
$status = '-992';
$status_desc = 'Already exist!';
}
}
if ($isExist && empty($status) && !$isUnique) {
$param = array();
$param['name'] = $data['Categories']['name'];
$param['id'] = $data['Categories']['id'];
$param['unique_url'] = $data['unique_url'];
$param['icon_id'] = $data['Categories']['icon_id'];
$param['version'] = $data['Categories']['version']+1;
$category = $this->Category->save($param);
if (!empty($category)) {
list($status, $status_desc, $CategoryData) = $this->getUserCategories($data['unique_url']);
if (!empty($CategoryData)) {
foreach ($CategoryData as $CatData) {
$returnData[] = $CatData['Category'];
}
$input["categories"] = $returnData;
} else {
$input["categories"] = [];
}
}
// $status = "+000";
// $status_desc = "SUCCESS.";
} else {
if(empty($status)){
$status = "-992";
$status_desc = "Category is not Exist.";
}
}
}
$this->processResponse($input, $data, $status, $status_desc);
}
// user Category delete API
public function deleteCategories()
{
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if(!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
}
if (empty($status)) {
list($status, $status_desc, $userObj) = $this->validateUser($data['user_id']);
}
if (empty($status)) {
if(!$this->isPaid($data['user_id'])){
$status = '-992';
$status_desc = 'This feature is only for paid user!';
}
}
$input = array();
if (empty($status)) {
$this->loadModel('Category');
$isExist = $this->Category->findById($data['category_id']);
if ($isExist) {
if($this->Category->delete($data['category_id'])){
$status = "+000";
$status_desc = "SUCCESS";
}
} else {
$status = "-991";
$status_desc = "Category is not Exist.";
}
}
$this->processResponse($input, $data, $status, $status_desc);
}
private function is_base64_encoded($str) {
$decoded_str = base64_decode($str);
$Str1 = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $decoded_str);
if ($Str1!=$decoded_str || $Str1 == '') {
return false;
}
return true;
}
public function register_push_token()
{
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if (!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
}
if (!empty($data) && empty($status)) {
list($status, $status_desc, $error) = $this->pushTokenRequestValidate($data);
}
$response = array();
if (empty($status)) {
$this->loadModel('User');
$user = $this->User->getUserByUserId($data['user_id']);
if(!empty($user['User'])) {
$status = "+000";
$status_desc = 'Token not found.';
$this->loadModel('PushToken');
$activeToken = $this->PushToken->checkActiveToken($data['user_id'],$data['device_id'],$data['platform']);
if (!empty($activeToken['PushToken'])){
$status_desc = 'Fetch Token successfully!';
}
if(!empty($data['push_token']) && array_key_exists('status', $object)) {
try {
if (!empty($activeToken['PushToken'])) {
// Token exists – update it
if ($data['status'] == 0) {
$this->PushToken->delete($activeToken['PushToken']['id']);
$status_desc = "Push Token Deleted Successfully";
} else {
$this->PushToken->save(array(
'id' => $activeToken['PushToken']['id'],
'user_id' => $activeToken['PushToken']['user_id'],
'device_id' => $activeToken['PushToken']['device_id'],
'push_token' => $data['push_token'],
'is_active' => $data['status']
));
$status_desc = "Push Token Updated Successfully";
}
} else if (empty($activeToken['PushToken']) && $data['status'] == 1) {
// Token does not exist – insert new
$this->PushToken->save(array(
'user_id' => $data['user_id'],
'device_id' => $data['device_id'],
'platform' => $data['platform'],
'push_token' => $data['push_token'],
'is_active' => 1
));
$status_desc = "Push Token Registered Successfully";
}
$status = "+000";
$activeToken = $this->PushToken->checkActiveToken($data['user_id'],$data['device_id'],$data['platform']);
} catch (Exception $e) {
$status_desc = $e->getMessage();
$status = "-99";
}
}
}else{
$status = '12';
$status_desc = 'User not found!';
}
}
if ($status != "+000") {
$this->processResponse($input, $data, $status, $status_desc);
} else {
$response["status"] = $status;
$response["status_desc"] = $status_desc;
$response["api_version"] = 3;
$response["data"] = null;
if (!empty($activeToken['PushToken'])) {
$response["data"] = $activeToken['PushToken'];
}
$this->set(array(
'response' => $response,
'_serialize' => array('response')
));
}
}
public function pushTokenRequestValidate($object)
{
//check validity
$error = "";
$error_desc = "";
$expObj = array();
$statues = array(0,1);
if (empty($object['user_id']) && !is_numeric($object['user_id'])) {
$error = $this->validation_status;
$error_desc = "user_id must be provided and numeric!";
$expObj['user_id'] = $error_desc;
}
if (empty($object['device_id'])) {
$error = $this->validation_status;
$error_desc = "device_id must be provided!";
$expObj['device_id'] = $error_desc;
}
if (!isset($object['platform'])) {
$error = $this->validation_status;
$error_desc = "platform must be provided!";
$expObj['platform'] = $error_desc;
}
if (array_key_exists('push_token', $object) && trim($object['push_token']) === '') {
$error = $this->validation_status;
$error_desc = "push_token must be provided!";
$expObj['push_token'] = $error_desc;
}
if (array_key_exists('status', $object) && !in_array($object['status'], $statues)) {
$error = $this->validation_status;
$error_desc = "status must be 0 or 1!";;
$expObj['status'] = $error_desc;
}
return array($error, $error_desc, $expObj);
}
public function sendNotification(){
$object = $this->request->input('json_decode');
if (!empty($object)) {
$data = $this->objectToArray($object);
}
if (!isset($data['skip_process_validation'])) {
list($data, $status, $status_desc, $error) = $this->processValidation();
}
if (!empty($data) && empty($status)) {
list($status, $status_desc, $error) = $this->notificationRequestValidate($data);
}
$tokens = array();
$this->loadModel('PushToken');
if(!empty($data['user_id'])){
$filter = array('status' => 1,'user_id' => $data['user_id']);
$db_token = $this->PushToken->getToken($filter);
if(!empty($db_token)) {
foreach ($db_token as $token) {
$tokens[] = ['user_id'=>$token['PushToken']['user_id'],
'device_id'=>$token['PushToken']['device_id'],
'token'=> $token['PushToken']['push_token']];
}
}
if(!empty($tokens)) {
$request_data = $data['data'];
$response = $this->Notification->sendPushNotification($tokens,$request_data);
}else{
$response["status"] = "-99";
$response["status_desc"] = "Push Token Not Found!";
$response["input"] = $data;
}
}else{
$response["status"] = $status;
$response["status_desc"] = $status_desc;
$response["input"] = $data;
}
$this->set(array(
'response' => $response,
'_serialize' => array('response')
));
}
public function notificationRequestValidate($object)
{
//check validity
$error = "";
$error_desc = "";
$expObj = array();
if (empty($object['title'])) {
$error = $this->validation_status;
$error_desc = "title must be provided!";
$expObj['title'] = $error_desc;
}
if (empty($object['body'])) {
$error = $this->validation_status;
$error_desc = "message must be provided!";
$expObj['body'] = $error_desc;
}
if (array_key_exists('user_id', $object) && empty($object['user_id'])) {
$error = $this->validation_status;
$error_desc = "user_id must be provided!";
$expObj['user_id'] = $error_desc;
}
return array($error, $error_desc, $expObj);
}
}