diff --git a/api/api_functions.php b/api/api_functions.php index 313bcf1..6cd1ccb 100644 --- a/api/api_functions.php +++ b/api/api_functions.php @@ -77,21 +77,35 @@ if( !function_exists('valid_phonenumber') ) { } -function get_user_data($ids, $conn) { + +function _get_cards($value) { + $u_cs = array(); + $u_cards = explode(",", $value); + foreach ($u_cards as $c) { + list($card_number, $card_is_active) = explode(";", $c); + $u_cs[] = array( + 'card_number' => $card_number, + 'is_active' => $card_is_active + ); + } + return $u_cs; +} + +function get_user_data($ids) { if( !is_string($ids) ) { new Exception('Param ids should be a comma separated string of user ids'); } $ACTIVE_GROUP_ID = "2"; - $conn->setFetchMode(DB_FETCHMODE_ASSOC); + $conn = get_db_connection(DB_FETCHMODE_ASSOC); /* Get data */ $sql_is_member = "u.expires > NOW() OR u.expires IS NULL AS is_member"; - $CARDNO_LEGACY_MAX = 100000000; - $sql_card_is_legacy = "u.cardno<$CARDNO_LEGACY_MAX AS card_is_legacy"; $sql_groups = "GROUP_CONCAT(DISTINCT g.id,';',g.name SEPARATOR ',') AS groups"; - $data_sql = "SELECT u.id,u.username,u.firstname,u.lastname,u.email,up.number,u.expires,u.cardno,$sql_card_is_legacy,$sql_groups,$sql_is_member - FROM din_user as u - LEFT JOIN din_userphonenumber as up ON up.user_id=u.id + $sql_cards = "GROUP_CONCAT(DISTINCT c.card_number,';',c.is_active SEPARATOR ',') AS cards"; + $data_sql = "SELECT u.id,u.username,u.firstname,u.lastname,u.email,up.number,u.expires,$sql_cards,$sql_groups,$sql_is_member + FROM din_user AS u + LEFT JOIN din_userphonenumber AS up ON up.user_id=u.id + LEFT JOIN din_card AS c ON c.user_id=u.id LEFT JOIN din_usergrouprelationship AS ug ON u.id=ug.user_id LEFT JOIN din_group AS g ON g.id=ug.group_id WHERE u.id IN ($ids) @@ -131,6 +145,12 @@ function get_user_data($ids, $conn) { } $result[$key] = $u_gs; } + elseif($key == "cards") { + if($value === "") { + continue; // no groups + } + $result[$key] = _get_cards($value); + } /* Encoding issues? oh yes, utf-8 please */ elseif( !is_valid_utf8($value) ) { $result[$key] = utf8_encode($value); @@ -143,16 +163,29 @@ function get_user_data($ids, $conn) { } function update_card($user_id, $card_number) { - /* Update card number on user */ + /* Adds card relationship OR if relationship already exist, set inactive and then add new */ + $conn = get_db_connection(DB_FETCHMODE_ORDERED); + $card_number = $conn->quoteSmart($card_number); + $user_id = $conn->quoteSmart($user_id); + + /* Set users existing cards inactive, if any */ + $sql = "UPDATE din_card SET is_active=0 WHERE user_id=$user_id AND is_active=1"; + $res = $conn->query($sql); + if( DB::isError($res) ) { new Exception($res->getMessage()); } + + /* Update our card */ + $sql = "UPDATE din_card SET user_id=$user_id,registered=NOW(),is_active=1 WHERE card_number=$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); $card_number = $conn->quoteSmart($card_number); - $sql = "SELECT mc.userId FROM din_membercard AS mc - LEFT JOIN din_user AS u ON mc.userId=u.id - WHERE mc.id=$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); @@ -163,4 +196,12 @@ function get_user_id_by_card_number($card_number) { return NULL; } return $res[0][0]; +} +function get_active_card_number($user) { + foreach($user['cards'] as $card) { + if($card['is_active'] == "1") { + return $card['card_number']; + } + } + return NULL; } \ No newline at end of file diff --git a/api/cardnumber.php b/api/cardnumber.php index 75edaeb..542fc1e 100644 --- a/api/cardnumber.php +++ b/api/cardnumber.php @@ -38,14 +38,15 @@ if($_SERVER['REQUEST_METHOD'] === 'POST') { 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'], $conn); + $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($user['cardno'] === $data['card_number']) { + 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 */ @@ -57,8 +58,11 @@ if($_SERVER['REQUEST_METHOD'] === 'POST') { if($id_from_card_number !== "") { return_json_response(array('error' => "Card number ".$data['card_number']." belongs to another user ($id_from_card_number)."), 400); } - /* TODO: Add card relationship OR remove old relationsip and add new */ - return_json_response(array('error' => 'TODO: Not implemented')); + + /* 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 */ @@ -73,9 +77,9 @@ else { // Search query $card_number = $conn->quoteSmart($card_number); - $sql = "SELECT mc.userId FROM din_membercard AS mc - LEFT JOIN din_user AS u ON mc.userId=u.id - WHERE mc.id=$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); @@ -97,7 +101,7 @@ else { /* Existing user with card_number. */ try{ - $user_data = get_user_data($user_id, $conn); + $user_data = get_user_data($user_id); } catch(Exception $e) { return_json_response(array('error' => $e->getMessage()), 500); return; // Note: Help IntelliJ code inspection. diff --git a/api/phonenumber.php b/api/phonenumber.php index baaa6c7..5259061 100644 --- a/api/phonenumber.php +++ b/api/phonenumber.php @@ -61,7 +61,7 @@ foreach($res as $value) { $user_ids = implode(",", $id_array); try{ - $results = get_user_data($user_ids, $conn); + $results = get_user_data($user_ids); } catch(Exception $e) { set_response_code(500); echo json_encode(array('error' => $e->getMessage())); diff --git a/api/user.php b/api/user.php index f41cdc1..b251512 100644 --- a/api/user.php +++ b/api/user.php @@ -132,7 +132,7 @@ foreach($res as $value) { $ids = implode(",", $id_array); try{ - $results = get_user_data($ids, $conn); + $results = get_user_data($ids); } catch(Exception $e) { set_response_code(500); echo json_encode(array('error' => $e->getMessage()));