From 3a1559584c804cb805272b29cc008aaebce0ac39 Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Sun, 16 Jul 2023 21:08:25 +0200 Subject: [PATCH] siteconfig --- app/repository/interfaces.go | 5 ++ domain/model/siteconfig.go | 33 ++++++++++++++ infra/site_config_repository.go | 62 +++++++++++++++++++++++++ infra/site_config_repository_test.go | 68 ++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 domain/model/siteconfig.go create mode 100644 infra/site_config_repository.go create mode 100644 infra/site_config_repository_test.go diff --git a/app/repository/interfaces.go b/app/repository/interfaces.go index c5c3013..d0294c4 100644 --- a/app/repository/interfaces.go +++ b/app/repository/interfaces.go @@ -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 +} diff --git a/domain/model/siteconfig.go b/domain/model/siteconfig.go new file mode 100644 index 0000000..72fc5b4 --- /dev/null +++ b/domain/model/siteconfig.go @@ -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 +} diff --git a/infra/site_config_repository.go b/infra/site_config_repository.go new file mode 100644 index 0000000..0d302f3 --- /dev/null +++ b/infra/site_config_repository.go @@ -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 +} diff --git a/infra/site_config_repository_test.go b/infra/site_config_repository_test.go new file mode 100644 index 0000000..b16641c --- /dev/null +++ b/infra/site_config_repository_test.go @@ -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) + +}