Added ability to upload media and parse cli arguments
This commit is contained in:
		
							
								
								
									
										44
									
								
								cmd/control/cli.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								cmd/control/cli.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
package control
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CliArgs struct {
 | 
			
		||||
	KeyFile string
 | 
			
		||||
	LogFile string
 | 
			
		||||
	PicsDir string
 | 
			
		||||
	WebDir  string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func HandleCliArgs() (*CliArgs, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
	cliArgs := new(CliArgs)
 | 
			
		||||
 | 
			
		||||
	keyFile := flag.String("key", "/var/www/cpolis.key", "key file")
 | 
			
		||||
	logFile := flag.String("log", "/var/log/cpolis.log", "log file")
 | 
			
		||||
	picsDir := flag.String("pics", "/var/www/cpolis/pics", "pictures directory")
 | 
			
		||||
	webDir := flag.String("web", "/var/www/cpolis/web", "web directory")
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
	cliArgs.KeyFile, err = filepath.Abs(*keyFile)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("error finding KeyFile: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	cliArgs.LogFile, err = filepath.Abs(*logFile)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("error finding LogFile: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	cliArgs.PicsDir, err = filepath.Abs(*picsDir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("error finding PicsDir: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	cliArgs.WebDir, err = filepath.Abs(*webDir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("error finding WebDir: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return cliArgs, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										61
									
								
								cmd/main.go
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								cmd/main.go
									
									
									
									
									
								
							@@ -16,13 +16,17 @@ func init() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	logFile, err := os.OpenFile("tmp/cpolis.log",
 | 
			
		||||
		os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
 | 
			
		||||
	cliArgs, err := control.HandleCliArgs()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatalln(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	logFile, err := os.OpenFile(cliArgs.LogFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatalln(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer logFile.Close()
 | 
			
		||||
	// log.SetOutput(logFile)
 | 
			
		||||
	log.SetOutput(logFile)
 | 
			
		||||
 | 
			
		||||
	db, err := model.OpenDB("cpolis")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -30,48 +34,49 @@ func main() {
 | 
			
		||||
	}
 | 
			
		||||
	defer db.Close()
 | 
			
		||||
 | 
			
		||||
	key, err := control.LoadKey("tmp/key.gob")
 | 
			
		||||
	key, err := control.LoadKey(cliArgs.KeyFile)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		key, err = control.NewKey()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Fatalln(err)
 | 
			
		||||
		}
 | 
			
		||||
		control.SaveKey(key, "tmp/key.gob")
 | 
			
		||||
		control.SaveKey(key, cliArgs.KeyFile)
 | 
			
		||||
	}
 | 
			
		||||
	store := control.NewCookieStore(key)
 | 
			
		||||
 | 
			
		||||
	mux := http.NewServeMux()
 | 
			
		||||
	mux.Handle("/web/static/", http.StripPrefix("/web/static/",
 | 
			
		||||
		http.FileServer(http.Dir("web/static/"))))
 | 
			
		||||
	mux.HandleFunc("/", view.HomePage(db, store))
 | 
			
		||||
		http.FileServer(http.Dir(cliArgs.WebDir+"/static/"))))
 | 
			
		||||
	mux.HandleFunc("/", view.HomePage(cliArgs, db, store))
 | 
			
		||||
 | 
			
		||||
	mux.HandleFunc("GET /create-tag/", view.CreateTag)
 | 
			
		||||
	mux.HandleFunc("GET /create-user/", view.CreateUser)
 | 
			
		||||
	mux.HandleFunc("GET /edit-user/", view.EditUser(db, store))
 | 
			
		||||
	mux.HandleFunc("GET /hub/", view.ShowHub(db, store))
 | 
			
		||||
	mux.HandleFunc("GET /logout/", view.Logout(store))
 | 
			
		||||
	mux.HandleFunc("GET /publish-issue/", view.PublishLatestIssue(db, store))
 | 
			
		||||
	mux.HandleFunc("GET /rejected-articles/", view.ShowRejectedArticles(db, store))
 | 
			
		||||
	mux.HandleFunc("GET /rss/", view.ShowRSS(
 | 
			
		||||
	mux.HandleFunc("GET /create-tag/", view.CreateTag(cliArgs))
 | 
			
		||||
	mux.HandleFunc("GET /create-user/", view.CreateUser(cliArgs))
 | 
			
		||||
	mux.HandleFunc("GET /edit-user/", view.EditUser(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("GET /hub/", view.ShowHub(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("GET /logout/", view.Logout(cliArgs, store))
 | 
			
		||||
	mux.HandleFunc("GET /publish-issue/", view.PublishLatestIssue(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("GET /rejected-articles/", view.ShowRejectedArticles(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("GET /rss/", view.ShowRSS(cliArgs,
 | 
			
		||||
		db,
 | 
			
		||||
		"Freimaurer Distrikt Niedersachsen und Sachsen-Anhalt",
 | 
			
		||||
		"https://distrikt-ni-st.de",
 | 
			
		||||
		"Freiheit, Gleichheit, Brüderlichkeit, Toleranz und Humanität",
 | 
			
		||||
	))
 | 
			
		||||
	mux.HandleFunc("GET /this-issue/", view.ShowCurrentArticles(db))
 | 
			
		||||
	mux.HandleFunc("GET /unpublished-articles/", view.ShowUnpublishedArticles(db))
 | 
			
		||||
	mux.HandleFunc("GET /write-article/", view.WriteArticle(db))
 | 
			
		||||
	mux.HandleFunc("GET /this-issue/", view.ShowCurrentArticles(cliArgs, db))
 | 
			
		||||
	mux.HandleFunc("GET /unpublished-articles/", view.ShowUnpublishedArticles(cliArgs, db))
 | 
			
		||||
	mux.HandleFunc("GET /write-article/", view.WriteArticle(cliArgs, db))
 | 
			
		||||
 | 
			
		||||
	mux.HandleFunc("POST /add-tag/", view.AddTag(db, store))
 | 
			
		||||
	mux.HandleFunc("POST /add-user/", view.AddUser(db, store))
 | 
			
		||||
	mux.HandleFunc("POST /login/", view.Login(db, store))
 | 
			
		||||
	mux.HandleFunc("POST /publish-article/", view.PublishArticle(db, store))
 | 
			
		||||
	mux.HandleFunc("POST /reject-article/", view.RejectArticle(db, store))
 | 
			
		||||
	mux.HandleFunc("POST /resubmit-article/", view.ResubmitArticle(db, store))
 | 
			
		||||
	mux.HandleFunc("POST /review-rejected-article/", view.ReviewRejectedArticle(db, store))
 | 
			
		||||
	mux.HandleFunc("POST /review-unpublished-article/", view.ReviewUnpublishedArticle(db, store))
 | 
			
		||||
	mux.HandleFunc("POST /submit-article/", view.SubmitArticle(db, store))
 | 
			
		||||
	mux.HandleFunc("POST /update-user/", view.UpdateUser(db, store))
 | 
			
		||||
	mux.HandleFunc("POST /add-tag/", view.AddTag(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("POST /add-user/", view.AddUser(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("POST /login/", view.Login(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("POST /publish-article/", view.PublishArticle(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("POST /reject-article/", view.RejectArticle(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("POST /resubmit-article/", view.ResubmitArticle(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("POST /review-rejected-article/", view.ReviewRejectedArticle(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("POST /review-unpublished-article/", view.ReviewUnpublishedArticle(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("POST /submit-article/", view.SubmitArticle(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("POST /update-user/", view.UpdateUser(cliArgs, db, store))
 | 
			
		||||
	mux.HandleFunc("POST /upload-image/", view.UploadImage(cliArgs))
 | 
			
		||||
 | 
			
		||||
	log.Fatalln(http.ListenAndServe(":8080", mux))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,12 @@
 | 
			
		||||
package view
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"html/template"
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
@@ -11,21 +14,21 @@ import (
 | 
			
		||||
	"streifling.com/jason/cpolis/cmd/model"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func ShowHub(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func ShowHub(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		session, err := s.Get(r, "cookie")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
			msg := "Session nicht mehr gültig. Bitte erneut anmelden."
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/hub.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
 | 
			
		||||
		template.Must(tmpl, err).ExecuteTemplate(w, "page-content", session.Values["role"].(int))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WriteArticle(db *model.DB) http.HandlerFunc {
 | 
			
		||||
func WriteArticle(c *control.CliArgs, db *model.DB) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		tags, err := db.GetTagList()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -34,16 +37,16 @@ func WriteArticle(db *model.DB) http.HandlerFunc {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/editor.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/editor.html")
 | 
			
		||||
		template.Must(tmpl, err).ExecuteTemplate(w, "page-content", tags)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SubmitArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func SubmitArticle(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		session, err := s.Get(r, "cookie")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
			msg := "Session nicht mehr gültig. Bitte erneut anmelden."
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
 | 
			
		||||
		}
 | 
			
		||||
@@ -81,13 +84,13 @@ func SubmitArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/hub.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", session.Values["role"])
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ResubmitArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func ResubmitArticle(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		id, err := strconv.ParseInt(r.PostFormValue("article-id"), 10, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -130,18 +133,18 @@ func ResubmitArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
 | 
			
		||||
		session, err := s.Get(r, "cookie")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
			msg := "Session nicht mehr gültig. Bitte erneut anmelden."
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/hub.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", session.Values["role"])
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ShowUnpublishedArticles(db *model.DB) http.HandlerFunc {
 | 
			
		||||
func ShowUnpublishedArticles(c *control.CliArgs, db *model.DB) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		unpublishedArticles, err := db.GetCertainArticles(false, false)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -150,13 +153,13 @@ func ShowUnpublishedArticles(db *model.DB) http.HandlerFunc {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/unpublished-articles.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/unpublished-articles.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", unpublishedArticles)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ShowRejectedArticles(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func ShowRejectedArticles(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		type htmlData struct {
 | 
			
		||||
			MyIDs            map[int64]bool
 | 
			
		||||
@@ -185,13 +188,13 @@ func ShowRejectedArticles(db *model.DB, s *control.CookieStore) http.HandlerFunc
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/rejected-articles.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/rejected-articles.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", data)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ReviewUnpublishedArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func ReviewUnpublishedArticle(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		type htmlData struct {
 | 
			
		||||
			Article *model.Article
 | 
			
		||||
@@ -220,13 +223,13 @@ func ReviewUnpublishedArticle(db *model.DB, s *control.CookieStore) http.Handler
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/to-be-published.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/to-be-published.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", data)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ReviewRejectedArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func ReviewRejectedArticle(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		type htmlData struct {
 | 
			
		||||
			Selected map[int64]bool
 | 
			
		||||
@@ -267,13 +270,13 @@ func ReviewRejectedArticle(db *model.DB, s *control.CookieStore) http.HandlerFun
 | 
			
		||||
			data.Selected[tag.ID] = true
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/rework-article.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/rework-article.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", data)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func PublishArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func PublishArticle(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		id, err := strconv.ParseInt(r.PostFormValue("id"), 10, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -284,7 +287,7 @@ func PublishArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
 | 
			
		||||
		session, err := s.Get(r, "cookie")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
			msg := "Session nicht mehr gültig. Bitte erneut anmelden."
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
 | 
			
		||||
		}
 | 
			
		||||
@@ -322,13 +325,13 @@ func PublishArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/hub.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", session.Values["role"])
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RejectArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func RejectArticle(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		id, err := strconv.ParseInt(r.PostFormValue("id"), 10, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -339,7 +342,7 @@ func RejectArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
 | 
			
		||||
		session, err := s.Get(r, "cookie")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
			msg := "Session nicht mehr gültig. Bitte erneut anmelden."
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
 | 
			
		||||
		}
 | 
			
		||||
@@ -352,13 +355,13 @@ func RejectArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/hub.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", session.Values["role"])
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ShowCurrentArticles(db *model.DB) http.HandlerFunc {
 | 
			
		||||
func ShowCurrentArticles(c *control.CliArgs, db *model.DB) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		articles, err := db.GetCurrentIssueArticles()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -367,7 +370,37 @@ func ShowCurrentArticles(db *model.DB) http.HandlerFunc {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/current-articles.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/current-articles.html")
 | 
			
		||||
		template.Must(tmpl, err).ExecuteTemplate(w, "page-content", articles)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UploadImage(c *control.CliArgs) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		file, header, err := r.FormFile("article-image")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Println(err)
 | 
			
		||||
			http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		defer file.Close()
 | 
			
		||||
 | 
			
		||||
		filename := fmt.Sprint("tmp/pics/", time.Now().Format("2006-01-02_15:04:05"), "-", header.Filename)
 | 
			
		||||
		img, err := os.Create(filename)
 | 
			
		||||
		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
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/editor.html")
 | 
			
		||||
		template.Must(tmpl, err).ExecuteTemplate(w, "editor-images", fmt.Sprint(""))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,23 +8,25 @@ import (
 | 
			
		||||
	"streifling.com/jason/cpolis/cmd/model"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func CreateTag(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	tmpl, err := template.ParseFiles("web/templates/add-tag.html")
 | 
			
		||||
func CreateTag(c *control.CliArgs) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/add-tag.html")
 | 
			
		||||
		template.Must(tmpl, err).ExecuteTemplate(w, "page-content", nil)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddTag(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func AddTag(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		db.AddTag(r.PostFormValue("tag"))
 | 
			
		||||
 | 
			
		||||
		session, err := s.Get(r, "cookie")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
			msg := "Session nicht mehr gültig. Bitte erneut anmelden."
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/hub.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", session.Values["role"])
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ import (
 | 
			
		||||
	"streifling.com/jason/cpolis/cmd/model"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func PublishLatestIssue(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func PublishLatestIssue(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		if err := db.PublishLatestIssue(); err != nil {
 | 
			
		||||
			log.Println(err)
 | 
			
		||||
@@ -19,12 +19,12 @@ func PublishLatestIssue(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
 | 
			
		||||
		session, err := s.Get(r, "cookie")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
			msg := "Session nicht mehr gültig. Bitte erneut anmelden."
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/hub.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", session.Values["role"])
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ import (
 | 
			
		||||
	"streifling.com/jason/cpolis/cmd/model"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func ShowRSS(db *model.DB, title, link, desc string) http.HandlerFunc {
 | 
			
		||||
func ShowRSS(c *control.CliArgs, db *model.DB, title, link, desc string) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		channel := &rss.Channel{
 | 
			
		||||
			Title:       title,
 | 
			
		||||
@@ -88,7 +88,7 @@ func ShowRSS(db *model.DB, title, link, desc string) http.HandlerFunc {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		files := []string{"web/templates/index.html", "web/templates/feed.rss"}
 | 
			
		||||
		files := []string{c.WebDir + "/templates/index.html", c.WebDir + "/templates/feed.rss"}
 | 
			
		||||
		tmpl, err := template.ParseFiles(files...)
 | 
			
		||||
		template.Must(tmpl, err).Execute(w, rss)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,26 +27,26 @@ func saveSession(w http.ResponseWriter, r *http.Request, s *control.CookieStore,
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func HomePage(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func HomePage(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		numRows, err := db.CountEntries("users")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Fatalln(err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		files := []string{"web/templates/index.html"}
 | 
			
		||||
		files := []string{c.WebDir + "/templates/index.html"}
 | 
			
		||||
		if numRows == 0 {
 | 
			
		||||
			files = append(files, "web/templates/add-user.html")
 | 
			
		||||
			files = append(files, c.WebDir+"/templates/add-user.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(files...)
 | 
			
		||||
			template.Must(tmpl, err).Execute(w, nil)
 | 
			
		||||
		} else {
 | 
			
		||||
			session, _ := s.Get(r, "cookie")
 | 
			
		||||
			if auth, ok := session.Values["authenticated"].(bool); auth && ok {
 | 
			
		||||
				files = append(files, "web/templates/hub.html")
 | 
			
		||||
				files = append(files, c.WebDir+"/templates/hub.html")
 | 
			
		||||
				tmpl, err := template.ParseFiles(files...)
 | 
			
		||||
				template.Must(tmpl, err).Execute(w, session.Values["role"])
 | 
			
		||||
			} else {
 | 
			
		||||
				files = append(files, "web/templates/login.html")
 | 
			
		||||
				files = append(files, c.WebDir+"/templates/login.html")
 | 
			
		||||
				tmpl, err := template.ParseFiles(files...)
 | 
			
		||||
				template.Must(tmpl, err).Execute(w, nil)
 | 
			
		||||
			}
 | 
			
		||||
@@ -54,7 +54,7 @@ func HomePage(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Login(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func Login(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		userName := r.PostFormValue("username")
 | 
			
		||||
		password := r.PostFormValue("password")
 | 
			
		||||
@@ -84,16 +84,16 @@ func Login(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/hub.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
 | 
			
		||||
		template.Must(tmpl, err).ExecuteTemplate(w, "page-content", user.Role)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Logout(s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func Logout(c *control.CliArgs, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		session, err := s.Get(r, "cookie")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
			msg := "Session nicht mehr gültig. Bitte erneut anmelden."
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
 | 
			
		||||
		}
 | 
			
		||||
@@ -106,7 +106,7 @@ func Logout(s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
		template.Must(tmpl, err).ExecuteTemplate(w, "page-content", nil)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,12 +31,14 @@ func checkUserStrings(user *model.User) (string, int, bool) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreateUser(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	tmpl, err := template.ParseFiles("web/templates/add-user.html")
 | 
			
		||||
func CreateUser(c *control.CliArgs) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/add-user.html")
 | 
			
		||||
		template.Must(tmpl, err).ExecuteTemplate(w, "page-content", nil)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func AddUser(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		role, err := strconv.Atoi(r.PostFormValue("role"))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -59,7 +61,7 @@ func AddUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
		if len(htmlData.UserName) == 0 || len(htmlData.FirstName) == 0 ||
 | 
			
		||||
			len(htmlData.LastName) == 0 || len(pass) == 0 || len(pass2) == 0 {
 | 
			
		||||
			htmlData.Msg = "Alle Felder müssen ausgefüllt werden."
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/add-user.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/add-user.html")
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", htmlData)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
@@ -67,7 +69,7 @@ func AddUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
		if !ok {
 | 
			
		||||
			htmlData.Msg = fmt.Sprint(userString, " ist zu lang. Maximal ",
 | 
			
		||||
				stringLen, " Zeichen erlaubt.")
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/add-user.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/add-user.html")
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", htmlData)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
@@ -75,13 +77,13 @@ func AddUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
		if id != 0 {
 | 
			
		||||
			htmlData.Msg = fmt.Sprint(htmlData.UserName,
 | 
			
		||||
				" ist bereits vergeben. Bitte anderen Benutzernamen wählen.")
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/add-user.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/add-user.html")
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", htmlData)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if pass != pass2 {
 | 
			
		||||
			htmlData.Msg = "Die Passwörter stimmen nicht überein."
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/add-user.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/add-user.html")
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", htmlData)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
@@ -117,16 +119,16 @@ func AddUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/hub.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
 | 
			
		||||
		template.Must(tmpl, err).ExecuteTemplate(w, "page-content", 0)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func EditUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func EditUser(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		session, err := s.Get(r, "cookie")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
			msg := "Session nicht mehr gültig. Bitte erneut anmelden."
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
 | 
			
		||||
		}
 | 
			
		||||
@@ -138,16 +140,16 @@ func EditUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/edit-user.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/edit-user.html")
 | 
			
		||||
		template.Must(tmpl, err).ExecuteTemplate(w, "page-content", user)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UpdateUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
func UpdateUser(c *control.CliArgs, db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		session, err := s.Get(r, "cookie")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/login.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/login.html")
 | 
			
		||||
			msg := "Session nicht mehr gültig. Bitte erneut anmelden."
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
 | 
			
		||||
		}
 | 
			
		||||
@@ -167,7 +169,7 @@ func UpdateUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
		if len(userData.UserName) == 0 || len(userData.FirstName) == 0 ||
 | 
			
		||||
			len(userData.LastName) == 0 {
 | 
			
		||||
			userData.Msg = "Alle Felder mit * müssen ausgefüllt sein."
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/edit-user.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/edit-user.html")
 | 
			
		||||
			tmpl = template.Must(tmpl, err)
 | 
			
		||||
			tmpl.ExecuteTemplate(w, "page-content", userData.Msg)
 | 
			
		||||
			return
 | 
			
		||||
@@ -177,7 +179,7 @@ func UpdateUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
		if !ok {
 | 
			
		||||
			userData.Msg = fmt.Sprint(userString, " ist zu lang. Maximal ",
 | 
			
		||||
				stringLen, " Zeichen erlaubt.")
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/edit-user.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/edit-user.html")
 | 
			
		||||
			tmpl = template.Must(tmpl, err)
 | 
			
		||||
			tmpl.ExecuteTemplate(w, "page-content", userData)
 | 
			
		||||
			return
 | 
			
		||||
@@ -187,7 +189,7 @@ func UpdateUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
			if id != userData.ID {
 | 
			
		||||
				userData.Msg = "Benutzername bereits vergeben."
 | 
			
		||||
				userData.UserName = ""
 | 
			
		||||
				tmpl, err := template.ParseFiles("web/templates/edit-user.html")
 | 
			
		||||
				tmpl, err := template.ParseFiles(c.WebDir + "/templates/edit-user.html")
 | 
			
		||||
				tmpl = template.Must(tmpl, err)
 | 
			
		||||
				tmpl.ExecuteTemplate(w, "page-content", userData)
 | 
			
		||||
				return
 | 
			
		||||
@@ -203,11 +205,11 @@ func UpdateUser(db *model.DB, s *control.CookieStore) http.HandlerFunc {
 | 
			
		||||
			newPass,
 | 
			
		||||
			newPass2); err != nil {
 | 
			
		||||
			userData.Msg = "Aktualisierung der Benutzerdaten fehlgeschlagen."
 | 
			
		||||
			tmpl, err := template.ParseFiles("web/templates/edit-user.html")
 | 
			
		||||
			tmpl, err := template.ParseFiles(c.WebDir + "/templates/edit-user.html")
 | 
			
		||||
			template.Must(tmpl, err).ExecuteTemplate(w, "page-content", userData)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tmpl, err := template.ParseFiles("web/templates/hub.html")
 | 
			
		||||
		tmpl, err := template.ParseFiles(c.WebDir + "/templates/hub.html")
 | 
			
		||||
		tmpl = template.Must(tmpl, err)
 | 
			
		||||
		tmpl.ExecuteTemplate(w, "page-content", session.Values["role"].(int))
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,8 +16,42 @@
 | 
			
		||||
        {{end}}
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div id="editor-images">
 | 
			
		||||
        <input name="article-image" type="file" hx-encoding="multipart/form-data" hx-post="/upload-image/"
 | 
			
		||||
            hx-swap="beforeend" hx-target="#editor-images" />
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <input type="submit" value="Senden" hx-post="/submit-article/" hx-target="#page-content" />
 | 
			
		||||
</form>
 | 
			
		||||
 | 
			
		||||
<button hx-get="/hub/" hx-target="#page-content">Abbrechen</button>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
    function copyToClipboard(text) {
 | 
			
		||||
        event.preventDefault(); // Get-Request verhindern
 | 
			
		||||
 | 
			
		||||
        var textarea = document.createElement("textarea");
 | 
			
		||||
        textarea.textContent = text;
 | 
			
		||||
        document.body.appendChild(textarea);
 | 
			
		||||
 | 
			
		||||
        textarea.select();
 | 
			
		||||
        try {
 | 
			
		||||
            document.execCommand('copy');
 | 
			
		||||
        } catch (err) {
 | 
			
		||||
            console.warn('Fehler beim Kopieren', err);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        document.body.removeChild(textarea);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
{{end}}
 | 
			
		||||
 | 
			
		||||
{{define "editor-images"}}
 | 
			
		||||
{{if gt (len .) 0}}
 | 
			
		||||
<div>
 | 
			
		||||
    {{.}}
 | 
			
		||||
    <button onclick="copyToClipboard('{{.}}')">Kopieren</button>
 | 
			
		||||
</div>
 | 
			
		||||
{{end}}
 | 
			
		||||
{{end}}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user