feat: database as plugin
This commit is contained in:
@@ -13,8 +13,8 @@ func (proxy Proxy) GetMetadata(name string, originalPath string, header http.Hea
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// get package from redis
|
||||
pkg, err := proxy.RedisClient.Get(options.RedisPrefix + name).Result()
|
||||
// get package from database
|
||||
pkg, err := proxy.Database.Get(options.DatabasePrefix + name)
|
||||
|
||||
// either package doesn't exist or there's some other problem
|
||||
if err != nil {
|
||||
@@ -50,11 +50,11 @@ func (proxy Proxy) GetMetadata(name string, originalPath string, header http.Hea
|
||||
pkg = string(body)
|
||||
|
||||
// save to redis
|
||||
_, err = proxy.RedisClient.Set(
|
||||
options.RedisPrefix+name,
|
||||
err = proxy.Database.Set(
|
||||
options.DatabasePrefix+name,
|
||||
pkg,
|
||||
options.RedisExpireTimeout,
|
||||
).Result()
|
||||
options.DatabaseExpiration,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -74,14 +74,14 @@ func (proxy Proxy) ListMetadata() ([]string, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
metadata, err := proxy.RedisClient.Keys(options.RedisPrefix + "*").Result()
|
||||
metadata, err := proxy.Database.Keys(options.DatabasePrefix)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
deprefixedMetadata := make([]string, 0)
|
||||
for _, record := range metadata {
|
||||
deprefixedMetadata = append(deprefixedMetadata, strings.Replace(record, options.RedisPrefix, "", 1))
|
||||
deprefixedMetadata = append(deprefixedMetadata, strings.Replace(record, options.DatabasePrefix, "", 1))
|
||||
}
|
||||
|
||||
return deprefixedMetadata, nil
|
||||
@@ -94,13 +94,13 @@ func (proxy Proxy) PurgeMetadata() error {
|
||||
return err
|
||||
}
|
||||
|
||||
metadata, err := proxy.RedisClient.Keys(options.RedisPrefix + "*").Result()
|
||||
metadata, err := proxy.Database.Keys(options.DatabasePrefix)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, record := range metadata {
|
||||
_, err := proxy.RedisClient.Del(record).Result()
|
||||
err := proxy.Database.Delete(record)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
31
proxy/database_redis.go
Normal file
31
proxy/database_redis.go
Normal file
@@ -0,0 +1,31 @@
|
||||
package proxy
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/go-redis/redis"
|
||||
)
|
||||
|
||||
type DatabaseRedis struct {
|
||||
Client *redis.Client
|
||||
}
|
||||
|
||||
func (db DatabaseRedis) Get(key string) (string, error) {
|
||||
return db.Client.Get(key).Result()
|
||||
}
|
||||
|
||||
func (db DatabaseRedis) Set(key string, value string, expiration time.Duration) error {
|
||||
return db.Client.Set(key, value, expiration).Err()
|
||||
}
|
||||
|
||||
func (db DatabaseRedis) Delete(key string) error {
|
||||
return db.Client.Del(key).Err()
|
||||
}
|
||||
|
||||
func (db DatabaseRedis) Keys(prefix string) ([]string, error) {
|
||||
return db.Client.Keys(prefix + "*").Result()
|
||||
}
|
||||
|
||||
func (db DatabaseRedis) Health() error {
|
||||
return db.Client.Ping().Err()
|
||||
}
|
||||
@@ -3,19 +3,25 @@ package proxy
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/go-redis/redis"
|
||||
)
|
||||
|
||||
type Proxy struct {
|
||||
RedisClient *redis.Client
|
||||
HttpClient *http.Client
|
||||
Database Database
|
||||
HttpClient *http.Client
|
||||
|
||||
GetOptions func() (Options, error)
|
||||
}
|
||||
|
||||
type Options struct {
|
||||
RedisPrefix string
|
||||
RedisExpireTimeout time.Duration
|
||||
DatabasePrefix string
|
||||
DatabaseExpiration time.Duration
|
||||
UpstreamAddress string
|
||||
}
|
||||
|
||||
type Database interface {
|
||||
Get(key string) (string, error)
|
||||
Set(key string, value string, ttl time.Duration) error
|
||||
Delete(key string) error
|
||||
Keys(prefix string) ([]string, error)
|
||||
Health() error
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ func (proxy Proxy) NoRouteHandler(c *gin.Context) {
|
||||
// } else
|
||||
|
||||
if c.Request.URL.Path == "/" {
|
||||
_, err := proxy.RedisClient.Ping().Result()
|
||||
err := proxy.Database.Health()
|
||||
|
||||
if err != nil {
|
||||
c.AbortWithStatusJSON(503, err)
|
||||
|
||||
Reference in New Issue
Block a user