package handler import ( "net/http" "os" "path/filepath" "regexp" "podstalk/store" ) var slugRe = regexp.MustCompile(`^[a-z0-9]+(-[a-z0-9]+)*$`) type SettingsHandler struct { Store *store.Store UploadDir string } func (h *SettingsHandler) ServeSettings(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { http.Error(w, "method not allowed", http.StatusMethodNotAllowed) return } userID := UserIDFromContext(r) user, err := h.Store.GetUser(userID) if err != nil { http.Redirect(w, r, "/", http.StatusSeeOther) return } if err := r.ParseMultipartForm(10 << 20); err != nil { http.Redirect(w, r, "/?error=file+too+large", http.StatusSeeOther) return } title := r.FormValue("podcast_title") if title == "" { title = user.PodcastTitle } slug := r.FormValue("podcast_slug") if slug == "" { slug = user.PodcastSlug } if slug != "" { if !slugRe.MatchString(slug) { http.Redirect(w, r, "/?error=slug+must+be+lowercase+letters+numbers+and+hyphens", http.StatusSeeOther) return } taken, err := h.Store.SlugTaken(slug, userID) if err != nil { http.Redirect(w, r, "/?error=internal+error", http.StatusSeeOther) return } if taken { http.Redirect(w, r, "/?error=slug+already+taken", http.StatusSeeOther) return } } author := r.FormValue("podcast_author") if author == "" { author = user.PodcastAuthor } image := user.PodcastImage // Handle podcast image upload file, header, err := r.FormFile("podcast_image") if err == nil { defer file.Close() if image != "" { os.Remove(filepath.Join(h.UploadDir, image)) } catDir := filepath.Join(h.UploadDir, "images") os.MkdirAll(catDir, 0755) ext := filepath.Ext(header.Filename) if ext == "" { ext = ".png" } dst, err := os.Create(filepath.Join(catDir, "podcast"+ext)) if err == nil { defer dst.Close() dst.ReadFrom(file) image = "images/podcast" + ext } } h.Store.UpdateUserPodcast(userID, title, slug, image, author) http.Redirect(w, r, "/?success=podcast+settings+saved", http.StatusSeeOther) }