1package remote
2
3import (
4 "context"
5 "fmt"
6 "net/http"
7 "net/url"
8
9 "github.com/bnema/gordon/internal/domain"
10)
11
12// ListPreviews returns all active preview environments.
13func (c *Client) ListPreviews(ctx context.Context) ([]domain.PreviewRoute, error) {
14 resp, err := c.request(ctx, http.MethodGet, "/previews", nil)
15 if err != nil {
16 return nil, err
17 }
18
19 var result struct {
20 Previews []domain.PreviewRoute `json:"previews"`
21 }
22 if err := parseResponse(resp, &result); err != nil {
23 return nil, err
24 }
25
26 return result.Previews, nil
27}
28
29// DeletePreview tears down a preview environment by name.
30func (c *Client) DeletePreview(ctx context.Context, name string) error {
31 if name == "" {
32 return fmt.Errorf("preview name cannot be empty")
33 }
34 resp, err := c.request(ctx, http.MethodDelete, "/preview/"+url.PathEscape(name), nil)
35 if err != nil {
36 return err
37 }
38 return parseResponse(resp, nil)
39}
40
41// ExtendPreview extends the TTL of a preview environment.
42func (c *Client) ExtendPreview(ctx context.Context, name string, ttl string) error {
43 if name == "" {
44 return fmt.Errorf("preview name cannot be empty")
45 }
46 if ttl == "" {
47 return fmt.Errorf("ttl cannot be empty")
48 }
49 resp, err := c.request(ctx, http.MethodPatch, "/preview/"+url.PathEscape(name), struct {
50 TTL string `json:"ttl"`
51 }{TTL: ttl})
52 if err != nil {
53 return err
54 }
55 return parseResponse(resp, nil)
56}
57
58// GetPreview returns a single preview by name.
59func (c *Client) GetPreview(ctx context.Context, name string) (*domain.PreviewRoute, error) {
60 previews, err := c.ListPreviews(ctx)
61 if err != nil {
62 return nil, fmt.Errorf("list previews: %w", err)
63 }
64 for _, p := range previews {
65 if p.Name == name {
66 return &p, nil
67 }
68 }
69 return nil, fmt.Errorf("preview %q: %w", name, domain.ErrPreviewNotFound)
70}