1package tfe
2
3import (
4	"context"
5	"errors"
6	"fmt"
7	"net/url"
8	"time"
9)
10
11// Compile-time proof of interface implementation.
12var _ OrganizationTokens = (*organizationTokens)(nil)
13
14// OrganizationTokens describes all the organization token related methods
15// that the Terraform Enterprise API supports.
16//
17// TFE API docs:
18// https://www.terraform.io/docs/enterprise/api/organization-tokens.html
19type OrganizationTokens interface {
20	// Generate a new organization token, replacing any existing token.
21	Generate(ctx context.Context, organization string) (*OrganizationToken, error)
22
23	// Read an organization token.
24	Read(ctx context.Context, organization string) (*OrganizationToken, error)
25
26	// Delete an organization token.
27	Delete(ctx context.Context, organization string) error
28}
29
30// organizationTokens implements OrganizationTokens.
31type organizationTokens struct {
32	client *Client
33}
34
35// OrganizationToken represents a Terraform Enterprise organization token.
36type OrganizationToken struct {
37	ID          string    `jsonapi:"primary,authentication-tokens"`
38	CreatedAt   time.Time `jsonapi:"attr,created-at,iso8601"`
39	Description string    `jsonapi:"attr,description"`
40	LastUsedAt  time.Time `jsonapi:"attr,last-used-at,iso8601"`
41	Token       string    `jsonapi:"attr,token"`
42}
43
44// Generate a new organization token, replacing any existing token.
45func (s *organizationTokens) Generate(ctx context.Context, organization string) (*OrganizationToken, error) {
46	if !validStringID(&organization) {
47		return nil, errors.New("invalid value for organization")
48	}
49
50	u := fmt.Sprintf("organizations/%s/authentication-token", url.QueryEscape(organization))
51	req, err := s.client.newRequest("POST", u, nil)
52	if err != nil {
53		return nil, err
54	}
55
56	ot := &OrganizationToken{}
57	err = s.client.do(ctx, req, ot)
58	if err != nil {
59		return nil, err
60	}
61
62	return ot, err
63}
64
65// Read an organization token.
66func (s *organizationTokens) Read(ctx context.Context, organization string) (*OrganizationToken, error) {
67	if !validStringID(&organization) {
68		return nil, errors.New("invalid value for organization")
69	}
70
71	u := fmt.Sprintf("organizations/%s/authentication-token", url.QueryEscape(organization))
72	req, err := s.client.newRequest("GET", u, nil)
73	if err != nil {
74		return nil, err
75	}
76
77	ot := &OrganizationToken{}
78	err = s.client.do(ctx, req, ot)
79	if err != nil {
80		return nil, err
81	}
82
83	return ot, err
84}
85
86// Delete an organization token.
87func (s *organizationTokens) Delete(ctx context.Context, organization string) error {
88	if !validStringID(&organization) {
89		return errors.New("invalid value for organization")
90	}
91
92	u := fmt.Sprintf("organizations/%s/authentication-token", url.QueryEscape(organization))
93	req, err := s.client.newRequest("DELETE", u, nil)
94	if err != nil {
95		return err
96	}
97
98	return s.client.do(ctx, req, nil)
99}
100