UserController::actionUpdate()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 23
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
cc 3
eloc 12
c 2
b 0
f 1
nc 3
nop 3
dl 0
loc 23
rs 9.0856
1
<?php
2
3
namespace App\Controller;
4
5
use App\Model\User;
6
use App\Common\JsonException;
7
use App\Requests\RequestPasswordResetRequest;
8
use App\Requests\PasswordResetRequest;
9
use App\Requests\UserCreateRequest;
10
use App\Requests\UserUpdateRequest;
11
use Slim\Http\Request;
12
use Slim\Http\Response;
13
14
class UserController extends CrudController
15
{
16
    /**
17
     * @param Request  $request
18
     * @param Response $response
19
     * @param array    $args
20
     *
21
     * @return \Psr\Http\Message\ResponseInterface
22
     * @throws JsonException
23
     */
24
    public function actionCreate(Request $request, Response $response, $args)
25
    {
26
        $params = $request->getParsedBody();
27
28
        $this->validateRequestParams($params, $args['entity'], new UserCreateRequest());
29
30
        $exist = User::exist($params['data']['attributes']['email']);
31
32
        if ($exist) {
33
            throw new JsonException($args['entity'], 400, 'User already exists', 'User already exists');
34
        }
35
36
        $user = User::create($params['data']['attributes'], $params['data']['attributes']['password']);
37
38
        $result = $this->encoder->encode($request, $user);
39
40
        return $this->apiRenderer->jsonResponse($response, 200, $result);
41
    }
42
43
    /**
44
     * @param Request  $request
45
     * @param Response $response
46
     * @param array    $args
47
     *
48
     * @return \Psr\Http\Message\ResponseInterface
49
     * @throws JsonException
50
     */
51
    public function actionUpdate(Request $request, Response $response, $args)
52
    {
53
        $user = User::find($args['id']);
54
55
        if (!$user) {
56
            throw new JsonException($args['entity'], 404, 'Not found', 'Entity not found');
57
        }
58
59
        $params = $request->getParsedBody();
60
61
        $this->validateRequestParams($params, $args['entity'], new UserUpdateRequest());
62
63
        $user->update($params['data']['attributes']);
64
65
        if (isset($params['data']['attributes']['password'])) {
66
            $user->setPassword($params['data']['attributes']['password']);
67
            $user->save();
68
        }
69
70
        $result = $this->encoder->encode($request, $user);
71
72
        return $this->apiRenderer->jsonResponse($response, 200, $result);
73
    }
74
75
    /**
76
     * @param Request  $request
77
     * @param Response $response
78
     * @param array    $args
79
     *
80
     * @return \Psr\Http\Message\ResponseInterface
81
     * @throws JsonException
82
     * @throws \Exception
83
     * @throws \Throwable
84
     */
85
    public function actionRequestPasswordReset(Request $request, Response $response, $args)
86
    {
87
        $params = $request->getParsedBody();
88
89
        $this->validateRequestParams($params, $args['entity'], new RequestPasswordResetRequest());
90
91
        $user = User::findUserByEmail($params['data']['attributes']['email']);
92
93
        if (!$user) {
94
            throw new JsonException($args['entity'], 400, 'Bad request', 'Bad request');
95
        }
96
97
        if (!User::isPasswordResetTokenValid($user->password_reset_token)) {
98
            $user->generatePasswordResetToken();
99
        }
100
101
        if (!$user->save()) {
102
            throw new JsonException($args['entity'], 400, 'Bad request', 'Bad request');
103
        }
104
105
        $message = \Swift_Message::newInstance('Восстановление пароля для доступа в example.com')
106
            ->setFrom(['[email protected]' => 'Почтовик example.com'])
107
            ->setTo([$user->email => $user->full_name])
108
            ->setBody($this->mailRenderer->render(
109
                '/RequestPasswordReset.php',
110
                [
111
                    'host'  => $this->settings['params']['host'],
112
                    'token' => $user->password_reset_token
113
                ]
114
            ), 'text/html');
115
116
        if ($this->mailer->send($message)) {
117
            return $this->apiRenderer->jsonResponse($response, 204);
118
        };
119
120
        throw new JsonException($args['entity'], 400, 'Bad request', 'Bad request');
121
    }
122
123
    /**
124
     * @param Request  $request
125
     * @param Response $response
126
     * @param array    $args
127
     *
128
     * @return \Psr\Http\Message\ResponseInterface
129
     * @throws JsonException
130
     */
131
    public function actionPasswordReset(Request $request, Response $response, $args)
132
    {
133
        $params = $request->getParsedBody();
134
135
        $this->validateRequestParams($params, $args['entity'], new PasswordResetRequest());
136
137
        $user = User::findByPasswordResetToken($params['data']['attributes']['token']);
138
139
        if ($user) {
140
            $user->setPassword($params['data']['attributes']['password']);
141
            $user->removePasswordResetToken();
142
143
            if ($user->save()) {
144
                return $this->apiRenderer->jsonResponse($response, 204);
145
            };
146
        }
147
148
        throw new JsonException($args['entity'], 400, 'Bad request', 'Bad request');
149
    }
150
}
151