[SnappOrder] Adds support for renewal of memberships
This commit is contained in:
1 parent
afa8feafb0
commit
f601b9a0e4
5 files changed
+148
-22
No files matched your search
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
define("LDAP_ENABLED", true);
|
||||
define("LDAP_ENABLED", false);
|
||||
define("LDAP_SERVER", "pacman.neuf.no");
|
||||
|
||||
define("KSUFFIX", "cn=krbcontainer");
|
||||
|
||||
+61
-13
@@ -2,15 +2,16 @@
|
||||
/*
|
||||
* Registers a user in the user table
|
||||
*
|
||||
* Request:
|
||||
* Request (new):
|
||||
*
|
||||
* $ curl /snapporder/api/register.php
|
||||
* $ curl /snapporder/api/register.php
|
||||
* {
|
||||
* "phone": "+4742345678",
|
||||
* "firstname": "Jon",
|
||||
* "lastname": "Hansen",
|
||||
* "email": "jon@uio.no",
|
||||
* "purchased": "2004-02-12" // optional, format: ISO-8601 date
|
||||
* "purchased": "2004-02-12" // optional, format: ISO-8601 date
|
||||
* "source": "snapporder_sms" // optional, possible values: "snapporder" or "snapporder_sms"
|
||||
* }
|
||||
*
|
||||
* Response:
|
||||
@@ -28,6 +29,16 @@
|
||||
* "registration_url": "/snapporder/register_partial.php?userid=4331&token=lol"
|
||||
* }
|
||||
*
|
||||
* Request (renewal):
|
||||
*
|
||||
* $ curl /snapporder/api/register.php
|
||||
* {
|
||||
* "phone": "+4742345678",
|
||||
* "purchased": "2004-02-12" // optional, format: ISO-8601 date
|
||||
* "type": "renewal" // optional, possible value: "renewal"
|
||||
* "source": "snapporder_sms" // optional, possible values: "snapporder" or "snapporder_sms"
|
||||
* }
|
||||
*
|
||||
* TODO maybe check $_SERVER['REQUEST_METHOD']
|
||||
*/
|
||||
|
||||
@@ -60,11 +71,19 @@ if($data === NULL) {
|
||||
echo $crypt->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);
|
||||
|
||||
?>
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"type": "renewal",
|
||||
"phone": "+4744444444",
|
||||
"purchased": "2014-05-12"
|
||||
}
|
||||
Reference in new issue
Block a user