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: "Autogenerated cpolis Issue Article", EncURL: fmt.Sprint("http://", c.Domain, c.Port, "/image/serve/", imgFileName), EncLength: int(imgSize), EncType: mimeType, Published: true, Rejected: false, Created: time.Now(), AuthorID: session.Values["id"].(int64), } fmt.Println(article.Link) 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("http://", c.Domain, c.Port, "/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) } }