ImportController::import()   A
last analyzed

Complexity

Conditions 3
Paths 5

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.7333
c 0
b 0
f 0
cc 3
nc 5
nop 2
1
<?php
2
3
namespace XHGui\Controller;
4
5
use Exception;
6
use InvalidArgumentException;
7
use Slim\Http\Request;
8
use Slim\Http\Response;
9
use Slim\Slim as App;
10
use XHGui\AbstractController;
11
use XHGui\Saver\SaverInterface;
12
13
class ImportController extends AbstractController
14
{
15
    /**
16
     * @var SaverInterface
17
     */
18
    private $saver;
19
20
    /** @var string */
21
    private $token;
22
23
    public function __construct(App $app, SaverInterface $saver, $token)
24
    {
25
        parent::__construct($app);
26
        $this->saver = $saver;
27
        $this->token = $token;
28
    }
29
30
    public function import(Request $request, Response $response): void
31
    {
32
        try {
33
            $id = $this->runImport($request);
34
            $result = ['ok' => true, 'id' => $id, 'size' => $request->getContentLength()];
35
        } catch (InvalidArgumentException $e) {
36
            $result = ['error' => true, 'message' => $e->getMessage()];
37
            $response->setStatus(401);
38
        } catch (Exception $e) {
39
            $result = ['error' => true, 'message' => $e->getMessage()];
40
            $response->setStatus(500);
41
        }
42
43
        $response['Content-Type'] = 'application/json';
44
        $response->body(json_encode($result));
45
    }
46
47
    private function runImport(Request $request): string
48
    {
49
        if ($this->token) {
50
            if ($this->token !== $request->get('token')) {
51
                throw new InvalidArgumentException('Token validation failed');
52
            }
53
        }
54
55
        $data = json_decode($request->getBody(), true);
56
        if (!is_array($data)) {
57
            throw new InvalidArgumentException('Failed to decode payload');
58
        }
59
60
        return $this->saver->save($data);
61
    }
62
}
63