Skip to content

Commit cebf485

Browse files
author
Renato Marinho
authored
Merge pull request #269 from AgusRdz/feature/slack-notifications
feature/slack-notifications
2 parents 0e1c86f + 5ef6f10 commit cebf485

File tree

16 files changed

+409
-93
lines changed

16 files changed

+409
-93
lines changed

.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,7 @@ PROXY_METHOD=
2727
PROXY_SERVER=
2828
PROXY_USER=
2929
PROXY_PASS=
30+
31+
SLACK_CHANNEL=channel-name
32+
SLACK_BOT_NAME=bot-name
33+
SLACK_WEBHOOK=endpoint

app/Contracts/SlackInterface.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace GitScrum\Contracts;
4+
5+
interface SlackInterface
6+
{
7+
public function send($content, $type = 0);
8+
}

app/Http/Controllers/Web/IssueController.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
namespace GitScrum\Http\Controllers\Web;
1010

1111
use Illuminate\Http\Request;
12+
use GitScrum\Contracts\SlackInterface as Slack;
1213
use GitScrum\Http\Requests\IssueRequest;
1314
use GitScrum\Models\Sprint;
1415
use GitScrum\Models\Issue;
@@ -137,7 +138,7 @@ public function update(IssueRequest $request, $slug)
137138
->with('success', trans('gitscrum.congratulations-the-issue-has-been-edited-with-successfully'));
138139
}
139140

140-
public function statusUpdate(Request $request, $slug = null, $status = 0)
141+
public function statusUpdate(Request $request, Slack $slack, $slug = null, $status = 0)
141142
{
142143
$request->status_id = $request->status_id ?? $status;
143144

@@ -158,6 +159,17 @@ public function statusUpdate(Request $request, $slug = null, $status = 0)
158159

159160
resolve('IssueService')->setRequest($request)->updateStatus();
160161

162+
$issue = Issue::slug($slug)->firstOrFail();
163+
164+
$content = [
165+
'title' => "{$issue->title}",
166+
'url' => url("issues/status-update/{$slug}"),
167+
'updated_by' => Auth::user()->slack_username,
168+
'status' => $status,
169+
];
170+
171+
$slack->send($content, 2);
172+
161173
return back()->with('success', trans('gitscrum.updated-successfully'));
162174
}
163175

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace GitScrum\Http\Controllers\Web;
4+
5+
use Auth;
6+
use Illuminate\Http\Request;
7+
8+
class SlackUserController extends Controller
9+
{
10+
/**
11+
* Update the specified resource in storage.
12+
*
13+
* @param \Illuminate\Http\Request $request
14+
*
15+
*/
16+
public function update(Request $request)
17+
{
18+
$user = Auth::user();
19+
$user->slack_username = $request->slack_username;
20+
$user->save();
21+
22+
return back()->with('success', trans('gitscrum.updated-successfully'));
23+
}
24+
}

app/Http/Controllers/Web/UserIssueController.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88

99
namespace GitScrum\Http\Controllers\Web;
1010

11-
use Illuminate\Http\Request;
11+
use Auth;
12+
use GitScrum\Contracts\SlackInterface as Slack;
1213
use GitScrum\Models\Issue;
1314
use GitScrum\Models\User;
15+
use Illuminate\Http\Request;
1416

1517
class UserIssueController extends Controller
1618
{
@@ -93,7 +95,7 @@ public function edit($id)
9395
*
9496
* @return \Illuminate\Http\Response
9597
*/
96-
public function update(Request $request, $slug)
98+
public function update(Request $request, $slug, Slack $slack)
9799
{
98100
$members = $request->input('members');
99101

@@ -103,6 +105,21 @@ public function update(Request $request, $slug)
103105
$issue->users()->sync($members);
104106

105107
if (!$request->ajax()) {
108+
$users = User::whereIn('id', $members)->select('slack_username')->get();
109+
$slackUsers = [];
110+
111+
foreach ($users as $user) {
112+
$slackUsers[] = $user->slack_username;
113+
}
114+
115+
$content = [
116+
'title' => $issue->title,
117+
'assigned_to' => $slackUsers,
118+
'url' => route('issues.show', $issue->slug),
119+
'assigned_by' => Auth::user()->slack_username,
120+
];
121+
$slack->send($content, 1);
122+
106123
return redirect()->back()->with('success', trans('gitscrum.updated-successfully'));
107124
}
108125
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace GitScrum\Providers;
4+
5+
use Illuminate\Support\ServiceProvider;
6+
7+
class SlackServiceProvider extends ServiceProvider
8+
{
9+
/**
10+
* Bootstrap the application services.
11+
*
12+
* @return void
13+
*/
14+
public function boot()
15+
{
16+
//
17+
}
18+
19+
/**
20+
* Register the application services.
21+
*
22+
* @return void
23+
*/
24+
public function register()
25+
{
26+
$this->app->bind('GitScrum\Contracts\SlackInterface', 'GitScrum\Services\SlackService');
27+
}
28+
}

app/Services/SlackService.php

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<?php
2+
3+
namespace GitScrum\Services;
4+
5+
use GitScrum\Contracts\SlackInterface;
6+
use Log;
7+
use Maknz\Slack\Client;
8+
9+
10+
class SlackService implements SlackInterface
11+
{
12+
const ISSUE_ASSIGNATION = 1;
13+
const STATUS_UPDATE = 2;
14+
15+
private $client;
16+
private $settings;
17+
18+
public function __construct()
19+
{
20+
$this->settings = [
21+
'channel' => env('SLACK_CHANNEL', ''),
22+
'username' => env('SLACK_BOT_NAME', ''),
23+
'icon' => ':page_facing_up:',
24+
'unfurl_links' => true,
25+
'link_names' => 1,
26+
'allow_markdown' => 1,
27+
];
28+
$this->client = new Client(env('SLACK_WEBHOOK', ''), $this->settings);
29+
}
30+
31+
/**
32+
* Send an Slack notification
33+
* @param array $content This array can contains custom attributes to send different notifications
34+
* @param integer $type Type of notification
35+
*
36+
* @return void
37+
*/
38+
public function send($content, $type = 0)
39+
{
40+
if (empty($this->client->getEndpoint()) || empty($this->client->getDefaultChannel())
41+
|| empty($this->client->getDefaultUsername())) {
42+
Log::info('One or more settings are missing, Slack notifications are not availables');
43+
44+
return;
45+
}
46+
47+
$message = $this->buildMessage($content, $type);
48+
$this->client->attach([
49+
'title' => $content['title'],
50+
'title_link' => $content['url'],
51+
'color' => 'good',
52+
])->enableMarkdown()->send($message);
53+
}
54+
55+
/**
56+
* Build the final output of message
57+
* @param array $content This array can contains custom attributes to send different notifications
58+
* @param integer $type Type of notification
59+
*
60+
* @return string Message ready to send
61+
*/
62+
private function buildMessage($content, $type)
63+
{
64+
$message = '';
65+
66+
switch ($type) {
67+
case 1:
68+
$usersAssigned = [];
69+
70+
foreach ($content['assigned_to'] as $username) {
71+
if (! empty($username)) {
72+
$usersAssigned[] = "@{$username}";
73+
}
74+
}
75+
76+
$usersAssigned = implode(' ', $usersAssigned);
77+
$params = [
78+
'assignedBy' => $content['assigned_by'],
79+
'assignedTo' => $usersAssigned,
80+
];
81+
$message = trans('gitscrum.issue-assigned', $params);
82+
break;
83+
case 2:
84+
switch ($content['status']) {
85+
case 1:
86+
$status = 'Todo';
87+
break;
88+
case 2:
89+
$status = 'In Progress';
90+
break;
91+
case 3:
92+
$status = 'Done';
93+
break;
94+
case 4:
95+
$status = 'Archived';
96+
break;
97+
default:
98+
$status = 'Todo';
99+
break;
100+
}
101+
102+
$params = [
103+
'username' => $content['updated_by'],
104+
'status' => $status,
105+
];
106+
$message = trans('gitscrum.issue-status-updated', $params);
107+
break;
108+
default:
109+
# code...
110+
break;
111+
}
112+
113+
return $message;
114+
}
115+
}

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"doctrine/dbal": "~2.5",
2929
"intervention/image": "^2.3",
3030
"laravel/framework": "5.4.*",
31+
"maknz/slack": "^1.7",
3132
"nesbot/carbon": "^1.21",
3233
"phploc/phploc": "*",
3334
"renatomarinho/laravel-multi-language": ">=1.0.0",

0 commit comments

Comments
 (0)