diff --git a/snapporder/api/query.php b/snapporder/api/query.php index b96616f..7ce405c 100644 --- a/snapporder/api/query.php +++ b/snapporder/api/query.php @@ -9,9 +9,10 @@ * Response: * * { - * "phone":" 42345678", + * "phone": "+4742345678", * "membership_status": 1, // 0 - ikke medlem, 1 - medlem, 2 - aktiv * "expires": "2015-04-23", + * "memberid": "4331", * "cardno": "12345", * "firstName": "Jon", * "lastName": "Hansen", @@ -40,7 +41,6 @@ if(!isset($_GET['phone'])) { } $phone = $_GET['phone']; $phone = clean_phonenumber($phone); -// todo you are here if( !valid_phonenumber($phone) ) { set_response_code(400); echo json_encode(array('error' => 'Not a phone number', 'query' => $_GET)); @@ -56,26 +56,17 @@ if(DB :: isError($conn)) { echo json_encode(array('error' => 'Could not connect to DB')); die(); } +$conn->setFetchMode(DB_FETCHMODE_ASSOC); /* Search in phone number table for phone number */ -$conn->setFetchMode(DB_FETCHMODE_ASSOC); -$phone = $conn->escapeSimple($phone); -$sql = "SELECT user_id FROM din_userphonenumber WHERE number='$phone'"; -$res = $conn->query($sql); -if( DB::isError($res) ) { - set_response_code(500); - echo json_encode( array('error' => 'db_error', 'error_message' => $res->toString() ) ); - die(); -} -// empty? -if( $res->numRows() == 0) { +$user_id = getUseridFromPhone($phone); +if( $user_id === false ) { echo json_encode( array('result' => 'No matching users')); die(); } -$res->fetchInto($row); /* Get and format user */ -$user = get_user($row['user_id']); +$user = get_user($user_id); /* Add back phone number from query */ $user['phone'] = $phone; diff --git a/snapporder/api/register.php b/snapporder/api/register.php index c2d22df..b3982c1 100644 --- a/snapporder/api/register.php +++ b/snapporder/api/register.php @@ -62,17 +62,24 @@ if($data === NULL) { } /* Validate supplied data */ -$required_keys = array('firstname', 'lastname', 'phone', 'email'); +$valid_keys = array('firstname', 'lastname', 'phone', 'email'); -foreach($required_keys as $key) { +foreach($valid_keys as $key) { if(!array_key_exists($key, $data)) { set_response_code(400); echo json_encode(array('error' => 'missing required field \''.$key.'\'')); die(); } } -var_dump($data); +foreach($data as $key => $value) { + if(!in_array($key, $valid_keys)) { + set_response_code(400); + echo json_encode(array('error' => 'unknown field \''.$key.'\'')); + die(); + } +} +$data['phone'] = clean_phonenumber($data['phone']); if( !valid_phonenumber($data['phone']) ) { set_response_code(400); echo json_encode(array('error' => 'Not a phone number:'.$data['phone'])); @@ -83,6 +90,17 @@ if( !valid_email($data['email']) ) { echo json_encode(array('error' => 'Not an email: '.$data['email'])); die(); } + +/* Connect to database */ +$options = array( 'debug' => 2, 'portability' => DB_PORTABILITY_ALL ); +$conn = DB::connect(getDSN(), $options); +if(DB :: isError($conn)) { + echo $conn->toString(); + set_response_code(500); + echo json_encode(array('error' => 'Could not connect to DB')); + die(); +} + /* Existing user? */ if( getUseridFromEmail($data['email']) !== false) { set_response_code(409); @@ -94,6 +112,18 @@ if( getUseridFromPhone($data['phone']) !== false ) { echo json_encode(array('error' => 'Existing user with phone: '.$data['phone'])); die(); } +/* validate firstname and lastname */ +if( strlen($data['firstname']) < 2) { + set_response_code(400); + echo json_encode(array('error' => 'Too short firstname: '.$data['firstname'])); + die(); +} +if( strlen($data['lastname']) < 2) { + set_response_code(400); + echo json_encode(array('error' => 'Too short lastname: '.$data['lastname'])); + die(); +} + /* Create user */ $user_id = add_user($data); @@ -102,7 +132,7 @@ $user_id = add_user($data); $user = get_user($user_id); /* Return encrypted user object */ -//echo json_encode($user); +echo json_encode($user); //echo $crypt->encrypt(json_encode($user)); ?> diff --git a/snapporder/lib/functions.php b/snapporder/lib/functions.php index c05a6c2..02462b0 100644 --- a/snapporder/lib/functions.php +++ b/snapporder/lib/functions.php @@ -8,22 +8,45 @@ function set_response_code($code) { } header('X-Ignore-This: something', true, $code); } +function generate_username($data) { + // TODO improve this, not unique enough + $firstname = preg_replace('/[^\w]/', '', $data['firstname']); + $firstname = substr(strtolower($firstname), 0, 6); + $lastname = preg_replace('/[^\w]/', '', $data['lastname']); + $lastname = substr(strtolower($lastname), 0, 3); + return $firstname.$lastname.substr(uniqid(), -3); +} function add_user($data) { global $conn; - /* TODO validate input */ - echo json_encode( array('error' => 'not implemented' ) ); - die(); + /* User table */ + $phone = $data['phone']; + unset($data['phone']); + $data['username'] = generate_username($data); + $cols = array_keys($data); + $values = array_values($data); + $sth = $conn->autoPrepare("din_user", $cols, DB_AUTOQUERY_INSERT); - // TODO $cols from data - $sql = 'INSERT INTO din_user ('.implode($cols, ",").') VALUES ()'; - $res = $conn->query($sql); + $res = $conn->execute($sth, $values); if( DB::isError($res) ) { echo json_encode( array('error' => 'db_error', 'error_message' => $res->toString() ) ); die(); } + + $user_id = get_user_id_by_username($data['username']); + + /* Phonenumber table */ + $sth = $conn->autoPrepare("din_userphonenumber", array('user_id', 'number'), DB_AUTOQUERY_INSERT); + $res = $conn->execute($sth, array($user_id, $phone)); + + if( DB::isError($res) ) { + echo json_encode( array('error' => 'db_error', 'error_message' => $res->toString() ) ); + die(); + } + + return $user_id; } /* Get user object with group ids and membership status */ @@ -68,12 +91,24 @@ function get_user($user_id) { return $user; } +function get_user_id_by_username($username) { + global $conn; + + $sql = "SELECT id FROM din_user WHERE username='$username'"; + $res = $conn->query($sql); + if( DB::isError($res) ) { + echo json_encode( array('error' => 'db_error', 'error_message' => $res->toString() ) ); + die(); + } + $res->fetchInto($data); + var_dump($data); + return $data['id']; +} function clean_phonenumber($pn) { - var_dump($pn); $pn = preg_replace('/[^0-9\+]/', '', $pn); // remove everything except valid chars $pn = preg_replace('/^00/','+', $pn); // replace starting 00 with + // norwegian phone numbers - if( strlen($pn === 8) && ($pn[0] === "4" || $pn[1] === "9") ) { + if( strlen($pn) === 8 && ($pn[0] === "4" || $pn[0] === "9") ) { $pn = "+47".$pn; } return $pn; @@ -83,6 +118,6 @@ function valid_phonenumber($phone) { return preg_match('/^\+?\d{8,15}$/i', $phone); } function valid_email($email) { - return preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i", $email); + return filter_var($email, FILTER_VALIDATE_EMAIL); } ?> diff --git a/snapporder/lib/test.php b/snapporder/lib/test.php new file mode 100644 index 0000000..4a4cfa9 --- /dev/null +++ b/snapporder/lib/test.php @@ -0,0 +1,11 @@ + "Nikolai R", "lastname" => "Kristiansen"))); diff --git a/snapporder/tests/.testuser.json.swo b/snapporder/tests/.testuser.json.swo new file mode 100644 index 0000000..29761e9 Binary files /dev/null and b/snapporder/tests/.testuser.json.swo differ diff --git a/snapporder/tests/testuser.json b/snapporder/tests/testuser.json index 7439f0a..707b5a3 100644 --- a/snapporder/tests/testuser.json +++ b/snapporder/tests/testuser.json @@ -1,6 +1,6 @@ { "firstname": "Test", "lastname": "Testesen", - "email": "asdfasdfz@asdf.com", - "phone": "48105887" + "email": "assdadfzaaa2ggzasdaaz@aaaa222asdaasdf.com", + "phone": "48115899" }