BREAKING CHANGE: /sitemap.xsl is gone (404), the definitions screen and the Phase 17 settings tile are replaced by the settings singleton, and priority, change frequency, priority tiers and the update manifest are no longer written or read. The config keys golem15.sitemap.cache_seconds and golem15.sitemap.priority_tiers are removed; site_url, lastmod_ignore and rebuild_delay_seconds are new. - sitemap:import and sitemap:import-winter write the additional addresses (and site_url, default_locale) instead of the definition - the golem15_sitemap_definitions table stays in the database, unread
81 lines
2.5 KiB
Go
81 lines
2.5 KiB
Go
// 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
|
|
}
|