repos / pico

pico services - prose.sh, pastes.sh, imgs.sh, feeds.sh, pgs.sh
git clone https://github.com/picosh/pico.git

pico / feeds
Eric Bower · 30 Jan 24

scp_hooks.go

 1package feeds
 2
 3import (
 4	"fmt"
 5	"strings"
 6	"time"
 7
 8	"slices"
 9
10	"github.com/charmbracelet/ssh"
11	"github.com/picosh/pico/db"
12	"github.com/picosh/pico/filehandlers"
13	"github.com/picosh/pico/shared"
14)
15
16type FeedHooks struct {
17	Cfg *shared.ConfigSite
18	Db  db.DB
19}
20
21func (p *FeedHooks) FileValidate(s ssh.Session, data *filehandlers.PostMetaData) (bool, error) {
22	if !shared.IsTextFile(string(data.Text)) {
23		err := fmt.Errorf(
24			"WARNING: (%s) invalid file must be plain text (utf-8), skipping",
25			data.Filename,
26		)
27		return false, err
28	}
29
30	if !shared.IsExtAllowed(data.Filename, p.Cfg.AllowedExt) {
31		extStr := strings.Join(p.Cfg.AllowedExt, ",")
32		err := fmt.Errorf(
33			"WARNING: (%s) invalid file, format must be (%s), skipping",
34			data.Filename,
35			extStr,
36		)
37		return false, err
38	}
39
40	return true, nil
41}
42
43func (p *FeedHooks) FileMeta(s ssh.Session, data *filehandlers.PostMetaData) error {
44	parsedText := shared.ListParseText(string(data.Text))
45
46	if parsedText.Title == "" {
47		data.Title = shared.ToUpper(data.Slug)
48	} else {
49		data.Title = parsedText.Title
50	}
51
52	data.Description = parsedText.Description
53	data.Tags = parsedText.Tags
54
55	data.Hidden = slices.Contains(p.Cfg.HiddenPosts, data.Filename)
56
57	if data.Data.LastDigest == nil {
58		now := time.Now()
59		data.Data.LastDigest = &now
60	}
61
62	return nil
63}