Implement ConfigAPI client

pull/89/head
Aloïs Micard 4 years ago
parent 901653dc02
commit 32cb7e63e0
No known key found for this signature in database
GPG Key ID: 1A0EB82F071F5EFE

@ -1,7 +1,13 @@
package client
import (
"encoding/json"
"fmt"
"github.com/creekorful/trandoshan/internal/configapi/api"
"github.com/creekorful/trandoshan/internal/event"
"io/ioutil"
"net/http"
"sync"
"time"
)
@ -36,6 +42,8 @@ type RefreshDelay struct {
// Client is a nice client interface for the ConfigAPI
type Client interface {
api.ConfigAPI
GetForbiddenMimeTypes() ([]ForbiddenMimeType, error)
SetForbiddenMimeTypes(values []ForbiddenMimeType) error
@ -47,9 +55,132 @@ type Client interface {
}
type client struct {
configAPIURL string
sub event.Subscriber
mutexes map[string]*sync.RWMutex
forbiddenMimeTypes []ForbiddenMimeType
forbiddenHostnames []ForbiddenHostname
refreshDelay RefreshDelay
}
// NewConfigClient create a new client for the ConfigAPI
func NewConfigClient(configAPIURL string, subscriber event.Subscriber, keys []string) (Client, error) {
return nil, nil // TODO
client := &client{
configAPIURL: configAPIURL,
sub: subscriber,
mutexes: map[string]*sync.RWMutex{},
}
// Pre-load wanted keys & create mutex
for _, key := range keys {
val, err := client.Get(key)
if err != nil {
return nil, err
}
if err := client.setValue(key, val); err != nil {
return nil, err
}
client.mutexes[key] = &sync.RWMutex{}
}
return client, nil
}
func (c *client) Get(key string) ([]byte, error) {
r, err := http.Get(fmt.Sprintf("%s/config/%s", c.configAPIURL, key))
if err != nil {
return nil, err
}
b, err := ioutil.ReadAll(r.Body)
if err != nil {
return nil, err
}
return b, nil
}
func (c *client) Set(key string, value []byte) error {
return nil // TODO
}
func (c *client) GetForbiddenMimeTypes() ([]ForbiddenMimeType, error) {
c.mutexes[ForbiddenMimeTypesKey].RLock()
defer c.mutexes[ForbiddenMimeTypesKey].RUnlock()
return c.forbiddenMimeTypes, nil
}
func (c *client) SetForbiddenMimeTypes(values []ForbiddenMimeType) error {
c.mutexes[ForbiddenMimeTypesKey].Lock()
defer c.mutexes[ForbiddenMimeTypesKey].Unlock()
c.forbiddenMimeTypes = values
return nil
}
func (c *client) GetForbiddenHostnames() ([]ForbiddenHostname, error) {
c.mutexes[ForbiddenHostnamesKey].RLock()
defer c.mutexes[ForbiddenHostnamesKey].RUnlock()
return c.forbiddenHostnames, nil
}
func (c *client) SetForbiddenHostnames(values []ForbiddenHostname) error {
c.mutexes[ForbiddenHostnamesKey].Lock()
defer c.mutexes[ForbiddenHostnamesKey].Unlock()
c.forbiddenHostnames = values
return nil
}
func (c *client) GetRefreshDelay() (RefreshDelay, error) {
c.mutexes[RefreshDelayKey].RLock()
defer c.mutexes[RefreshDelayKey].RUnlock()
return c.refreshDelay, nil
}
func (c *client) SetRefreshDelay(value RefreshDelay) error {
c.mutexes[RefreshDelayKey].Lock()
defer c.mutexes[RefreshDelayKey].Unlock()
c.refreshDelay = value
return nil
}
func (c *client) setValue(key string, value []byte) error {
switch key {
case ForbiddenMimeTypesKey:
var val []ForbiddenMimeType
if err := json.Unmarshal(value, &val); err != nil {
return err
}
c.forbiddenMimeTypes = val
break
case ForbiddenHostnamesKey:
var val []ForbiddenHostname
if err := json.Unmarshal(value, &val); err != nil {
return err
}
c.forbiddenHostnames = val
break
case RefreshDelayKey:
var val RefreshDelay
if err := json.Unmarshal(value, &val); err != nil {
return err
}
c.refreshDelay = val
break
default:
return fmt.Errorf("non managed value type: %s", key)
}
return nil
}

Loading…
Cancel
Save