Passed
Push — dev ( 2c953a...19f0dc )
by Janko
28:50 queued 20:04
created

CreateDatabaseEntry   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Test Coverage

Coverage 17.86%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 30
c 1
b 0
f 0
dl 0
loc 68
ccs 5
cts 28
cp 0.1786
rs 10
wmc 9

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 1
A checkForCompletion() 0 11 3
A createDatabaseEntryForUser() 0 33 5
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Module\Database\Lib;
6
7
use Stu\Module\Award\Lib\CreateUserAwardInterface;
8
use Stu\Module\Prestige\Lib\CreatePrestigeLogInterface;
9
use Stu\Orm\Entity\DatabaseCategoryInterface;
10
use Stu\Orm\Entity\DatabaseEntryInterface;
11
use Stu\Orm\Entity\UserInterface;
12
use Stu\Orm\Repository\DatabaseEntryRepositoryInterface;
13
use Stu\Orm\Repository\DatabaseUserRepositoryInterface;
14
15
final class CreateDatabaseEntry implements CreateDatabaseEntryInterface
16
{
17
    private DatabaseEntryRepositoryInterface $databaseEntryRepository;
18
19
    private DatabaseUserRepositoryInterface $databaseUserRepository;
20
21
    private CreatePrestigeLogInterface $createPrestigeLog;
22
23
    private CreateUserAwardInterface $createUserAward;
24
25 1
    public function __construct(
26
        DatabaseEntryRepositoryInterface $databaseEntryRepository,
27
        DatabaseUserRepositoryInterface $databaseUserRepository,
28
        CreatePrestigeLogInterface $createPrestigeLog,
29
        CreateUserAwardInterface $createUserAward
30
    ) {
31 1
        $this->databaseEntryRepository = $databaseEntryRepository;
32 1
        $this->databaseUserRepository = $databaseUserRepository;
33 1
        $this->createPrestigeLog = $createPrestigeLog;
34 1
        $this->createUserAward = $createUserAward;
35
    }
36
37
    public function createDatabaseEntryForUser(UserInterface $user, int $databaseEntryId): ?DatabaseEntryInterface
38
    {
39
        if ($databaseEntryId === 0) {
40
            return null;
41
        }
42
43
        if (!$user->hasColony()) {
44
            return null;
45
        }
46
47
        $databaseEntry = $this->databaseEntryRepository->find($databaseEntryId);
48
49
        if ($databaseEntry === null) {
50
            return null;
51
        }
52
53
        //create new user entry
54
        $userEntry = $this->databaseUserRepository->prototype()
55
            ->setUser($user)
56
            ->setDatabaseEntry($databaseEntry)
57
            ->setDate(time());
58
59
        $this->databaseUserRepository->save($userEntry);
60
61
62
        if (!$user->isNpc()) {
63
            //create prestige log
64
            $this->createPrestigeLog->createLogForDatabaseEntry($databaseEntry, $user, $userEntry->getDate());
65
66
            $this->checkForCompletion($user, $databaseEntry->getCategory());
67
        }
68
69
        return $databaseEntry;
70
    }
71
72
    private function checkForCompletion(UserInterface $user, DatabaseCategoryInterface $category): void
73
    {
74
        //check if an award is configured for this category
75
        if ($category->getAward() === null) {
76
            return;
77
        }
78
79
        $award = $category->getAward();
80
81
        if ($this->databaseUserRepository->hasUserCompletedCategory($user->getId(), $category->getId())) {
82
            $this->createUserAward->createAwardForUser($user, $award);
83
        }
84
    }
85
}
86