181 lines
4.6 KiB
Go
181 lines
4.6 KiB
Go
package frontend
|
|
|
|
import (
|
|
"fmt"
|
|
"html/template"
|
|
"log"
|
|
"mime"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
b "streifling.com/jason/cpolis/cmd/backend"
|
|
)
|
|
|
|
func PublishLatestIssue(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
session, err := getSession(w, r, c, s)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
session.Values["article"] = nil
|
|
if err = session.Save(r, w); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
title := r.PostFormValue("issue-title")
|
|
if len(title) == 0 {
|
|
err = fmt.Errorf("error: no title for issue specified")
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
if session.Values["issue-image"] == nil {
|
|
err := "error: Image required"
|
|
log.Println(err)
|
|
http.Error(w, err, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
imgFileName := session.Values["issue-image"].(string)
|
|
imgAbsName := fmt.Sprint(c.PicsDir, "/", imgFileName)
|
|
|
|
imgFile, err := os.Open(imgAbsName)
|
|
if err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
defer imgFile.Close()
|
|
|
|
imgInfo, err := imgFile.Stat()
|
|
if err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
article := &b.Article{
|
|
Title: title,
|
|
EncURL: fmt.Sprint(c.Domain, "/image/serve/", imgFileName),
|
|
EncLength: int(imgInfo.Size()),
|
|
EncType: mime.TypeByExtension(filepath.Ext(imgAbsName)),
|
|
Published: true,
|
|
Rejected: false,
|
|
Created: time.Now(),
|
|
AuthorID: session.Values["id"].(int64),
|
|
AutoGenerated: true,
|
|
}
|
|
|
|
article.ID, err = db.AddArticle(article)
|
|
if err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
articleAbsName := fmt.Sprint(c.ArticleDir, "/", article.ID, ".md")
|
|
if err = os.WriteFile(articleAbsName, []byte(r.PostFormValue("article-content")), 0644); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
article.Link = fmt.Sprint(c.Domain, "/article/serve/", article.ID)
|
|
if err = db.UpdateAttributes(&b.Attribute{Table: "articles", ID: article.ID, AttName: "link", Value: article.Link}); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
if err = db.UpdateAttributes(&b.Attribute{Table: "articles", ID: article.ID, AttName: "link", Value: article.Link}); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
if err = db.AddArticleToCurrentIssue(article.ID); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
if err := db.PublishLatestIssue(); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
feed, err := b.GenerateRSS(c, db)
|
|
if err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
if err = b.SaveRSS(c.RSSFile, feed); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
session.Values["issue-image"] = nil
|
|
if err = session.Save(r, w); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
|
|
tmpl = template.Must(tmpl, err)
|
|
if err = tmpl.ExecuteTemplate(w, "page-content", session.Values["role"]); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func UploadIssueImage(c *b.Config, s *b.CookieStore) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
session, err := getSession(w, r, c, s)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
if err := r.ParseMultipartForm(10 << 20); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
file, _, err := r.FormFile("issue-image")
|
|
if err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
filename, err := b.SaveImage(c, file)
|
|
if err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
session.Values["issue-image"] = filename
|
|
if err = session.Save(r, w); err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
}
|
|
}
|