Split up max value for img height and with into values for img and banner
This commit is contained in:
		| @@ -6,12 +6,14 @@ tmp_dir = "tmp" | ||||
| args_bin = [ | ||||
|     "-aes tmp/cpolis.aes", | ||||
|     "-articles tmp/articles", | ||||
|     "-banner-width 512", | ||||
|     "-config tmp/config.toml", | ||||
|     "-desc 'Freiheit, Gleichheit, Brüderlichkeit, Toleranz und Humanität'", | ||||
|     "-domain localhost", | ||||
|     "-feed tmp/cpolis.atom", | ||||
|     "-firebase tmp/firebase.json", | ||||
|     "-gob tmp/cpolis.gob", | ||||
|     "-img-width 256", | ||||
|     "-link https://distrikt-ni-st.de", | ||||
|     "-log tmp/cpolis.log", | ||||
|     "-pdfs tmp/pdfs", | ||||
| @@ -19,7 +21,6 @@ args_bin = [ | ||||
|     "-port 8080", | ||||
|     "-title 'Freimaurer Distrikt Niedersachsen und Sachsen-Anhalt'", | ||||
|     "-web web", | ||||
|     "-width 1024", | ||||
| ] | ||||
| bin = "./tmp/main" | ||||
| cmd = "go build -o ./tmp/main ./cmd/main.go" | ||||
|   | ||||
| @@ -12,44 +12,48 @@ import ( | ||||
| ) | ||||
|  | ||||
| type Config struct { | ||||
| 	AESKeyFile   string | ||||
| 	ArticleDir   string | ||||
| 	ConfigFile   string | ||||
| 	DBName       string | ||||
| 	Description  string | ||||
| 	Domain       string | ||||
| 	AtomFeed     string | ||||
| 	FirebaseKey  string | ||||
| 	GOBKeyFile   string | ||||
| 	Link         string | ||||
| 	LogFile      string | ||||
| 	PDFDir       string | ||||
| 	PicsDir      string | ||||
| 	Port         string | ||||
| 	Title        string | ||||
| 	Version      string | ||||
| 	WebDir       string | ||||
| 	MaxImgHeight int | ||||
| 	MaxImgWidth  int | ||||
| 	AESKeyFile      string | ||||
| 	ArticleDir      string | ||||
| 	ConfigFile      string | ||||
| 	DBName          string | ||||
| 	Description     string | ||||
| 	Domain          string | ||||
| 	AtomFeed        string | ||||
| 	FirebaseKey     string | ||||
| 	GOBKeyFile      string | ||||
| 	Link            string | ||||
| 	LogFile         string | ||||
| 	PDFDir          string | ||||
| 	PicsDir         string | ||||
| 	Port            string | ||||
| 	Title           string | ||||
| 	Version         string | ||||
| 	WebDir          string | ||||
| 	MaxBannerHeight int | ||||
| 	MaxBannerWidth  int | ||||
| 	MaxImgHeight    int | ||||
| 	MaxImgWidth     int | ||||
| } | ||||
|  | ||||
| func newConfig() *Config { | ||||
| 	return &Config{ | ||||
| 		AESKeyFile:   "/var/www/cpolis/aes.key", | ||||
| 		ArticleDir:   "/var/www/cpolis/articles", | ||||
| 		ConfigFile:   "/etc/cpolis/config.toml", | ||||
| 		DBName:       "cpolis", | ||||
| 		AtomFeed:     "/var/www/cpolis/cpolis.atom", | ||||
| 		FirebaseKey:  "/var/www/cpolis/serviceAccountKey.json", | ||||
| 		GOBKeyFile:   "/var/www/cpolis/gob.key", | ||||
| 		LogFile:      "/var/log/cpolis.log", | ||||
| 		MaxImgHeight: 1080, | ||||
| 		MaxImgWidth:  1920, | ||||
| 		PDFDir:       "/var/www/cpolis/pdfs", | ||||
| 		PicsDir:      "/var/www/cpolis/pics", | ||||
| 		Port:         ":8080", | ||||
| 		Version:      "v0.13.0", | ||||
| 		WebDir:       "/var/www/cpolis/web", | ||||
| 		AESKeyFile:      "/var/www/cpolis/aes.key", | ||||
| 		ArticleDir:      "/var/www/cpolis/articles", | ||||
| 		ConfigFile:      "/etc/cpolis/config.toml", | ||||
| 		DBName:          "cpolis", | ||||
| 		AtomFeed:        "/var/www/cpolis/cpolis.atom", | ||||
| 		FirebaseKey:     "/var/www/cpolis/serviceAccountKey.json", | ||||
| 		GOBKeyFile:      "/var/www/cpolis/gob.key", | ||||
| 		LogFile:         "/var/log/cpolis.log", | ||||
| 		MaxBannerHeight: 1080, | ||||
| 		MaxBannerWidth:  1920, | ||||
| 		MaxImgHeight:    1080, | ||||
| 		MaxImgWidth:     1920, | ||||
| 		PDFDir:          "/var/www/cpolis/pdfs", | ||||
| 		PicsDir:         "/var/www/cpolis/pics", | ||||
| 		Port:            ":8080", | ||||
| 		Version:         "v0.13.0", | ||||
| 		WebDir:          "/var/www/cpolis/web", | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -119,8 +123,10 @@ func (c *Config) handleCliArgs() error { | ||||
| 	flag.StringVar(&c.PicsDir, "pics", c.PicsDir, "pictures directory") | ||||
| 	flag.StringVar(&c.Title, "title", c.Title, "channel title") | ||||
| 	flag.StringVar(&c.WebDir, "web", c.WebDir, "web directory") | ||||
| 	flag.IntVar(&c.MaxImgHeight, "height", c.MaxImgHeight, "maximum image height") | ||||
| 	flag.IntVar(&c.MaxImgWidth, "width", c.MaxImgWidth, "maximum image width") | ||||
| 	flag.IntVar(&c.MaxBannerHeight, "banner-height", c.MaxBannerHeight, "maximum banner height") | ||||
| 	flag.IntVar(&c.MaxBannerWidth, "banner-width", c.MaxBannerWidth, "maximum banner width") | ||||
| 	flag.IntVar(&c.MaxImgHeight, "img-height", c.MaxImgHeight, "maximum image height") | ||||
| 	flag.IntVar(&c.MaxImgWidth, "img-width", c.MaxImgWidth, "maximum image width") | ||||
| 	flag.IntVar(&port, "port", port, "port") | ||||
| 	flag.Parse() | ||||
|  | ||||
| @@ -217,6 +223,14 @@ func (c *Config) setupConfig(cliConfig *Config) error { | ||||
| 		return fmt.Errorf("error setting up file: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	if cliConfig.MaxBannerHeight != defaultConfig.MaxBannerHeight { | ||||
| 		c.MaxBannerHeight = cliConfig.MaxBannerHeight | ||||
| 	} | ||||
|  | ||||
| 	if cliConfig.MaxBannerWidth != defaultConfig.MaxBannerWidth { | ||||
| 		c.MaxBannerWidth = cliConfig.MaxBannerWidth | ||||
| 	} | ||||
|  | ||||
| 	if cliConfig.MaxImgHeight != defaultConfig.MaxImgHeight { | ||||
| 		c.MaxImgHeight = cliConfig.MaxImgHeight | ||||
| 	} | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package backend | ||||
|  | ||||
| import ( | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
| 	"image" | ||||
| 	"io" | ||||
| @@ -13,7 +14,7 @@ import ( | ||||
|  | ||||
| var ErrUnsupportedFormat error = image.ErrFormat // used internally by imaging | ||||
|  | ||||
| func SaveImage(c *Config, src io.Reader) (string, error) { | ||||
| func SaveImage(src io.Reader, maxHeight, maxWidth int, path string) (string, error) { | ||||
| 	img, err := imaging.Decode(src, imaging.AutoOrientation(true)) | ||||
| 	if err != nil { | ||||
| 		if err == ErrUnsupportedFormat { | ||||
| @@ -22,15 +23,15 @@ func SaveImage(c *Config, src io.Reader) (string, error) { | ||||
| 		return "", fmt.Errorf("error decoding image: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	if img.Bounds().Dy() > c.MaxImgHeight { | ||||
| 		img = imaging.Resize(img, 0, c.MaxImgHeight, imaging.Lanczos) | ||||
| 	if img.Bounds().Dy() > maxHeight { | ||||
| 		img = imaging.Resize(img, 0, maxHeight, imaging.Lanczos) | ||||
| 	} | ||||
| 	if img.Bounds().Dx() > c.MaxImgWidth { | ||||
| 		img = imaging.Resize(img, c.MaxImgWidth, 0, imaging.Lanczos) | ||||
| 	if img.Bounds().Dx() > maxWidth { | ||||
| 		img = imaging.Resize(img, maxWidth, 0, imaging.Lanczos) | ||||
| 	} | ||||
|  | ||||
| 	filename := fmt.Sprint(uuid.New(), ".webp") | ||||
| 	file, err := os.Create(c.PicsDir + "/" + filename) | ||||
| 	file, err := os.Create(path + filename) | ||||
| 	if err != nil { | ||||
| 		return "", fmt.Errorf("error creating new image file: %v", err) | ||||
| 	} | ||||
| @@ -42,3 +43,20 @@ func SaveImage(c *Config, src io.Reader) (string, error) { | ||||
|  | ||||
| 	return filename, nil | ||||
| } | ||||
|  | ||||
| func ServeBase64Image(c *Config, filename string) (string, error) { | ||||
| 	file := c.PicsDir + "/" + filename | ||||
|  | ||||
| 	img, err := os.Open(file) | ||||
| 	if err != nil { | ||||
| 		return "", fmt.Errorf("error opening file %v: %v", file, err) | ||||
| 	} | ||||
| 	defer img.Close() | ||||
|  | ||||
| 	imgBytes, err := io.ReadAll(img) | ||||
| 	if err != nil { | ||||
| 		return "", fmt.Errorf("error turning %v into bytes: %v", file, err) | ||||
| 	} | ||||
|  | ||||
| 	return base64.StdEncoding.EncodeToString(imgBytes), nil | ||||
| } | ||||
|   | ||||
| @@ -348,7 +348,7 @@ func ReviewRejectedArticle(c *b.Config, db *b.DB, s *b.CookieStore) http.Handler | ||||
|  | ||||
| 		imgURL := strings.Split(data.Article.BannerLink, "/") | ||||
| 		imgFileName := imgURL[len(imgURL)-1] | ||||
| 		data.BannerImage, err = serveBase64Image(c, imgFileName) | ||||
| 		data.BannerImage, err = b.ServeBase64Image(c, imgFileName) | ||||
| 		if err != nil { | ||||
| 			log.Println(err) | ||||
| 			http.Error(w, err.Error(), http.StatusInternalServerError) | ||||
| @@ -625,7 +625,7 @@ func ReviewArticle(c *b.Config, db *b.DB, s *b.CookieStore, action, title, butto | ||||
|  | ||||
| 		imgURL := strings.Split(article.BannerLink, "/") | ||||
| 		imgFileName := imgURL[len(imgURL)-1] | ||||
| 		data.BannerImage, err = serveBase64Image(c, imgFileName) | ||||
| 		data.BannerImage, err = b.ServeBase64Image(c, imgFileName) | ||||
| 		if err != nil { | ||||
| 			log.Println(err) | ||||
| 			http.Error(w, err.Error(), http.StatusInternalServerError) | ||||
| @@ -808,7 +808,7 @@ func EditArticle(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { | ||||
|  | ||||
| 		imgURL := strings.Split(data.Article.BannerLink, "/") | ||||
| 		imgFileName := imgURL[len(imgURL)-1] | ||||
| 		data.BannerImage, err = serveBase64Image(c, imgFileName) | ||||
| 		data.BannerImage, err = b.ServeBase64Image(c, imgFileName) | ||||
| 		if err != nil { | ||||
| 			log.Println(err) | ||||
| 			http.Error(w, err.Error(), http.StatusInternalServerError) | ||||
|   | ||||
| @@ -1,35 +1,14 @@ | ||||
| package frontend | ||||
|  | ||||
| import ( | ||||
| 	"encoding/base64" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"html/template" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
|  | ||||
| 	b "streifling.com/jason/cpolis/cmd/backend" | ||||
| ) | ||||
|  | ||||
| func serveBase64Image(c *b.Config, filename string) (string, error) { | ||||
| 	file := c.PicsDir + "/" + filename | ||||
|  | ||||
| 	img, err := os.Open(file) | ||||
| 	if err != nil { | ||||
| 		return "", fmt.Errorf("error opening file %v: %v", file, err) | ||||
| 	} | ||||
| 	defer img.Close() | ||||
|  | ||||
| 	imgBytes, err := io.ReadAll(img) | ||||
| 	if err != nil { | ||||
| 		return "", fmt.Errorf("error turning %v into bytes: %v", file, err) | ||||
| 	} | ||||
|  | ||||
| 	return base64.StdEncoding.EncodeToString(imgBytes), nil | ||||
| } | ||||
|  | ||||
| func UploadImage(c *b.Config, s *b.CookieStore) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		if _, err := getSession(w, r, c, s); err != nil { | ||||
| @@ -52,7 +31,7 @@ func UploadImage(c *b.Config, s *b.CookieStore) http.HandlerFunc { | ||||
| 		} | ||||
| 		defer file.Close() | ||||
|  | ||||
| 		filename, err := b.SaveImage(c, file) | ||||
| 		filename, err := b.SaveImage(file, c.MaxImgHeight, c.MaxImgWidth, c.PicsDir+"/") | ||||
| 		if err != nil { | ||||
| 			if err == b.ErrUnsupportedFormat { | ||||
| 				http.Error(w, "Das Dateiformat wird nicht unterstützt.", http.StatusBadRequest) | ||||
| @@ -69,51 +48,6 @@ func UploadImage(c *b.Config, s *b.CookieStore) http.HandlerFunc { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| 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 { | ||||
| 			log.Println(err) | ||||
| 			http.Error(w, err.Error(), http.StatusInternalServerError) | ||||
| 			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 { | ||||
| 			if err == b.ErrUnsupportedFormat { | ||||
| 				http.Error(w, "Das Dateiformat wird nicht unterstützt.", http.StatusBadRequest) | ||||
| 				return | ||||
| 			} | ||||
| 			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) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func UploadBanner(c *b.Config, s *b.CookieStore, fileKey, htmlFile, htmlTemplate string) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		if _, err := getSession(w, r, c, s); err != nil { | ||||
| @@ -130,7 +64,7 @@ func UploadBanner(c *b.Config, s *b.CookieStore, fileKey, htmlFile, htmlTemplate | ||||
| 		} | ||||
| 		defer file.Close() | ||||
|  | ||||
| 		filename, err := b.SaveImage(c, file) | ||||
| 		filename, err := b.SaveImage(file, c.MaxBannerHeight, c.MaxBannerWidth, c.PicsDir+"/") | ||||
| 		if err != nil { | ||||
| 			if err == b.ErrUnsupportedFormat { | ||||
| 				http.Error(w, "Das Dateiformat wird nicht unterstützt.", http.StatusBadRequest) | ||||
| @@ -141,7 +75,7 @@ func UploadBanner(c *b.Config, s *b.CookieStore, fileKey, htmlFile, htmlTemplate | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		base64Img, err := serveBase64Image(c, filename) | ||||
| 		base64Img, err := b.ServeBase64Image(c, filename) | ||||
| 		if err != nil { | ||||
| 			log.Println(err) | ||||
| 			http.Error(w, err.Error(), http.StatusInternalServerError) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user