1// Copyright 2012-present Oliver Eilhard. All rights reserved.
2// Use of this source code is governed by a MIT-license.
3// See http://olivere.mit-license.org/license.txt for details.
4
5package elastic
6
7import (
8	"context"
9	"fmt"
10	"net/url"
11
12	"gopkg.in/olivere/elastic.v5/uritemplates"
13)
14
15// DeleteTemplateService deletes a search template. More information can
16// be found at https://www.elastic.co/guide/en/elasticsearch/reference/5.2/search-template.html.
17type DeleteTemplateService struct {
18	client      *Client
19	pretty      bool
20	id          string
21	version     *int
22	versionType string
23}
24
25// NewDeleteTemplateService creates a new DeleteTemplateService.
26func NewDeleteTemplateService(client *Client) *DeleteTemplateService {
27	return &DeleteTemplateService{
28		client: client,
29	}
30}
31
32// Id is the template ID.
33func (s *DeleteTemplateService) Id(id string) *DeleteTemplateService {
34	s.id = id
35	return s
36}
37
38// Version an explicit version number for concurrency control.
39func (s *DeleteTemplateService) Version(version int) *DeleteTemplateService {
40	s.version = &version
41	return s
42}
43
44// VersionType specifies a version type.
45func (s *DeleteTemplateService) VersionType(versionType string) *DeleteTemplateService {
46	s.versionType = versionType
47	return s
48}
49
50// buildURL builds the URL for the operation.
51func (s *DeleteTemplateService) buildURL() (string, url.Values, error) {
52	// Build URL
53	path, err := uritemplates.Expand("/_search/template/{id}", map[string]string{
54		"id": s.id,
55	})
56	if err != nil {
57		return "", url.Values{}, err
58	}
59
60	// Add query string parameters
61	params := url.Values{}
62	if s.version != nil {
63		params.Set("version", fmt.Sprintf("%d", *s.version))
64	}
65	if s.versionType != "" {
66		params.Set("version_type", s.versionType)
67	}
68
69	return path, params, nil
70}
71
72// Validate checks if the operation is valid.
73func (s *DeleteTemplateService) Validate() error {
74	var invalid []string
75	if s.id == "" {
76		invalid = append(invalid, "Id")
77	}
78	if len(invalid) > 0 {
79		return fmt.Errorf("missing required fields: %v", invalid)
80	}
81	return nil
82}
83
84// Do executes the operation.
85func (s *DeleteTemplateService) Do(ctx context.Context) (*AcknowledgedResponse, error) {
86	// Check pre-conditions
87	if err := s.Validate(); err != nil {
88		return nil, err
89	}
90
91	// Get URL for request
92	path, params, err := s.buildURL()
93	if err != nil {
94		return nil, err
95	}
96
97	// Get HTTP response
98	res, err := s.client.PerformRequest(ctx, "DELETE", path, params, nil)
99	if err != nil {
100		return nil, err
101	}
102
103	// Return operation response
104	ret := new(AcknowledgedResponse)
105	if err := s.client.decoder.Decode(res.Body, ret); err != nil {
106		return nil, err
107	}
108	return ret, nil
109}
110