diff --git a/cmd/owl/import_v1.go b/cmd/owl/import_v1.go index f5004b0..ee811ba 100644 --- a/cmd/owl/import_v1.go +++ b/cmd/owl/import_v1.go @@ -10,6 +10,7 @@ import ( "path" "github.com/spf13/cobra" + "gopkg.in/yaml.v2" ) var userPath string @@ -37,6 +38,68 @@ var importCmd = &cobra.Command{ panic(err) } + // import config + bytes, err := os.ReadFile(path.Join(userPath, "meta/config.yml")) + if err != nil { + panic(err) + } + v1Config := importer.V1UserConfig{} + yaml.Unmarshal(bytes, &v1Config) + + mes := []model.MeLinks{} + for _, me := range v1Config.Me { + mes = append(mes, model.MeLinks{ + Name: me.Name, + Url: me.Url, + }) + } + + lists := []model.EntryList{} + for _, list := range v1Config.Lists { + lists = append(lists, model.EntryList{ + Id: list.Id, + Title: list.Title, + Include: importer.ConvertTypeList(list.Include, app.Registry), + ListType: list.ListType, + }) + } + + headerMenu := []model.MenuItem{} + for _, item := range v1Config.HeaderMenu { + headerMenu = append(headerMenu, model.MenuItem{ + Title: item.Title, + List: item.List, + Url: item.Url, + Post: item.Post, + }) + } + + footerMenu := []model.MenuItem{} + for _, item := range v1Config.FooterMenu { + footerMenu = append(footerMenu, model.MenuItem{ + Title: item.Title, + List: item.List, + Url: item.Url, + Post: item.Post, + }) + } + + v2Config, _ := app.SiteConfigRepo.Get() + v2Config.Title = v1Config.Title + v2Config.SubTitle = v1Config.SubTitle + v2Config.HeaderColor = v1Config.HeaderColor + v2Config.AuthorName = v1Config.AuthorName + v2Config.Me = mes + v2Config.Lists = lists + v2Config.PrimaryListInclude = v1Config.PrimaryListInclude + v2Config.HeaderMenu = headerMenu + v2Config.FooterMenu = footerMenu + + err = app.SiteConfigRepo.Update(v2Config) + if err != nil { + panic(err) + } + for _, post := range posts { existing, _ := app.EntryService.FindById(post.Id) if existing != nil { @@ -72,9 +135,23 @@ var importCmd = &cobra.Command{ Content: post.Content, }) case "bookmark": - + entry = &entrytypes.Bookmark{} + entry.SetID(post.Id) + entry.SetPublishedAt(&post.Meta.Date) + entry.SetMetaData(&entrytypes.BookmarkMetaData{ + Url: post.Meta.Bookmark.Url, + Title: post.Meta.Bookmark.Text, + Content: post.Content, + }) case "reply": - + entry = &entrytypes.Reply{} + entry.SetID(post.Id) + entry.SetPublishedAt(&post.Meta.Date) + entry.SetMetaData(&entrytypes.ReplyMetaData{ + Url: post.Meta.Reply.Url, + Title: post.Meta.Reply.Text, + Content: post.Content, + }) case "photo": entry = &entrytypes.Image{} entry.SetID(post.Id) diff --git a/cmd/owl/main.go b/cmd/owl/main.go index 909cb63..0d6406b 100644 --- a/cmd/owl/main.go +++ b/cmd/owl/main.go @@ -32,6 +32,8 @@ func App(db infra.Database) *web.WebApp { registry.Register(&entrytypes.Page{}) registry.Register(&entrytypes.Recipe{}) registry.Register(&entrytypes.Note{}) + registry.Register(&entrytypes.Bookmark{}) + registry.Register(&entrytypes.Reply{}) entryRepo := infra.NewEntryRepository(db, registry) binRepo := infra.NewBinaryFileRepo(db) diff --git a/entry_types/bookmark.go b/entry_types/bookmark.go new file mode 100644 index 0000000..2002bd0 --- /dev/null +++ b/entry_types/bookmark.go @@ -0,0 +1,38 @@ +package entrytypes + +import ( + "fmt" + "owl-blogs/domain/model" + "owl-blogs/render" +) + +type Bookmark struct { + model.EntryBase + meta BookmarkMetaData +} + +type BookmarkMetaData struct { + Title string `owl:"inputType=text"` + Url string `owl:"inputType=text"` + Content string `owl:"inputType=text widget=textarea"` +} + +func (e *Bookmark) Title() string { + return e.meta.Title +} + +func (e *Bookmark) Content() model.EntryContent { + str, err := render.RenderTemplateToString("entry/Bookmark", e) + if err != nil { + fmt.Println(err) + } + return model.EntryContent(str) +} + +func (e *Bookmark) MetaData() interface{} { + return &e.meta +} + +func (e *Bookmark) SetMetaData(metaData interface{}) { + e.meta = *metaData.(*BookmarkMetaData) +} diff --git a/entry_types/reply.go b/entry_types/reply.go new file mode 100644 index 0000000..de2f751 --- /dev/null +++ b/entry_types/reply.go @@ -0,0 +1,38 @@ +package entrytypes + +import ( + "fmt" + "owl-blogs/domain/model" + "owl-blogs/render" +) + +type Reply struct { + model.EntryBase + meta ReplyMetaData +} + +type ReplyMetaData struct { + Title string `owl:"inputType=text"` + Url string `owl:"inputType=text"` + Content string `owl:"inputType=text widget=textarea"` +} + +func (e *Reply) Title() string { + return "Re: " + e.meta.Title +} + +func (e *Reply) Content() model.EntryContent { + str, err := render.RenderTemplateToString("entry/Reply", e) + if err != nil { + fmt.Println(err) + } + return model.EntryContent(str) +} + +func (e *Reply) MetaData() interface{} { + return &e.meta +} + +func (e *Reply) SetMetaData(metaData interface{}) { + e.meta = *metaData.(*ReplyMetaData) +} diff --git a/importer/config.go b/importer/config.go new file mode 100644 index 0000000..7fb861a --- /dev/null +++ b/importer/config.go @@ -0,0 +1,33 @@ +package importer + +type V1UserConfig struct { + Title string `yaml:"title"` + SubTitle string `yaml:"subtitle"` + HeaderColor string `yaml:"header_color"` + AuthorName string `yaml:"author_name"` + Me []V1UserMe `yaml:"me"` + PassworHash string `yaml:"password_hash"` + Lists []V1PostList `yaml:"lists"` + PrimaryListInclude []string `yaml:"primary_list_include"` + HeaderMenu []V1MenuItem `yaml:"header_menu"` + FooterMenu []V1MenuItem `yaml:"footer_menu"` +} + +type V1UserMe struct { + Name string `yaml:"name"` + Url string `yaml:"url"` +} + +type V1PostList struct { + Id string `yaml:"id"` + Title string `yaml:"title"` + Include []string `yaml:"include"` + ListType string `yaml:"list_type"` +} + +type V1MenuItem struct { + Title string `yaml:"title"` + List string `yaml:"list"` + Url string `yaml:"url"` + Post string `yaml:"post"` +} diff --git a/importer/utils.go b/importer/utils.go index e7fe2c1..7b77cb3 100644 --- a/importer/utils.go +++ b/importer/utils.go @@ -3,6 +3,8 @@ package importer import ( "bytes" "os" + "owl-blogs/app" + entrytypes "owl-blogs/entry_types" "path" "time" @@ -202,3 +204,35 @@ func fileExists(path string) bool { _, err := os.Stat(path) return err == nil } + +func ConvertTypeList(v1 []string, registry *app.EntryTypeRegistry) []string { + v2 := make([]string, len(v1)) + for i, v1Type := range v1 { + switch v1Type { + case "article": + name, _ := registry.TypeName(&entrytypes.Article{}) + v2[i] = name + case "bookmark": + name, _ := registry.TypeName(&entrytypes.Bookmark{}) + v2[i] = name + case "reply": + name, _ := registry.TypeName(&entrytypes.Reply{}) + v2[i] = name + case "photo": + name, _ := registry.TypeName(&entrytypes.Image{}) + v2[i] = name + case "note": + name, _ := registry.TypeName(&entrytypes.Note{}) + v2[i] = name + case "recipe": + name, _ := registry.TypeName(&entrytypes.Recipe{}) + v2[i] = name + case "page": + name, _ := registry.TypeName(&entrytypes.Page{}) + v2[i] = name + default: + v2[i] = v1Type + } + } + return v2 +} diff --git a/render/templates/base.tmpl b/render/templates/base.tmpl index 321926d..e85f769 100644 --- a/render/templates/base.tmpl +++ b/render/templates/base.tmpl @@ -85,6 +85,15 @@
@@ -93,7 +102,19 @@ {{template "main" .Data}} diff --git a/render/templates/entry/Bookmark.tmpl b/render/templates/entry/Bookmark.tmpl new file mode 100644 index 0000000..9b3a887 --- /dev/null +++ b/render/templates/entry/Bookmark.tmpl @@ -0,0 +1,3 @@ +Bookmark: {{.MetaData.Url}} + +{{.MetaData.Content | markdown }} diff --git a/render/templates/entry/Reply.tmpl b/render/templates/entry/Reply.tmpl new file mode 100644 index 0000000..dfc5323 --- /dev/null +++ b/render/templates/entry/Reply.tmpl @@ -0,0 +1,3 @@ +Reply to: {{.MetaData.Url}} + +{{.MetaData.Content | markdown }}