Advertisement
Guest User

Untitled

a guest
Dec 15th, 2017
529
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 28.68 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * Author: HuyDang
  5.  */
  6. namespace Tacko\Users\Controllers\Api;
  7.  
  8. use App\Http\Controllers\Api\ApiBaseController;
  9. use Illuminate\Http\Request;
  10. use Tacko\Users\Repositories\User\UserRepository;
  11. /*use Tacko\Users\Repositories\UserDevice\UserDeviceRepository;*/
  12. use Core\Push\Repositories\Userdevices\UserdevicesRepository;
  13. use Tacko\Countries\Repositories\Country\CountryRepository;
  14.  
  15. use Mail;
  16. use Laravel\Passport\Http\Controllers\HandlesOAuthErrors;
  17. use Laravel\Passport\TokenRepository;
  18. use Laravel\Passport\Token;
  19. use Cartalyst\Sentinel\Laravel\Facades\Activation;
  20. use Cartalyst\Sentinel\Laravel\Facades\Sentinel;
  21. use Cartalyst\Sentinel\Laravel\Facades\Reminder;
  22. use Zend\Diactoros\Response as Psr7Response;
  23. use Psr\Http\Message\ServerRequestInterface;
  24. use League\OAuth2\Server\AuthorizationServer;
  25. use League\OAuth2\Server\Exception\OAuthServerException;
  26. use Tacko\Currencies\Repositories\Currency\CurrencyRepository;
  27. use Carbon\Carbon;
  28.  
  29.  
  30. /**
  31.  * @SWG\Resource(
  32.  *   apiVersion="1.0.0",
  33.  *   swaggerVersion="1.2",
  34.  *   resourcePath="/Auth",
  35.  *   description="Auth Api",
  36.  *   produces="['application/json']"
  37.  * )
  38.  */
  39. class AuthController extends ApiBaseController
  40. {
  41.     use HandlesOAuthErrors;
  42.  
  43.     /**
  44.      * The authorization server.
  45.      *
  46.      * @var AuthorizationServer
  47.      */
  48.     protected $server;
  49.  
  50.     /**
  51.      * The custom authorization server.
  52.      *
  53.      * @var CustomAuthorizationServer
  54.      */
  55.     protected $customServer;
  56.  
  57.  
  58.     /**
  59.      * The token repository instance.
  60.      *
  61.      * @var TokenRepository
  62.      */
  63.     protected $tokens;
  64.  
  65.     protected $countryRepository;
  66.     protected $userDeviceRepository;
  67.     protected $currencyRepository;
  68.  
  69.     public function __construct(Request $request,
  70.                                 UserRepository $userRepository,
  71.                                 CountryRepository $countryRepository,
  72.                                 UserdevicesRepository $userDeviceRepository,
  73.                                 AuthorizationServer $server,
  74.                                 TokenRepository $tokens,
  75.                                 ServerRequestInterface $requestHandle,
  76.                                 CurrencyRepository $currencyRepository)
  77.     {
  78.         $this->request = $request;
  79.         $this->server = $server;
  80.         $this->tokens = $tokens;
  81.  
  82.         $this->requestHandle = $requestHandle;
  83.  
  84.         $this->modelRepository = $userRepository;
  85.         $this->model = $userRepository->createModel();
  86.  
  87.         $this->countryRepository = $countryRepository;
  88.         $this->userDeviceRepository = $userDeviceRepository;
  89.         $this->currencyRepository = $currencyRepository;
  90.  
  91.         parent::__construct($request);
  92.  
  93.         $this->middleware('passport:api')->only('signOut');
  94.     }
  95.  
  96.     /**
  97.      * @SWG\Model(id="SignUpModel")
  98.      * @SWG\Property(name="country_id", type="integer", required=true, defaultValue="229"),
  99.      * @SWG\Property(name="phone_number", type="string", required=true, defaultValue="12345678"),
  100.      * @SWG\Property(name="email", type="string", required=true, defaultValue="bss.team.dev@gmail.com"),
  101.      * @SWG\Property(name="password", type="string", required=true, defaultValue="123456"),
  102.      * @SWG\Property(name="username", type="string", required=true, defaultValue="bss.team.dev@gmail.com"),
  103.      * @SWG\Property(name="name_of_user", type="string", required=true, defaultValue="BSSDev"),
  104.      * @SWG\Property(name="grant_type", type="string", required=true, defaultValue="password"),
  105.      * @SWG\Property(name="client_id", type="string", required=true, defaultValue="2"),
  106.      * @SWG\Property(name="client_secret", type="string", required=true, defaultValue="4p5Ib4Kgx5Q9edW775c6eHJ7Kg2sRu0IjZeRE7oz"),
  107.      * @SWG\Property(name="device_platform", type="string", required=true, defaultValue="ios"),
  108.      * @SWG\Property(name="device_token", type="string", required=true, defaultValue="a437dd18254449779569cc1322a87791a426ad0c3e33aaf92379fac65d89758e"),
  109.      * @SWG\Property(name="longitude", type="string", required=true, defaultValue="106.66033"),
  110.      * @SWG\Property(name="latitude", type="string", required=true, defaultValue="10.7919413"),
  111.      * @SWG\Api(
  112.      *   path="/api/auth/signUp",
  113.      *   @SWG\Operation(
  114.      *      method="POST",
  115.      *      summary="Sign Up",
  116.      *      nickname="signUp",
  117.      *      @SWG\Parameter(name="body", description="Request body", required=true, type="SignUpModel", paramType="body", allowMultiple=false),
  118.      *      @SWG\ResponseMessage(code=200, message="OK"),
  119.      *      @SWG\ResponseMessage(code=400, message="Invalid request params"),
  120.      *      @SWG\ResponseMessage(code=401, message="Caller is not authenticated"),
  121.      *      @SWG\ResponseMessage(code=404, message="Resource not found")
  122.      *   )
  123.      * )
  124.      */
  125.     public function store()
  126.     {
  127.         try {
  128.             $input = $this->getRequestInput();
  129.  
  130.             $country_id = $this->request->get('country_id');
  131.             $phone_number = $this->request->get('phone_number');
  132.             $username = $this->request->get('name_of_user');
  133.             $password = $this->request->get('password');
  134.  
  135.             $checkUserWithPhone = $this->model->where('phone_number', $phone_number)->where('country_id', $country_id)->first();
  136.             if(isset($checkUserWithPhone)){
  137.                 return $this->respondWithErrorKey('phone.exists', 409);
  138.             }
  139.  
  140.             $validatorErrors = $this->getValidator($input, $this->model->rules['create']);
  141.             if (!empty($validatorErrors)) {
  142.                 return $this->respondWithError($validatorErrors);
  143.             }
  144.             $result = Sentinel::register($input);
  145.             $user = Sentinel::findById($result->id);
  146.  
  147.             //Update information miss when use Sentinel Register
  148.             $user->username = $username;
  149.             $user->phone_number = $phone_number;
  150.             $user->country_id = $country_id;
  151.             $user->save();
  152.  
  153.             //Activation Account
  154.             $activation = Activation::create($user);
  155.             Activation::complete($user, $activation->code);
  156.  
  157.             $role = Sentinel::findRoleByName('Registered');
  158.             // Assign the group to the user
  159.             $role->users()->attach($user);
  160.  
  161.             /*Send welcome email to user*/
  162.             $dataView = array(
  163.                 "email" => $user->email,
  164.                 "password" => $password
  165.             );
  166.  
  167.             Mail::send('tacko/users::emails.welcome', $dataView, function ($message) use ($dataView) {
  168.                 $message->to($dataView['email'])->subject('Welcome to Tacko!');
  169.             });
  170.  
  171.             /*Sign In*/
  172.             $signIn = $this->signIn($this->requestHandle);
  173.  
  174.             return $signIn;
  175.  
  176.         } catch (\Exception $e) {
  177.             return $this->errorInternalError($e->getMessage());
  178.         }
  179.     }
  180.  
  181.     /**
  182.      * @SWG\Api(
  183.      *   path="/api/auth/activate/{code}",
  184.      *   @SWG\Operation(
  185.      *     summary="Activate user",
  186.      *     method="GET",
  187.      *     nickname="activateUser",
  188.      *     @SWG\Parameter(name="code", description="Verify Code", required=true, type="string", paramType="path", allowMultiple=false),
  189.      *     @SWG\Parameter(name="device_platform", description="Device Platform", required=true, type="string", paramType="query", allowMultiple=false, defaultValue="ios"),
  190.      *     @SWG\Parameter(name="device_token", description="Device Token", required=true, type="string", paramType="query", allowMultiple=false, defaultValue="a437dd18254449779569cc1322a87791a426ad0c3e33aaf92379fac65d89758e"),
  191.      *     @SWG\Parameter(name="longitude", description="Longitude", required=true, type="string", paramType="query", allowMultiple=false, defaultValue="106.66033"),
  192.      *     @SWG\Parameter(name="latitude", description="Latitude", required=true, type="string", paramType="query", allowMultiple=false, defaultValue="10.7919413"),
  193.      *     @SWG\ResponseMessage(code=200, message="OK"),
  194.      *     @SWG\ResponseMessage(code=400, message="Invalid request params"),
  195.      *     @SWG\ResponseMessage(code=401, message="Caller is not authenticated"),
  196.      *     @SWG\ResponseMessage(code=404, message="Resource not found")
  197.      *   )
  198.      * )
  199.      */
  200.  
  201.     public function activate($code)
  202.     {
  203.         try {
  204.             $userActivation = Activation::where('code', $code)->where('completed', 'false')->first();
  205.             if(isset($userActivation)){
  206.                 $user_id = $userActivation->user_id;
  207.                 $user = Sentinel::findById($user_id);
  208.                 if (Activation::complete($user, $code)) {
  209.                     Sentinel::login($user);
  210.                     // get last persistences => the newest one for current login request
  211.                     $persistences = $user->persistences()->latest()->first();
  212.                     $response = $user->toArray();
  213.                     $response['last_login'] = $this->parseToDateTime($response['last_login']);
  214.                     $response['created_at'] = $this->parseToDateTime($response['created_at']);
  215.                     $response['updated_at'] = $this->parseToDateTime($response['updated_at']);
  216.                     $response[$this->apiKeyName] = $persistences->code;
  217.                     $response['country'] = $this->countryRepository->find($user->country_id);
  218.  
  219.                     //Update longitude and latitude
  220.                     $longitude = $this->request->get('longitude');
  221.                     $latitude = $this->request->get('latitude');
  222.                     if($longitude && $latitude) {
  223.                         $user->longitude = $longitude;
  224.                         $user->latitude = $latitude;
  225.                     }
  226.                     $user->save();
  227.  
  228.                     // Update devices
  229.                     $input = [
  230.                         'device_type'  => $this->request->get('device_platform'),
  231.                         'device_token' => $this->request->get('device_token'),
  232.                     ];
  233.                     if ($input['device_type'] && $input['device_token']) {
  234.                         // Format input
  235.                         $input['device_type'] = strtolower($input['device_type']);
  236.  
  237.                         //Create or update device
  238.                         $this->createOrUpdateDevice($input, $user);
  239.                     }
  240.  
  241.                     return $this->respondWithSuccess($response);
  242.                 } else {
  243.                     return $this->respondWithErrorKey('users_activate_verify_failed', 400);
  244.                 }
  245.             }else{
  246.                 return $this->respondWithErrorKey('users_activate_verify_failed', 409);
  247.             }
  248.         }catch (\Exception $e) {
  249.             return $this->errorInternalError($e->getMessage());
  250.         }
  251.     }
  252.  
  253.     public function direct($code){
  254.         echo ('<a href="tacko://activate/'.$code.'"> confirm </a><script> window.location.href = "tacko://activate/'.$code.'"; window.open("tacko://activate/'.$code.'");</script>');die();
  255.     }
  256.  
  257.     /**
  258.      * @SWG\Model(id="SignInModel")
  259.      * @SWG\Property(name="username", type="string", required=true, defaultValue="bss.team.dev@gmail.com"),
  260.      * @SWG\Property(name="password", type="string", required=true, defaultValue="123456"),
  261.      * @SWG\Property(name="grant_type", type="string", required=true, defaultValue="password"),
  262.      * @SWG\Property(name="client_id", type="string", required=true, defaultValue="2"),
  263.      * @SWG\Property(name="client_secret", type="string", required=true, defaultValue="4p5Ib4Kgx5Q9edW775c6eHJ7Kg2sRu0IjZeRE7oz"),
  264.      * @SWG\Property(name="email", type="string", required=true, defaultValue="bss.team.dev@gmail.com"),
  265.      * @SWG\Property(name="device_platform", type="string", required=true, defaultValue="ios"),
  266.      * @SWG\Property(name="device_token", type="string", required=true, defaultValue="a437dd18254449779569cc1322a87791a426ad0c3e33aaf92379fac65d89758e"),
  267.      * @SWG\Property(name="longitude", type="string", required=true, defaultValue="106.66033"),
  268.      * @SWG\Property(name="latitude", type="string", required=true, defaultValue="10.7919413"),
  269.      * @SWG\Api(
  270.      *   path="/api/auth/signIn",
  271.      *   @SWG\Operation(
  272.      *      method="POST",
  273.      *      summary="Sign in",
  274.      *      nickname="signIn",
  275.      *      @SWG\Parameter(name="body", description="Request body", required=true, type="SignInModel", paramType="body", allowMultiple=false),
  276.      *      @SWG\ResponseMessage(code=200, message="OK"),
  277.      *      @SWG\ResponseMessage(code=400, message="Invalid request params"),
  278.      *      @SWG\ResponseMessage(code=401, message="Caller is not authenticated"),
  279.      *      @SWG\ResponseMessage(code=404, message="Resource not found")
  280.      *   )
  281.      * )
  282.      */
  283.     public function signIn(ServerRequestInterface $request)
  284.     {
  285.         $email = $this->request->get('email');
  286.         $password = $this->request->get('password');
  287.  
  288.         $credentials = [
  289.             'email' => $email,
  290.             'password' => $password
  291.         ];
  292.         $user = Sentinel::authenticate($credentials, $this->request->get('remember'));
  293.  
  294.         if (!$user) {
  295.             //return $this->respondWithErrorKey('login.fail', 403);
  296.             throw  OAuthServerException::invalidCredentials();
  297.         }
  298.         $access_token = Token::where('user_id', $user->id)->where('revoked', 0)->first();
  299.         if(isset($access_token)){
  300.             $this->tokens->revokeAccessToken($access_token->id);
  301.         }
  302.  
  303.         try {
  304.             //login with passport begin
  305.             $withErrorHandling = $this->withErrorHandling(function () use ($request) {
  306.                 $respondToAccessTokenRequest = $this->server->respondToAccessTokenRequest($request, new Psr7Response);
  307.                 return $respondToAccessTokenRequest;
  308.             });
  309.         }catch(\Exception $e){
  310.             return $this->errorWrongArgs($e->getMessage());
  311.         }
  312.         //$withErrorHandling instanceof \Zend\Diactoros\Response''
  313.         //login with passport end
  314.  
  315.         $token = json_decode((string)$withErrorHandling->getBody(), false);
  316.  
  317.         // get last persistences => the newest one for current login request
  318.         $persistences = $user->persistences()->latest()->first();
  319.  
  320.         $response = $user->toArray();
  321.         $response['last_login'] = $this->parseToDateTime($response['last_login']);
  322.         $response['created_at'] = $this->parseToDateTime($response['created_at']);
  323.         $response['updated_at'] = $this->parseToDateTime($response['updated_at']);
  324.         $response[$this->apiKeyName] = $token;
  325.         $response['country'] = $this->countryRepository->find($user->country_id);
  326.         $response['is_notification'] = (boolean)$response['is_notification'];
  327.  
  328.         //Update longitude and latitude
  329.         $longitude = $this->request->get('longitude');
  330.         $latitude = $this->request->get('latitude');
  331.         if($longitude && $latitude) {
  332.             $user->longitude = $longitude;
  333.             $user->latitude = $latitude;
  334.         }
  335.         $user->save();
  336.  
  337.         // Update devices
  338.         $input = [
  339.             'device_type' => $this->request->get('device_platform'),
  340.             'device_token' => $this->request->get('device_token'),
  341.         ];
  342.         if ($input['device_type'] && $input['device_token']) {
  343.             // Format input
  344.             $input['device_type'] = strtolower($input['device_type']);
  345.  
  346.             //Create or update device
  347.             $this->createOrUpdateDevice($input, $user);
  348.  
  349.         }
  350.  
  351.         /*Current User Currency*/
  352.         $currency = $this->currencyRepository->createModel()->where('country_id', $user->country_id)->first();
  353.         if(isset($currency)){
  354.             $response['local_currency'] = $currency->code_iso;
  355.         }else{
  356.             $response['local_currency'] = 'USD';
  357.         }
  358.  
  359.         return $this->respondWithSuccess($response);
  360.     }
  361.  
  362.     public function createOrUpdateDevice($input, $user)
  363.     {
  364.         if ($device = $this->userDeviceRepository->createModel()->where('device_type', $input['device_type'])->where('device_token', $input['device_token'])->first()) {
  365.             $device->user_id = $user->id;
  366.             $device->last_active = $user->last_login;
  367.             $device->save();
  368.         } else {
  369.             $checkUserIsset = $this->userDeviceRepository->createModel()->where('user_id', $user->id)->first();
  370.             $input['user_id'] = $user->id;
  371.             $input['last_active'] = $user->last_login;
  372.             if(isset($checkUserIsset)){
  373.                 $this->userDeviceRepository->update($checkUserIsset->id, $input);
  374.             }else{
  375.                 $this->userDeviceRepository->create($input);
  376.             }
  377.         }
  378.     }
  379.  
  380.     /**
  381.      * @SWG\Api(
  382.      *   path="/api/auth/signOut",
  383.      *   @SWG\Operation(
  384.      *     summary="Sign out",
  385.      *     method="POST",
  386.      *     nickname="signOut",
  387.      *     @SWG\ResponseMessage(code=200, message="OK"),
  388.      *     @SWG\ResponseMessage(code=400, message="Invalid request params"),
  389.      *     @SWG\ResponseMessage(code=401, message="Caller is not authenticated"),
  390.      *     @SWG\ResponseMessage(code=404, message="Resource not found")
  391.      *   )
  392.      * )
  393.      */
  394.     public function signOut()
  395.     {
  396.         try {
  397.             $user = $this->user()[0];
  398.             $access_token_id = $user->token()->id;
  399.             if ($device = $this->userDeviceRepository->createModel()->where('user_id', $user->id)->first()) {
  400.                 $this->userDeviceRepository->createModel()->where('device_token', $device->device_token)->delete();
  401.             }
  402.  
  403.             if (Sentinel::logout($user, $this->request->get('force', false))) {
  404.                 $access_token = $this->tokens->find($access_token_id);
  405.                 $access_token->revoke();
  406.                 return $this->respondWithSuccess('Logout Successful!');
  407.             } else {
  408.                 return $this->errorNotFound();
  409.             }
  410.         } catch (\Exception $e) {
  411.             return $this->errorInternalError($e->getMessage());
  412.         }
  413.     }
  414.  
  415.     /**
  416.      * @SWG\Model(
  417.      *    id="resendCodeModel",
  418.      *  @SWG\Property(name="email", type="string", required=true, defaultValue="bss.team.dev@gmail.com")
  419.      * )
  420.      */
  421.  
  422.     /**
  423.      * @SWG\Api(
  424.      *   path="/api/auth/resend",
  425.      *   @SWG\Operation(
  426.      *      method="PUT",
  427.      *      summary="Resend Code Activate",
  428.      *      nickname="resendCodeActivate",
  429.      *      @SWG\Parameter(name="body", description="Request body", required=true, type="resendCodeModel", paramType="body", allowMultiple=false),
  430.      *      @SWG\ResponseMessage(code=200, message="OK"),
  431.      *      @SWG\ResponseMessage(code=400, message="Invalid request params"),
  432.      *      @SWG\ResponseMessage(code=401, message="Caller is not authenticated"),
  433.      *      @SWG\ResponseMessage(code=404, message="Resource not found")
  434.      *   )
  435.      * )
  436.      */
  437.     public function resend()
  438.     {
  439.         try {
  440.             $email = $this->request->get('email');
  441.             $checkEmail = $this->model->where('email', $email)->first();
  442.             if (isset($checkEmail)) {
  443.                 $user = Sentinel::findById($checkEmail->id);
  444.                 $checkActivation = Activation::completed($user);
  445.                 if (!$checkActivation) {
  446.                     $activation = Activation::exists($user);
  447.  
  448.                     $random_hash = strtoupper(substr(md5(uniqid(rand(), true)), 4, 6));
  449.                     $activation->code = $random_hash;
  450.                     $activation->save();
  451.  
  452.                     $dataView = array(
  453.                         "id" => $user->id,
  454.                         "email" => $user->email,
  455.                         "code" => $activation->code
  456.                     );
  457.  
  458.                     Mail::send('tacko/users::emails.activeRegistration', $dataView, function ($message) use ($dataView) {
  459.                         $message->to($dataView['email'])->subject('Verify registration!');
  460.                     });
  461.  
  462.                     return $this->respondWithSuccess(array(
  463.                         'email' => $user->email,
  464.                         'message' => "We have resent you activate code!"
  465.                     ));
  466.                 } else {
  467.                     return $this->respondWithErrorKey('users_activate_verify_completed', 400);
  468.                 }
  469.             } else {
  470.                 return $this->respondWithErrorKey('users_code_exists_user', 400);
  471.             }
  472.         } catch (\Exception $e) {
  473.             return $this->errorInternalError($e->getMessage());
  474.         }
  475.     }
  476.  
  477.     /**
  478.      * @SWG\Model(
  479.      *    id="request_reset_password",
  480.      *  @SWG\Property(name="email", type="string", required=true, defaultValue="bss.team.dev@gmail.com"),
  481.      *  @SWG\Property(name="isWeb", type="boolean", required=false, defaultValue=false),
  482.      * )
  483.      */
  484.  
  485.     /**
  486.      * @SWG\Api(
  487.      *   path="/api/auth/requestResetPassword",
  488.      *   @SWG\Operation(
  489.      *      method="POST",
  490.      *      summary="Confirm Request Password",
  491.      *      nickname="confirmRequestPassword",
  492.      *      @SWG\Parameter(name="body", description="Request body", required=true, type="request_reset_password", paramType="body", allowMultiple=false),
  493.      *      @SWG\ResponseMessage(code=200, message="OK"),
  494.      *      @SWG\ResponseMessage(code=400, message="Invalid request params"),
  495.      *      @SWG\ResponseMessage(code=401, message="Caller is not authenticated"),
  496.      *      @SWG\ResponseMessage(code=404, message="Resource not found")
  497.      *   )
  498.      * )
  499.      */
  500.     public function requestResetPassword()
  501.     {
  502.         try {
  503.             $isWeb = $this->request->get('isWeb');
  504.             $input = $this->getRequestInput();
  505.             $validatorErrors = $this->getValidator($input, $this->model->rules['reset_password']);
  506.             if (!empty($validatorErrors)) {
  507.                 return $this->respondWithError($validatorErrors);
  508.             }
  509.  
  510.             $checkUser = $this->model->where('email', $input['email'])->first();
  511.  
  512.             if (isset($checkUser)) {
  513.                 $userRecord = $this->model->where('email', $input['email'])
  514.                     ->select(
  515.                         'id'
  516.                     )->first();
  517.  
  518.  
  519.                 $user = Sentinel::findById($userRecord->id);
  520.  
  521.                 if ($activation = Activation::completed($user)) {
  522.  
  523.                     $random_hash = strtoupper(substr(md5(uniqid(rand(), true)), 4, 6));
  524.  
  525.                     $now = Carbon::createFromFormat('Y-m-d H:i:s', date('Y-m-d H:i:s'))->format('c');
  526.                     $reminderExist = Reminder::exists($user);
  527.  
  528.                     if($reminderExist){
  529.                         $updated = Carbon::createFromFormat('Y-m-d H:i:s', $reminderExist->updated_at)->format('c');
  530.                         if(!$reminderExist->completed and (int)(strtotime($now) - strtotime($updated)) > 900){/*Expire after 15 minutes*/
  531.                             $reminderExist->code = $random_hash;
  532.                             $reminderExist->save();
  533.                             $results = $reminderExist;
  534.                         }else{
  535.                             $results = $reminderExist;
  536.                         }
  537.                     }else{
  538.                         $results = Reminder::create($user);
  539.                         $results->code = $random_hash;
  540.                         $results->save();
  541.                     }
  542.  
  543.                     $reminder = array(
  544.                         "id" => $userRecord->id,
  545.                         "email" => $input['email'],
  546.                         "code" => $results->code
  547.                     );
  548.  
  549.                     if ($isWeb === true) {
  550.                         $reminder = $results;
  551.                         Mail::send('tacko/users::password.requestResetPasswordFrontend', compact('user', 'reminder'), function ($message) use ($user) {
  552.                             $message->to($user->email)->subject('Request reset password!');
  553.                         });
  554.                     } else {
  555.                         Mail::send('tacko/users::password.requestResetPassword', $reminder, function ($message) use ($reminder) {
  556.                             $message->to($reminder['email'])->subject('Request reset password!');
  557.                         });
  558.                     }
  559.                     return $this->respondWithSuccess("We have sent you reset password code!");
  560.                 } else {
  561.                     return $this->respondWithErrorKey('users_activate_verify_failed', 403);
  562.                 }
  563.             } else {
  564.                 return $this->respondWithErrorKey('user.deleted', 403);
  565.             }
  566.         } catch (\Exception $e) {
  567.             return $this->errorInternalError($e->getMessage());
  568.         }
  569.     }
  570.  
  571.     public function resetPass($id, $code)
  572.     {
  573.         echo('<a href="tacko://reset?userId=' . $id . '&code=' . $code . '"> confirm </a><script> window.location.href = "tacko://reset?userId=' . $id . '&code=' . $code . '"; window.open("tacko://reset?userId=' . $id . '&code=' . $code . '");</script>');
  574.         die();
  575.     }
  576.  
  577.     /**
  578.      * @SWG\Model(
  579.      *    id="activatePass",
  580.      *  @SWG\Property(name="email", type="string", required=true, defaultValue="bss.team.dev@gmail.com"),
  581.      *  @SWG\Property(name="code", type="string", required=true, defaultValue="uwTXhN"),
  582.      *  @SWG\Property(name="newPassword", type="string", required=true, defaultValue="hoanggia3116"),
  583.      *  @SWG\Property(name="newPassword_confirmation", type="string", required=true, defaultValue="hoanggia3116")
  584.      * )
  585.      */
  586.  
  587.     /**
  588.      * @SWG\Api(
  589.      *   path="/api/auth/resetPassword",
  590.      *   @SWG\Operation(
  591.      *     summary="Reset Password",
  592.      *     method="PUT",
  593.      *     nickname="resetPassword",
  594.      *     @SWG\Parameter(name="body", description="Request body", required=true, type="activatePass", paramType="body", allowMultiple=false),
  595.      *     @SWG\ResponseMessage(code=200, message="OK"),
  596.      *     @SWG\ResponseMessage(code=400, message="Invalid request params"),
  597.      *     @SWG\ResponseMessage(code=401, message="Caller is not authenticated"),
  598.      *     @SWG\ResponseMessage(code=404, message="Resource not found")
  599.      *   )
  600.      * )
  601.      */
  602.     public function resetPassword()
  603.     {
  604.         try {
  605.             $data = $this->request->all();
  606.             $email = $this->request->get('email');
  607.  
  608.             $validatorErrors = $this->getValidator($data, $this->model->rules['reset_password_active']);
  609.             if (!empty($validatorErrors)) {
  610.                 return $this->respondWithError($validatorErrors);
  611.             }
  612.  
  613.             $checkUserEmail = $this->model->where('email', $email)->first();
  614.             if (isset($checkUserEmail)) {
  615.                 $userId = $checkUserEmail->id;
  616.                 $code = $this->request->get('code');
  617.                 $new_pass = $this->request->get('newPassword');
  618.  
  619.                 $checkUser = $this->modelRepository->find($userId);
  620.  
  621.                 if (isset($checkUser)) {
  622.                     $user = Sentinel::findById($userId);
  623.  
  624.                     $now = Carbon::createFromFormat('Y-m-d H:i:s', date('Y-m-d H:i:s'))->format('c');
  625.                     $reminderExist = Reminder::exists($user);
  626.  
  627.                     if(isset($reminderExist) and !$reminderExist->completed){
  628.                         $updated = Carbon::createFromFormat('Y-m-d H:i:s', $reminderExist->updated_at)->format('c');
  629.  
  630.                         /*Expire after 15 minutes*/
  631.                         if((int)(strtotime($now) - strtotime($updated)) < 900){
  632.                             $reminder = Reminder::complete($user, $code, $new_pass);
  633.                             $data = array(
  634.                                 'email' => $user->email,
  635.                                 'password' => $new_pass
  636.                             );
  637.  
  638.                             if ($reminder) {
  639.                                 Mail::send('tacko/users::password.newPassword', $data, function ($message) use ($data) {
  640.                                     $message->to($data['email'])->subject('Tacko Account New password!');
  641.                                 });
  642.                                 return $this->respondWithSuccess($data);
  643.                             } else {
  644.                                 return $this->respondWithErrorKey('reset.pwd.sent.pwd.failed.or.expired', 403);
  645.                             }
  646.                         }else{
  647.                             return $this->respondWithErrorKey('reset.pwd.sent.pwd.failed.or.expired', 403);
  648.                         }
  649.                     }else{
  650.                         return $this->respondWithErrorKey('reset.fail', 403);
  651.                     }
  652.                 } else {
  653.                     return $this->respondWithErrorKey('user.deleted', 403);
  654.                 }
  655.             }
  656.  
  657.         } catch (\Exception $e) {
  658.             return $this->errorInternalError($e->getMessage());
  659.         }
  660.     }
  661. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement