1// Copyright (c) 2015 Ableton AG, Berlin. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file.
5
6package travis
7
8import (
9	"context"
10	"fmt"
11	"net/http"
12)
13
14// BetaFeaturesService handles communication with the
15// beta feature related methods of the Travis CI API.
16type BetaFeaturesService struct {
17	client *Client
18}
19
20// BetaFeature is a standard representation of an individual beta feature
21//
22// Travis CI API docs: https://developer.travis-ci.com/resource/beta_feature#attributes
23type BetaFeature struct {
24	// Value uniquely identifying the beta feature
25	Id uint `json:"id,omitempty"`
26	// The name of the feature
27	Name string `json:"name,omitempty"`
28	// Longer description of the feature
29	Description string `json:"description,omitempty"`
30	// Indicates if the user has this feature turned on
31	Enabled bool `json:"enabled,omitempty"`
32	// Url for users to leave Travis CI feedback on this feature
33	FeedbackUrl string `json:"feedback_url,omitempty"`
34	*Metadata
35}
36
37// betaFeaturesResponse represents a response
38// from organizations endpoints
39type betaFeaturesResponse struct {
40	BetaFeatures []*BetaFeature `json:"beta_features,omitempty"`
41}
42
43// List fetches a list of beta features available to a user
44//
45// Travis CI API docs: https://developer.travis-ci.com/resource/beta_features#find
46func (bs *BetaFeaturesService) List(ctx context.Context, userId uint) ([]*BetaFeature, *http.Response, error) {
47	u, err := urlWithOptions(fmt.Sprintf("/user/%d/beta_features", userId), nil)
48	if err != nil {
49		return nil, nil, err
50	}
51
52	req, err := bs.client.NewRequest(http.MethodGet, u, nil, nil)
53	if err != nil {
54		return nil, nil, err
55	}
56
57	var br betaFeaturesResponse
58	resp, err := bs.client.Do(ctx, req, &br)
59	if err != nil {
60		return nil, resp, err
61	}
62
63	return br.BetaFeatures, resp, err
64}
65
66// Update updates a user's beta_feature
67//
68// Travis CI API docs: https://developer.travis-ci.com/resource/beta_feature#update
69func (bs *BetaFeaturesService) Update(ctx context.Context, userId uint, id uint, enabled bool) (*BetaFeature, *http.Response, error) {
70	u, err := urlWithOptions(fmt.Sprintf("/user/%d/beta_feature/%d", userId, id), nil)
71	if err != nil {
72		return nil, nil, err
73	}
74
75	req, err := bs.client.NewRequest(http.MethodPatch, u, map[string]bool{"enabled": enabled}, nil)
76	if err != nil {
77		return nil, nil, err
78	}
79
80	var feature BetaFeature
81	resp, err := bs.client.Do(ctx, req, &feature)
82	if err != nil {
83		return nil, resp, err
84	}
85
86	return &feature, resp, err
87}
88
89// Delete delete a user's beta feature
90//
91// Travis CI API docs: https://developer.travis-ci.com/resource/beta_feature#delete
92func (bs *BetaFeaturesService) Delete(ctx context.Context, userId uint, id uint) (*BetaFeature, *http.Response, error) {
93	u, err := urlWithOptions(fmt.Sprintf("/user/%d/beta_feature/%d", userId, id), nil)
94	if err != nil {
95		return nil, nil, err
96	}
97
98	req, err := bs.client.NewRequest(http.MethodDelete, u, nil, nil)
99	if err != nil {
100		return nil, nil, err
101	}
102
103	var feature BetaFeature
104	resp, err := bs.client.Do(ctx, req, &feature)
105	if err != nil {
106		return nil, resp, err
107	}
108
109	return &feature, resp, err
110}
111