reprogl

Форк
0
/
feed.go 
107 строк · 1.9 Кб
1
package models
2

3
import (
4
	"crypto/sha1"
5
	"encoding/xml"
6
	"fmt"
7
	"time"
8
)
9

10
const (
11
	RssFeedType = iota
12
	AtomFeedType
13
)
14

15
type SitemapTime time.Time
16

17
type RssTime time.Time
18

19
type FeedInterface interface {
20
	setChannelData(FeedChannelData)
21
	ContentType() string
22
	addFeedItem(*FeedItem)
23
}
24

25
type FeedGeneratorInterface interface {
26
	ContentType() string
27
	AsXML() ([]byte, error)
28
}
29

30
type FeedItem struct {
31
	ID        int
32
	Title     string
33
	Slug      string
34
	URL       string
35
	Text      string
36
	CreatedAt time.Time
37
	UpdatedAt time.Time
38
	FeaturedImage
39
}
40

41
type FeedItemList []*FeedItem
42

43
type FeedChannelData struct {
44
	Title       string
45
	Link        string
46
	Description string
47
	Language    string
48
	Charset     string
49
	Author      string
50
	Email       string
51
	Generator   string
52
	FeedItems   FeedItemList
53
}
54

55
type Feed[F FeedInterface] struct {
56
	value F
57
}
58

59
func (ct SitemapTime) MarshalText() ([]byte, error) {
60
	t := time.Time(ct)
61

62
	return []byte(t.Format(time.RFC3339)), nil
63
}
64

65
func (ct RssTime) MarshalText() ([]byte, error) {
66
	t := time.Time(ct)
67

68
	return []byte(t.Format(time.RFC1123Z)), nil
69
}
70

71
func (d FeedChannelData) GIUD() string {
72
	return byStringGIUD(d.Link)
73
}
74

75
func (i FeedItem) GIUD() (result string) {
76
	dt := time.Date(2024, time.June, 8, 0, 0, 0, 0, time.UTC)
77
	if dt.Before(i.CreatedAt) {
78
		result = byStringGIUD(fmt.Sprintf("feed%d%d", i.ID, i.ID*i.ID))
79
	} else {
80
		result = byStringGIUD(i.Slug)
81
	}
82

83
	return
84
}
85

86
func CreateFeed[T FeedInterface](t T, d FeedChannelData) *Feed[T] {
87
	feed := Feed[T]{value: t}
88
	feed.value.setChannelData(d)
89

90
	return &feed
91
}
92

93
func (f Feed[T]) ContentType() string {
94
	return f.value.ContentType()
95
}
96

97
func (f Feed[T]) AsXML() ([]byte, error) {
98
	return xml.MarshalIndent(f.value, "", "  ")
99
}
100

101
func byStringGIUD(s string) string {
102
	hash := sha1.New()
103
	hash.Write([]byte(s))
104
	sum := hash.Sum(nil)
105

106
	return fmt.Sprintf("%x-%x-%x-%x-%x", sum[0:4], sum[4:6], sum[6:8], sum[8:10], sum[10:16])
107
}
108

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.