113 lines
2.4 KiB
Go
113 lines
2.4 KiB
Go
// Copyright (C) 2023 Marius Schellenberger
|
|
|
|
package client
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
apiclient "git.giftfish.de/ston1th/keyctl/pkg/api/client"
|
|
"git.giftfish.de/ston1th/keyctl/pkg/api/v1/schema"
|
|
)
|
|
|
|
var (
|
|
ErrClientIsNil = errors.New("client is nil")
|
|
keyPath = schema.KeyPath
|
|
reqPath = schema.ReqPath
|
|
)
|
|
|
|
type Client struct {
|
|
c *apiclient.Client
|
|
}
|
|
|
|
func NewClient(c *apiclient.Client) (*Client, error) {
|
|
if c == nil {
|
|
return nil, ErrClientIsNil
|
|
}
|
|
return &Client{c}, nil
|
|
}
|
|
|
|
func (c *Client) GetApprovals(ctx context.Context) (approvals schema.Approvals, err error) {
|
|
path := reqPath
|
|
req, err := c.c.NewRequest(ctx, "GET", path, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = c.c.Do(req, &approvals)
|
|
return
|
|
}
|
|
|
|
func (c *Client) RejectApproval(ctx context.Context, id string) error {
|
|
return c.sendApproval(ctx, id, false)
|
|
}
|
|
|
|
func (c *Client) AcceptApproval(ctx context.Context, id string) error {
|
|
return c.sendApproval(ctx, id, true)
|
|
}
|
|
|
|
func (c *Client) sendApproval(ctx context.Context, id string, approve bool) (err error) {
|
|
path := fmt.Sprintf("%s/%s", reqPath, id)
|
|
method := "DELETE"
|
|
if approve {
|
|
method = "PUT"
|
|
}
|
|
req, err := c.c.NewRequest(ctx, method, path, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = c.c.Do(req, nil)
|
|
return
|
|
}
|
|
|
|
func (c *Client) GetKeys(ctx context.Context) (keys schema.Keys, err error) {
|
|
path := keyPath
|
|
req, err := c.c.NewRequest(ctx, "GET", path, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = c.c.Do(req, &keys)
|
|
return
|
|
}
|
|
|
|
func (c *Client) GetKey(ctx context.Context, id string) (key schema.Key, err error) {
|
|
path := fmt.Sprintf("%s/%s", keyPath, id)
|
|
req, err := c.c.NewRequest(ctx, "GET", path, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = c.c.FollowRedirect(req, &key, time.Second*2)
|
|
return
|
|
}
|
|
|
|
func (c *Client) CreateKey(ctx context.Context, newKey schema.NewKey) (key schema.Key, err error) {
|
|
buf := new(bytes.Buffer)
|
|
path := keyPath
|
|
err = newKey.Validate()
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = json.NewEncoder(buf).Encode(newKey)
|
|
if err != nil {
|
|
return
|
|
}
|
|
req, err := c.c.NewRequest(ctx, "POST", path, buf)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = c.c.Do(req, &key)
|
|
return
|
|
}
|
|
|
|
func (c *Client) DeleteKey(ctx context.Context, id string) (err error) {
|
|
path := fmt.Sprintf("%s/%s", keyPath, id)
|
|
req, err := c.c.NewRequest(ctx, "DELETE", path, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = c.c.Do(req, nil)
|
|
return
|
|
}
|