Issues (108)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

Services/PaywallService.php (14 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

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
namespace Newscoop\PaywallBundle\Services;
9
10
use Newscoop\PaywallBundle\Subscription\SubscriptionData;
11
use Newscoop\PaywallBundle\Entity\UserSubscription;
12
use Newscoop\PaywallBundle\Entity\Subscription;
13
use Newscoop\PaywallBundle\Criteria\SubscriptionCriteria;
14
use Doctrine\ORM\EntityManager;
15
use Newscoop\PaywallBundle\Entity\Duration;
16
use Newscoop\Services\UserService;
17
use Doctrine\Common\Collections\ArrayCollection;
18
19
/**
20
 * PaywallService manages user's subscriptions.
21
 */
22
class PaywallService
23
{
24
    /** @var EntityManager */
25
    protected $em;
26
27
    protected $userService;
28
29
    /**
30
     * @param EntityManager $em
31
     */
32
    public function __construct(EntityManager $em, UserService $userService)
33
    {
34
        $this->em = $em;
35
        $this->userService = $userService;
36
    }
37
38
    public function filterRanges(Subscription $subscription, $periodId)
39
    {
40
        $ranges = $subscription->getRanges()->filter(function (Duration $duration) use ($periodId) {
41
            return $duration->getId() == $periodId;
42
        });
43
44
        return $ranges->first();
45
    }
46
47
    /**
48
     * Gets all available subscriptions by criteria.
49
     *
50
     * @return array
51
     */
52
    public function getSubscriptionsByCriteria(SubscriptionCriteria $criteria, $returnQuery = false)
53
    {
54
        return $this->em->getRepository('Newscoop\PaywallBundle\Entity\Subscription')
55
            ->getListByCriteria($criteria, $returnQuery);
56
    }
57
58
    /**
59
     * Gets all user subscriptions by criteria.
60
     *
61
     * @return mixed
62
     */
63
    public function getUserSubscriptionsByCriteria(SubscriptionCriteria $criteria, $returnQuery = false)
64
    {
65
        return $this->getRepository()
66
            ->getListByCriteria($criteria, $returnQuery)
67
        ;
68
    }
69
70
    /**
71
     * Gets currently logged in user's subscriptions.
72
     *
73
     * @param SubscriptionCriteria $criteria
74
     * @param bool                 $returnQuery
75
     *
76
     * @return mixed
77
     */
78
    public function getMySubscriptionsByCriteria(SubscriptionCriteria $criteria, $returnQuery = false)
79
    {
80
        return $this->getRepository()
81
            ->getListByCriteria($criteria, $returnQuery, true)
82
        ;
83
    }
84
85
    /**
86
     * Filter my subscriptions.
87
     *
88
     * @param array $items
89
     *
90
     * @return ArrayCollection
91
     */
92
    public function filterMySubscriptions(array $items = array())
93
    {
94
        $orderItems = new ArrayCollection($items);
95
        foreach ($orderItems as $item) {
96
            foreach ($orderItems as $value) {
97
                $parent = $item->getParent();
98
                if ($item->getSubscription()->getId() == $value->getSubscription()->getId() &&
99
                    $parent  == $value
100
                ) {
101
                    $value->setProlonged(true);
102
                    $value->setToPay($parent->getToPay());
103
                    $value->setExpireAt($parent->getExpireAt());
104
                    $value->setDuration($parent->getDuration());
105
                    $value->setDiscountTotal($parent->getDiscountTotal());
106
                    $value->setActive($parent->isActive());
107
                    $value->setCreatedAt($parent->getCreatedAt());
108
                    $orderItems->removeElement($item);
109
                }
110
            }
111
        }
112
113
        return $orderItems;
114
    }
115
116
    /**
117
     * Count subscriptions by given criteria.
118
     *
119
     * @param array $criteria
120
     *
121
     * @return int
122
     */
123
    public function countBy(array $criteria)
124
    {
125
        return $this->getRepository()->countBy($criteria);
126
    }
127
128
    /**
129
     * Gets user's subscriptions repository.
130
     *
131
     * @return EntityRepository
132
     */
133
    public function getRepository()
134
    {
135
        return $this->em->getRepository('Newscoop\PaywallBundle\Entity\UserSubscription');
136
    }
137
138
    /**
139
     * Gets subscriptions repository.
140
     *
141
     * @return EntityRepository
142
     */
143
    public function getSubscriptionRepository()
144
    {
145
        return $this->em->getRepository('Newscoop\PaywallBundle\Entity\Subscription');
146
    }
147
148
    /**
149
     * Gets user's subscriptions for issues by given Id.
150
     *
151
     * @param int $id Subscription Id to search for
152
     *
153
     * @return array
154
     */
155
    public function getIssues($id)
156
    {
157
        $issues = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Issue')
158
            ->findBy(array(
159
                'subscription' => $id,
160
            ));
161
162
        $issuesArray = array();
163
        foreach ($issues as $issue) {
164
            $issueName = $this->em->getRepository('Newscoop\Entity\Issue')->findOneByNumber($issue->getIssueNumber())->getName();
165
166
            $issuesArray[] = array(
167
                'id' => $issue->getId(),
168
                'name' => $issueName,
169
                'language' => $issue->getLanguage()->getName(),
170
                'date' => $issue->getStartDate(),
171
                'days' => $issue->getDays(),
172
                'paid' => $issue->getPaidDays(),
173
            );
174
        }
175
176
        return $issuesArray;
177
    }
178
179
    /**
180
     * Gets user's subscriptions for sections by given Id.
181
     *
182
     * @param int $id Subscription Id to search for
183
     *
184
     * @return array
185
     */
186 View Code Duplication
    public function getSections($id)
0 ignored issues
show
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...
187
    {
188
        $sections = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Section')
189
            ->findBy(array(
190
                'subscription' => $id,
191
            ));
192
193
        $sectionsArray = array();
194
        foreach ($sections as $section) {
195
            $sectionsArray[] = array(
196
                'id' => $section->getId(),
197
                'name' => $section->getName(),
198
                'language' => $section->getLanguage()->getName(),
199
                'date' => $section->getStartDate(),
200
                'days' => $section->getDays(),
201
                'paid' => $section->getPaidDays(),
202
            );
203
        }
204
205
        return $sectionsArray;
206
    }
207
208
    /**
209
     * Gets user's subscriptions for articles by given Id.
210
     *
211
     * @param int $id Subscription Id to search for
212
     *
213
     * @return array
214
     */
215 View Code Duplication
    public function getArticles($id)
0 ignored issues
show
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...
216
    {
217
        $articles = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Article')
218
            ->findBy(array(
219
                'subscription' => $id,
220
            ));
221
222
        $articlesArray = array();
223
        foreach ($articles as $article) {
224
            $articlesArray[] = array(
225
                'id' => $article->getId(),
226
                'name' => $article->getName(),
227
                'language' => $article->getLanguage()->getName(),
228
                'date' => $article->getStartDate(),
229
                'days' => $article->getDays(),
230
                'paid' => $article->getPaidDays(),
231
            );
232
        }
233
234
        return $articlesArray;
235
    }
236
237
    /**
238
     * Gets currently added user's Sections by given language Id and subscription Id.
239
     *
240
     * @param int $language       Language Id to search for
241
     * @param int $subscriptionId Subscription Id to search for
242
     *
243
     * @return array
244
     */
245
    public function getSectionsByLanguageAndId($language, $subscriptionId)
246
    {
247
        $sections = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Section')
248
            ->findBy(array(
249
                'language' => $language,
250
                'subscription' => $subscriptionId,
251
        ));
252
253
        return $sections;
254
    }
255
256
    /**
257
     * Checks if user had trial.
258
     *
259
     * @param Newscoop\Entity\User $user User
260
     *
261
     * @return bool
262
     */
263
    public function userHadTrial($user)
264
    {
265
        $qb = $this->em->getRepository('Newscoop\PaywallBundle\Entity\UserSubscription')
266
            ->createQueryBuilder('u');
267
268
        $qb->select('count(u.id)')
269
            ->where('u.user = :user')
270
            ->andWhere($qb->expr()->isNotNull('u.trial'))
271
            ->setParameter('user', $user);
272
273
        $userTrials = (int) $qb->getQuery()->getSingleScalarResult();
274
275
        return $userTrials > 1 ? true : false;
276
    }
277
278
    /**
279
     * Checks if trial is valid.
280
     *
281
     * @param Newscoop\Entity\User $user User
282
     *
283
     * @return bool
284
     */
285
    public function validateTrial($user)
286
    {
287
        $trial = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Trial')
288
            ->findOneBy(array(
289
                'user' => $user,
290
                'is_active' => true,
291
        ));
292
293
        if ($trial) {
294
            $datetime = new \DateTime('now');
295
            //if trial expired
296
297
            if ($trial->getFinishTrial() >= $datetime) {
298
                return true;
299
            }
300
301
            // deactivate trial
302
            $trial->setIsActive(false);
303
            $this->em->flush();
304
305
            return false;
306
        }
307
308
        return false;
309
    }
310
311
    /**
312
     * Checks if trial is active.
313
     *
314
     * @param Newscoop\Entity\User $user User
315
     *
316
     * @return bool
317
     */
318
    public function isTrialActive($user)
319
    {
320
        $trial = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Trial')
321
            ->findOneBy(array(
322
                'user' => $user,
323
        ));
324
325
        if ($trial) {
326
            return $trial->getIsActive();
327
        }
328
329
        return false;
330
    }
331
332
    /**
333
     * Deactivates trial.
334
     *
335
     * @param Newscoop\Entity\User $user User
336
     *
337
     * @return bool
338
     */
339
    public function deactivateTrial($user)
340
    {
341
        $trial = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Trial')
342
            ->findOneBy(array(
343
                'user' => $user,
344
                'is_active' => true,
345
        ));
346
347
        if ($trial) {
348
            $trial->setIsActive(false);
349
            $this->em->flush();
350
351
            return true;
352
        }
353
354
        return false;
355
    }
356
357
    /**
358
     * Gets all available sections by given language Id.
359
     *
360
     * @param int $language Language Id to search for
0 ignored issues
show
There is no parameter named $language. Did you maybe mean $languageId?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function. It has, however, found a similar but not annotated parameter which might be a good fit.

Consider the following example. The parameter $ireland is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $ireland
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was changed, but the annotation was not.

Loading history...
361
     *
362
     * @return array
363
     */
364
    public function getSectionsByLanguageId($languageId)
365
    {
366
        $sections = $this->em->getRepository('Newscoop\Entity\Section')
367
            ->findBy(array(
368
                'language' => $languageId,
369
            ));
370
371
        return $sections;
372
    }
373
374
    /**
375
     * Gets currently added user's Issues by given language Id and subscription Id.
376
     *
377
     * @param int $language        Language Id to search for
378
     * @param int $subscription_id Subscription Id to search for
379
     *
380
     * @return array
381
     */
382 View Code Duplication
    public function getIssuesByLanguageAndId($language, $subscription_id)
0 ignored issues
show
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...
383
    {
384
        $issues = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Issue')
385
            ->findBy(array(
386
                'language' => $language,
387
                'subscription' => $subscription_id,
388
        ));
389
390
        return $issues;
391
    }
392
393
    /**
394
     * Gets all available Issues by given language Id.
395
     *
396
     * @param int $languageId Language Id to search for
397
     *
398
     * @return array
399
     */
400
    public function getIssuesByLanguageId($languageId)
401
    {
402
        $issues = $this->em->getRepository('Newscoop\Entity\Issue')
403
            ->findBy(array(
404
                'language' => $languageId,
405
            ));
406
407
        return $issues;
408
    }
409
410
    /**
411
     * Gets currently added user's Articles by given language Id and subscription Id.
412
     *
413
     * @param int $language        Language Id to search for
414
     * @param int $subscription_id Subscription Id to search for
415
     *
416
     * @return array
417
     */
418 View Code Duplication
    public function getArticlesByLanguageAndId($language, $subscription_id)
0 ignored issues
show
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...
419
    {
420
        $articles = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Article')
421
            ->findBy(array(
422
                'language' => $language,
423
                'subscription' => $subscription_id,
424
        ));
425
426
        return $articles;
427
    }
428
429
    /**
430
     * Gets all available Articles by given language Id.
431
     *
432
     * @param int $languageId Language Id to search for
433
     *
434
     * @return array
435
     */
436
    public function getArticlesByLanguageId($languageId)
437
    {
438
        $articles = $this->em->getRepository('Newscoop\Entity\Article')
439
            ->findBy(array(
440
                'language' => $languageId,
441
            ));
442
443
        return $articles;
444
    }
445
446
    /**
447
     * Gets subscription details by given subscription Id.
448
     *
449
     * @param int $subscriptionId Subscription Id to search for
450
     *
451
     * @return array
452
     */
453
    public function getSubscriptionDetails($subscriptionId)
454
    {
455
        $subscription = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Subscription')
456
            ->createQueryBuilder('s')
457
            ->select('s.type', 's.duration', 's.price', 's.currency', 'i.publication')
458
            ->innerJoin('s.specification', 'i', 'WITH', 'i.subscription = :id')
459
            ->where('s.id = :id AND s.is_active = true')
460
            ->setParameter('id', $subscriptionId)
461
            ->getQuery()
462
            ->getArrayResult();
463
464
        return $subscription;
465
    }
466
467
    /**
468
     * Gets one defined subscription by given subscription Id.
469
     *
470
     * @param int $subscriptionId Subscription Id to search for
471
     *
472
     * @return entity object
473
     */
474
    public function getOneSubscriptionById($subscriptionId)
475
    {
476
        $subscription = $this->em->getRepository('Newscoop\PaywallBundle\Entity\Subscription')
477
            ->findOneBy(array(
478
                'id' => $subscriptionId,
479
            ));
480
481
        return $subscription;
482
    }
483
484
    /**
485
     * Activates Subscription by Id and returns its instance.
486
     *
487
     * @param int $id User subscription id
488
     *
489
     * @return UserSubscription
490
     */
491 View Code Duplication
    public function activateById($id)
0 ignored issues
show
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...
492
    {
493
        $subscription = $this->em->getRepository('Newscoop\PaywallBundle\Entity\UserSubscription')
494
            ->findOneBy(array(
495
                'id' => $id,
496
        ));
497
498
        if ($subscription) {
499
            $this->activateUserSubscription($subscription);
500
            $this->em->flush();
501
        }
502
503
        return $subscription;
504
    }
505
506
    /**
507
     * Activates user subscription.
508
     *
509
     * @param UserSubscription $subscription
510
     */
511
    public function activateUserSubscription(UserSubscription $subscription)
512
    {
513
        $subscription->setActive(true);
514
        $subscription->setType('P');
515
        $subscription->setProlonged(false);
516
        $now = new \DateTime('now');
517
        if (!$subscription->getExpireAt()) {
518
            $subscription->setExpireAt($this->getExpirationDate($subscription));
519
            $subscription->setCreatedAt($now);
520
        }
521
522
        if ($subscription->getParent()) {
523
            $subscription->getParent()->setActive(false);
524
            $subscription->getParent()->setExpireAt($now);
525
        }
526
    }
527
528
    /**
529
     * Gets user subscription expiration date.
530
     *
531
     * @param UserSubscription $userSubscription User subscription
532
     *
533
     * @return DateTime
534
     */
535
    public function getExpirationDate(UserSubscription $userSubscription)
536
    {
537
        $now = new \DateTime('now');
538
        $createdAt = $userSubscription->getCreatedAt();
539
        if ($userSubscription->getParent()) {
540
            $createdAt = $userSubscription->getStartsAt();
541
        }
542
543
        // diffrence in days between subscription create date
544
        // and actual activation date
545
        $startDate = $createdAt ?: $now;
546
        $duration = $userSubscription->getDuration();
547
        $value = $duration['value'];
548
        $attribute = $duration['attribute'];
549
        $timeSpan = null;
550
        switch ($attribute) {
551 View Code Duplication
            case Duration::MONTHS:
0 ignored issues
show
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...
552
                $diffrence = (int) $now->diff($createdAt)->format('%m');
553
                $months = $value + $diffrence;
554
                $timeSpan = new \DateInterval('P'.$months.'M');
555
                break;
556 View Code Duplication
            case Duration::DAYS:
0 ignored issues
show
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...
557
                $daysDiffrence = (int) $now->diff($createdAt)->format('%a');
558
                $days = $value + $daysDiffrence;
559
                $timeSpan = new \DateInterval('P'.$days.'D');
560
                break;
561
        }
562
563
        return $startDate->add($timeSpan);
564
    }
565
566
    /**
567
     * Gets Subscription configuration(details) by given Subscription Id.
568
     *
569
     * @param int $subscriptionId Subscription id
570
     *
571
     * @return entity object
572
     */
573
    public function getOneSubscriptionSpecification($subscriptionId)
574
    {
575
        $subscriptionSpec = $this->em->getRepository('Newscoop\PaywallBundle\Entity\SubscriptionSpecification')
576
            ->findOneBy(array(
577
                'subscription' => $subscriptionId,
578
            ));
579
580
        return $subscriptionSpec;
581
    }
582
583
    /**
584
     * Checks if Subscription by given User Id and Subscription Id exists.
585
     *
586
     * @param int    $userId         User id
587
     * @param int    $subscriptionId Subscription id
588
     * @param string $active         Active on inactive subscription
589
     *
590
     * @return array
591
     */
592 View Code Duplication
    public function getOneByUserAndSubscription($userId, $subscriptionId, $active = 'Y')
0 ignored issues
show
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...
593
    {
594
        $subscription = $this->getRepository()
595
            ->findOneBy(array(
596
                'user' => $userId,
597
                'subscription' => $subscriptionId,
598
                'active' => $active,
599
            ));
600
601
        if ($subscription) {
602
            return $subscription;
603
        }
604
605
        return;
606
    }
607
608
    public function getOrderItemBy($id, $period = null)
609
    {
610
        return $this->getRepository()->getOrderItemBy($id, $this->getCurrentUser(), $period);
611
    }
612
613
    public function getCurrentUser()
614
    {
615
        return $this->userService->getCurrentUser();
616
    }
617
618
    /**
619
     * Get one user subscription by user.
620
     *
621
     * @param Newscoop\Entity\User|int $user User or user id
622
     *
623
     * @return UserSubscription|null
624
     */
625 View Code Duplication
    public function getOneByUser($user)
0 ignored issues
show
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...
626
    {
627
        $subscription = $this->em->getRepository('Newscoop\PaywallBundle\Entity\UserSubscription')
628
            ->findOneBy(array(
629
                'user' => $user,
630
                'active' => 'Y',
631
            ));
632
633
        if ($subscription) {
634
            return $subscription;
635
        }
636
637
        return;
638
    }
639
640
    /**
641
     * Gets all sections diffrent from already added user's sections by given language
642
     * and publication.
643
     *
644
     * @param int $languageId    Language Id
645
     * @param int $publicationId Publication Id
646
     *
647
     * @return array
648
     */
649
    public function getDiffrentSectionsByLanguage($languageId, $publicationId)
650
    {
651
        $sections = $this->em->getRepository('Newscoop\Entity\Section')
652
            ->createQueryBuilder('s')
653
            ->select('s.number', 's.name')
654
            ->where('s.language != :id AND s.publication = :publicationId')
655
            ->setParameters(array(
656
                'id' => $languageId,
657
                'publicationId' => $publicationId,
658
            ))
659
            ->getQuery()
660
            ->getArrayResult();
661
662
        return $sections;
663
    }
664
665
    /**
666
     * Gets all issues diffrent from already added user's issues by given language
667
     * and publication.
668
     *
669
     * @param int $languageId    Language Id
670
     * @param int $publicationId Publication Id
671
     *
672
     * @return array
673
     */
674 View Code Duplication
    public function getDiffrentIssuesByLanguage($languageId, $publicationId)
0 ignored issues
show
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...
675
    {
676
        $issues = $this->em->getRepository('Newscoop\Entity\Issue')
677
            ->createQueryBuilder('i')
678
            ->select('i.number', 'i.name')
679
            ->where('i.language != :id AND i.publication = :publicationId')
680
            ->setParameters(array(
681
                'id' => $languageId,
682
                'publicationId' => $publicationId,
683
            ))
684
            ->getQuery()
685
            ->getArrayResult();
686
687
        return $issues;
688
    }
689
690
    /**
691
     * Gets all articles diffrent from already added user's articles by given language
692
     * and publication.
693
     *
694
     * @param int $languageId    Language Id
695
     * @param int $publicationId Publication Id
696
     *
697
     * @return array
698
     */
699 View Code Duplication
    public function getDiffrentArticlesByLanguage($languageId, $publicationId)
0 ignored issues
show
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...
700
    {
701
        $articles = $this->em->getRepository('Newscoop\Entity\Article')
702
            ->createQueryBuilder('i')
703
            ->select('i.number', 'i.name')
704
            ->where('i.language != :id AND i.publication = :publicationId')
705
            ->setParameters(array(
706
                'id' => $languageId,
707
                'publicationId' => $publicationId,
708
            ))
709
            ->getQuery()
710
            ->getArrayResult();
711
712
        return $articles;
713
    }
714
715
    /**
716
     * Update Subscription according to SubscritionData class.
717
     *
718
     * @param UserSubscription $subscription
719
     * @param SubscriptionData $data
720
     *
721
     * @return Subscription
722
     */
723
    public function update(UserSubscription $subscription, SubscriptionData $data)
724
    {
725
        $subscription = $this->apply($subscription, $data);
726
727
        return $subscription;
728
    }
729
730
    private function apply(UserSubscription $subscription, SubscriptionData $data)
731
    {
732
        if ($data->userId) {
733
            $user = $this->em->getRepository('Newscoop\Entity\User')->getOneActiveUser($data->userId, false)->getOneOrNullResult();
734
            if ($user) {
735
                $subscription->setUser($user);
736
            }
737
        }
738
739
        if ($data->publicationId) {
740
            $publication = $this->em->getRepository('Newscoop\Entity\Publication')->findOneBy(array('id' => $data->publicationId));
741
            if ($publication) {
742
                $subscription->setPublication($publication);
743
            }
744
        }
745
746
        if ($data->toPay) {
747
            $subscription->setToPay($data->toPay);
748
        }
749
750
        if (!empty($data->duration)) {
751
            $subscription->setDuration($data->duration);
752
        }
753
754
        if (!empty($data->discount)) {
755
            $subscription->setDiscount($data->discount);
756
        }
757
758
        if ($data->subscriptionId) {
759
            $subscription->setSubscription($data->subscriptionId);
0 ignored issues
show
$data->subscriptionId is of type integer, but the function expects a object<Newscoop\PaywallB...le\Entity\Subscription>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
760
        }
761
762
        if ($data->currency) {
763
            $subscription->setCurrency($data->currency);
764
        }
765
766
        if ($data->active) {
767
            $subscription->setActive($data->active);
768
        }
769
770
        if ($data->type) {
771
            $subscription->setType($data->type);
772
        }
773
774
        return $subscription;
775
    }
776
777
    public function save(UserSubscription $subscription)
778
    {
779
        $this->em->getConnection()->beginTransaction();
780
        try {
781
            $this->em->persist($subscription);
782
            $this->em->flush();
783
784
            $this->em->getConnection()->commit();
785
        } catch (\Exception $e) {
786
            // Rollback
787
            $this->em->getConnection()->rollback();
788
            throw $e;
789
        }
790
    }
791
792
    /**
793
     * Deactivates Subscription by Id and returns its instance.
794
     *
795
     * @param int $id - user subscription id
796
     *
797
     * @return UserSubscription
798
     */
799
    public function deactivateById($id)
800
    {
801
        $subscription = $this->em->getRepository('Newscoop\PaywallBundle\Entity\UserSubscription')
802
            ->findOneBy(array(
803
                'id' => $id,
804
            ));
805
806
        if ($subscription) {
807
            $subscription->setActive(false);
808
            $subscription->setType('T');
809
            $this->em->flush();
810
        }
811
812
        return $subscription;
813
    }
814
815
    /**
816
     * Removes Subscription by Id and returns its instance.
817
     *
818
     * @param int $id User subscription id
819
     *
820
     * @return UserSubscription
821
     */
822 View Code Duplication
    public function deleteById($id)
0 ignored issues
show
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...
823
    {
824
        $subscription = $this->em->getRepository('Newscoop\PaywallBundle\Entity\UserSubscription')
825
            ->findOneBy(array(
826
                'id' => $id,
827
            ));
828
829
        if ($subscription) {
830
            $this->em->remove($subscription);
831
            $this->em->flush();
832
        }
833
834
        return $subscription;
835
    }
836
837
    public function getOneById($id)
838
    {
839
        $subscription = $this->em->getRepository('Newscoop\PaywallBundle\Entity\UserSubscription')->findOneBy(array(
840
            'id' => $id,
841
        ));
842
843
        return $subscription;
844
    }
845
846
    public function getUserSubscriptionBySubscriptionId($id)
847
    {
848
        $subscription = $this->em->getRepository('Newscoop\PaywallBundle\Entity\UserSubscription')->findOneBy(array(
849
            'subscription' => $id,
850
        ));
851
852
        return $subscription;
853
    }
854
855
    public function getOneByUserAndPublication($userId, $publicationId)
856
    {
857
        $subscription = $this->em->getRepository('Newscoop\PaywallBundle\Entity\UserSubscription')->findOneBy(array(
858
            'user' => $userId,
859
            'publication' => $publicationId,
860
        ));
861
862
        return $subscription;
863
    }
864
865
    public function create()
866
    {
867
        $subscription = new UserSubscription();
868
869
        return $subscription;
870
    }
871
872
    public function getArticleRepository()
873
    {
874
        return $this->em->getRepository('Newscoop\Entity\Article');
875
    }
876
877
    public function getSectionRepository()
878
    {
879
        return $this->em->getRepository('Newscoop\Entity\Section');
880
    }
881
882
    public function getLanguageRepository()
883
    {
884
        return $this->em->getRepository('Newscoop\Entity\Language');
885
    }
886
887
    public function getIssueRepository()
888
    {
889
        return $this->em->getRepository('Newscoop\Entity\Issue');
890
    }
891
}
892