keboola/gooddata-php-client

View on GitHub
src/Exception.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php
/**
 *
 * @author Jakub Matejka <jakub@keboola.com>
 * @date 2013-03-19
 *
 */
namespace Keboola\GoodData;

class Exception extends \Exception
{
    public function __construct($message, $code = 0, \Exception $previous = null)
    {
        $message = self::parseMessage($message);
        if (is_array($message)) {
            $message = json_encode($message);
        }
        parent::__construct($message, $code, $previous);
    }

    public static function loginError(\Exception $previous = null)
    {
        return new static('GoodData login failed', 403, $previous);
    }

    public static function unexpectedResponseError($message, $method, $uri, $response = [])
    {
        return new static(json_encode([
            'description' => $message,
            'method' => $method,
            'uri' => $uri,
            'response' => $response
        ]), 400);
    }
    
    public static function error($uri, $message, $code = 0, \Exception $previous = null)
    {
        $message = self::parseMessage($message);
        switch ($code) {
            case 401:
                $message = (isset($message['message'])
                    && $message['message'] == 'Login needs security code verification due to failed login attempts.')
                    ? "GoodData login refused due to failed login attempts"
                    : "GoodData login failed. $message";
                break;
            case 403:
                $message = "GoodData user does not have access to resource '$uri'. $message";
                break;
            case 410:
                if (strpos($message, 'task failed') === false) {
                    $message = "GoodData uri $uri is not reachable, project has been probably deleted. $message";
                }
                break;
            case 429:
                $message = "Too many requests on GoodData API. Try again later please. $message";
                break;
        }
        if (is_array($message)) {
            $message = json_encode($message);
        }
        return new static($message, $code, $previous);
    }

    public static function configurationError($message)
    {
        return new static($message);
    }

    public static function parseMessage($message)
    {
        if (isset($message['message'])) {
            if (isset($message['parameters']) && count($message['parameters'])) {
                $message = vsprintf($message['message'], $message['parameters']);
            } else {
                $message = $message['message'];
            }
        }
        if (isset($message['error']['message'])) {
            if (isset($message['error']['parameters']) && count($message['error']['parameters'])) {
                $message = vsprintf($message['error']['message'], $message['error']['parameters']);
            } else {
                $message = $message['error']['message'];
            }
        }
        if (isset($message['details']['error']['validationErrors'])) {
            $errors = [];
            foreach ($message['details']['error']['validationErrors'] as $err) {
                $errors[] = vsprintf($err['validationError']['message'], $err['validationError']['parameters']);
            }
            $message = $errors;
        }
        return $message;
    }

    public function getData()
    {
        $json = json_decode($this->message, true);
        return $json ?: [];
    }
}