|
|
|
/*
|
|
|
|
* Copyright © 2018-2019 Musing Studio LLC.
|
|
|
|
*
|
|
|
|
* This file is part of WriteFreely.
|
|
|
|
*
|
|
|
|
* WriteFreely is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License, included
|
|
|
|
* in the LICENSE file in this source code package.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package writefreely
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"github.com/ikeikeikeike/go-sitemap-generator/v2/stm"
|
|
|
|
"github.com/writeas/web-core/log"
|
|
|
|
)
|
|
|
|
|
|
|
|
func buildSitemap(host, alias string) *stm.Sitemap {
|
|
|
|
sm := stm.NewSitemap(0)
|
|
|
|
sm.SetDefaultHost(host)
|
|
|
|
if alias != "/" {
|
|
|
|
sm.SetSitemapsPath(alias)
|
|
|
|
}
|
|
|
|
|
|
|
|
sm.Create()
|
|
|
|
|
|
|
|
// Note: Do not call `sm.Finalize()` because it flushes
|
|
|
|
// the underlying datastructure from memory to disk.
|
|
|
|
|
|
|
|
return sm
|
|
|
|
}
|
|
|
|
|
|
|
|
func handleViewSitemap(app *App, w http.ResponseWriter, r *http.Request) error {
|
|
|
|
vars := mux.Vars(r)
|
|
|
|
|
|
|
|
// Determine canonical blog URL
|
|
|
|
alias := vars["collection"]
|
|
|
|
subdomain := vars["subdomain"]
|
|
|
|
isSubdomain := subdomain != ""
|
|
|
|
if isSubdomain {
|
|
|
|
alias = subdomain
|
|
|
|
}
|
|
|
|
|
|
|
|
host := fmt.Sprintf("%s/%s/", app.cfg.App.Host, alias)
|
|
|
|
var c *Collection
|
|
|
|
var err error
|
|
|
|
pre := "/"
|
|
|
|
if app.cfg.App.SingleUser {
|
|
|
|
c, err = app.db.GetCollectionByID(1)
|
|
|
|
} else {
|
|
|
|
c, err = app.db.GetCollection(alias)
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
c.hostName = app.cfg.App.Host
|
|
|
|
|
|
|
|
if !isSubdomain {
|
|
|
|
pre += alias + "/"
|
|
|
|
}
|
|
|
|
host = c.CanonicalURL()
|
|
|
|
|
|
|
|
sm := buildSitemap(host, pre)
|
|
|
|
posts, err := app.db.GetPosts(app.cfg, c, 0, false, false, false, "")
|
|
|
|
if err != nil {
|
|
|
|
log.Error("Error getting posts: %v", err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
lastSiteMod := time.Now()
|
|
|
|
for i, p := range *posts {
|
|
|
|
if i == 0 {
|
|
|
|
lastSiteMod = p.Updated
|
|
|
|
}
|
|
|
|
u := stm.URL{
|
|
|
|
{"loc", p.Slug.String},
|
|
|
|
{"changefreq", "weekly"},
|
|
|
|
{"mobile", true},
|
|
|
|
{"lastmod", p.Updated},
|
|
|
|
}
|
|
|
|
if len(p.Images) > 0 {
|
|
|
|
imgs := []stm.URL{}
|
|
|
|
for _, i := range p.Images {
|
|
|
|
imgs = append(imgs, stm.URL{
|
|
|
|
{"loc", i},
|
|
|
|
{"title", ""},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
u = append(u, []interface{}{"image", imgs})
|
|
|
|
}
|
|
|
|
sm.Add(u)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add top URL
|
|
|
|
sm.Add(stm.URL{
|
|
|
|
{"loc", pre},
|
|
|
|
{"changefreq", "daily"},
|
|
|
|
{"priority", "1.0"},
|
|
|
|
{"lastmod", lastSiteMod},
|
|
|
|
})
|
|
|
|
|
|
|
|
w.Write(sm.XMLContent())
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|