AbstractRequest::getCallUrl()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 12
ccs 9
cts 9
cp 1
rs 9.4285
cc 1
eloc 9
nc 1
nop 2
crap 1
1
<?php
2
namespace Thunder\SimilarWebApi;
3
4
/**
5
 * @author Tomasz Kowalczyk <[email protected]>
6
 */
7
abstract class AbstractRequest
8
    {
9
    const API = 'http://api.similarweb.com';
10
11
    protected static $appStores = array('google_play_store' => '0', 'app_store' => '1');
12
    protected static $arguments = array('app', 'domain', 'period', 'start', 'end', 'main', 'store', 'page');
13
    protected static $periods = array('daily', 'weekly', 'monthly');
14
15
    protected $args = array();
16
17 67
    public function getCallUrl($format, $token)
18
        {
19 67
        $args = $this->args;
20 67
        $args['format'] = $format;
21 67
        $args['token'] = $token;
22 67
        $keys = array_map(function($item) {
23 67
            return '{'.$item.'}';
24 67
            }, array_keys($args));
25 67
        $values = array_values($args);
26
27 67
        return str_replace($keys, $values, $this->getUrl());
28
        }
29
30 75
    protected function validateArg($arg, $value)
31
        {
32 75
        if('domain' == $arg && !$value)
33 75
            {
34 1
            throw new \InvalidArgumentException('Empty domain!');
35
            }
36 74
        elseif('app' == $arg && !$value)
37
            {
38 1
            throw new \InvalidArgumentException('Empty app name!');
39
            }
40 74
        elseif('period' == $arg && !in_array($value, static::$periods))
41
            {
42 1
            $periods = implode(', ', static::$periods);
43 1
            $msg = 'Invalid period %s, expected one of %s!';
44 1
            throw new \InvalidArgumentException(sprintf($msg, $value, $periods));
45
            }
46 74
        elseif(in_array($arg, array('start', 'end')) && !preg_match('/[0-9]{2}-[0-9]{4}/', $value))
47
            {
48 2
            $msg = 'Invalid %s date %s, expected format MM-YYYY!';
49 2
            throw new \InvalidArgumentException(sprintf($msg, $arg, $value));
50
            }
51 74
        elseif('main' == $arg)
52
            {
53 19
            $value = (bool)$value ? 'true' : 'false';
54 19
            }
55 74
        elseif('page' == $arg && !ctype_digit((string)$value))
56
            {
57 1
            $msg = 'Invalid page number %s!';
58 1
            throw new \InvalidArgumentException(sprintf($msg, $value));
59
            }
60 74
        elseif('store' == $arg && !in_array($value, static::$appStores))
61
            {
62 1
            $msg = 'Invalid app store ID %s!';
63 1
            throw new \InvalidArgumentException(sprintf($msg, $value));
64
            }
65 73
        else if(!in_array($arg, static::$arguments))
66 73
            {
67 1
            $msg = 'Unknown argument %s (value %s)!';
68 1
            throw new \InvalidArgumentException(sprintf($msg, $arg, $value));
69
            }
70
71 72
        return $value;
72
        }
73
74
    /**
75
     * @return string API endpoint name as in documentation
76
     */
77
    abstract public function getName();
78
79
    /**
80
     * @return string API call URL with parameter placeholders
81
     */
82
    abstract public function getUrl();
83
84
    /**
85
     * @return array Mapping data for response parsing
86
     */
87
    abstract public function getMapping();
88
    }
89