Completed
Pull Request — experimental/sf (#3263)
by Kentaro
44:38 queued 08:15
created

MemberController::create()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 50

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 31
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
nc 2
nop 1
dl 0
loc 50
rs 9.0909
c 0
b 0
f 0
ccs 31
cts 31
cp 1
crap 3
1
<?php
2
3
/*
4
 * This file is part of EC-CUBE
5
 *
6
 * Copyright(c) LOCKON CO.,LTD. All Rights Reserved.
7
 *
8
 * http://www.lockon.co.jp/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Eccube\Controller\Admin\Setting\System;
15
16
use Eccube\Controller\AbstractController;
17
use Eccube\Entity\Member;
18
use Eccube\Event\EccubeEvents;
19
use Eccube\Event\EventArgs;
20
use Eccube\Form\Type\Admin\MemberType;
21
use Eccube\Repository\MemberRepository;
22
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
23
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
24
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
25
use Symfony\Component\HttpFoundation\Request;
26
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
27
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
28
29
class MemberController extends AbstractController
0 ignored issues
show
introduced by
Missing class doc comment
Loading history...
30
{
31
    /**
32
     * @var TokenStorageInterface
33
     */
34
    protected $tokenStorage;
35
36
    /**
37
     * @var MemberRepository
38
     */
39
    protected $memberRepository;
40
41
    /**
42
     * @var EncoderFactoryInterface
43
     */
44
    protected $encoderFactory;
45
46
    /**
47
     * MemberController constructor.
48
     *
49
     * @param EncoderFactoryInterface $encoderFactory
50
     * @param MemberRepository $memberRepository
0 ignored issues
show
introduced by
Expected 8 spaces after parameter type; 1 found
Loading history...
51
     * @param TokenStorageInterface $tokenStorage
0 ignored issues
show
introduced by
Expected 3 spaces after parameter type; 1 found
Loading history...
52
     */
53 17
    public function __construct(
54
        EncoderFactoryInterface $encoderFactory,
55
        MemberRepository $memberRepository,
56
        TokenStorageInterface $tokenStorage
57
    ) {
58 17
        $this->encoderFactory = $encoderFactory;
59 17
        $this->memberRepository = $memberRepository;
60 17
        $this->tokenStorage = $tokenStorage;
61
    }
62
63
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
64
     * @Route("/%eccube_admin_route%/setting/system/member", name="admin_setting_system_member")
65
     * @Template("@admin/Setting/System/member.twig")
66
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
67 1 View Code Duplication
    public function index(Request $request)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
68
    {
69 1
        $Members = $this->memberRepository->findBy([], ['sort_no' => 'DESC']);
70
71 1
        $builder = $this->formFactory->createBuilder();
72
73 1
        $event = new EventArgs(
74
            [
75 1
                'builder' => $builder,
76 1
                'Members' => $Members,
77
            ],
78 1
            $request
79
        );
80 1
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_INDEX_INITIALIZE, $event);
81
82 1
        $form = $builder->getForm();
83
84
        return [
85 1
            'form' => $form->createView(),
86 1
            'Members' => $Members,
87
        ];
88
    }
89
90
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
91
     * @Route("/%eccube_admin_route%/setting/system/member/new", name="admin_setting_system_member_new")
92
     * @Template("@admin/Setting/System/member_edit.twig")
93
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
94 3
    public function create(Request $request)
95
    {
96 3
        $LoginMember = clone $this->tokenStorage->getToken()->getUser();
97 3
        $this->entityManager->detach($LoginMember);
98
99 3
        $Member = new Member();
100 3
        $builder = $this->formFactory
101 3
            ->createBuilder(MemberType::class, $Member);
102
103 3
        $event = new EventArgs([
104 3
            'builder' => $builder,
105 3
            'Member' => $Member,
106 3
        ], $request);
107 3
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_INITIALIZE, $event);
108
109 3
        $form = $builder->getForm();
110 3
        $form->handleRequest($request);
111
112 3
        if ($form->isSubmitted() && $form->isValid()) {
113 1
            $encoder = $this->encoderFactory->getEncoder($Member);
114 1
            $salt = $encoder->createSalt();
115 1
            $rawPassword = $Member->getPassword();
116 1
            $encodedPassword = $encoder->encodePassword($rawPassword, $salt);
117
            $Member
118 1
                ->setSalt($salt)
119 1
                ->setPassword($encodedPassword);
120
121 1
            $this->memberRepository->save($Member);
122
123 1
            $event = new EventArgs(
124
                [
125 1
                    'form' => $form,
126 1
                    'Member' => $Member,
127
                ],
128 1
                $request
129
            );
130 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_COMPLETE, $event);
131
132 1
            $this->addSuccess('admin.member.save.complete', 'admin');
133
134 1
            return $this->redirectToRoute('admin_setting_system_member');
135
        }
136
137 2
        $this->tokenStorage->getToken()->setUser($LoginMember);
138
139
        return [
140 2
            'form' => $form->createView(),
141 2
            'Member' => $Member,
142
        ];
143
    }
144
145
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
introduced by
Doc comment for parameter "$Member" missing
Loading history...
146
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/edit", requirements={"id" = "\d+"}, name="admin_setting_system_member_edit")
147
     * @Template("@admin/Setting/System/member_edit.twig")
