Passed
Pull Request — master (#11)
by Simon
01:34
created

SlackAuthController::index()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nc 1
nop 1
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace Firesphere\StripeSlack\Controller;
4
5
use GuzzleHttp\Client;
6
use SilverStripe\Control\Controller;
7
use SilverStripe\Control\Director;
8
use SilverStripe\Control\HTTPRequest;
9
use SilverStripe\Control\HTTPResponse;
10
use SilverStripe\Core\Convert;
11
use SilverStripe\ORM\ValidationException;
12
use SilverStripe\SiteConfig\SiteConfig;
13
14
/**
15
 * Class SlackAuthController
16
 *
17
 */
18
class SlackAuthController extends Controller
19
{
20
21
    /**
22
     * It seems like a lot is going on here
23
     * But in reality, it's mainly just configuration stuff
24
     *
25
     * @param HTTPRequest $request
26
     * @throws ValidationException
27
     */
28
    public function index(HTTPRequest $request)
29
    {
30
        list($code, $config, $baseURL, $url) = $this->getConfig($request);
31
32
        $query = $this->getQuery($config, $code);
33
34
        // Setup and request the code
35
        $service = new Client(['base_uri' => $baseURL]);
36
        $response = $service->request('GET', $url . $query);
37
38
        $this->saveToken($response, $config);
39
40
        // A successful write should go back to the admin
41
        $this->redirect('/admin/settings#Root_Slack');
42
    }
43
44
    /**
45
     * @param HTTPRequest $request
46
     * @return array
47
     */
48
    public function getConfig(HTTPRequest $request)
49
    {
50
        // Code param
51
        $code = $request->getVar('code');
52
        $config = SiteConfig::current_site_config();
53
        // Build the URL
54
        $baseURL = $config->SlackURL;
55
        $baseURL = (substr($baseURL, -1) === '/') ? $baseURL : $baseURL . '/';
56
        $url = 'api/oauth.access?';
57
58
        return [$code, $config, $baseURL, $url];
59
    }
60
61
    /**
62
     * @param $config
63
     * @param $code
64
     * @return string
65
     */
66
    public function getQuery($config, $code)
67
    {
68
        $params = [
69
            'client_id'     => $config->SlackClientID,
70
            'client_secret' => $config->SlackClientSecret,
71
            'code'          => $code,
72
            'redirect_uri'  => Director::absoluteURL('/SlackAuthorization/'),
73
        ];
74
75
        return http_build_query($params);
76
    }
77
78
    /**
79
     * @param HTTPResponse $response
80
     * @param SiteConfig $config
81
     * @throws ValidationException
82
     */
83
    public function saveToken($response, $config)
84
    {
85
        // Convert the JSON to use in our config (hidden from user view)
86
        $result = Convert::json2array($response->getBody());
87
88
        $config->SlackToken = $result['access_token'];
89
        $config->write();
90
    }
91
}
92