forked from electricdusk/rushlink
		
	refactor: Make view logic private
This commit is contained in:
		
							parent
							
								
									a4ad82d6dd
								
							
						
					
					
						commit
						173ae7665b
					
				@ -74,28 +74,28 @@ func (t PasteState) String() string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func indexGetHandler(w http.ResponseWriter, r *http.Request) {
 | 
					func indexGetHandler(w http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
	Render(w, r, "index", nil)
 | 
						render(w, r, "index", nil)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func indexPostHandler(w http.ResponseWriter, r *http.Request) {
 | 
					func indexPostHandler(w http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
	if err := r.ParseMultipartForm(50 * 1000 * 1000); err != nil {
 | 
						if err := r.ParseMultipartForm(50 * 1000 * 1000); err != nil {
 | 
				
			||||||
		log.Printf("error: %v\n", err)
 | 
							log.Printf("error: %v\n", err)
 | 
				
			||||||
		RenderInternalServerError(w, r, err)
 | 
							renderInternalServerError(w, r, err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Determine what kind of post this is, currently only `shorten=...`
 | 
						// Determine what kind of post this is, currently only `shorten=...`
 | 
				
			||||||
	if len(r.PostForm) == 0 {
 | 
						if len(r.PostForm) == 0 {
 | 
				
			||||||
		RenderError(w, r, http.StatusBadRequest, "empty body in POST request\n")
 | 
							renderError(w, r, http.StatusBadRequest, "empty body in POST request\n")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	shorten_values, prs := r.PostForm["shorten"]
 | 
						shorten_values, prs := r.PostForm["shorten"]
 | 
				
			||||||
	if !prs {
 | 
						if !prs {
 | 
				
			||||||
		RenderError(w, r, http.StatusBadRequest, "no 'shorten' param given\n")
 | 
							renderError(w, r, http.StatusBadRequest, "no 'shorten' param given\n")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(shorten_values) != 1 {
 | 
						if len(shorten_values) != 1 {
 | 
				
			||||||
		RenderError(w, r, http.StatusBadRequest, "only one 'shorten' param is allowed per request\n")
 | 
							renderError(w, r, http.StatusBadRequest, "only one 'shorten' param is allowed per request\n")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -124,11 +124,11 @@ func pasteGetHandlerInner(w http.ResponseWriter, r *http.Request, noRedirect, sh
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}); err != nil {
 | 
						}); err != nil {
 | 
				
			||||||
		log.Printf("error: %v\n", err)
 | 
							log.Printf("error: %v\n", err)
 | 
				
			||||||
		RenderInternalServerError(w, r, err)
 | 
							renderInternalServerError(w, r, err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if storedPaste == nil {
 | 
						if storedPaste == nil {
 | 
				
			||||||
		RenderError(w, r, http.StatusNotFound, "url key not found in the database")
 | 
							renderError(w, r, http.StatusNotFound, "url key not found in the database")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -143,7 +143,7 @@ func pasteGetHandlerInner(w http.ResponseWriter, r *http.Request, noRedirect, sh
 | 
				
			|||||||
			"Paste":   storedPaste,
 | 
								"Paste":   storedPaste,
 | 
				
			||||||
			"IsOwner": isOwner,
 | 
								"IsOwner": isOwner,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		Render(w, r, "pasteMeta", data)
 | 
							render(w, r, "pasteMeta", data)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -154,18 +154,18 @@ func pasteGetHandlerInner(w http.ResponseWriter, r *http.Request, noRedirect, sh
 | 
				
			|||||||
			urlParse, err := url.Parse(rawurl)
 | 
								urlParse, err := url.Parse(rawurl)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				log.Printf("error: invalid URL ('%v') in database for key '%v': %v\n", rawurl, storedPaste.Key, err)
 | 
									log.Printf("error: invalid URL ('%v') in database for key '%v': %v\n", rawurl, storedPaste.Key, err)
 | 
				
			||||||
				RenderInternalServerError(w, r, "invalid url in database")
 | 
									renderInternalServerError(w, r, "invalid url in database")
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			http.Redirect(w, r, urlParse.String(), http.StatusSeeOther)
 | 
								http.Redirect(w, r, urlParse.String(), http.StatusSeeOther)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		w.Write(storedPaste.Content)
 | 
							w.Write(storedPaste.Content)
 | 
				
			||||||
	case StateDeleted:
 | 
						case StateDeleted:
 | 
				
			||||||
		RenderError(w, r, http.StatusGone, "key has been deleted")
 | 
							renderError(w, r, http.StatusGone, "key has been deleted")
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		log.Printf("error: invalid storedPaste.State (%v) for key '%v'\n", storedPaste.State, storedPaste.Key)
 | 
							log.Printf("error: invalid storedPaste.State (%v) for key '%v'\n", storedPaste.State, storedPaste.Key)
 | 
				
			||||||
		msg := fmt.Sprintf("internal server error: invalid storedPaste.State (%v\n)", storedPaste.State)
 | 
							msg := fmt.Sprintf("internal server error: invalid storedPaste.State (%v\n)", storedPaste.State)
 | 
				
			||||||
		RenderInternalServerError(w, r, msg)
 | 
							renderInternalServerError(w, r, msg)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -174,15 +174,15 @@ func shortenPostHandler(w http.ResponseWriter, r *http.Request) {
 | 
				
			|||||||
	userURL, err := url.ParseRequestURI(rawurl)
 | 
						userURL, err := url.ParseRequestURI(rawurl)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		msg := fmt.Sprintf("invalid url (%v): %v", err, rawurl)
 | 
							msg := fmt.Sprintf("invalid url (%v): %v", err, rawurl)
 | 
				
			||||||
		RenderError(w, r, http.StatusBadRequest, msg)
 | 
							renderError(w, r, http.StatusBadRequest, msg)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if userURL.Scheme == "" {
 | 
						if userURL.Scheme == "" {
 | 
				
			||||||
		RenderError(w, r, http.StatusBadRequest, "invalid url (unspecified scheme)")
 | 
							renderError(w, r, http.StatusBadRequest, "invalid url (unspecified scheme)")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if userURL.Host == "" {
 | 
						if userURL.Host == "" {
 | 
				
			||||||
		RenderError(w, r, http.StatusBadRequest, "invalid url (unspecified host)")
 | 
							renderError(w, r, http.StatusBadRequest, "invalid url (unspecified host)")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -202,7 +202,7 @@ func shortenPostHandler(w http.ResponseWriter, r *http.Request) {
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}); err != nil {
 | 
						}); err != nil {
 | 
				
			||||||
		log.Printf("error: %v\n", err)
 | 
							log.Printf("error: %v\n", err)
 | 
				
			||||||
		RenderInternalServerError(w, r, err)
 | 
							renderInternalServerError(w, r, err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -210,7 +210,7 @@ func shortenPostHandler(w http.ResponseWriter, r *http.Request) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		err = errors.Wrap(err, "parsing url")
 | 
							err = errors.Wrap(err, "parsing url")
 | 
				
			||||||
		log.Printf("error: %v\n", err)
 | 
							log.Printf("error: %v\n", err)
 | 
				
			||||||
		RenderInternalServerError(w, r, err)
 | 
							renderInternalServerError(w, r, err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var base64OwnerToken = make([]byte, 24)
 | 
						var base64OwnerToken = make([]byte, 24)
 | 
				
			||||||
 | 
				
			|||||||
@ -23,12 +23,12 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Plain text templates
 | 
					// Plain text templates
 | 
				
			||||||
var TextBaseTemplate *text.Template = text.Must(text.New("").Parse(string(MustAsset("templates/txt/base.txt.tmpl"))))
 | 
					var textBaseTemplate *text.Template = text.Must(text.New("").Parse(string(MustAsset("templates/txt/base.txt.tmpl"))))
 | 
				
			||||||
var HTMLBaseTemplate *html.Template = html.Must(html.New("").Parse(string(MustAsset("templates/html/base.html.tmpl"))))
 | 
					var htmlBaseTemplate *html.Template = html.Must(html.New("").Parse(string(MustAsset("templates/html/base.html.tmpl"))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Template collections
 | 
					// Template collections
 | 
				
			||||||
var TextTemplates = make(map[string]*text.Template, 0)
 | 
					var textTemplates = make(map[string]*text.Template, 0)
 | 
				
			||||||
var HTMLTemplates = make(map[string]*html.Template, 0)
 | 
					var htmlTemplates = make(map[string]*html.Template, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Used by resolveResponseContentType
 | 
					// Used by resolveResponseContentType
 | 
				
			||||||
var acceptHeaderMediaRangeRegex = regexp.MustCompile(`^\s*([^()<>@,;:\\"/\[\]?.=]+)/([^()<>@,;:\\"/\[\]?.=]+)\s*$`)
 | 
					var acceptHeaderMediaRangeRegex = regexp.MustCompile(`^\s*([^()<>@,;:\\"/\[\]?.=]+)/([^()<>@,;:\\"/\[\]?.=]+)\s*$`)
 | 
				
			||||||
@ -39,23 +39,23 @@ var acceptHeaderWeight = regexp.MustCompile(`^\s*q=0(?:\.([0-9]{0,3}))|1(?:\.0{0
 | 
				
			|||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	for _, tmplPath := range AssetNames() {
 | 
						for _, tmplPath := range AssetNames() {
 | 
				
			||||||
		if mustMatch("templates/txt/*.txt.tmpl", tmplPath) {
 | 
							if mustMatch("templates/txt/*.txt.tmpl", tmplPath) {
 | 
				
			||||||
			base := text.Must(TextBaseTemplate.Clone())
 | 
								base := text.Must(textBaseTemplate.Clone())
 | 
				
			||||||
			tmpl := text.Must(base.Parse(string(MustAsset(tmplPath))))
 | 
								tmpl := text.Must(base.Parse(string(MustAsset(tmplPath))))
 | 
				
			||||||
			tmplName := strings.TrimSuffix(filepath.Base(tmplPath), ".txt.tmpl")
 | 
								tmplName := strings.TrimSuffix(filepath.Base(tmplPath), ".txt.tmpl")
 | 
				
			||||||
			TextTemplates[tmplName] = tmpl
 | 
								textTemplates[tmplName] = tmpl
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if mustMatch("templates/html/*.html.tmpl", tmplPath) {
 | 
							if mustMatch("templates/html/*.html.tmpl", tmplPath) {
 | 
				
			||||||
			base := html.Must(HTMLBaseTemplate.Clone())
 | 
								base := html.Must(htmlBaseTemplate.Clone())
 | 
				
			||||||
			tmpl := html.Must(base.Parse(string(MustAsset(tmplPath))))
 | 
								tmpl := html.Must(base.Parse(string(MustAsset(tmplPath))))
 | 
				
			||||||
			tmplName := strings.TrimSuffix(filepath.Base(tmplPath), ".html.tmpl")
 | 
								tmplName := strings.TrimSuffix(filepath.Base(tmplPath), ".html.tmpl")
 | 
				
			||||||
			HTMLTemplates[tmplName] = tmpl
 | 
								htmlTemplates[tmplName] = tmpl
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Sanity check. Both maps should not be empty
 | 
						// Sanity check. Both maps should not be empty
 | 
				
			||||||
	if len(TextTemplates) == 0 || len(HTMLTemplates) == 0 {
 | 
						if len(textTemplates) == 0 || len(htmlTemplates) == 0 {
 | 
				
			||||||
		panic("template loading failed")
 | 
							panic("template loading failed")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -72,7 +72,7 @@ func parseFail(tmplName string, err error) {
 | 
				
			|||||||
	panic(errors.Wrapf(err, "parsing of %v failed", tmplName))
 | 
						panic(errors.Wrapf(err, "parsing of %v failed", tmplName))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Render(w http.ResponseWriter, r *http.Request, tmplName string, data map[string]interface{}) {
 | 
					func render(w http.ResponseWriter, r *http.Request, tmplName string, data map[string]interface{}) {
 | 
				
			||||||
	contentType, err := resolveResponseContentType(r, []string{"text/plain", "text/html"})
 | 
						contentType, err := resolveResponseContentType(r, []string{"text/plain", "text/html"})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		w.WriteHeader(http.StatusNotAcceptable)
 | 
							w.WriteHeader(http.StatusNotAcceptable)
 | 
				
			||||||
@ -82,25 +82,25 @@ func Render(w http.ResponseWriter, r *http.Request, tmplName string, data map[st
 | 
				
			|||||||
	switch contentType {
 | 
						switch contentType {
 | 
				
			||||||
	case "text/plain":
 | 
						case "text/plain":
 | 
				
			||||||
		w.Header().Set("Content-Type", "text/plain")
 | 
							w.Header().Set("Content-Type", "text/plain")
 | 
				
			||||||
		tmpl := TextTemplates[tmplName]
 | 
							tmpl := textTemplates[tmplName]
 | 
				
			||||||
		if tmpl == nil {
 | 
							if tmpl == nil {
 | 
				
			||||||
			err = fmt.Errorf("'%v' not in TextTemplates", tmplName)
 | 
								err = fmt.Errorf("'%v' not in textTemplates", tmplName)
 | 
				
			||||||
			break
 | 
								break
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		err = tmpl.Execute(w, data)
 | 
							err = tmpl.Execute(w, data)
 | 
				
			||||||
	case "text/html":
 | 
						case "text/html":
 | 
				
			||||||
		w.Header().Set("Content-Type", "text/html")
 | 
							w.Header().Set("Content-Type", "text/html")
 | 
				
			||||||
		tmpl := HTMLTemplates[tmplName]
 | 
							tmpl := htmlTemplates[tmplName]
 | 
				
			||||||
		if tmpl == nil {
 | 
							if tmpl == nil {
 | 
				
			||||||
			err = fmt.Errorf("'%v' not in HTMLTemplates", tmplName)
 | 
								err = fmt.Errorf("'%v' not in htmlTemplates", tmplName)
 | 
				
			||||||
			break
 | 
								break
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Construct a (lazy) plain-text view for inclusion in <pre>
 | 
							// Construct a (lazy) plain-text view for inclusion in <pre>
 | 
				
			||||||
		pre := func() string {
 | 
							pre := func() string {
 | 
				
			||||||
			tmpl := TextTemplates[tmplName]
 | 
								tmpl := textTemplates[tmplName]
 | 
				
			||||||
			if tmpl == nil {
 | 
								if tmpl == nil {
 | 
				
			||||||
				panic(fmt.Errorf("'%v' not in TextTemplates", tmplName))
 | 
									panic(fmt.Errorf("'%v' not in textTemplates", tmplName))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			var buf bytes.Buffer
 | 
								var buf bytes.Buffer
 | 
				
			||||||
			if err := tmpl.Execute(&buf, data); err != nil {
 | 
								if err := tmpl.Execute(&buf, data); err != nil {
 | 
				
			||||||
@ -121,14 +121,14 @@ func Render(w http.ResponseWriter, r *http.Request, tmplName string, data map[st
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func RenderError(w http.ResponseWriter, r *http.Request, status int, msg string) {
 | 
					func renderError(w http.ResponseWriter, r *http.Request, status int, msg string) {
 | 
				
			||||||
	w.WriteHeader(status)
 | 
						w.WriteHeader(status)
 | 
				
			||||||
	Render(w, r, "error", map[string]interface{}{"Message": msg})
 | 
						render(w, r, "error", map[string]interface{}{"Message": msg})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func RenderInternalServerError(w http.ResponseWriter, r *http.Request, err interface{}) {
 | 
					func renderInternalServerError(w http.ResponseWriter, r *http.Request, err interface{}) {
 | 
				
			||||||
	msg := fmt.Sprintf("internal server error: %v", err)
 | 
						msg := fmt.Sprintf("internal server error: %v", err)
 | 
				
			||||||
	RenderError(w, r, http.StatusInternalServerError, msg)
 | 
						renderError(w, r, http.StatusInternalServerError, msg)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Merge the second data map into the first one, overwriting any key that is
 | 
					// Merge the second data map into the first one, overwriting any key that is
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user