v2 #43
|
@ -29,3 +29,8 @@ type AuthorRepository interface {
|
|||
// It returns an error if the author is not found
|
||||
FindByName(name string) (*model.Author, error)
|
||||
}
|
||||
|
||||
type SiteConfigRepository interface {
|
||||
Get() (model.SiteConfig, error)
|
||||
Update(siteConfig model.SiteConfig) error
|
||||
}
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
package model
|
||||
|
||||
type MeLinks struct {
|
||||
Name string
|
||||
Url string
|
||||
}
|
||||
|
||||
type EntryList struct {
|
||||
Id string
|
||||
Title string
|
||||
Include []string
|
||||
ListType string
|
||||
}
|
||||
|
||||
type MenuItem struct {
|
||||
Title string
|
||||
List string
|
||||
Url string
|
||||
Post string
|
||||
}
|
||||
|
||||
type SiteConfig struct {
|
||||
Title string
|
||||
SubTitle string
|
||||
HeaderColor string
|
||||
AuthorName string
|
||||
Me []MeLinks
|
||||
Lists []EntryList
|
||||
PrimaryListInclude []string
|
||||
HeaderMenu []MenuItem
|
||||
FooterMenu []MenuItem
|
||||
Secret string
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
package infra
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"owl-blogs/app/repository"
|
||||
"owl-blogs/domain/model"
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
)
|
||||
|
||||
type DefaultSiteConfigRepo struct {
|
||||
db *sqlx.DB
|
||||
}
|
||||
|
||||
func NewSiteConfigRepo(db Database) repository.SiteConfigRepository {
|
||||
sqlxdb := db.Get()
|
||||
|
||||
sqlxdb.MustExec(`
|
||||
CREATE TABLE IF NOT EXISTS site_config (
|
||||
config TEXT
|
||||
);
|
||||
`)
|
||||
|
||||
return &DefaultSiteConfigRepo{
|
||||
db: sqlxdb,
|
||||
}
|
||||
}
|
||||
|
||||
// Get implements repository.SiteConfigRepository.
|
||||
func (r *DefaultSiteConfigRepo) Get() (model.SiteConfig, error) {
|
||||
data := []byte{}
|
||||
err := r.db.Get(&data, "SELECT config FROM site_config LIMIT 1")
|
||||
if err != nil {
|
||||
if err.Error() == "sql: no rows in result set" {
|
||||
return model.SiteConfig{}, nil
|
||||
}
|
||||
return model.SiteConfig{}, err
|
||||
}
|
||||
if len(data) == 0 {
|
||||
return model.SiteConfig{}, nil
|
||||
}
|
||||
config := model.SiteConfig{}
|
||||
err = json.Unmarshal(data, &config)
|
||||
return config, err
|
||||
}
|
||||
|
||||
// Update implements repository.SiteConfigRepository.
|
||||
func (r *DefaultSiteConfigRepo) Update(siteConfig model.SiteConfig) error {
|
||||
jsonData, err := json.Marshal(siteConfig)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
res, err := r.db.Exec("UPDATE site_config SET config = ?", jsonData)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rows, err := res.RowsAffected()
|
||||
if rows == 0 {
|
||||
_, err = r.db.Exec("INSERT INTO site_config (config) VALUES (?)", jsonData)
|
||||
}
|
||||
return err
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
package infra_test
|
||||
|
||||
import (
|
||||
"owl-blogs/app/repository"
|
||||
"owl-blogs/infra"
|
||||
"owl-blogs/test"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func setupSiteConfigRepo() repository.SiteConfigRepository {
|
||||
db := test.NewMockDb()
|
||||
repo := infra.NewSiteConfigRepo(db)
|
||||
return repo
|
||||
}
|
||||
|
||||
func TestSiteConfigRepo(t *testing.T) {
|
||||
repo := setupSiteConfigRepo()
|
||||
|
||||
config, err := repo.Get()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "", config.Title)
|
||||
require.Equal(t, "", config.SubTitle)
|
||||
|
||||
config.Title = "title"
|
||||
config.SubTitle = "SubTitle"
|
||||
|
||||
err = repo.Update(config)
|
||||
require.NoError(t, err)
|
||||
|
||||
config2, err := repo.Get()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "title", config2.Title)
|
||||
require.Equal(t, "SubTitle", config2.SubTitle)
|
||||
}
|
||||
|
||||
func TestSiteConfigUpdates(t *testing.T) {
|
||||
repo := setupSiteConfigRepo()
|
||||
|
||||
config, err := repo.Get()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "", config.Title)
|
||||
require.Equal(t, "", config.SubTitle)
|
||||
|
||||
config.Title = "title"
|
||||
config.SubTitle = "SubTitle"
|
||||
|
||||
err = repo.Update(config)
|
||||
require.NoError(t, err)
|
||||
|
||||
config2, err := repo.Get()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "title", config2.Title)
|
||||
require.Equal(t, "SubTitle", config2.SubTitle)
|
||||
|
||||
config2.Title = "title2"
|
||||
config2.SubTitle = "SubTitle2"
|
||||
|
||||
err = repo.Update(config2)
|
||||
require.NoError(t, err)
|
||||
|
||||
config3, err := repo.Get()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "title2", config3.Title)
|
||||
require.Equal(t, "SubTitle2", config3.SubTitle)
|
||||
|
||||
}
|
Loading…
Reference in New Issue