1<?php
2
3namespace Elastica;
4
5use Elastica\Exception\InvalidException;
6
7/**
8 * Elastica index template object.
9 *
10 * @author Dmitry Balabka <dmitry.balabka@gmail.com>
11 *
12 * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html
13 */
14class IndexTemplate
15{
16    /**
17     * Index template name.
18     *
19     * @var string Index pattern
20     */
21    protected $_name;
22
23    /**
24     * Client object.
25     *
26     * @var \Elastica\Client Client object
27     */
28    protected $_client;
29
30    /**
31     * Creates a new index template object.
32     *
33     * @param \Elastica\Client $client Client object
34     * @param string           $name   Index template name
35     *
36     * @throws \Elastica\Exception\InvalidException
37     */
38    public function __construct(Client $client, $name)
39    {
40        $this->_client = $client;
41
42        if (!\is_scalar($name)) {
43            throw new InvalidException('Index template should be a scalar type');
44        }
45        $this->_name = (string) $name;
46    }
47
48    /**
49     * Deletes the index template.
50     *
51     * @return \Elastica\Response Response object
52     */
53    public function delete()
54    {
55        $response = $this->request(Request::DELETE);
56
57        return $response;
58    }
59
60    /**
61     * Creates a new index template with the given arguments.
62     *
63     * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html
64     *
65     * @param array $args OPTIONAL Arguments to use
66     *
67     * @return \Elastica\Response
68     */
69    public function create(array $args = [])
70    {
71        return $this->request(Request::PUT, $args);
72    }
73
74    /**
75     * Checks if the given index template is already created.
76     *
77     * @return bool True if index exists
78     */
79    public function exists()
80    {
81        $response = $this->request(Request::HEAD);
82
83        return 200 === $response->getStatus();
84    }
85
86    /**
87     * Returns the index template name.
88     *
89     * @return string Index name
90     */
91    public function getName()
92    {
93        return $this->_name;
94    }
95
96    /**
97     * Returns index template client.
98     *
99     * @return \Elastica\Client Index client object
100     */
101    public function getClient()
102    {
103        return $this->_client;
104    }
105
106    /**
107     * Makes calls to the elasticsearch server based on this index template name.
108     *
109     * @param string $method Rest method to use (GET, POST, DELETE, PUT)
110     * @param array  $data   OPTIONAL Arguments as array
111     *
112     * @return \Elastica\Response Response object
113     */
114    public function request($method, $data = [])
115    {
116        $path = '_template/'.$this->getName();
117
118        return $this->getClient()->request($path, $method, $data);
119    }
120}
121