RecuperarContrasenaController.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. namespace app\modules\publico\controllers;
  3. use app\modules\mail\models\NotificacionCorreo;
  4. use common\data\Respuesta;
  5. use common\rest\JsonController;
  6. use DateTime;
  7. use DateTimeZone;
  8. use v1\models\RecuperarContrasena;
  9. use v1\models\Sesion;
  10. use v1\models\Usuario;
  11. use yii\db\Expression;
  12. use yii\web\Session;
  13. class RecuperarContrasenaController extends JsonController {
  14. public $modelClass = 'v1\models\RecuperarContrasena';
  15. public function actionIndex() {
  16. $correo = trim($this->req->getBodyParam("correo", ""));
  17. $usuario = null;
  18. if ($correo !== "") {
  19. $usuario = Usuario::find()->andWhere(["correo" => $correo])->one();
  20. }
  21. if ($usuario === null) {
  22. return (new Respuesta())
  23. ->esError()
  24. ->mensaje('No se ha encontrado el Usuario, favor de verificar el correo.');
  25. }
  26. try {
  27. $recuperarContrasena = new RecuperarContrasena();
  28. $recuperarContrasena->uuid();
  29. $recuperarContrasena->idUsuario = $usuario->id;
  30. $recuperarContrasena->token = mt_rand(10000000, 99999999);
  31. $recuperarContrasena->creado = new Expression('now()');
  32. $recuperarContrasena->load($this->req->getBodyParams(), '');
  33. if (!$recuperarContrasena->save()) {
  34. return (new Respuesta())
  35. ->esError()
  36. ->mensaje('No fue posible crear el código de recuperación');
  37. }
  38. $tz = new DateTimeZone('America/Hermosillo');
  39. $fechaNotificacion = new DateTime();
  40. $fechaNotificacion->setTimezone($tz);
  41. $fechaNotificacion = $fechaNotificacion->format('d/m/Y H:i a');
  42. $parametros = [
  43. "prioridad" => NotificacionCorreo::PRIORIDAD_1,
  44. "asunto" => "Notificación SIISTAI Recuperar Contraseña: " . $fechaNotificacion,
  45. "cuerpo" => $this->renderPartial('correo', ["datos" => $recuperarContrasena, "usuario" => $usuario]),
  46. "receptores" => [$correo],
  47. "adjuntos" => []
  48. ];
  49. $resultado = NotificacionCorreo::enviarMultiple($parametros);
  50. $recuperarContrasena->refresh();
  51. return (new Respuesta())
  52. ->mensaje("Se ha enviado un correo con los datos necesarios para recuperar su contraseña.");
  53. } catch (\Exception $e) {
  54. return (new Respuesta())
  55. ->esError()
  56. ->mensaje($e->getMessage());
  57. }
  58. }
  59. public function actionVerificar() {
  60. $correo = trim($this->req->get("correo", ""));
  61. $token = intval($this->req->get("token", 0));
  62. $usuario = null;
  63. if ($correo !== "") {
  64. $usuario = Usuario::find()->andWhere(["correo" => $correo])->one();
  65. }
  66. if ($token !== 0) {
  67. $encontrarToken = RecuperarContrasena::find()
  68. ->andWhere([
  69. 'idUsuario' => $usuario->id,
  70. 'token' => $token,
  71. ])
  72. ->andWhere(['is not', 'utilizado', null]);
  73. if ($encontrarToken->exists()) {
  74. return (new Respuesta())
  75. ->esError()
  76. ->mensaje('Este token ya fue utilizado');
  77. }
  78. }
  79. if ($usuario !== null) {
  80. $recuperarContrasena = RecuperarContrasena::find()
  81. ->andWhere([
  82. "idUsuario" => $usuario->id,
  83. "token" => $token,
  84. 'utilizado' => null
  85. ])
  86. ->one();
  87. if ($recuperarContrasena !== null) {
  88. return (new Respuesta())
  89. ->mensaje('Token válido');
  90. } else {
  91. return (new Respuesta())
  92. ->esError()
  93. ->mensaje('El Token parece no coincidir, favor de revisar');
  94. }
  95. } else {
  96. return (new Respuesta())
  97. ->esError()
  98. ->mensaje('Ha ocurrido un error');
  99. }
  100. }
  101. public function actionCambiar() {
  102. $correo = trim($this->req->getBodyParam("correo", ""));
  103. $token = intval($this->req->getBodyParam("token", null));
  104. $pwd = trim($this->req->getBodyParam("pwd", ""));
  105. $usuario = null;
  106. if ($correo !== "") {
  107. $usuario = Usuario::find()->andWhere(["correo" => $correo])->one();
  108. }
  109. /** @var \v1\models\Usuario $usuario */
  110. if ($usuario !== null) {
  111. $validarToken = RecuperarContrasena::find()
  112. ->andWhere([
  113. 'token' => $token,
  114. 'idUsuario' => $usuario->id
  115. ])
  116. ->one();
  117. if ($validarToken !== null) {
  118. $usuario->agregarClave($pwd);
  119. $usuario->modificado = new Expression('now()');
  120. if (!$usuario->save()) {
  121. return (new Respuesta($usuario))
  122. ->mensaje("Ocurrió un error al guardar al recuperar su contraseña, favor de intentarlo de nuevo");
  123. }
  124. $validarToken->utilizado = new Expression('now()');
  125. if (!$validarToken->save()) {
  126. return (new Respuesta($usuario))
  127. ->mensaje("Ocurrió un error al guardar al recuperar su contraseña, favor de intentarlo de nuevo");
  128. }
  129. $sesion = Sesion::find()
  130. ->andWhere([
  131. 'correo' => $correo,
  132. 'eliminado' => null
  133. ])
  134. ->one();
  135. $usuario->refresh();
  136. return (new Respuesta($sesion))
  137. ->mensaje("Contraseña actualizada");
  138. } else {
  139. return (new Respuesta())
  140. ->esError()
  141. ->mensaje('Error al intentar cambiar su contraseña, favor de intentar de nuevo');
  142. }
  143. }
  144. }
  145. }