forked from jshiffer/matterbridge
229 lines
6.3 KiB
Go
229 lines
6.3 KiB
Go
|
package kbchat
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1"
|
||
|
)
|
||
|
|
||
|
type kvstoreMethod string
|
||
|
|
||
|
type kvstoreOptions struct {
|
||
|
Team *string `json:"team"`
|
||
|
Namespace *string `json:"namespace,omitempty"`
|
||
|
EntryKey *string `json:"entryKey,omitempty"`
|
||
|
EntryValue *string `json:"entryValue,omitempty"`
|
||
|
Revision *int `json:"revision,omitempty"`
|
||
|
}
|
||
|
|
||
|
type kvstoreParams struct {
|
||
|
Options kvstoreOptions `json:"options"`
|
||
|
}
|
||
|
|
||
|
type kvstoreAPIReq struct {
|
||
|
Method kvstoreMethod `json:"method"`
|
||
|
Params kvstoreParams `json:"params"`
|
||
|
}
|
||
|
|
||
|
type GetEntryRes struct {
|
||
|
Result keybase1.KVGetResult `json:"result"`
|
||
|
Error Error `json:"error,omitempty"`
|
||
|
}
|
||
|
|
||
|
type PutEntryRes struct {
|
||
|
Result keybase1.KVPutResult `json:"result"`
|
||
|
Error Error `json:"error,omitempty"`
|
||
|
}
|
||
|
|
||
|
type DeleteEntryRes struct {
|
||
|
Result keybase1.KVDeleteEntryResult `json:"result"`
|
||
|
Error Error `json:"error,omitempty"`
|
||
|
}
|
||
|
|
||
|
type ListNamespacesRes struct {
|
||
|
Result keybase1.KVListNamespaceResult `json:"result"`
|
||
|
Error Error `json:"error,omitempty"`
|
||
|
}
|
||
|
|
||
|
type ListEntryKeysRes struct {
|
||
|
Result keybase1.KVListEntryResult `json:"result"`
|
||
|
Error Error `json:"error,omitempty"`
|
||
|
}
|
||
|
|
||
|
type KVStoreAPI interface {
|
||
|
PutEntry(teamName *string, namespace string, entryKey string, entryValue string) (keybase1.KVPutResult, error)
|
||
|
PutEntryWithRevision(teamName *string, namespace string, entryKey string, entryValue string, revision int) (keybase1.KVPutResult, error)
|
||
|
DeleteEntry(teamName *string, namespace string, entryKey string) (keybase1.KVDeleteEntryResult, error)
|
||
|
DeleteEntryWithRevision(teamName *string, namespace string, entryKey string, revision int) (keybase1.KVDeleteEntryResult, error)
|
||
|
GetEntry(teamName *string, namespace string, entryKey string) (keybase1.KVGetResult, error)
|
||
|
ListNamespaces(teamName *string) (keybase1.KVListNamespaceResult, error)
|
||
|
ListEntryKeys(teamName *string, namespace string) (keybase1.KVListEntryResult, error)
|
||
|
}
|
||
|
|
||
|
func (a *API) PutEntry(teamName *string, namespace string, entryKey string, entryValue string) (result keybase1.KVPutResult, err error) {
|
||
|
return a.PutEntryWithRevision(teamName, namespace, entryKey, entryValue, 0)
|
||
|
}
|
||
|
|
||
|
func (a *API) PutEntryWithRevision(teamName *string, namespace string, entryKey string, entryValue string, revision int) (result keybase1.KVPutResult, err error) {
|
||
|
|
||
|
opts := kvstoreOptions{
|
||
|
Team: teamName,
|
||
|
Namespace: &namespace,
|
||
|
EntryKey: &entryKey,
|
||
|
EntryValue: &entryValue,
|
||
|
}
|
||
|
if revision != 0 {
|
||
|
opts.Revision = &revision
|
||
|
}
|
||
|
args := kvstoreAPIReq{Method: "put", Params: kvstoreParams{Options: opts}}
|
||
|
apiInput, err := json.Marshal(args)
|
||
|
if err != nil {
|
||
|
return result, err
|
||
|
}
|
||
|
|
||
|
cmd := a.runOpts.Command("kvstore", "api")
|
||
|
cmd.Stdin = strings.NewReader(string(apiInput))
|
||
|
bytes, err := cmd.Output()
|
||
|
if err != nil {
|
||
|
return result, APIError{err}
|
||
|
}
|
||
|
|
||
|
entry := PutEntryRes{}
|
||
|
err = json.Unmarshal(bytes, &entry)
|
||
|
if err != nil {
|
||
|
return result, UnmarshalError{err}
|
||
|
}
|
||
|
if entry.Error.Message != "" {
|
||
|
return result, entry.Error
|
||
|
}
|
||
|
return entry.Result, nil
|
||
|
}
|
||
|
|
||
|
func (a *API) DeleteEntry(teamName *string, namespace string, entryKey string) (result keybase1.KVDeleteEntryResult, err error) {
|
||
|
return a.DeleteEntryWithRevision(teamName, namespace, entryKey, 0)
|
||
|
}
|
||
|
|
||
|
func (a *API) DeleteEntryWithRevision(teamName *string, namespace string, entryKey string, revision int) (result keybase1.KVDeleteEntryResult, err error) {
|
||
|
|
||
|
opts := kvstoreOptions{
|
||
|
Team: teamName,
|
||
|
Namespace: &namespace,
|
||
|
EntryKey: &entryKey,
|
||
|
}
|
||
|
if revision != 0 {
|
||
|
opts.Revision = &revision
|
||
|
}
|
||
|
args := kvstoreAPIReq{Method: "del", Params: kvstoreParams{Options: opts}}
|
||
|
apiInput, err := json.Marshal(args)
|
||
|
if err != nil {
|
||
|
return result, err
|
||
|
}
|
||
|
|
||
|
cmd := a.runOpts.Command("kvstore", "api")
|
||
|
cmd.Stdin = strings.NewReader(string(apiInput))
|
||
|
bytes, err := cmd.Output()
|
||
|
if err != nil {
|
||
|
return result, APIError{err}
|
||
|
}
|
||
|
|
||
|
entry := DeleteEntryRes{}
|
||
|
err = json.Unmarshal(bytes, &entry)
|
||
|
if err != nil {
|
||
|
return result, UnmarshalError{err}
|
||
|
}
|
||
|
if entry.Error.Message != "" {
|
||
|
return result, entry.Error
|
||
|
}
|
||
|
return entry.Result, nil
|
||
|
}
|
||
|
|
||
|
func (a *API) GetEntry(teamName *string, namespace string, entryKey string) (result keybase1.KVGetResult, err error) {
|
||
|
|
||
|
opts := kvstoreOptions{
|
||
|
Team: teamName,
|
||
|
Namespace: &namespace,
|
||
|
EntryKey: &entryKey,
|
||
|
}
|
||
|
args := kvstoreAPIReq{Method: "get", Params: kvstoreParams{Options: opts}}
|
||
|
apiInput, err := json.Marshal(args)
|
||
|
if err != nil {
|
||
|
return result, err
|
||
|
}
|
||
|
cmd := a.runOpts.Command("kvstore", "api")
|
||
|
cmd.Stdin = strings.NewReader(string(apiInput))
|
||
|
bytes, err := cmd.Output()
|
||
|
if err != nil {
|
||
|
return result, APIError{err}
|
||
|
}
|
||
|
|
||
|
entry := GetEntryRes{}
|
||
|
err = json.Unmarshal(bytes, &entry)
|
||
|
if err != nil {
|
||
|
return result, UnmarshalError{err}
|
||
|
}
|
||
|
if entry.Error.Message != "" {
|
||
|
return result, entry.Error
|
||
|
}
|
||
|
return entry.Result, nil
|
||
|
}
|
||
|
|
||
|
func (a *API) ListNamespaces(teamName *string) (result keybase1.KVListNamespaceResult, err error) {
|
||
|
|
||
|
opts := kvstoreOptions{
|
||
|
Team: teamName,
|
||
|
}
|
||
|
args := kvstoreAPIReq{Method: "list", Params: kvstoreParams{Options: opts}}
|
||
|
apiInput, err := json.Marshal(args)
|
||
|
if err != nil {
|
||
|
return result, err
|
||
|
}
|
||
|
|
||
|
cmd := a.runOpts.Command("kvstore", "api")
|
||
|
cmd.Stdin = strings.NewReader(string(apiInput))
|
||
|
bytes, err := cmd.Output()
|
||
|
if err != nil {
|
||
|
return result, APIError{err}
|
||
|
}
|
||
|
|
||
|
var namespaces ListNamespacesRes
|
||
|
err = json.Unmarshal(bytes, &namespaces)
|
||
|
if err != nil {
|
||
|
return result, UnmarshalError{err}
|
||
|
}
|
||
|
if namespaces.Error.Message != "" {
|
||
|
return result, namespaces.Error
|
||
|
}
|
||
|
return namespaces.Result, nil
|
||
|
}
|
||
|
|
||
|
func (a *API) ListEntryKeys(teamName *string, namespace string) (result keybase1.KVListEntryResult, err error) {
|
||
|
|
||
|
opts := kvstoreOptions{
|
||
|
Team: teamName,
|
||
|
Namespace: &namespace,
|
||
|
}
|
||
|
args := kvstoreAPIReq{Method: "list", Params: kvstoreParams{Options: opts}}
|
||
|
apiInput, err := json.Marshal(args)
|
||
|
if err != nil {
|
||
|
return result, err
|
||
|
}
|
||
|
|
||
|
cmd := a.runOpts.Command("kvstore", "api")
|
||
|
cmd.Stdin = strings.NewReader(string(apiInput))
|
||
|
bytes, err := cmd.Output()
|
||
|
if err != nil {
|
||
|
return result, APIError{err}
|
||
|
}
|
||
|
|
||
|
entryKeys := ListEntryKeysRes{}
|
||
|
err = json.Unmarshal(bytes, &entryKeys)
|
||
|
if err != nil {
|
||
|
return result, UnmarshalError{err}
|
||
|
}
|
||
|
if entryKeys.Error.Message != "" {
|
||
|
return result, entryKeys.Error
|
||
|
}
|
||
|
return entryKeys.Result, nil
|
||
|
}
|