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) 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, _, 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) } }