// Package console holds the sitemap plugin's commands: sitemap:rebuild, // sitemap:import (a JSON list of additional addresses) and // sitemap:import-winter (a copy of a WinterCMS site's url items and // settings). package console import ( "context" "fmt" "strings" "git.golem15.com/golem15/sm-sitemap-plugin/models" "git.golem15.com/golem15/summercms/modules/backpack" "git.golem15.com/golem15/summercms/modules/bonfire" "git.golem15.com/golem15/summercms/modules/lagoon" "gorm.io/gorm" ) func flagValue(in bonfire.Input, name string) string { v, ok := in.Flag(name) if !ok { return "" } return strings.TrimSpace(v) } func flagOn(in bonfire.Input, name string) bool { switch strings.ToLower(flagValue(in, name)) { case "true", "1", "yes": return true } return false } // lookupDB returns the app database. The generated main.go publishes no // database for plugin commands, so when none is published it opens // database.dsn and publishes it the way lagoon's migrate does. The returned // func closes a pool this call opened; it is a no-op otherwise. func lookupDB(ctx context.Context, app *backpack.App) (*gorm.DB, func(), error) { if app == nil { return nil, nil, fmt.Errorf("golem15.sitemap: app is nil") } if db, ok := app.Lookup[*gorm.DB](); ok && db != nil { return db, func() {}, nil } if lagoon.DSN(app.Config) == "" { return nil, nil, fmt.Errorf("golem15.sitemap: database is not configured (set SUMMER_DATABASE__DSN)") } sqlDB, gdb, err := lagoon.OpenFromApp(ctx, app) if err != nil { return nil, nil, err } if err := lagoon.Publish(app, sqlDB, gdb); err != nil { _ = sqlDB.Close() return nil, nil, err } return gdb, func() { _ = sqlDB.Close() }, nil } // loadSettingsForUpdate reads settings row 1 inside tx, locked, creating // it when the migration's row is gone. func loadSettingsForUpdate(tx *gorm.DB) (models.Settings, error) { if err := tx.Exec(`INSERT INTO golem15_sitemap_settings (id) VALUES (1) ON CONFLICT (id) DO NOTHING`).Error; err != nil { return models.Settings{}, err } var s models.Settings if err := tx.Raw(`SELECT * FROM golem15_sitemap_settings WHERE id = 1 FOR UPDATE`).Scan(&s).Error; err != nil { return models.Settings{}, err } return s, nil } // saveExtra stores the additional addresses on settings row 1. func saveExtra(tx *gorm.DB, rows []models.ExtraURL) error { if rows == nil { rows = []models.ExtraURL{} } value := lagoon.Jsonable[[]models.ExtraURL]{Data: rows, Valid: true} return tx.Exec(`UPDATE golem15_sitemap_settings SET extra_urls = ? WHERE id = 1`, value).Error }