148
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
149 3
    public function edit(Request $request, Member $Member)
150
    {
151 3
        $LoginMember = clone $this->tokenStorage->getToken()->getUser();
152 3
        $this->entityManager->detach($LoginMember);
153
154 3
        $previousPassword = $Member->getPassword();
155 3
        $Member->setPassword($this->eccubeConfig['eccube_default_password']);
156
157 3
        $builder = $this->formFactory
158 3
            ->createBuilder(MemberType::class, $Member);
159
160 3
        $event = new EventArgs(
161
            [
162 3
                'builder' => $builder,
163 3
                'Member' => $Member,
164
            ],
165 3
            $request
166
        );
167 3
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_INITIALIZE, $event);
168
169 3
        $form = $builder->getForm();
170 3
        $form->handleRequest($request);
171
172 3
        if ($form->isSubmitted() && $form->isValid()) {
173 1
            if ($Member->getpassword() === $this->eccubeConfig['eccube_default_password']) {
174
                // 編集時にパスワードを変更していなければ
175
                // 変更前のパスワード(暗号化済み)をセット
176 1
                $Member->setPassword($previousPassword);
177
            } else {
178
                $salt = $Member->getSalt();
179
                // 2系からのデータ移行でsaltがセットされていない場合はsaltを生成.
180
                if (empty($salt)) {
181
                    $salt = bin2hex(openssl_random_pseudo_bytes(5));
182
                    $Member->setSalt($salt);
183
                }
184
185
                $rawPassword = $Member->getPassword();
186
                $encoder = $this->encoderFactory->getEncoder($Member);
187
                $encodedPassword = $encoder->encodePassword($rawPassword, $salt);
188
                $Member->setPassword($encodedPassword);
189
            }
190
191 1
            $this->memberRepository->save($Member);
192
193 1
            $event = new EventArgs(
194
                [
195 1
                    'form' => $form,
196 1
                    'Member' => $Member,
197
                ],
198 1
                $request
199
            );
200 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_COMPLETE, $event);
201
202 1
            $this->addSuccess('admin.member.save.complete', 'admin');
203
204 1
            return $this->redirectToRoute('admin_setting_system_member');
205
        }
206
207 2
        $this->tokenStorage->getToken()->setUser($LoginMember);
208
209
        return [
210 2
            'form' => $form->createView(),
211 2
            'Member' => $Member,
212
        ];
213
    }
214
215
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
introduced by
Doc comment for parameter "$Member" missing
Loading history...
216
     * @Method("PUT")
217
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/up", requirements={"id" = "\d+"}, name="admin_setting_system_member_up")
218
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
219 2 View Code Duplication
    public function up(Request $request, Member $Member)
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
220
    {
221 2
        $this->isTokenValid();
222
223
        try {
224 2
            $this->memberRepository->up($Member);
225
226 2
            $this->addSuccess('admin.member.up.complete', 'admin');
227
        } catch (\Exception $e) {
228
            log_error('メンバー表示順更新エラー', [$Member->getId(), $e]);
229
230
            $this->addError('admin.member.up.error', 'admin');
231
        }
232
233 2
        return $this->redirectToRoute('admin_setting_system_member');
234
    }
235
236
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
introduced by
Doc comment for parameter "$Member" missing
Loading history...
237
     * @Method("PUT")
238
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/down", requirements={"id" = "\d+"}, name="admin_setting_system_member_down")
239
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
240 3 View Code Duplication
    public function down(Request $request, Member $Member)
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
241
    {
242 3
        $this->isTokenValid();
243
244
        try {
245 3
            $this->memberRepository->down($Member);
246
247 2
            $this->addSuccess('admin.member.down.complete', 'admin');
248 1
        } catch (\Exception $e) {
249 1
            log_error('メンバー表示順更新エラー', [$Member->getId(), $e]);
250
251 1
            $this->addError('admin.member.down.error', 'admin');
252
        }
253
254 3
        return $this->redirectToRoute('admin_setting_system_member');
255
    }
256
257
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$request" missing
Loading history...
introduced by
Doc comment for parameter "$Member" missing
Loading history...
258
     * @Method("DELETE")
259
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/delete", requirements={"id" = "\d+"}, name="admin_setting_system_member_delete")
260
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
261 1 View Code Duplication
    public function delete(Request $request, Member $Member)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
262
    {
263 1
        $this->isTokenValid();
264
265 1
        log_info('メンバー削除開始', [$Member->getId()]);
266
267
        try {
268 1
            $this->memberRepository->delete($Member);
269
270 1
            $event = new EventArgs(
271
                [
272 1
                    'Member' => $Member,
273
                ],
274 1
                $request
275
            );
276 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_DELETE_COMPLETE, $event);
277
278 1
            $this->addSuccess('admin.member.delete.complete', 'admin');
279
280 1
            log_info('メンバー削除完了', [$Member->getId()]);
281
        } catch (\Exception $e) {
282
            log_info('メンバー削除エラー', [$Member->getId(), $e]);
283
284
            $message = trans('admin.delete.failed.foreign_key', ['%name%' => trans('member.text.name')]);
285
            $this->addError($message, 'admin');
286
        }
287
288 1
        return $this->redirectToRoute('admin_setting_system_member');
289
    }
290
}
291