Compare commits
	
		
			1 Commits
		
	
	
		
			d2b21e7405
			...
			new_rss
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 93bc38db67 | 
| @@ -11,12 +11,12 @@ import ( | ||||
| ) | ||||
|  | ||||
| type Article struct { | ||||
| 	Tags     *TagList | ||||
| 	Title    string | ||||
| 	Author   string | ||||
| 	Created  time.Time | ||||
| 	Desc     string | ||||
| 	Content  string | ||||
| 	Tags     []string | ||||
| 	UUID     uuid.UUID | ||||
| 	AuthorID int64 | ||||
| } | ||||
|   | ||||
							
								
								
									
										106
									
								
								cmd/data/rss.go
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								cmd/data/rss.go
									
									
									
									
									
								
							| @@ -1,106 +0,0 @@ | ||||
| package data | ||||
|  | ||||
| import ( | ||||
| 	"encoding/gob" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/gorilla/feeds" | ||||
| ) | ||||
|  | ||||
| type Feed struct { | ||||
| 	addCh chan *feeds.Item | ||||
| 	setCh chan feeds.Feed | ||||
| 	getCh chan feeds.Feed | ||||
| 	feed  feeds.Feed | ||||
| 	wg    sync.WaitGroup | ||||
| } | ||||
|  | ||||
| func minFeed() *Feed { | ||||
| 	return &Feed{ | ||||
| 		addCh: make(chan *feeds.Item), | ||||
| 		setCh: make(chan feeds.Feed), | ||||
| 		getCh: make(chan feeds.Feed), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (f *Feed) start() { | ||||
| 	f.wg.Done() | ||||
| 	for { | ||||
| 		select { | ||||
| 		case item := <-f.addCh: | ||||
| 			f.feed.Items = append(f.feed.Items, item) | ||||
| 		case f.getCh <- f.feed: | ||||
| 		case f.feed = <-f.setCh: | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func NewFeed(title, link, desc string) *Feed { | ||||
| 	feed := minFeed() | ||||
| 	feed.feed = feeds.Feed{ | ||||
| 		Title:       title, | ||||
| 		Link:        &feeds.Link{Href: link}, | ||||
| 		Description: desc, | ||||
| 	} | ||||
|  | ||||
| 	feed.wg.Add(1) | ||||
| 	go feed.start() | ||||
| 	feed.wg.Wait() | ||||
|  | ||||
| 	return feed | ||||
| } | ||||
|  | ||||
| func (f *Feed) Get() feeds.Feed { | ||||
| 	return <-f.getCh | ||||
| } | ||||
|  | ||||
| func (f *Feed) Set(feed feeds.Feed) { | ||||
| 	f.setCh <- feed | ||||
| } | ||||
|  | ||||
| func OpenFeed(filename string) (*Feed, error) { | ||||
| 	file, err := os.Open(filename) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error opening file %v: %v", filename, err) | ||||
| 	} | ||||
| 	defer file.Close() | ||||
|  | ||||
| 	feed := minFeed() | ||||
| 	feed.wg.Add(1) | ||||
| 	go feed.start() | ||||
| 	feed.wg.Wait() | ||||
|  | ||||
| 	decoder := gob.NewDecoder(file) | ||||
| 	tmpFeed := new(feeds.Feed) | ||||
| 	err = decoder.Decode(tmpFeed) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error decoding file %v: %v", filename, err) | ||||
| 	} | ||||
|  | ||||
| 	feed.Set(*tmpFeed) | ||||
|  | ||||
| 	return feed, nil | ||||
| } | ||||
|  | ||||
| func (f *Feed) Save(filename string) error { | ||||
| 	file, err := os.Create(filename) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("error creating file %v: %v", filename, err) | ||||
| 	} | ||||
| 	defer file.Close() | ||||
|  | ||||
| 	encoder := gob.NewEncoder(file) | ||||
| 	feed := f.Get() | ||||
| 	err = encoder.Encode(feed) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("error encoding file %v: %v", filename, err) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (f *Feed) Add(i *feeds.Item) { | ||||
| 	f.addCh <- i | ||||
| } | ||||
| @@ -6,8 +6,8 @@ import ( | ||||
| 	"net/http" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.streifling.com/jason/rss" | ||||
| 	"github.com/google/uuid" | ||||
| 	"github.com/gorilla/feeds" | ||||
| 	"streifling.com/jason/cpolis/cmd/data" | ||||
| ) | ||||
|  | ||||
| @@ -116,7 +116,7 @@ func ReviewArticle(al *data.ArticleList, s *data.CookieStore) http.HandlerFunc { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func PublishArticle(f *data.Feed, al *data.ArticleList, s *data.CookieStore) http.HandlerFunc { | ||||
| func PublishArticle(f *rss.Feed, al *data.ArticleList, s *data.CookieStore) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		uuid, err := uuid.Parse(r.PostFormValue("uuid")) | ||||
| 		if err != nil { | ||||
| @@ -141,13 +141,12 @@ func PublishArticle(f *data.Feed, al *data.ArticleList, s *data.CookieStore) htt | ||||
| 			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg) | ||||
| 		} | ||||
|  | ||||
| 		f.Add(&feeds.Item{ | ||||
| 			Title:       article.Title, | ||||
| 			Author:      &feeds.Author{Name: session.Values["name"].(string)}, | ||||
| 			Created:     article.Created, | ||||
| 			Description: article.Desc, | ||||
| 			Content:     article.Content, | ||||
| 		}) | ||||
| 		item := rss.NewItem() | ||||
| 		item.Title = article.Title | ||||
| 		item.Author = article.Author | ||||
| 		item.Description = article.Desc | ||||
| 		item.Content = &rss.Content{Value: article.Content} | ||||
| 		f.Channels[0].AddItem(item) | ||||
| 		f.Save("tmp/rss.gob") | ||||
|  | ||||
| 		tmpl, err := template.ParseFiles("web/templates/hub.html") | ||||
|   | ||||
| @@ -5,13 +5,12 @@ import ( | ||||
| 	"log" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"streifling.com/jason/cpolis/cmd/data" | ||||
| 	"git.streifling.com/jason/rss" | ||||
| ) | ||||
|  | ||||
| func ShowRSS(f *data.Feed) http.HandlerFunc { | ||||
| func ShowRSS(f *rss.Feed) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		feed := f.Get() | ||||
| 		rss, err := feed.ToRss() | ||||
| 		rss, err := f.ToXML() | ||||
| 		if err != nil { | ||||
| 			log.Println(err) | ||||
| 			http.Error(w, err.Error(), http.StatusInternalServerError) | ||||
|   | ||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @@ -3,9 +3,9 @@ module streifling.com/jason/cpolis | ||||
| go 1.22.0 | ||||
|  | ||||
| require ( | ||||
| 	git.streifling.com/jason/rss v0.0.0-20240305145359-7d49b2cb25fc | ||||
| 	github.com/go-sql-driver/mysql v1.7.1 | ||||
| 	github.com/google/uuid v1.6.0 | ||||
| 	github.com/gorilla/feeds v1.1.2 | ||||
| 	github.com/gorilla/sessions v1.2.2 | ||||
| 	github.com/microcosm-cc/bluemonday v1.0.26 | ||||
| 	github.com/yuin/goldmark v1.7.0 | ||||
|   | ||||
							
								
								
									
										12
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								go.sum
									
									
									
									
									
								
							| @@ -1,3 +1,7 @@ | ||||
| git.streifling.com/jason/rss v0.0.0-20240305140009-a59d3f112892 h1:miU3U9H8zSoYprEaG7xaGLMb4CcGLjGt7McC8Wrf+Vs= | ||||
| git.streifling.com/jason/rss v0.0.0-20240305140009-a59d3f112892/go.mod h1:gpZF0nZbQSstMpyHD9DTAvlQEG7v4pjO5c7aIMWM4Jg= | ||||
| git.streifling.com/jason/rss v0.0.0-20240305145359-7d49b2cb25fc h1:vJ36ouI2wTK+jFktnqyAfFHoYnoznAgAo1nUzvMzCvQ= | ||||
| git.streifling.com/jason/rss v0.0.0-20240305145359-7d49b2cb25fc/go.mod h1:gpZF0nZbQSstMpyHD9DTAvlQEG7v4pjO5c7aIMWM4Jg= | ||||
| github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= | ||||
| github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= | ||||
| github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= | ||||
| @@ -8,20 +12,12 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= | ||||
| github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= | ||||
| github.com/gorilla/feeds v1.1.2 h1:pxzZ5PD3RJdhFH2FsJJ4x6PqMqbgFk1+Vez4XWBW8Iw= | ||||
| github.com/gorilla/feeds v1.1.2/go.mod h1:WMib8uJP3BbY+X8Szd1rA5Pzhdfh+HCCAYT2z7Fza6Y= | ||||
| github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= | ||||
| github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= | ||||
| github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= | ||||
| github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ= | ||||
| github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||
| github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | ||||
| github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||
| github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= | ||||
| github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= | ||||
| github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= | ||||
| github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= | ||||
| github.com/yuin/goldmark v1.7.0 h1:EfOIvIMZIzHdB/R/zVrikYLPPwJlfMcNczJFMs1m6sA= | ||||
| github.com/yuin/goldmark v1.7.0/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= | ||||
| golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= | ||||
|   | ||||
		Reference in New Issue
	
	Block a user