| 
<?php/**
 * @author     Pierre-Henry Soria <[email protected]>
 * @website    https://ph7.me
 * @license    MIT License
 */
 
 namespace PH7\ApiSimpleMenu\Route;
 
 use PH7\ApiSimpleMenu\Route\Exception\NotFoundException;
 use PH7\ApiSimpleMenu\Service\Exception\CannotLoginUserException;
 use PH7\ApiSimpleMenu\Service\Exception\EmailExistsException;
 use PH7\ApiSimpleMenu\Service\SecretKey;
 use PH7\ApiSimpleMenu\Service\User;
 
 use PH7\JustHttp\StatusCode;
 use PH7\PhpHttpResponseHeader\Http as HttpResponse;
 
 enum UserAction: string
 {
 case LOGIN = 'login';
 case CREATE = 'create';
 case RETRIEVE_ALL = 'retrieveall';
 case RETRIEVE = 'retrieve';
 case REMOVE = 'remove';
 case UPDATE = 'update';
 
 /**
 * @throws Exception\NotFoundException
 */
 public function getResponse(): string
 {
 $postBody = file_get_contents('php://input');
 $postBody = json_decode($postBody);
 
 // Ternary conditional operator operator
 $userId = $_REQUEST['id'] ?? ''; // using the null coalescing operator
 
 // retrieve JWT secret key, and pass it to User Service' constructor
 $jwtToken = SecretKey::getJwtSecretKey();
 $user = new User($jwtToken);
 
 try {
 // first, let's check if HTTP method for the requested endpoint is valid
 $expectHttpMethod = match ($this) {
 self::LOGIN => Http::POST_METHOD,
 self::CREATE => Http::POST_METHOD,
 self::UPDATE => Http::PUT_METHOD,
 self::RETRIEVE_ALL => Http::GET_METHOD,
 self::RETRIEVE => Http::GET_METHOD,
 self::REMOVE => Http::DELETE_METHOD
 };
 
 if (Http::doesHttpMethodMatch($expectHttpMethod) === false) {
 throw new NotFoundException('HTTP method is incorrect. Request not found');
 }
 
 $response = match ($this) {
 self::LOGIN => $user->login($postBody),
 self::CREATE => $user->create($postBody),
 self::UPDATE => $user->update($postBody),
 self::RETRIEVE_ALL => $user->retrieveAll(),
 self::RETRIEVE => $user->retrieve($userId),
 self::REMOVE => $user->remove($postBody),
 };
 } catch (CannotLoginUserException $e) {
 // Send 400 http status code
 HttpResponse::setHeadersByCode(StatusCode::BAD_REQUEST);
 
 $response = [
 'errors' => [
 'message' => $e->getMessage(),
 ]
 ];
 } catch (EmailExistsException $e) {
 HttpResponse::setHeadersByCode(StatusCode::BAD_REQUEST);
 
 $response = [
 'errors' => [
 'message' => $e->getMessage()
 ]
 ];
 }
 
 return json_encode($response);
 }
 }
 
 $action = $_REQUEST['action'] ?? null;
 
 $userAction = UserAction::tryFrom($action);
 if ($userAction) {
 echo $userAction->getResponse();
 } else {
 require_once 'not-found.routes.php';
 }
 
 |