From f601b9a0e4c85487278f534e6f2651cbe31249c6 Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Tue, 29 Jul 2014 16:52:07 +0200 Subject: [PATCH] [SnappOrder] Adds support for renewal of memberships --- includes/Ldap_defines.php | 2 +- snapporder/api/register.php | 74 +++++++++++++++++++++----- snapporder/lib/functions.php | 50 +++++++++++++++++ snapporder/tests/integration.php | 39 +++++++++++--- snapporder/tests/testuser_renewal.json | 5 ++ 5 files changed, 148 insertions(+), 22 deletions(-) create mode 100644 snapporder/tests/testuser_renewal.json diff --git a/includes/Ldap_defines.php b/includes/Ldap_defines.php index 3df635d..3afa08c 100644 --- a/includes/Ldap_defines.php +++ b/includes/Ldap_defines.php @@ -1,6 +1,6 @@ json_encode_and_encrypt(array('error' => 'Can\'t decode body')); die(); } +/* Check type of registration */ +$reg_type = "new"; +/* Renewal */ +if( isset($data['type']) && $data['type'] === "renewal" ) { + $required_keys = array('phone'); + $reg_type = $data['type']; +} else { + $required_keys = array('firstname', 'lastname', 'phone', 'email'); +} /* Validate supplied data */ -$required_keys = array('firstname', 'lastname', 'phone', 'email'); $valid_keys = $required_keys; -$valid_keys[] = + 'purchased'; +$valid_keys = array_merge($valid_keys, array('purchased', 'source', 'type')); foreach($required_keys as $key) { if(!array_key_exists($key, $data)) { @@ -87,7 +106,8 @@ if( !valid_phonenumber($data['phone']) ) { echo $crypt->json_encode_and_encrypt(array('error' => 'Not a phone number:'.$data['phone'])); die(); } -if( !valid_email($data['email']) ) { + +if( $reg_type === "new" && !valid_email($data['email']) ) { set_response_code(400); echo $crypt->json_encode_and_encrypt(array('error' => 'Not an email: '.$data['email'])); die(); @@ -105,24 +125,40 @@ if(DB :: isError($conn)) { $conn->setFetchMode(DB_FETCHMODE_ASSOC); /* Existing user? */ -if( getUseridFromEmail($data['email']) !== false) { +if( $reg_type === "new" && getUseridFromEmail($data['email']) !== false) { set_response_code(409); echo $crypt->json_encode_and_encrypt(array('error' => 'Existing user with email: '.$data['email'])); die(); } -if( getUseridFromPhone($data['phone']) !== false ) { +$user_id = getUseridFromPhone($data['phone']); +if( $reg_type === "new" && $user_id !== false ) { set_response_code(409); echo $crypt->json_encode_and_encrypt(array('error' => 'Existing user with phone: '.$data['phone'])); die(); } +/* Renewal of membership? */ +if( $reg_type === "renew" && $user_id === false ) { + set_response_code(409); + echo $crypt->json_encode_and_encrypt(array('error' => 'Could not find user with phone: '.$data['phone'])); + die(); +} +if( $reg_type === "renewal") { + $user = get_user($user_id); + /* Don't allow renewal of an existing valid membership. */ + if( $user['membership_status'] !== 0 ) { + set_response_code(409); + echo $crypt->json_encode_and_encrypt(array('error' => 'Cannot renew, user with phone '.$data['phone'].' has a valid membership until: '.$user['expires'])); + die(); + } +} /* validate firstname and lastname */ -if( strlen($data['firstname']) < 2) { +if( $reg_type === "new" && strlen($data['firstname']) < 2 ) { set_response_code(400); echo $crypt->json_encode_and_encrypt(array('error' => 'Too short firstname: '.$data['firstname'])); die(); } -if( strlen($data['lastname']) < 2) { +if( $reg_type === "new" && strlen($data['lastname']) < 2 ) { set_response_code(400); echo $crypt->json_encode_and_encrypt(array('error' => 'Too short lastname: '.$data['lastname'])); die(); @@ -139,11 +175,22 @@ if( isset($data['purchased']) ) { $data['purchased'] = $purchased; } +/* Validate optional source */ +if( isset($data['source']) && !in_array($data['source'], array('snapporder', 'snapporder_sms')) ) { + set_response_code(400); + echo $crypt->json_encode_and_encrypt(array('error' => 'Invalid value in field source: '.$data['source'])); + die(); +} + /* Create user */ $user_id = NULL; try { - $user_id = add_user($data); + if( $reg_type === "new" ) { + $user_id = add_user($data); + } else { + $user_id = renew_user($data); + } } catch(InsideDatabaseException $e) { set_response_code(500); echo $crypt->json_encode_and_encrypt(array('error' => 'db_error', 'error_message' => $e->getMessage())); @@ -161,13 +208,14 @@ try { } /* Add register url */ -$user['registration_url'] = generate_registration_url($user, SECRET_KEY); +if($user['registration_status'] === "partial") { + $user['registration_url'] = generate_registration_url($user, SECRET_KEY); +} /* Add back phone number from query */ $user['phone'] = $data['phone']; /* Return encrypted user object */ echo $crypt->json_encode_and_encrypt($user); -//echo json_encode($user); ?> diff --git a/snapporder/lib/functions.php b/snapporder/lib/functions.php index f41ce83..4b531b9 100644 --- a/snapporder/lib/functions.php +++ b/snapporder/lib/functions.php @@ -124,6 +124,56 @@ function get_user($user_id) { } return $user; } + +function renew_user($data) { + global $conn; + + /* User table */ + $phone = $data['phone']; + unset($data['phone']); + unset($data['type']); + + /* Our own values */ + $source = $data['source']; + if( !isset($data['source']) ) { + $source = "snapporder"; + } + unset($data['source']); + + /* 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 + + // FIXME: Decode UTF-8 values... why? + foreach($data as $key=>$value) { + $data[$key] = utf8_decode($value); + } + + $res = $conn->autoExecute("din_user", $data, DB_AUTOQUERY_UPDATE, "id = $user_id"); + + if( DB::isError($res) ) { + throw new InsideDatabaseException($res->getMessage()); + } + + /* Phonenumber table, set validated */ + $fields_values = array('validated' => 1); + + $res = $conn->autoExecute("din_userphonenumber", $fields_values, DB_AUTOQUERY_UPDATE, "user_id=$user_id AND number='$number'"); + + if( DB::isError($res) ) { + throw new InsideDatabaseException($res->getMessage()); + } + + log_userupdate($user_id, "Medlemskap fornyet via SnappOrder ($source)."); + + return $user_id; +} + function get_user_id_by_username($username) { global $conn; diff --git a/snapporder/tests/integration.php b/snapporder/tests/integration.php index 8327c56..bc99858 100644 --- a/snapporder/tests/integration.php +++ b/snapporder/tests/integration.php @@ -3,17 +3,13 @@ require_once("../lib/CryptoHelper.php"); require_once("../lib/functions.php"); require_once("../config.php"); +define("API_URL", 'http://inside.dev'); /* Query */ function test_get_query() { $number = "+4745115787"; - //$data = file_get_contents("./testuser.json"); - //$data = $crypt->encrypt($data); - $ch = curl_init('http://inside.dev/snapporder/api/query.php?phone='.urlencode($number)); - //curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); - //curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + $ch = curl_init(API_URL.'/snapporder/api/query.php?phone='.urlencode($number)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - //curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json ')); $result = curl_exec($ch); $crypt = new CryptoHelper(SNAP_IV, SNAP_KEY); @@ -33,7 +29,7 @@ function test_post_register() { $data = file_get_contents("./testuser.json"); $data = $crypt->encrypt($data); - $ch = curl_init('http://inside.dev/snapporder/api/register.php'); + $ch = curl_init(API_URL.'/snapporder/api/register.php'); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @@ -54,5 +50,32 @@ function test_post_register() { /* Register */ curl_close ($ch); } +function test_post_register_renewal() { + $crypt = new CryptoHelper(SNAP_IV, SNAP_KEY); + $data = file_get_contents("./testuser_renewal.json"); + + $data = $crypt->encrypt($data); + $ch = curl_init(API_URL.'/snapporder/api/register.php'); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_ENCODING ,""); + curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=UTF-8')); + + $result = curl_exec($ch); + $result = $crypt->decrypt(trim($result)); + $decoded_result = (array) json_decode($result); + + if(isset($decoded_result['expires']) && $decoded_result['expires'] === "2015-05-12") { + echo "OK"; + var_dump($decoded_result); + } else { + echo "FAIL\n"; + var_dump($decoded_result); + } + /* Register */ + curl_close ($ch); +} //test_get_query(); -test_post_register(); +//test_post_register(); +test_post_register_renewal(); diff --git a/snapporder/tests/testuser_renewal.json b/snapporder/tests/testuser_renewal.json new file mode 100644 index 0000000..5c5b668 --- /dev/null +++ b/snapporder/tests/testuser_renewal.json @@ -0,0 +1,5 @@ +{ + "type": "renewal", + "phone": "+4744444444", + "purchased": "2014-05-12" +}