ProfileController.php 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. namespace App\Controllers;
  3. use App\Database\Queries\UserQuery;
  4. use App\Web\ValidationChecker;
  5. use Psr\Http\Message\ResponseInterface as Response;
  6. use Psr\Http\Message\ServerRequestInterface as Request;
  7. class ProfileController extends Controller
  8. {
  9. /**
  10. * @param Request $request
  11. * @param Response $response
  12. *
  13. * @return Response
  14. * @throws \Twig\Error\LoaderError
  15. * @throws \Twig\Error\RuntimeError
  16. * @throws \Twig\Error\SyntaxError
  17. */
  18. public function profile(Request $request, Response $response): Response
  19. {
  20. $user = make(UserQuery::class)->get($request, $this->session->get('user_id'), true);
  21. return view()->render($response, 'user/edit.twig', [
  22. 'profile' => true,
  23. 'user' => $user,
  24. ]);
  25. }
  26. /**
  27. * @param Request $request
  28. * @param Response $response
  29. * @param int $id
  30. *
  31. * @return Response
  32. */
  33. public function profileEdit(Request $request, Response $response, int $id): Response
  34. {
  35. $user = make(UserQuery::class)->get($request, $id, true);
  36. $validator = ValidationChecker::make()
  37. ->rules([
  38. 'email.required' => filter_var(param($request, 'email'), FILTER_VALIDATE_EMAIL),
  39. 'email.unique' => $this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `email` = ? AND `email` <> ?', [param($request, 'email'), $user->email])->fetch()->count == 0,
  40. ])
  41. ->onFail(function ($rule) {
  42. $alerts = [
  43. 'email.required' => lang('email_required'),
  44. 'email.unique' => lang('email_taken'),
  45. ];
  46. $this->session->alert($alerts[$rule], 'danger');
  47. });
  48. if ($validator->fails()) {
  49. return redirect($response, route('profile'));
  50. }
  51. if (param($request, 'password') !== null && !empty(param($request, 'password'))) {
  52. $this->database->query('UPDATE `users` SET `email`=?, `password`=? WHERE `id` = ?', [
  53. param($request, 'email'),
  54. password_hash(param($request, 'password'), PASSWORD_DEFAULT),
  55. $user->id,
  56. ]);
  57. } else {
  58. $this->database->query('UPDATE `users` SET `email`=? WHERE `id` = ?', [
  59. param($request, 'email'),
  60. $user->id,
  61. ]);
  62. }
  63. $this->session->alert(lang('profile_updated'), 'success');
  64. $this->logger->info('User '.$this->session->get('username')." updated profile of $user->id.");
  65. return redirect($response, route('profile'));
  66. }
  67. }