192 lines
4.8 KiB
Go
192 lines
4.8 KiB
Go
package frontend
|
|
|
|
import (
|
|
"fmt"
|
|
"html/template"
|
|
"io"
|
|
"log"
|
|
"mime"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
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
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
imgSize := imgInfo.Size()
|
|
mimeType := mime.TypeByExtension(filepath.Ext(imgAbsName))
|
|
|
|
article := &b.Article{
|
|
Title: r.PostFormValue("issue-title"),
|
|
EncURL: fmt.Sprint(c.Domain, "/image/serve/", imgFileName),
|
|
EncLength: int(imgSize),
|
|
EncType: mimeType,
|
|
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)
|
|
tmpl.ExecuteTemplate(w, "page-content", session.Values["role"])
|
|
}
|
|
}
|
|
|
|
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, header, err := r.FormFile("issue-image")
|
|
if err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
nameStrings := strings.Split(header.Filename, ".")
|
|
extension := "." + nameStrings[len(nameStrings)-1]
|
|
filename := fmt.Sprint(uuid.New(), extension)
|
|
absFilepath, err := filepath.Abs(fmt.Sprint(c.PicsDir, "/", filename))
|
|
if err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
img, err := os.Create(absFilepath)
|
|
if err != nil {
|
|
log.Println(err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
defer img.Close()
|
|
|
|
if _, err = io.Copy(img, file); 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)
|
|
}
|
|
}
|