Completed
Push — master ( 706672...0f2117 )
by Daniel
02:07
created

SlackService::getAttachment()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 20
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 14
nc 1
nop 1
dl 0
loc 20
ccs 15
cts 15
cp 1
crap 1
rs 9.7998
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace DanielPieper\MergeReminder\Service;
4
5
use DanielPieper\MergeReminder\ValueObject\MergeRequestApproval;
6
use Razorpay\Slack\Attachment;
7
use Razorpay\Slack\Client;
8
9
class SlackService
10
{
11
    /** @var Client */
12
    private $slackClient;
13
14 5
    public function __construct(Client $slackClient)
15
    {
16 5
        $this->slackClient = $slackClient;
17 5
    }
18
19
    /**
20
     * @param MergeRequestApproval[] $mergeRequestApprovals
21
     * @param string $messageText
22
     */
23 1
    public function postMessage(array $mergeRequestApprovals, $messageText = 'Your pending merge requests'): void
24
    {
25 1
        $message = $this->slackClient->createMessage();
26 1
        $message->setText($messageText);
27
28 1
        foreach ($mergeRequestApprovals as $mergeRequestApproval) {
29 1
            $attachment = $this->getAttachment($mergeRequestApproval);
30 1
            $message->attach($attachment);
31
        }
32
33 1
        $this->slackClient->sendMessage($message);
34 1
    }
35
36
    /**
37
     * @param MergeRequestApproval $mergeRequestApproval
38
     * @return Attachment
39
     */
40 2
    protected function getAttachment(MergeRequestApproval $mergeRequestApproval): Attachment
41
    {
42 2
        $mergeRequest = $mergeRequestApproval->getMergeRequest();
43 2
        $project = $mergeRequest->getProject();
44 2
        $author = $mergeRequest->getAuthor();
45
46 2
        $attachment = new Attachment([
47 2
            'fallback' => $mergeRequest->getWebUrl(),
48 2
            'title' => $mergeRequest->getTitle(),
49 2
            'title_link' => $mergeRequest->getWebUrl(),
50 2
            'text' => $mergeRequest->getDescription(),
51 2
            'author_name' => $author->getUsername(),
52
            /* 'author_icon' => $author->getAvatarUrl(), */
53 2
            'author_link' => $author->getWebUrl(),
54 2
            'color' => $this->getColor($mergeRequestApproval),
55 2
            'fields' => $this->getFields($mergeRequestApproval),
56 2
            'footer' => $project->getName(),
57
        ]);
58
59 2
        return $attachment;
60
    }
61
62 2
    protected function getFields(MergeRequestApproval $mergeRequestApproval): array
63
    {
64
        $fields = [
65
            [
66 2
                'title' => 'Created',
67 2
                'value' => $mergeRequestApproval->getCreatedAt()->shortRelativeToNowDiffForHumans(),
68
                'short' => true,
69
            ],
70
        ];
71
72 2
        if ($mergeRequestApproval->getUpdatedAt()->diffInDays($mergeRequestApproval->getCreatedAt()) > 0) {
73 2
            $fields[] = [
74 2
                'title' => 'Updated',
75 2
                'value' => $mergeRequestApproval->getUpdatedAt()->shortRelativeToNowDiffForHumans(),
76
                'short' => true,
77
            ];
78
        }
79
80 2
        $approverNames = $mergeRequestApproval->getApproverNames();
81 2
        if (count($approverNames) > 0) {
82 1
            $fields[] = [
83 1
                'title' => 'Approvers',
84 1
                'value' => implode(', ', $approverNames),
85
                'short' => true,
86
            ];
87
        }
88
89 2
        $approverGroupNames = $mergeRequestApproval->getApproverGroupNames();
90 2
        if (count($approverGroupNames) > 0) {
91 1
            $fields[] = [
92 1
                'title' => 'Approver Groups',
93 1
                'value' => implode(', ', $approverGroupNames),
94
                'short' => true,
95
            ];
96
        }
97
98 2
        return $fields;
99
    }
100
101
    /**
102
     * @param MergeRequestApproval $mergeRequestApproval
103
     * @return string
104
     */
105 4
    protected function getColor(MergeRequestApproval $mergeRequestApproval): string
106
    {
107 4
        $ageInDays = $mergeRequestApproval->getCreatedAt()->diffInDays();
108
109 4
        if ($ageInDays > 2) {
110 2
            return 'danger';
111
        }
112 2
        if ($ageInDays > 1) {
113 1
            return 'warning';
114
        }
115 1
        return 'good';
116
    }
117
}
118