From 34b36c2308d480c8ca4a3484987d4a8aeae39066 Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Fri, 30 May 2014 11:50:39 +0200 Subject: [PATCH] Working register.php --- .gitignore | 1 + snapporder/api/query.php | 7 ++-- snapporder/api/register.php | 49 ++++++++++++++++-------- snapporder/api/tags | 0 snapporder/lib/functions.php | 57 ++++++++++++++++++++++------ snapporder/lib/test.php | 11 ------ snapporder/migrate.sql | 5 +++ snapporder/tests/.testuser.json.swo | Bin 12288 -> 0 bytes snapporder/tests/testuser.json | 4 +- 9 files changed, 91 insertions(+), 43 deletions(-) create mode 100644 snapporder/api/tags delete mode 100644 snapporder/lib/test.php create mode 100644 snapporder/migrate.sql delete mode 100644 snapporder/tests/.testuser.json.swo diff --git a/.gitignore b/.gitignore index 4a52bdf..d563c4d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ snapporder/config.php migration.log error_log *.swp +*.swo .htaccess payex_defines.php diff --git a/snapporder/api/query.php b/snapporder/api/query.php index 7ce405c..a3167ba 100644 --- a/snapporder/api/query.php +++ b/snapporder/api/query.php @@ -10,14 +10,15 @@ * * { * "phone": "+4742345678", - * "membership_status": 1, // 0 - ikke medlem, 1 - medlem, 2 - aktiv + * "membership_status": 1, // 0: registrert, 1: medlem, 2: aktivt medlem * "expires": "2015-04-23", * "memberid": "4331", * "cardno": "12345", - * "firstName": "Jon", - * "lastName": "Hansen", + * "firstname": "Jon", + * "lastname": "Hansen", * "email": "jon@uio.no", * "registration_status": "partial" // "partial" means show link + * "register_url": "/snapporder/register_partial.php?id=4331&hmac=lol" * } * */ diff --git a/snapporder/api/register.php b/snapporder/api/register.php index b3982c1..5ba833a 100644 --- a/snapporder/api/register.php +++ b/snapporder/api/register.php @@ -7,27 +7,28 @@ * $ curl /snapporder/api/register.php * { * "phone":12345678, - * "firstName": "Jon", - * "lastName": "Hansen", - * "email": "jon@uio.no" + * "firstname": "Jon", + * "lastname": "Hansen", + * "email": "jon@uio.no", + * "purchased": "2004-02-12" // optional, format: ISO-8601 date * } * * Response: * * { - * "phone":12345678, - * "memberStatus":1, - * "endDate": "2015-04-23" , - * "membershipNumber": "dsadsa2333", - * "firstName": "Jon", - * "lastName": "Hansen", + * "phone": "+4742345678", + * "membership_status": 1, // 0: registrert, 1: medlem, 2: aktivt medlem + * "expires": "2015-04-23", + * "memberid": "4331", + * "firstname": "Jon", + * "lastname": "Hansen", * "email": "jon@uio.no", - * "registration_status": "partial" // "partial" or "full" + * "registration_status": "partial" // "partial" means show link + * "register_url": "/snapporder/register_partial.php?id=4331&hmac=lol" * } * - * TODO: - * - register user with fromSnappOrder flag - * - return result + * TODO register url + * TODO maybe check $_SERVER['REQUEST_METHOD'] */ /* Pull in Inside */ @@ -62,9 +63,11 @@ if($data === NULL) { } /* Validate supplied data */ -$valid_keys = array('firstname', 'lastname', 'phone', 'email'); +$required_keys = array('firstname', 'lastname', 'phone', 'email'); +$valid_keys = $required_keys; +$valid_keys[] = + 'purchased'; -foreach($valid_keys as $key) { +foreach($required_keys as $key) { if(!array_key_exists($key, $data)) { set_response_code(400); echo json_encode(array('error' => 'missing required field \''.$key.'\'')); @@ -100,6 +103,7 @@ if(DB :: isError($conn)) { echo json_encode(array('error' => 'Could not connect to DB')); die(); } +$conn->setFetchMode(DB_FETCHMODE_ASSOC); /* Existing user? */ if( getUseridFromEmail($data['email']) !== false) { @@ -112,6 +116,7 @@ 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); @@ -124,6 +129,17 @@ if( strlen($data['lastname']) < 2) { die(); } +/* Validate optional purchase_date */ +if( isset($data['purchased']) ) { + $purchased = clean_date($data['purchased']) ; + if($purchased === false) { + set_response_code(400); + echo json_encode(array('error' => 'Could not parse date from field purchased: '.$data['purchased'])); + die(); + } + $data['purchased'] = $purchased; +} + /* Create user */ $user_id = add_user($data); @@ -131,6 +147,9 @@ $user_id = add_user($data); /* Get and format user */ $user = get_user($user_id); +/* Add back phone number from query */ +$user['phone'] = $data['phone']; + /* Return encrypted user object */ echo json_encode($user); //echo $crypt->encrypt(json_encode($user)); diff --git a/snapporder/api/tags b/snapporder/api/tags new file mode 100644 index 0000000..e69de29 diff --git a/snapporder/lib/functions.php b/snapporder/lib/functions.php index 02462b0..e92fdd4 100644 --- a/snapporder/lib/functions.php +++ b/snapporder/lib/functions.php @@ -8,29 +8,48 @@ function set_response_code($code) { } header('X-Ignore-This: something', true, $code); } + +/* Username based on firstname and lastname, max 12 chars */ function generate_username($data) { - // TODO improve this, not unique enough $firstname = preg_replace('/[^\w]/', '', $data['firstname']); - $firstname = substr(strtolower($firstname), 0, 6); + $firstname = substr(strtolower($firstname), 0, 5); $lastname = preg_replace('/[^\w]/', '', $data['lastname']); - $lastname = substr(strtolower($lastname), 0, 3); - return $firstname.$lastname.substr(uniqid(), -3); + $lastname = substr(strtolower($lastname), 0, 2); + $rand = substr(uniqid("", true), -5); + + return $firstname.$lastname.$rand; } + function add_user($data) { global $conn; /* User table */ - $phone = $data['phone']; + $phone = $data['phone']; // used later unset($data['phone']); + + /* Add our own initial values */ $data['username'] = generate_username($data); + $data['source'] = "snapporder"; + $data['registration_status'] = "partial"; + + /* Membership expiry */ + /* One year from today (default) */ + if( !isset($data['purchased']) ) { + $data['purchased'] = date_create(); + } + /* ...or one year from specified date */ + $data['expires'] = date_format(date_modify($data['purchased'], "+1 year"), "Y-m-d"); + unset($data['purchased']); // dont save purchase date + $cols = array_keys($data); $values = array_values($data); + $sth = $conn->autoPrepare("din_user", $cols, DB_AUTOQUERY_INSERT); - - $res = $conn->execute($sth, $values); + if( DB::isError($res) ) { + set_response_code(500); echo json_encode( array('error' => 'db_error', 'error_message' => $res->toString() ) ); die(); } @@ -38,10 +57,14 @@ function add_user($data) { $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)); + $cols = array('user_id', 'number', 'validated'); + $values = array($user_id, $phone, 1); + + $sth = $conn->autoPrepare("din_userphonenumber", $cols, DB_AUTOQUERY_INSERT); + $res = $conn->execute($sth, $values); if( DB::isError($res) ) { + set_response_code(500); echo json_encode( array('error' => 'db_error', 'error_message' => $res->toString() ) ); die(); } @@ -59,10 +82,13 @@ function get_user($user_id) { * - a date >= NOW(): Valid membership * - NULL: Lifelong membership */ - $cols = array('id', 'firstname', 'lastname', 'email', 'expires', 'cardno'); - $sql = "SELECT ".implode($cols, ",").",GROUP_CONCAT(group_id) AS group_ids,expires > NOW() OR expires IS NULL AS is_member FROM din_user AS u, din_usergrouprelationship AS ug WHERE u.id=$user_id AND u.id=ug.user_id GROUP BY user_id"; + $cols = array('id', 'firstname', 'lastname', 'email', 'expires', 'cardno', 'registration_status'); + $sql_group_ids = "GROUP_CONCAT(group_id) AS group_ids"; + $sql_is_member = "expires > NOW() OR expires IS NULL AS is_member"; + $sql = "SELECT ".implode($cols, ",").",$sql_group_ids,$sql_is_member FROM din_user AS users LEFT JOIN din_usergrouprelationship AS ug ON users.id=ug.user_id WHERE users.id=$user_id GROUP BY users.id"; $res = $conn->query($sql); if( DB::isError($res) ) { + set_response_code(500); echo json_encode( array('error' => 'db_error', 'error_message' => $res->toString() ) ); die(); } @@ -88,6 +114,8 @@ function get_user($user_id) { /* Clean up user object */ unset($user['is_member']); unset($user['group_ids']); + $user['memberid'] = $user['id']; // rename + unset($user['id']); return $user; } @@ -97,11 +125,11 @@ function get_user_id_by_username($username) { $sql = "SELECT id FROM din_user WHERE username='$username'"; $res = $conn->query($sql); if( DB::isError($res) ) { + set_response_code(500); 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) { @@ -113,6 +141,11 @@ function clean_phonenumber($pn) { } return $pn; } +// ISO-8601 Y-m-d +function clean_date($date) { + // returns a DateTime object + return date_create_from_format('Y-m-d', $date); +} // E.164 function valid_phonenumber($phone) { return preg_match('/^\+?\d{8,15}$/i', $phone); diff --git a/snapporder/lib/test.php b/snapporder/lib/test.php deleted file mode 100644 index 4a4cfa9..0000000 --- a/snapporder/lib/test.php +++ /dev/null @@ -1,11 +0,0 @@ - "Nikolai R", "lastname" => "Kristiansen"))); diff --git a/snapporder/migrate.sql b/snapporder/migrate.sql new file mode 100644 index 0000000..1f5d0e2 --- /dev/null +++ b/snapporder/migrate.sql @@ -0,0 +1,5 @@ +/* New columns */ +ALTER TABLE `din_user` ADD `source` VARCHAR( 255 ) NOT NULL DEFAULT 'inside'; +ALTER TABLE `din_user` ADD `registration_status` VARCHAR( 255 ) NOT NULL DEFAULT 'full'; +ALTER TABLE `din_user` ADD `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP; +ALTER TABLE `din_userphonenumber` ADD `validated` INT( 1 ) NOT NULL DEFAULT '0'; diff --git a/snapporder/tests/.testuser.json.swo b/snapporder/tests/.testuser.json.swo deleted file mode 100644 index 29761e93b19279c8847d7f86ec3f57fe8977a801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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