110
package main
import (
_ "github.com/asdine/storm/v3"
_ "go.etcd.io/bbolt"
"net/http"
"net/url"
"path/filepath"
"sophuwu.site/myweb/template"
"strings"
"time"
)
type BlogMeta struct {
ID string `storm:"unique"`
Title string `storm:"index"`
Date string `storm:"index"`
Desc string `storm:"index"`
}
type BlogContent struct {
ID string `storm:"unique"`
Content string `storm:"index"`
}
func IdGen(title, date string) string {
title = strings.ReplaceAll(title, " ", "-")
return filepath.Join(date, url.PathEscape(title))
}
func SaveBlog(title, desc, body string, date ...string) error {
if len(date) == 0 {
date = append(date, time.Now().Format("2006-01-02"))
}
id := IdGen(title, date[0])
err := DB.Save(&BlogContent{
ID: id,
Content: body,
})
if err != nil {
return err
}
blg := BlogMeta{
ID: id,
Title: title,
Date: date[0],
Desc: desc,
}
err = DB.Save(&blg)
return err
}
func GetBlog(id string) (meta BlogMeta, content BlogContent, err error) {
err = DB.One("ID", id, &content)
if err != nil {
return
}
err = DB.One("ID", id, &meta)
return
}
func SortBlogsDate(blogs []BlogMeta) []BlogMeta {
for i := 0; i < len(blogs); i++ {
for j := i + 1; j < len(blogs); j++ {
if blogs[i].Date < blogs[j].Date {
blogs[i], blogs[j] = blogs[j], blogs[i]
}
}
}
return blogs
}
func GetBlogs() ([]BlogMeta, error) {
var blogs []BlogMeta
// err := DB.All(&blogs)
err := DB.AllByIndex("Date", &blogs)
if err != nil {
return nil, err
}
blogs = SortBlogsDate(blogs)
return blogs, err
}
func BlogHandler(w http.ResponseWriter, r *http.Request) {
path := strings.TrimPrefix(r.URL.Path, "/blog/")
if path == "" {
blogs, err := GetBlogs()
if CheckHttpErr(err, w, r, 500) {
return
}
d := template.Data("Sophie's Blogs", "I sometimes write blogs about random things that I find interesting. Here you can read all my posts about various things I found interesting at some point.")
d["blogs"] = []BlogMeta(blogs)
d.Set("NoBlogs", len(blogs))
err = template.Use(w, r, "blogs", d)
CheckHttpErr(err, w, r, 500)
return
}
meta, content, err := GetBlog(path)
if CheckHttpErr(err, w, r, 404) {
return
}
data := template.Data(meta.Title, meta.Desc)
data.Set("Date", meta.Date)
data.SetHTML(content.Content)
err = template.Use(w, r, "blog", data)
CheckHttpErr(err, w, r, 500)
}