1package tfe
2
3import (
4	"context"
5	"fmt"
6	"net/url"
7)
8
9// Compile-time proof of interface implementation.
10var _ AdminWorkspaces = (*adminWorkspaces)(nil)
11
12// AdminWorkspaces describes all the admin workspace related methods that the Terraform Enterprise API supports.
13// Note that admin settings are only available in Terraform Enterprise.
14//
15// TFE API docs: https://www.terraform.io/docs/cloud/api/admin/workspaces.html
16type AdminWorkspaces interface {
17	// List all the workspaces within a workspace.
18	List(ctx context.Context, options AdminWorkspaceListOptions) (*AdminWorkspaceList, error)
19
20	// Read a workspace by its ID.
21	Read(ctx context.Context, workspaceID string) (*AdminWorkspace, error)
22
23	// Delete a workspace by its ID.
24	Delete(ctx context.Context, workspaceID string) error
25}
26
27// adminWorkspaces implements AdminWorkspaces.
28type adminWorkspaces struct {
29	client *Client
30}
31
32type AdminVCSRepo struct {
33	Identifier string `jsonapi:"attr,identifier"`
34}
35
36// AdminWorkspaces represents a Terraform Enterprise admin workspace.
37type AdminWorkspace struct {
38	ID      string        `jsonapi:"primary,workspaces"`
39	Name    string        `jsonapi:"attr,name"`
40	Locked  bool          `jsonapi:"attr,locked"`
41	VCSRepo *AdminVCSRepo `jsonapi:"attr,vcs-repo"`
42
43	// Relations
44	Organization *Organization `jsonapi:"relation,organization"`
45	CurrentRun   *Run          `jsonapi:"relation,current-run"`
46}
47
48// AdminWorkspaceListOptions represents the options for listing workspaces.
49type AdminWorkspaceListOptions struct {
50	ListOptions
51
52	// A query string (partial workspace name) used to filter the results.
53	// https://www.terraform.io/docs/cloud/api/admin/workspaces.html#query-parameters
54	Query *string `url:"q,omitempty"`
55
56	// A list of relations to include. See available resources
57	// https://www.terraform.io/docs/cloud/api/admin/workspaces.html#available-related-resources
58	Include *string `url:"include"`
59}
60
61// AdminWorkspaceList represents a list of workspaces.
62type AdminWorkspaceList struct {
63	*Pagination
64	Items []*AdminWorkspace
65}
66
67// List all the workspaces within a worksapce.
68func (s *adminWorkspaces) List(ctx context.Context, options AdminWorkspaceListOptions) (*AdminWorkspaceList, error) {
69	u := "admin/workspaces"
70	req, err := s.client.newRequest("GET", u, &options)
71	if err != nil {
72		return nil, err
73	}
74
75	awl := &AdminWorkspaceList{}
76	err = s.client.do(ctx, req, awl)
77	if err != nil {
78		return nil, err
79	}
80
81	return awl, nil
82}
83
84// Read a workspace by its ID.
85func (s *adminWorkspaces) Read(ctx context.Context, workspaceID string) (*AdminWorkspace, error) {
86	if !validStringID(&workspaceID) {
87		return nil, ErrInvalidWorkspaceValue
88	}
89
90	u := fmt.Sprintf("admin/workspaces/%s", url.QueryEscape(workspaceID))
91	req, err := s.client.newRequest("GET", u, nil)
92	if err != nil {
93		return nil, err
94	}
95
96	aw := &AdminWorkspace{}
97	err = s.client.do(ctx, req, aw)
98	if err != nil {
99		return nil, err
100	}
101
102	return aw, nil
103}
104
105// Delete a workspace by its ID.
106func (s *adminWorkspaces) Delete(ctx context.Context, workspaceID string) error {
107	if !validStringID(&workspaceID) {
108		return ErrInvalidWorkspaceValue
109	}
110
111	u := fmt.Sprintf("admin/workspaces/%s", url.QueryEscape(workspaceID))
112	req, err := s.client.newRequest("DELETE", u, nil)
113	if err != nil {
114		return err
115	}
116
117	return s.client.do(ctx, req, nil)
118}
119