Completed
Pull Request — experimental/sf (#3236)
by Kentaro
51:49 queued 45:19
created

MemberController::up()   A

Complexity

Conditions 2
Paths 3

Size

Total Lines 16

Duplication

Lines 16
Ratio 100 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
nc 3
nop 2
dl 16
loc 16
rs 9.7333
c 0
b 0
f 0
ccs 8
cts 8
cp 1
crap 2
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 Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
17
use Eccube\Controller\AbstractController;
18
use Eccube\Entity\Member;
19
use Eccube\Event\EccubeEvents;
20
use Eccube\Event\EventArgs;
21
use Eccube\Form\Type\Admin\MemberType;
22
use Eccube\Repository\MemberRepository;
23
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
24
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
25
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
26
use Symfony\Component\HttpFoundation\Request;
27
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
28
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
29
30
class MemberController extends AbstractController
31
{
32
    /**
33
     * @var TokenStorageInterface
34
     */
35
    protected $tokenStorage;
36
37
    /**
38
     * @var MemberRepository
39
     */
40
    protected $memberRepository;
41
42
    /**
43
     * @var EncoderFactoryInterface
44
     */
45
    protected $encoderFactory;
46
47
    /**
48
     * MemberController constructor.
49
     *
50
     * @param EncoderFactoryInterface $encoderFactory
51
     * @param MemberRepository $memberRepository
52
     * @param TokenStorageInterface $tokenStorage
53
     */
54 17
    public function __construct(
55
        EncoderFactoryInterface $encoderFactory,
56
        MemberRepository $memberRepository,
57
        TokenStorageInterface $tokenStorage
58
    ) {
59 17
        $this->encoderFactory = $encoderFactory;
60 17
        $this->memberRepository = $memberRepository;
61 17
        $this->tokenStorage = $tokenStorage;
62
    }
63
64
    /**
65
     * @Route("/%eccube_admin_route%/setting/system/member", name="admin_setting_system_member")
66
     * @Template("@admin/Setting/System/member.twig")
67
     */
68 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...
69
    {
70 1
        $Members = $this->memberRepository->findBy([], ['sort_no' => 'DESC']);
71
72 1
        $builder = $this->formFactory->createBuilder();
73
74 1
        $event = new EventArgs(
75
            [
76 1
                'builder' => $builder,
77 1
                'Members' => $Members,
78
            ],
79 1
            $request
80
        );
81 1
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_INDEX_INITIALIZE, $event);
82
83 1
        $form = $builder->getForm();
84
85
        return [
86 1
            'form' => $form->createView(),
87 1
            'Members' => $Members,
88
        ];
89
    }
90
91
    /**
92
     * @Route("/%eccube_admin_route%/setting/system/member/new", name="admin_setting_system_member_new")
93
     * @Template("@admin/Setting/System/member_edit.twig")
94
     */
95 3
    public function create(Request $request)
96
    {
97 3
        $LoginMember = clone $this->tokenStorage->getToken()->getUser();
98 3
        $this->entityManager->detach($LoginMember);
99
100 3
        $Member = new Member();
101 3
        $builder = $this->formFactory
102 3
            ->createBuilder(MemberType::class, $Member);
103
104 3
        $event = new EventArgs([
105 3
            'builder' => $builder,
106 3
            'Member' => $Member,
107 3
        ], $request);
108 3
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_INITIALIZE, $event);
109
110 3
        $form = $builder->getForm();
111 3
        $form->handleRequest($request);
112
113 3
        if ($form->isSubmitted() && $form->isValid()) {
114 1
            $encoder = $this->encoderFactory->getEncoder($Member);
115 1
            $salt = $encoder->createSalt();
116 1
            $rawPassword = $Member->getPassword();
117 1
            $encodedPassword = $encoder->encodePassword($rawPassword, $salt);
118
            $Member
119 1
                ->setSalt($salt)
120 1
                ->setPassword($encodedPassword);
121
122 1
            $this->memberRepository->save($Member);
123
124 1
            $event = new EventArgs(
125
                [
126 1
                    'form' => $form,
127 1
                    'Member' => $Member,
128
                ],
129 1
                $request
130
            );
131 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_COMPLETE, $event);
132
133 1
            $this->addSuccess('admin.member.save.complete', 'admin');
134
135 1
            return $this->redirectToRoute('admin_setting_system_member');
136
        }
137
138 2
        $this->tokenStorage->getToken()->setUser($LoginMember);
139
140
        return [
141 2
            'form' => $form->createView(),
142 2
            'Member' => $Member,
143
        ];
144
    }
145
146
    /**
147
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/edit", requirements={"id" = "\d+"}, name="admin_setting_system_member_edit")
148
     * @Template("@admin/Setting/System/member_edit.twig")
149
     */
150 3
    public function edit(Request $request, Member $Member)
151
    {
152 3
        $LoginMember = clone $this->tokenStorage->getToken()->getUser();
153 3
        $this->entityManager->detach($LoginMember);
154
155 3
        $previousPassword = $Member->getPassword();
156 3
        $Member->setPassword($this->eccubeConfig['eccube_default_password']);
157
158 3
        $builder = $this->formFactory
159 3
            ->createBuilder(MemberType::class, $Member);
160
161 3
        $event = new EventArgs(
162
            [
163 3
                'builder' => $builder,
164 3
                'Member' => $Member,
165
            ],
166 3
            $request
167
        );
168 3
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_INITIALIZE, $event);
169
170 3
        $form = $builder->getForm();
171 3
        $form->handleRequest($request);
172
173 3
        if ($form->isSubmitted() && $form->isValid()) {
174 1
            if ($Member->getpassword() === $this->eccubeConfig['eccube_default_password']) {
175
                // 編集時にパスワードを変更していなければ
176
                // 変更前のパスワード(暗号化済み)をセット
177 1
                $Member->setPassword($previousPassword);
178
            } else {
179
                $salt = $Member->getSalt();
180
                // 2系からのデータ移行でsaltがセットされていない場合はsaltを生成.
181
                if (empty($salt)) {
182
                    $salt = bin2hex(openssl_random_pseudo_bytes(5));
183
                    $Member->setSalt($salt);
184
                }
185
186
                $rawPassword = $Member->getPassword();
187
                $encoder = $this->encoderFactory->getEncoder($Member);
188
                $encodedPassword = $encoder->encodePassword($rawPassword, $salt);
189
                $Member->setPassword($encodedPassword);
190
            }
191
192 1
            $this->memberRepository->save($Member);
193
194 1
            $event = new EventArgs(
195
                [
196 1
                    'form' => $form,
197 1
                    'Member' => $Member,
198
                ],
199 1
                $request
200
            );
201 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_COMPLETE, $event);
202
203 1
            $this->addSuccess('admin.member.save.complete', 'admin');
204
205 1
            return $this->redirectToRoute('admin_setting_system_member');
206
        }
207
208 2
        $this->tokenStorage->getToken()->setUser($LoginMember);
209
210
        return [
211 2
            'form' => $form->createView(),
212 2
            'Member' => $Member,
213
        ];
214
    }
215
216
    /**
217
     * @Method("PUT")
218
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/up", requirements={"id" = "\d+"}, name="admin_setting_system_member_up")
219
     */
220 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...
221
    {
222 2
        $this->isTokenValid();
223
224
        try {
225 2
            $this->memberRepository->up($Member);
226
227 1
            $this->addSuccess('admin.member.up.complete', 'admin');
228 1
        } catch (\Exception $e) {
229 1
            log_error('メンバー表示順更新エラー', [$Member->getId(), $e]);
230
231 1
            $this->addError('admin.member.up.error', 'admin');
232
        }
233
234 2
        return $this->redirectToRoute('admin_setting_system_member');
235
    }
236
237
    /**
238
     * @Method("PUT")
239
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/down", requirements={"id" = "\d+"}, name="admin_setting_system_member_down")
240
     */
241 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...
242
    {
243 3
        $this->isTokenValid();
244
245
        try {
246 3
            $this->memberRepository->down($Member);
247
248 2
            $this->addSuccess('admin.member.down.complete', 'admin');
249 1
        } catch (\Exception $e) {
250 1
            log_error('メンバー表示順更新エラー', [$Member->getId(), $e]);
251
252 1
            $this->addError('admin.member.down.error', 'admin');
253
        }
254
255 3
        return $this->redirectToRoute('admin_setting_system_member');
256
    }
257
258
    /**
259
     * @Method("DELETE")
260
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/delete", requirements={"id" = "\d+"}, name="admin_setting_system_member_delete")
261
     */
262 1
    public function delete(Request $request, Member $Member)
263
    {
264 1
        $this->isTokenValid();
265
266 1
        log_info('メンバー削除開始', [$Member->getId()]);
267
268
        try {
269 1
            $this->memberRepository->delete($Member);
270
271 1
            $event = new EventArgs(
272
                [
273 1
                    'Member' => $Member,
274
                ],
275 1
                $request
276
            );
277 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_DELETE_COMPLETE, $event);
278
279 1
            $this->addSuccess('admin.member.delete.complete', 'admin');
280
281 1
            log_info('メンバー削除完了', [$Member->getId()]);
282
        } catch (ForeignKeyConstraintViolationException $e) {
283
            log_info('メンバー削除エラー', [$Member->getId()]);
284
285
            $message = trans('admin.delete.failed.foreign_key', ['%name%' => $Member->getName()]);
286
            $this->addError($message, 'admin');
287
        } catch (\Exception $e) {
288
            log_info('メンバー削除エラー', [$Member->getId(), $e]);
289
290
            $message = trans('admin.delete.failed');
291
            $this->addError($message, 'admin');
292
        }
293
294 1
        return $this->redirectToRoute('admin_setting_system_member');
295
    }
296
}
297