Passed
Push — master ( 81bbde...2ac216 )
by Adel
05:46
created

FreelancersService::getById()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace App\Services;
4
5
use App\Domain\Entities\Freelancer;
6
use App\Domain\Entities\Job;
7
use App\Domain\ValueObjects\Email;
8
use App\Domain\ValueObjects\Money;
9
use App\Infrastructure\MultiDispatcher;
10
use App\Infrastructure\StrictObjectManager;
11
use App\Services\Dto\JobApplyDto;
12
use Ramsey\Uuid\Uuid;
13
use Ramsey\Uuid\UuidInterface;
14
15
final class FreelancersService
16
{
17
    /** @var StrictObjectManager */
18
    private $entityManager;
19
20
    /** @var MultiDispatcher */
21
    private $dispatcher;
22
23
    public function __construct(StrictObjectManager $entityManager, MultiDispatcher $dispatcher)
24
    {
25
        $this->entityManager = $entityManager;
26
        $this->dispatcher = $dispatcher;
27
    }
28
29
    /**
30
     * Return freelancers's id.
31
     *
32
     * @param \App\Domain\ValueObjects\Email $email
33
     * @param \App\Domain\ValueObjects\Money $hourRate
34
     * @return UuidInterface
35
     */
36
    public function register(Email $email, Money $hourRate): UuidInterface
37
    {
38
        $freelancer = Freelancer::register(Uuid::uuid4(), $email, $hourRate);
39
40
        $this->entityManager->persist($freelancer);
41
        $this->entityManager->flush();
42
43
        $this->dispatcher->multiDispatch($freelancer->releaseEvents());
44
45
        return $freelancer->getId();
46
    }
47
48
    /**
49
     * @param \App\Services\Dto\JobApplyDto $dto
50
     * @throws \App\Exceptions\Job\SameFreelancerProposalException
51
     */
52
    public function apply(JobApplyDto $dto)
53
    {
54
        /** @var Freelancer $freelancer */
55
        $freelancer = $this->entityManager->findOrFail(Freelancer::class, $dto->getFreelancerId());
56
57
        /** @var Job $job */
58
        $job = $this->entityManager->findOrFail(Job::class, $dto->getJobId());
59
60
        $freelancer->apply($job, $dto->getCoverLetter());
61
62
        $this->dispatcher->multiDispatch($freelancer->releaseEvents());
63
64
        $this->entityManager->flush();
65
    }
66
}