UsersSubscriptionsController   A
last analyzed

Complexity

Total Complexity 28

Size/Duplication

Total Lines 232
Duplicated Lines 15.09 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
dl 35
loc 232
rs 10
c 0
b 0
f 0
wmc 28
lcom 1
cbo 7

8 Methods

Rating   Name   Duplication   Size   Complexity  
A loadSubscriptionsAction() 0 23 3
A processSubscription() 0 19 2
A processRequest() 0 18 4
A deactivateAction() 14 14 3
A deleteAction() 0 19 2
A activateAction() 17 17 3
C addSubscriptionAction() 4 68 8
B editsubscriptionAction() 0 25 3

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
/**
4
 * @author Rafał Muszyński <[email protected]>
5
 * @copyright 2013 Sourcefabric o.p.s.
6
 * @license http://www.gnu.org/licenses/gpl-3.0.txt
7
 */
8
9
namespace Newscoop\PaywallBundle\Controller;
10
11
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
12
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
13
use Symfony\Component\HttpFoundation\Request;
14
use Symfony\Component\HttpFoundation\JsonResponse;
15
use Newscoop\PaywallBundle\Criteria\SubscriptionCriteria;
16
use Newscoop\PaywallBundle\Events\PaywallEvents;
17
use Newscoop\PaywallBundle\Entity\Order;
18
use Newscoop\PaywallBundle\Form\Type\OrderItemType;
19
use Newscoop\PaywallBundle\Permissions;
20
21
class UsersSubscriptionsController extends BaseController
22
{
23
    /**
24
     * @Route("/admin/paywall_plugin/load-subscriptions/{id}", options={"expose"=true})
25
     * @Template()
26
     */
27
    public function loadSubscriptionsAction(Request $request, $id)
28
    {
29
        $this->hasPermission(Permissions::ORDERS_VIEW);
30
        $criteria = $this->processRequest($request);
31
        $criteria->order = $id;
32
        $userSubscriptions = $this->get('paywall.subscription.service')
33
            ->getUserSubscriptionsByCriteria($criteria, true)
34
            ->getArrayResult();
35
36
        $pocessed = array();
37
        foreach ($userSubscriptions as $subscription) {
38
            $pocessed[] = $this->processSubscription($subscription);
39
        }
40
41
        $responseArray = array(
42
            'iTotalRecords' => count($userSubscriptions),
43
            'iTotalDisplayRecords' => $request->get('sSearch') ? count($pocessed) : count($userSubscriptions),
44
            'sEcho' => (int) $request->get('sEcho'),
45
            'aaData' => $pocessed,
46
        );
47
48
        return new JsonResponse($responseArray);
49
    }
50
51
    private function processSubscription($userSubscription)
52
    {
53
        return array(
54
            'id' => $userSubscription['id'],
55
            'userid' => $userSubscription['user']['id'],
56
            'username' => $userSubscription['user']['username'],
57
            'publication' => $userSubscription['publication']['name'],
58
            'subscription' => $userSubscription['subscription']['name'],
59
            'topay' => $userSubscription['toPay'] / $userSubscription['duration']['value'].' '.$userSubscription['currency'],
60
            'total' => $userSubscription['toPay'].' '.$userSubscription['currency'],
61
            'period' => $userSubscription['duration']['value'].' '.$userSubscription['duration']['attribute'],
62
            'currency' => $userSubscription['currency'],
63
            'type' => $userSubscription['type'],
64
            'active' => $userSubscription['active'] == 'Y' ? true : false,
65
            'firstNotify' => $userSubscription['notifySentLevelOne'],
66
            'secondNotify' => $userSubscription['notifySentLevelTwo'],
67
            'expiresAt' => $userSubscription['expire_at'],
68
        );
69
    }
70
71
    private function processRequest($request)
72
    {
73
        $criteria = new SubscriptionCriteria();
74
        if ($request->query->has('sSortDir_0')) {
75
            $criteria->orderBy[$request->query->get('iSortCol_0')] = $request->query->get('sSortDir_0');
76
        }
77
78
        if ($request->query->has('sSearch')) {
79
            $criteria->query = $request->query->get('sSearch');
80
        }
81
82
        $criteria->maxResults = $request->query->get('iDisplayLength', 10);
83
        if ($request->query->has('iDisplayStart')) {
84
            $criteria->firstResult = $request->query->get('iDisplayStart');
85
        }
86
87
        return $criteria;
88
    }
89
90
    /**
91
     * @Route("/admin/paywall_plugin/users-subscriptions/deactivate/{id}", options={"expose"=true})
92
     */
93 View Code Duplication
    public function deactivateAction(Request $request, $id)
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...
94
    {
95
        $this->hasPermission(Permissions::ORDERS_MANAGE);
96
        if ($request->isMethod('POST')) {
97
            try {
98
                $subscription = $this->get('paywall.subscription.service')->deactivateById($id);
99
                $this->dispatchNotificationEvent(PaywallEvents::SUBSCRIPTION_STATUS_CHANGE, $subscription);
100
101
                return new JsonResponse(array('status' => true));
102
            } catch (\Exception $exception) {
103
                return new JsonResponse(array('status' => false));
104
            }
105
        }
106
    }
107
108
    /**
109
     * @Route("/admin/paywall_plugin/users-subscriptions/delete/{id}", options={"expose"=true})
110
     */
111
    public function deleteAction(Request $request, $id)
112
    {
113
        $this->hasPermission(Permissions::ORDERS_MANAGE);
114
        try {
115
            $subscriptionService = $this->get('paywall.subscription.service');
116
            $subscription = $subscriptionService->deactivateById($id);
117
            $order = $subscription->getOrder();
118
119
            $this->dispatchNotificationEvent(PaywallEvents::SUBSCRIPTION_STATUS_CHANGE, $subscription);
120
            $em = $this->get('em');
121
            $subscriptionService->deleteById($id);
122
            $order->calculateTotal();
123
            $em->flush();
124
125
            return new JsonResponse(array('status' => true));
126
        } catch (\Exception $exception) {
127
            return new JsonResponse(array('status' => false));
128
        }
129
    }
130
131
    /**
132
     * @Route("/admin/paywall_plugin/users-subscriptions/activate/{id}", options={"expose"=true})
133
     */
134 View Code Duplication
    public function activateAction(Request $request, $id)
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...
135
    {
136
        $this->hasPermission(Permissions::ORDERS_MANAGE);
137
        if ($request->isMethod('POST')) {
138
            try {
139
                $subscription = $this->get('paywall.subscription.service')->activateById($id);
140
                $this->dispatchNotificationEvent(PaywallEvents::SUBSCRIPTION_STATUS_CHANGE, $subscription);
141
142
                return new JsonResponse(array('status' => true));
143
            } catch (\Exception $exception) {
144
                return new JsonResponse(array(
145
                    'status' => false,
146
                    'message' => $exception->getMessage(),
147
                ));
148
            }
149
        }
150
    }
151
152
    /**
153
     * @Route("/admin/paywall_plugin/users-subscriptions/add-subscription/{id}", options={"expose"=true})
154
     */
155
    public function addSubscriptionAction(Request $request, Order $order)
156
    {
157
        $this->hasPermission(Permissions::ORDERS_MANAGE);
158
        $subscriptionService = $this->container->get('paywall.subscription.service');
159
        $subscription = $subscriptionService->create();
160
        $form = $this->createForm(new OrderItemType());
161
        if ($request->isMethod('POST')) {
162
            $form->handleRequest($request);
163
            if ($form->isValid()) {
164
                $data = $form->getData();
165
                $subscriptionConfig = $subscriptionService->getOneSubscriptionSpecification($data['subscriptions']);
166
                $userSubscriptionInactive = $subscriptionService->getOneByUserAndSubscription(
167
                    $order->getUser()->getId(),
168
                    $subscriptionConfig->getSubscription()->getId(),
169
                    'N'
170
                );
171
172
                $userSubscription = $subscriptionService->getOneByUserAndSubscription(
173
                    $order->getUser()->getId(),
174
                    $subscriptionConfig->getSubscription()->getId()
175
                );
176
177
                if ($userSubscription || $userSubscriptionInactive) {
178
                    return $this->redirect($this->generateUrl('paywall_plugin_userorder_edit', array(
179
                        'id' => $order->getId(),
180
                    )));
181
                }
182
183
                $period = $data['period'];
184
                $durationObj = $subscriptionService->filterRanges($data['subscriptions'], $period->getId());
185
                $duration = array(
186
                    'value' => $durationObj->getValue(),
187
                    'attribute' => $durationObj->getAttribute(),
188
                );
189
190
                $discount = array();
191 View Code Duplication
                if ($durationObj->getDiscount()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
192
                    $discount['value'] = $durationObj->getDiscount()->getValue();
193
                    $discount['type'] = $durationObj->getDiscount()->getType();
194
                }
195
196
                $subscriptionData = new \Newscoop\PaywallBundle\Subscription\SubscriptionData(array(
197
                    'userId' => $order->getUser(),
198
                    'duration' => $duration,
199
                    'discount' => $discount,
200
                    'subscriptionId' => $subscriptionConfig->getSubscription(),
201
                    'publicationId' => $subscriptionConfig->getPublication(),
202
                    'toPay' => $subscriptionConfig->getSubscription()->getPrice(),
203
                    'currency' => $subscriptionConfig->getSubscription()->getCurrency(),
204
                    'type' => $data['type'],
205
                    'active' => $data['status'] === 'Y' ? true : false,
206
                ), $userSubscription);
207
208
                $subscription->setOrder($order);
209
                $subscription = $subscriptionService->update($subscription, $subscriptionData);
210
                if ($data['status'] === 'Y') {
211
                    $subscription->setExpireAt($subscriptionService->getExpirationDate($subscription));
212
                }
213
                $subscriptionService->save($subscription);
214
215
                $this->dispatchNotificationEvent(PaywallEvents::ADMIN_ORDER_SUBSCRIPTION, $subscription);
216
217
                return $this->redirect($this->generateUrl('paywall_plugin_userorder_edit', array(
218
                    'id' => $order->getId(),
219
                )));
220
            }
221
        }
222
    }
223
224
    /**
225
     * @Route("/admin/paywall_plugin/users-subscriptions/edit/{id}", options={"expose"=true})
226
     */
227
    public function editsubscriptionAction(Request $request, $id)
228
    {
229
        $this->hasPermission(Permissions::ORDERS_MANAGE);
230
        $em = $this->getDoctrine()->getManager();
231
        $orderItem = $this->get('paywall.subscription.service')->getOneById($id);
232
233
        $form = $this->createForm('subscriptioneditForm', $orderItem);
234
        if ($request->isMethod('POST')) {
235
            $form->bind($request);
236
            if ($form->isValid()) {
237
                $em->flush();
238
239
                return $this->redirect($this->generateUrl('paywall_plugin_userorder_edit', array(
240
                    'id' => $orderItem->getOrder()->getId(),
241
                )));
242
            }
243
        }
244
245
        return $this->render('NewscoopPaywallBundle:UsersSubscriptions:editsubscription.html.twig', array(
246
            'form' => $form->createView(),
247
            'user' => new \MetaUser($orderItem->getUser()),
248
            'avatarHash' => md5($orderItem->getUser()->getEmail()),
249
            'subscription' => $orderItem,
250
        ));
251
    }
252
}
253