Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
This file provides C.R.U.D functionalities for the User Entity.
<?php
namespace App;
use Exception;
use App\UserModel;
use App\TokenModel;
use App\Controller;
use Firebase\JWT\JWT;
use App\RequestMiddleware;
/**
* UserController - The UserController. This Controller makes use of a few Models for creating, updating, fetching and deleting Users.
*
* @author Ilori Stephen A <stephenilori458@gmail.com>
* @link https://github.com/learningdollars/php-rest-api/App/Controller/UserController.php
* @license MIT
*/
class UserController extends Controller {
/**
* createNewUser
*
* Creates a new User.
*
* @param mixed $request $response Contains the Request and Respons Object from the router.
* @return mixed Anonymous
*/
public function createNewUser($request, $response)
{
$Response = [];
$sapi_type = php_sapi_name();
$Middleware = new RequestMiddleware();
$Middleware = $Middleware::acceptsJson();
if (!$Middleware) {
array_push($Response, [
'status' => 400,
'message' => 'Sorry, Only JSON Contents are allowed to access this Endpoint.',
'data' => []
]);
$response->code(400)->json($Response);
return;
}
$data = json_decode($request->body());
// Do some validation...
$validationObject = array(
(Object) [
'validator' => 'required',
'data' => isset($data->firstName) ? $data->firstName : '',
'key' => 'First Name'
],
(Object) [
'validator' => 'string',
'data' => isset($data->firstName) ? $data->firstName : '',
'key' => 'First Name'
],
(Object) [
'validator' => 'required',
'data' => isset($data->lastName) ? $data->lastName : '',
'key' => 'Last Name',
],
(Object) [
'validator' => 'string',
'data' => isset($data->lastName) ? $data->lastName : '',
'key' => 'Last Name',
],
(Object) [
'validator' => 'emailExists',
'data' => isset($data->email) ? $data->email : '',
'key' => 'Email'
],
(Object) [
'validator' => 'min:7',
'data' => isset($data->password) ? $data->password : '',
'key' => 'Password'
]
);
$validationBag = Parent::validation($validationObject);
if ($validationBag->status) {
$response->code(400)->json($validationBag);
return;
}
// Trim the response and create the account....
$payload = array(
'firstName' => htmlspecialchars(stripcslashes(strip_tags($data->firstName))),
'lastName' => htmlspecialchars(stripcslashes(strip_tags($data->lastName))),
'email' => stripcslashes(strip_tags($data->email)),
'password' => password_hash($data->password, PASSWORD_BCRYPT),
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
);
try {
$UserModel = new UserModel();
$UserData = $UserModel::createUser($payload);
if ($UserData['status']) {
// Initialize JWT Token....
$tokenExp = date('Y-m-d H:i:s');
$tokenSecret = Parent::JWTSecret();
$tokenPayload = array(
'iat' => time(),
'iss' => 'PHP_MINI_REST_API', //!!Modify:: Modify this to come from a constant
"exp" => strtotime('+ 7 Days'),
"user_id" => $UserData['data']['user_id']
);
$Jwt = JWT::encode($tokenPayload, $tokenSecret);
// Save JWT Token...
$TokenModel = new TokenModel();
$TokenModel::createToken([
'user_id' => $UserData['data']['user_id'],
'jwt_token'=> $Jwt
]);
$UserData['data']['token'] = $Jwt;
// Return Response............
$Response['status'] = 201;
$Response['message'] = '';
$Response['data'] = $UserData;
$response->code(201)->json($Response);
return;
}
$Response['status'] = 500;
$Response['message'] = 'An unexpected error occurred and your account could not be created. Please, try again later.';
$Response['data'] = [];
$response->code(500)->json($Response);
return;
} catch (Exception $e) {
$Response['status'] = 500;
$Response['message'] = $e->getMessage();
$Response['data'] = [];
$response->code(500)->json($Response);
return;
}
}
/**
* login
*
* Authenticates a New User.
*
* @param mixed $request $response Contains the Request and Respons Object from the router.
* @return mixed Anonymous
*/
public function login($request, $response)
{
$Response = [];
$sapi_type = php_sapi_name();
$Middleware = new RequestMiddleware();
$Middleware = $Middleware::acceptsJson();
if (!$Middleware) {
array_push($Response, [
'status' => 400,
'message' => 'Sorry, Only JSON Contents are allowed to access this Endpoint.',
'data' => []
]);
$response->code(400)->json($Response);
return;
}
$data = json_decode($request->body());
// Do some validation...
$validationObject = array(
(Object) [
'validator' => 'required',
'data' => isset($data->email) ? $data->email : '',
'key' => 'Email'
],
(Object) [
'validator' => 'required',
'data' => isset($data->password) ? $data->password : '',
'key' => 'Password'
],
(Object) [
'validator' => 'min:7',
'data' => isset($data->password) ? $data->password : '',
'key' => 'Password'
]
);
$validationBag = Parent::validation($validationObject);
if ($validationBag->status) {
$response->code(400)->json($validationBag);
return;
}
// Trim the response and create the account....
$payload = array(
'email' => stripcslashes(strip_tags($data->email)),
'password' => $data->password,
'updated_at' => date('Y-m-d H:i:s')
);
try {
$UserModel = new UserModel();
$UserData = $UserModel::checkEmail($payload['email']);
if ($UserData['status']) {
if (password_verify($payload['password'], $UserData['data']['password'])) {
// Initialize JWT Token....
$tokenExp = date('Y-m-d H:i:s');
$tokenSecret = Parent::JWTSecret();
$tokenPayload = array(
'iat' => time(),
'iss' => 'PHP_MINI_REST_API', //!!Modify:: Modify this to come from a constant
"exp" => strtotime('+ 7 Days'),
"user_id" => $UserData['data']['id']
);
$Jwt = JWT::encode($tokenPayload, $tokenSecret);
// Save JWT Token...
$TokenModel = new TokenModel();
$TokenModel::createToken([
'user_id' => $UserData['data']['id'],
'jwt_token'=> $Jwt
]);
$UserData['data']['token'] = $Jwt;
// Return Response............
$Response['status'] = 201;
$Response['message'] = '';
$Response['data'] = $UserData;
$response->code(201)->json($Response);
return;
}
$Response['status'] = 401;
$Response['message'] = 'Please, check your Email and Password and try again.';
$Response['data'] = [];
$response->code(401)->json($Response);
return;
}
$Response['status'] = 500;
$Response['message'] = 'An unexpected error occurred and your action could not be completed. Please, try again later.';
$Response['data'] = [];
$response->code(500)->json($Response);
return;
} catch (Exception $e) {
$Response['status'] = 500;
$Response['message'] = $e->getMessage();
$Response['data'] = [];
$response->code(500)->json($Response);
return;
}
}
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment