package frontend import ( "fmt" "html/template" "io" "log" "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 } article := &b.Article{ Title: "Autogenerated Issue Article", Content: r.PostFormValue("issue-content"), Link: session.Values["issue-image"].(string), Published: true, Rejected: false, Created: time.Now(), AuthorID: session.Values["id"].(int64), } fmt.Println(article.Link) content, err := b.ConvertToHTML(article.Content) if err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return } err = os.WriteFile(fmt.Sprint(c.ArticleDir, "/", article.ID, ".html"), []byte(content), 0444) if err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return } article.ID, err = db.AddArticle(article) if 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) } }