diff options
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/blogspace/main.go | 31 | ||||
| -rw-r--r-- | cmd/blogspace/seed.go | 30 |
2 files changed, 43 insertions, 18 deletions
diff --git a/cmd/blogspace/main.go b/cmd/blogspace/main.go index cf240a8..20e6ffe 100644 --- a/cmd/blogspace/main.go +++ b/cmd/blogspace/main.go @@ -45,15 +45,18 @@ func run(ctx context.Context, cfg *config.Config, cmd string) error { if err := waitForDB(ctx, cfg.DatabaseURL); err != nil { return err } - if err := db.Migrate(ctx, cfg.DatabaseURL); err != nil { + if err := db.MigrateControl(ctx, cfg.DatabaseURL); err != nil { return fmt.Errorf("migrate: %w", err) } - pool, err := db.Open(ctx, cfg.DatabaseURL) + cluster, err := db.Open(ctx, cfg.DatabaseURL) if err != nil { return err } - defer pool.Close() - st := store.New(pool) + defer cluster.Close() + st := store.New(cluster) + if err := migrateBlogs(ctx, cluster, st); err != nil { + return err + } switch cmd { case "migrate": @@ -74,13 +77,29 @@ func run(ctx context.Context, cfg *config.Config, cmd string) error { } } +// migrateBlogs brings every registered blog database up to the current +// schema. A blog whose database is missing (a restore gone wrong) is logged +// and skipped so the other blogs still come up; its requests fail until fixed. +func migrateBlogs(ctx context.Context, cluster *db.Cluster, st *store.Store) error { + blogs, err := st.ListBlogs(ctx) + if err != nil { + return err + } + for _, b := range blogs { + if err := db.MigrateBlog(ctx, cluster.BlogURL(b.DBName)); err != nil { + log.Printf("blog %q: database %s: %v", b.Subdomain, b.DBName, err) + } + } + return nil +} + // waitForDB retries the connection so `docker compose up` ordering doesn't matter. func waitForDB(ctx context.Context, url string) error { deadline := time.Now().Add(60 * time.Second) for { - pool, err := db.Open(ctx, url) + c, err := db.Open(ctx, url) if err == nil { - pool.Close() + c.Close() return nil } if time.Now().After(deadline) { diff --git a/cmd/blogspace/seed.go b/cmd/blogspace/seed.go index 7862363..a476486 100644 --- a/cmd/blogspace/seed.go +++ b/cmd/blogspace/seed.go @@ -41,10 +41,14 @@ func seed(ctx context.Context, cfg *config.Config, st *store.Store) error { if err != nil { return err } - if err := st.UpdateBlogSettings(ctx, blog.ID, blog.Title, "Notes on gardening, code and everything in between"); err != nil { + bs, err := st.Open(ctx, blog) + if err != nil { + return err + } + if err := bs.UpdateSettings(ctx, blog.Title, "Notes on gardening, code and everything in between"); err != nil { return err } - home, err := st.HomePage(ctx, blog.ID) + home, err := bs.HomePage(ctx) if err != nil { return err } @@ -54,9 +58,8 @@ func seed(ctx context.Context, cfg *config.Config, st *store.Store) error { {Slug: "news", Title: "News", IntroMD: "Short updates, newest first.", ShowInNav: true}, {Slug: "contact", Title: "Contact", IntroMD: "Email: alice@example.com\n\nOr find me at the Saturday market, stall 12.", ShowInNav: true}, } { - p.BlogID = blog.ID p.IntroHTML = markdown.Render(p.IntroMD) - created, err := st.CreatePage(ctx, &p) + created, err := bs.CreatePage(ctx, &p) if err != nil { return err } @@ -74,14 +77,14 @@ func seed(ctx context.Context, cfg *config.Config, st *store.Store) error { if err := png.Encode(&buf, img); err != nil { return err } - bg, err := st.CreateImage(ctx, blog.ID, "gradient.png", "image/png", buf.Bytes()) + bg, err := bs.CreateImage(ctx, "gradient.png", "image/png", buf.Bytes()) if err != nil { return err } theme := web.DefaultTheme() theme.BgImage = bg.ID.String() theme.BgMode = "tile" - if err := st.UpdateBlogTheme(ctx, blog.ID, theme.JSON()); err != nil { + if err := bs.UpdateTheme(ctx, theme.JSON()); err != nil { return err } // a footer line and a right column, so the layout options have something to show @@ -90,8 +93,7 @@ func seed(ctx context.Context, cfg *config.Config, st *store.Store) error { {Area: "right", Kind: "recent", Title: "Recent posts", Count: 5}, {Area: "right", Kind: "archive", Title: "Archive"}, } { - m.BlogID = blog.ID - if _, err := st.CreateModule(ctx, &m); err != nil { + if _, err := bs.CreateModule(ctx, &m); err != nil { return err } } @@ -100,7 +102,7 @@ func seed(ctx context.Context, cfg *config.Config, st *store.Store) error { for i := 0; i < 10; i++ { body := fmt.Sprintf("Filler post number %d, here to demonstrate pagination.", i+1) post := &store.Post{PageID: home.ID, Title: fmt.Sprintf("Filler post %d", i+1), Slug: fmt.Sprintf("filler-%d", i+1), BodyMD: body, BodyHTML: markdown.Render(body), Published: true} - if _, err := st.CreatePost(ctx, post); err != nil { + if _, err := bs.CreatePost(ctx, post); err != nil { return err } } @@ -112,7 +114,7 @@ func seed(ctx context.Context, cfg *config.Config, st *store.Store) error { } for _, p := range posts { post := &store.Post{PageID: pages[p.page].ID, Title: p.title, Slug: slug.Make(p.title), BodyMD: p.body, BodyHTML: markdown.Render(p.body), Published: true} - if _, err := st.CreatePost(ctx, post); err != nil { + if _, err := bs.CreatePost(ctx, post); err != nil { return err } } @@ -121,12 +123,16 @@ func seed(ctx context.Context, cfg *config.Config, st *store.Store) error { if err != nil { return err } - rootHome, err := st.HomePage(ctx, root.ID) + rs, err := st.Open(ctx, root) + if err != nil { + return err + } + rootHome, err := rs.HomePage(ctx) if err != nil { return err } welcome := "This is the blog on the **root domain**, owned by the superadmin. It works like every other blog.\n\nOther blogs live on subdomains, for example [alice](" + cfg.BlogURL("alice") + ")." - if _, err := st.CreatePost(ctx, &store.Post{PageID: rootHome.ID, Title: "Welcome to Blogspace", Slug: "welcome", BodyMD: welcome, BodyHTML: markdown.Render(welcome), Published: true}); err != nil { + if _, err := rs.CreatePost(ctx, &store.Post{PageID: rootHome.ID, Title: "Welcome to Blogspace", Slug: "welcome", BodyMD: welcome, BodyHTML: markdown.Render(welcome), Published: true}); err != nil { return err } log.Printf("seed: superadmin %q (password %q in dev), blogger alice / alicealice at %s", cfg.SuperadminUsername, "admin", cfg.BlogURL("alice")) |
