Add save/load for client config
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
parent
d583db5450
commit
ff8c6aca64
@ -8,20 +8,61 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.t-juice.club/torjus/gpaste/api"
|
"git.t-juice.club/torjus/gpaste/api"
|
||||||
"git.t-juice.club/torjus/gpaste/files"
|
"git.t-juice.club/torjus/gpaste/files"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
"github.com/kirsle/configdir"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Client struct {
|
type Client struct {
|
||||||
BaseURL string
|
BaseURL string `json:"base_url"`
|
||||||
AuthToken string
|
AuthToken string `json:"auth_token"`
|
||||||
|
|
||||||
httpClient http.Client
|
httpClient http.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) WriteConfigToWriter(w io.Writer) error {
|
||||||
|
encoder := json.NewEncoder(w)
|
||||||
|
return encoder.Encode(c)
|
||||||
|
}
|
||||||
|
func (c *Client) WriteConfig() error {
|
||||||
|
dir := configdir.LocalConfig("gpaste")
|
||||||
|
// Ensure dir exists
|
||||||
|
err := os.MkdirAll(dir, os.ModePerm)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
path := filepath.Join(dir, "client.json")
|
||||||
|
f, err := os.Create(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
return c.WriteConfigToWriter(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) LoadConfig() error {
|
||||||
|
dir := configdir.LocalCache("gpaste")
|
||||||
|
path := filepath.Join(dir, "client.json")
|
||||||
|
f, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
return c.LoadConfigFromReader(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) LoadConfigFromReader(r io.Reader) error {
|
||||||
|
decoder := json.NewDecoder(r)
|
||||||
|
return decoder.Decode(c)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) Login(ctx context.Context, username, password string) error {
|
func (c *Client) Login(ctx context.Context, username, password string) error {
|
||||||
url := fmt.Sprintf("%s/api/login", c.BaseURL)
|
url := fmt.Sprintf("%s/api/login", c.BaseURL)
|
||||||
// TODO: Change timeout
|
// TODO: Change timeout
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package client_test
|
package client_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@ -15,6 +16,7 @@ import (
|
|||||||
"git.t-juice.club/torjus/gpaste/files"
|
"git.t-juice.club/torjus/gpaste/files"
|
||||||
"git.t-juice.club/torjus/gpaste/users"
|
"git.t-juice.club/torjus/gpaste/users"
|
||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
|
"github.com/google/go-cmp/cmp/cmpopts"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -162,4 +164,31 @@ func TestClient(t *testing.T) {
|
|||||||
t.Errorf("File contents does not match: %s", cmp.Diff(buf.String(), fileContents))
|
t.Errorf("File contents does not match: %s", cmp.Diff(buf.String(), fileContents))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
t.Run("Save", func(t *testing.T) {
|
||||||
|
c := client.Client{BaseURL: "http://example.org/gpaste", AuthToken: "tokenpls"}
|
||||||
|
expectedConfig := "{\"base_url\":\"http://example.org/gpaste\",\"auth_token\":\"tokenpls\"}\n"
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
err := c.WriteConfigToWriter(buf)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error writing config: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if diff := cmp.Diff(buf.String(), expectedConfig); diff != "" {
|
||||||
|
t.Errorf("Written config does not match expected: %s", diff)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
t.Run("Load", func(t *testing.T) {
|
||||||
|
c := client.Client{}
|
||||||
|
config := "{\"base_url\":\"http://pasta.example.org\",\"auth_token\":\"tokenpls\"}\n"
|
||||||
|
expectedClient := client.Client{BaseURL: "http://pasta.example.org", AuthToken: "tokenpls"}
|
||||||
|
sr := strings.NewReader(config)
|
||||||
|
if err := c.LoadConfigFromReader(sr); err != nil {
|
||||||
|
t.Fatalf("Error reading config: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if diff := cmp.Diff(c, expectedClient, cmpopts.IgnoreUnexported(client.Client{})); diff != "" {
|
||||||
|
t.Errorf("Client does not match expected: %s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,10 @@ func ActionLogin(c *cli.Context) error {
|
|||||||
errmsg := fmt.Sprintf("Error logging in: %s", err)
|
errmsg := fmt.Sprintf("Error logging in: %s", err)
|
||||||
return cli.Exit(errmsg, 1)
|
return cli.Exit(errmsg, 1)
|
||||||
}
|
}
|
||||||
|
if err := clnt.WriteConfig(); err != nil {
|
||||||
|
errMsg := fmt.Sprintf("Failed to write config: %s", err)
|
||||||
|
return cli.Exit(errMsg, 1)
|
||||||
|
}
|
||||||
// TODO: Store this somewhere, so we don't need to log in each time
|
// TODO: Store this somewhere, so we don't need to log in each time
|
||||||
fmt.Println("Successfully logged in.")
|
fmt.Println("Successfully logged in.")
|
||||||
|
|
||||||
|
2
go.mod
2
go.mod
@ -9,6 +9,7 @@ require github.com/go-chi/chi/v5 v5.0.7
|
|||||||
require (
|
require (
|
||||||
github.com/golang-jwt/jwt v3.2.2+incompatible
|
github.com/golang-jwt/jwt v3.2.2+incompatible
|
||||||
github.com/google/go-cmp v0.5.6
|
github.com/google/go-cmp v0.5.6
|
||||||
|
github.com/kirsle/configdir v0.0.0-20170128060238-e45d2f54772f
|
||||||
github.com/pelletier/go-toml v1.9.4
|
github.com/pelletier/go-toml v1.9.4
|
||||||
github.com/urfave/cli/v2 v2.3.0
|
github.com/urfave/cli/v2 v2.3.0
|
||||||
go.etcd.io/bbolt v1.3.6
|
go.etcd.io/bbolt v1.3.6
|
||||||
@ -23,4 +24,5 @@ require (
|
|||||||
go.uber.org/atomic v1.9.0 // indirect
|
go.uber.org/atomic v1.9.0 // indirect
|
||||||
go.uber.org/multierr v1.7.0 // indirect
|
go.uber.org/multierr v1.7.0 // indirect
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
|
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
||||||
)
|
)
|
||||||
|
2
go.sum
2
go.sum
@ -15,6 +15,8 @@ github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
|||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/kirsle/configdir v0.0.0-20170128060238-e45d2f54772f h1:dKccXx7xA56UNqOcFIbuqFjAWPVtP688j5QMgmo6OHU=
|
||||||
|
github.com/kirsle/configdir v0.0.0-20170128060238-e45d2f54772f/go.mod h1:4rEELDSfUAlBSyUjPG0JnaNGjf13JySHFeRdD/3dLP0=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
Loading…
Reference in New Issue
Block a user