Improved settings support

This commit is contained in:
Maxim Lebedev 2021-10-14 02:31:10 +05:00
parent ce6530acef
commit dd43f0bf22
Signed by: toby3d
GPG Key ID: 1F14E25B7C119FC5
6 changed files with 129 additions and 77 deletions

View File

@ -1,6 +1,7 @@
package config
type Repository interface {
GetBool(key string) bool
GetInt(key string) int
GetString(key string) string
}

View File

@ -23,3 +23,7 @@ func (v *viperConfigRepository) GetString(key string) string {
func (v *viperConfigRepository) GetInt(key string) int {
return v.viper.GetInt(key)
}
func (v *viperConfigRepository) GetBool(key string) bool {
return v.viper.GetBool(key)
}

View File

@ -37,3 +37,20 @@ func TestGetInt(t *testing.T) {
assert.Equal(t, 42, repository.NewViperConfigRepository(v).GetInt("testing.answer"))
}
func TestGetBool(t *testing.T) {
t.Parallel()
v := viper.New()
_ = v.MergeConfigMap(map[string]interface{}{
"testing": map[string]interface{}{
"answer": 42,
"enabled": true,
"disabled": false,
},
})
assert.False(t, repository.NewViperConfigRepository(v).GetBool("testing.answer"))
assert.True(t, repository.NewViperConfigRepository(v).GetBool("testing.enabled"))
assert.False(t, repository.NewViperConfigRepository(v).GetBool("testing.disabled"))
}

View File

@ -1,9 +1,26 @@
package config
import "time"
type UseCase interface {
Addr() string
DBFileName() string
Host() string
Port() int
URL() string
GetDatabasePath() string
GetDatabaseType() string
GetIndieAuthAccessTokenExpirationTime() time.Duration
GetIndieAuthEnabled() bool
GetIndieAuthJWTSecret() string
GetIndieAuthJWTSigningAlgorithm() string
GetIndieAuthJWTSigningPrivateKeyFile() string
GetName() string
GetRunMode() string
GetServerAddress() string
GetServerCertificate() string
GetServerDomain() string
GetServerEnablePPROF() bool
GetServerHost() string
GetServerKey() string
GetServerPort() int
GetServerProtocol() string
GetServerRootURL() string
GetServerStaticRootPath() string
GetServerStaticURLPrefix() string
}

View File

@ -2,6 +2,10 @@ package usecase
import (
"net"
"path/filepath"
"time"
"github.com/valyala/fasttemplate"
"source.toby3d.me/website/oauth/internal/config"
)
@ -16,22 +20,95 @@ func NewConfigUseCase(repo config.Repository) config.UseCase {
}
}
func (useCase *configUseCase) URL() string {
return useCase.repo.GetString("url")
func (useCase *configUseCase) GetName() string {
return useCase.repo.GetString("name")
}
func (useCase *configUseCase) Host() string {
func (useCase *configUseCase) GetRunMode() string {
return useCase.repo.GetString("runMode")
}
func (useCase *configUseCase) GetServerProtocol() string {
return useCase.repo.GetString("server.protocol")
}
func (useCase *configUseCase) GetServerDomain() string {
return useCase.repo.GetString("server.domain")
}
func (useCase *configUseCase) GetServerRootURL() string {
t := fasttemplate.New(useCase.repo.GetString("server.rootUrl"), "{{", "}}")
data := make(map[string]interface{})
for _, key := range []string{
"domain",
"httpAddr",
"httpPort",
"protocol",
} {
data[key] = useCase.repo.GetString("server." + key)
}
return t.ExecuteString(data)
}
func (useCase *configUseCase) GetServerStaticURLPrefix() string {
return useCase.repo.GetString("server.staticUrlPrefix")
}
func (useCase *configUseCase) GetServerHost() string {
return useCase.repo.GetString("server.host")
}
func (useCase *configUseCase) Port() int {
func (useCase *configUseCase) GetServerPort() int {
return useCase.repo.GetInt("server.port")
}
func (useCase *configUseCase) Addr() string {
return net.JoinHostPort(useCase.repo.GetString("server.host"), useCase.repo.GetString("server.port"))
func (useCase *configUseCase) GetServerAddress() string {
return net.JoinHostPort(useCase.repo.GetString("server.host"),
useCase.repo.GetString("server.port"))
}
func (useCase *configUseCase) DBFileName() string {
return useCase.repo.GetString("database.connection.filename")
func (useCase *configUseCase) GetServerCertificate() string {
return filepath.Clean(useCase.repo.GetString("server.certFile"))
}
func (useCase *configUseCase) GetServerKey() string {
return filepath.Clean(useCase.repo.GetString("server.keyFile"))
}
func (useCase *configUseCase) GetServerStaticRootPath() string {
return useCase.repo.GetString("server.staticRootPath")
}
func (useCase *configUseCase) GetServerEnablePPROF() bool {
return useCase.repo.GetBool("server.enablePprof")
}
func (useCase *configUseCase) GetDatabaseType() string {
return useCase.repo.GetString("database.type")
}
func (useCase *configUseCase) GetDatabasePath() string {
return filepath.Clean(useCase.repo.GetString("database.path"))
}
func (useCase *configUseCase) GetIndieAuthEnabled() bool {
return useCase.repo.GetBool("indieauth.enabled")
}
func (useCase *configUseCase) GetIndieAuthAccessTokenExpirationTime() time.Duration {
return time.Duration(useCase.repo.GetInt("indieauth.accessTokenExpirationTime")) * time.Second
}
func (useCase *configUseCase) GetIndieAuthJWTSigningAlgorithm() string {
return useCase.repo.GetString("indieauth.jwtSigningAlgorithm")
}
func (useCase *configUseCase) GetIndieAuthJWTSecret() string {
return useCase.repo.GetString("indieauth.jwtSecret")
}
func (useCase *configUseCase) GetIndieAuthJWTSigningPrivateKeyFile() string {
return filepath.Clean(useCase.repo.GetString("indieauth.jwtSigningPrivateKeyFile"))
}

View File

@ -1,64 +0,0 @@
package usecase_test
import (
"os"
"testing"
"github.com/spf13/viper"
"github.com/stretchr/testify/assert"
"source.toby3d.me/website/oauth/internal/config"
repository "source.toby3d.me/website/oauth/internal/config/repository/viper"
"source.toby3d.me/website/oauth/internal/config/usecase"
)
//nolint: gochecknoglobals
var ucase config.UseCase
func TestMain(m *testing.M) {
v := viper.New()
for key, val := range map[string]interface{}{
"database.client": "bolt",
"database.connection.filename": "./data/development.db",
"server.host": "127.0.0.1",
"server.port": 3000,
"url": "https://127.0.0.1:3000/",
} {
v.Set(key, val)
}
ucase = usecase.NewConfigUseCase(repository.NewViperConfigRepository(v))
os.Exit(m.Run())
}
func TestAddr(t *testing.T) {
t.Parallel()
assert.Equal(t, "127.0.0.1:3000", ucase.Addr())
}
func TestDBFileName(t *testing.T) {
t.Parallel()
assert.Equal(t, "./data/development.db", ucase.DBFileName())
}
func TestHost(t *testing.T) {
t.Parallel()
assert.Equal(t, "127.0.0.1", ucase.Host())
}
func TestPort(t *testing.T) {
t.Parallel()
assert.Equal(t, 3000, ucase.Port())
}
func TestURL(t *testing.T) {
t.Parallel()
assert.Equal(t, "https://127.0.0.1:3000/", ucase.URL())
}