diff --git a/api/api_functions.php b/api/api_functions.php index 7deb3c2..d7a8777 100644 --- a/api/api_functions.php +++ b/api/api_functions.php @@ -15,7 +15,6 @@ if( !function_exists('set_response_code') ) { } } - function return_json_response($data, $response_code=200) { if($response_code != 200) { set_response_code($response_code); @@ -46,7 +45,6 @@ function get_db_connection($fetch_mode=NULL, $options=NULL) { return $conn; } - if( !function_exists('clean_phonenumber') ) { function clean_phonenumber($pn) { $pn = preg_replace('/[^0-9\+]/', '', $pn); // remove everything except valid chars @@ -64,7 +62,6 @@ if( !function_exists('clean_phonenumber') ) { } } - if( !function_exists('valid_phonenumber') ) { // E.164 function valid_phonenumber($phone) { @@ -72,8 +69,6 @@ if( !function_exists('valid_phonenumber') ) { } } - - function _get_cards($value) { $u_cs = array(); $u_cards = explode(",", $value); @@ -151,6 +146,37 @@ function get_user_data($ids) { return $results; } +function get_card($card_number) { + $conn = get_db_connection(DB_FETCHMODE_ASSOC); + + $card_number = $conn->quoteSmart($card_number); + $sql = "SELECT * FROM din_card WHERE card_number=$card_number"; + + $res = $conn->getAll($sql); + + if( DB::isError($res) ) { + new Exception($res->getMessage()); + } + if( count($res) === 1) { + return $res[0]; + } + + return NULL; +} + +function update_card_with_phone_number($card_number, $phone_number) { + /* Set card active and add phone number, phone number should not exist */ + $conn = get_db_connection(DB_FETCHMODE_ORDERED); + + $card_number = $conn->quoteSmart($card_number); + $phone_number = $conn->quoteSmart($phone_number); + + /* Update our card */ + $sql = "UPDATE din_card SET owner_phone_number=$phone_number,registered=NOW(),is_active=1 WHERE card_number=$card_number"; + $res = $conn->query($sql); + if( DB::isError($res) ) { new Exception($res->getMessage()); } +} + function update_card($user_id, $card_number) { /* Adds card relationship OR if relationship already exist, set inactive and then add new */ $conn = get_db_connection(DB_FETCHMODE_ORDERED); @@ -168,6 +194,7 @@ function update_card($user_id, $card_number) { $res = $conn->query($sql); if( DB::isError($res) ) { new Exception($res->getMessage()); } } + function get_user_id_by_card_number($card_number) { $conn = get_db_connection(DB_FETCHMODE_ORDERED); @@ -186,6 +213,26 @@ function get_user_id_by_card_number($card_number) { } return $res[0][0]; } + +function get_card_owner_phone_number($card_number) { + $conn = get_db_connection(DB_FETCHMODE_ORDERED); + + $card_number = $conn->quoteSmart($card_number); + $sql = "SELECT c.owner_phone_number FROM din_card AS c + LEFT JOIN din_user AS u ON c.user_id=u.id + WHERE c.card_number=$card_number"; + + $res = $conn->getAll($sql); + + if( DB::isError($res) ) { + new Exception($res->getMessage()); + } + if( count($res) === 0 ) { + return NULL; + } + return $res[0][0]; +} + function get_active_card_number($user) { foreach($user['cards'] as $card) { if($card['is_active'] == "1") { diff --git a/api/card.php b/api/card.php new file mode 100644 index 0000000..81f6bbd --- /dev/null +++ b/api/card.php @@ -0,0 +1,110 @@ + "Missing param apikey."), 400); +} +/* Valid API KEY (defined in credentials.php) ? */ +if( $_GET['apikey'] !== USER_API_KEY && $_GET['apikey'] !== USER_API_KEY_KASSA ) { + return_json_response(array('error' => "Invalid apikey: '".$_GET['apikey']."'."), 400); +} +if($_SERVER['REQUEST_METHOD'] === 'POST') { + $body = file_get_contents('php://input'); + $data = json_decode($body, true); + + /* Validate params */ + if( !isset($data['card_number']) ) { + return_json_response(array('error' => "Missing param card_number"), 400); + } + $card_number = $data['card_number']; + + if( !is_numeric($card_number) ) { + return_json_response(array('error' => "Value card_number must be numeric: '".$card_number."'"), 400); + } + + /* Validate user_id */ + if( !isset($data['user_id']) || !isset($data['phone_number']) ) { + return_json_response(array('error' => "Missing either param user_id or phone_number"), 400); + } + + $is_new_membership = isset($data['phone_number']); // FIXME: Use param type=new_card instead of checking phone_number + if($is_new_membership) { + $phone_number = clean_phonenumber($data['phone_number']); + if(!valid_phonenumber($phone_number)) { + return_json_response(array('error' => "Invalid phone number: '".$phone_number."'"), 400); + } + + /* New membership, with only card number and phone number tuple */ + update_card_with_phone_number($card_number, $phone_number); + + /* Return card object */ + return_json_response(array('user'=> NULL, 'card' => get_card($card_number))); + + } else { + /* Existing user */ + if( !is_numeric($data['user_id']) ) { + return_json_response(array('error' => "Value user_id must be numeric: '".$data['user_id']."'"), 400); + } + /* If user does not exist, bail */ + $user_data = get_user_data($data['user_id']); + if( count($user_data) !== 1 ) { + return_json_response(array('error' => "User with user_id '".$data['user_id']."' does not exist."), 400); + } + $user = $user_data[0]; + $active_card_number = get_active_card_number($user); + + /* If card number is attached to specified user, bail */ + if($active_card_number && $active_card_number === $data['card_number']) { + return_json_response(array('error' => "Card number ".$data['card_number']." is already attached to user (".$data['user_id'].")."), 400); + } + /* If card number does not exist, bail */ + $id_from_card_number = get_user_id_by_card_number($data['card_number']); + if($id_from_card_number === NULL) { + return_json_response(array('error' => "Card number ".$data['card_number']." does not exist."), 400); + } + /* If card belongs to another user, bail */ + if($id_from_card_number !== "") { + return_json_response(array('error' => "Card number ".$data['card_number']." belongs to another user ($id_from_card_number)."), 400); + } + + /* Add card relationship OR set old relationship inactive and add new */ + update_card($data['user_id'], $data['card_number']); + + return_json_response(array('user' => get_user_data($data['user_id']))); + } +} +else { + /* Validate params */ + if( !isset($_GET['card_number']) ) { + return_json_response(array('error' => "Missing param card_number: ".var_export($_POST, true)), 400); + } + $card_number = $_GET['card_number']; + + if( !is_numeric($card_number) ) { + return_json_response(array('error' => "Value card_number must be numeric: '".$card_number."'"), 400); + } + + $card = get_card($card_number); + + if(!$card || $card['user_id'] === "") { + $user = NULL; + } else { + /* Existing user with card_number */ + try{ + $user = get_user_data($card['user_id'])[0]; + } catch(Exception $e) { + return_json_response(array('error' => $e->getMessage()), 500); + return; // Note: Help IntelliJ code inspection. + } + } + + return_json_response(array('user' => $user, 'card' => $card)); +} \ No newline at end of file diff --git a/api/cardnumber.php b/api/cardnumber.php deleted file mode 100644 index 542fc1e..0000000 --- a/api/cardnumber.php +++ /dev/null @@ -1,111 +0,0 @@ - "Missing param apikey."), 400); -} -/* Valid API KEY (defined in credentials.php) ? */ -if( $_GET['apikey'] !== USER_API_KEY && $_GET['apikey'] !== USER_API_KEY_KASSA ) { - return_json_response(array('error' => "Invalid apikey: '".$_GET['apikey']."'."), 400); -} -if($_SERVER['REQUEST_METHOD'] === 'POST') { - $body = file_get_contents('php://input'); - $data = json_decode($body, true); - - /* Validate params */ - if( !isset($data['card_number']) ) { - return_json_response(array('error' => "Missing param card_number"), 400); - } - $card_number = $data['card_number']; - - if( !is_numeric($card_number) ) { - return_json_response(array('error' => "Value card_number must be numeric: '".$card_number."'"), 400); - } - - /* Validate user_id */ - if( !isset($data['user_id']) ) { - return_json_response(array('error' => "Missing param user_id"), 400); - } - if( !is_numeric($data['user_id']) ) { - return_json_response(array('error' => "Value user_id must be numeric: '".$data['user_id']."'"), 400); - } - /* If user does not exist, bail */ - $user_data = get_user_data($data['user_id']); - if( count($user_data) !== 1 ) { - return_json_response(array('error' => "User with user_id '".$data['user_id']."' does not exist."), 400); - } - $user = $user_data[0]; - $active_card_number = get_active_card_number($user); - - /* If card number is attached to specified user, bail */ - if($active_card_number && $active_card_number === $data['card_number']) { - return_json_response(array('error' => "Card number ".$data['card_number']." is already attached to user (".$data['user_id'].")."), 400); - } - /* If card number does not exist, bail */ - $id_from_card_number = get_user_id_by_card_number($data['card_number']); - if($id_from_card_number === NULL) { - return_json_response(array('error' => "Card number ".$data['card_number']." does not exist."), 400); - } - /* If card belongs to another user, bail */ - if($id_from_card_number !== "") { - return_json_response(array('error' => "Card number ".$data['card_number']." belongs to another user ($id_from_card_number)."), 400); - } - - /* Add card relationship OR set old relationship inactive and add new */ - update_card($data['user_id'], $data['card_number']); - - return_json_response(array('user' => get_user_data($data['user_id']))); -} -else { - /* Validate params */ - if( !isset($_GET['card_number']) && !isset($_POST['card_number']) ) { - return_json_response(array('error' => "Missing param card_number: ".var_export($_POST, true)), 400); - } - $card_number = $_GET['card_number']; - - if( !is_numeric($card_number) ) { - return_json_response(array('error' => "Value card_number must be numeric: '".$card_number."'"), 400); - } - - // Search query - $card_number = $conn->quoteSmart($card_number); - $sql = "SELECT c.user_id FROM din_card AS c - LEFT JOIN din_user AS u ON c.user_id=u.id - WHERE c.card_number=$card_number"; - - $res = $conn->getAll($sql); - - if( DB::isError($res) ) { - return_json_response(array('error' => $res->message), 500); - } - $card_number_exists = count($res) === 0; - - /* Invalid card number? */ - if($card_number_exists) { - return_json_response(array('user' => NULL, 'valid' => false)); - } - - $user_id = $res[0][0]; - /* Free card_number? */ - if($user_id === "") { - return_json_response(array('user' => NULL, 'valid' => true)); - } - - /* Existing user with card_number. */ - try{ - $user_data = get_user_data($user_id); - } catch(Exception $e) { - return_json_response(array('error' => $e->getMessage()), 500); - return; // Note: Help IntelliJ code inspection. - } - - return_json_response(array('user' => $user_data, 'valid' => $res !== NULL)); -} \ No newline at end of file diff --git a/api/register.php b/api/register.php index 620e31a..cca377a 100644 --- a/api/register.php +++ b/api/register.php @@ -70,7 +70,7 @@ if( isset($data['type']) && $data['type'] === "renewal" ) { $required_keys = array('apikey', 'phone'); $valid_keys = $required_keys; -$valid_keys = array_merge($valid_keys, array('purchased', 'source', 'type', 'membership_trial', 'cardno')); +$valid_keys = array_merge($valid_keys, array('purchased', 'source', 'type', 'membership_trial', 'card_number')); $valid_sources = array('physical', 'web', 'manual');