From b80b05824972fb80a3552f253aea1df5e06bb61b Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Thu, 29 May 2014 00:18:24 +0200 Subject: [PATCH] Register allmost works --- snapporder/api/query.php | 21 ++++------- snapporder/api/register.php | 38 +++++++++++++++++--- snapporder/lib/functions.php | 53 +++++++++++++++++++++++----- snapporder/lib/test.php | 11 ++++++ snapporder/tests/.testuser.json.swo | Bin 0 -> 12288 bytes snapporder/tests/testuser.json | 4 +-- 6 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 snapporder/lib/test.php create mode 100644 snapporder/tests/.testuser.json.swo 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 0000000000000000000000000000000000000000..29761e93b19279c8847d7f86ec3f57fe8977a801 GIT binary patch literal 12288 zcmeI&y-ve05C`xp0}}`YJU|F5G;JuNWrC4`i4U<}u~Xa+CyLV|6#*Lz3_KAJz&o(= z8i-4q3^25;p#Mo1>wLB)|F$S;*Dj7vy!~o}Bvy$wE+0>yUYF>-OJq$i?sMA9TeD(h zdRd$rp0y_L-IoUjN{<4q+JUjoC>=P=>M z+G#G+ZdkA7OSk+@Z+-22-Y)bZ009U<00Izz00bZafqx{BB^7#*`z#c9S}exOkFh8* zKmY;|fB*y_009U<00Izz00bcL2L)IW9jy=zCG+q9<@^7q)E|;>k}r}slKGlvNdyES z009U<00Izz00bZa0SG_<0>2QrBTvFlu4AkH1J7?X>-D{6tL0DU^?*%3pJ(S3t7y#3 xVW%@@sd#)S6^CIssho