package handlers import ( "log" "net/http" "threadr/models" "github.com/gorilla/sessions" ) func PreferencesHandler(app *App) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { session := r.Context().Value("session").(*sessions.Session) userID, ok := session.Values["user_id"].(int) if !ok { http.Redirect(w, r, app.Config.ThreadrDir+"/login/", http.StatusFound) return } // Handle POST request (saving preferences) if r.Method == http.MethodPost { // Get form values autoSaveDrafts := r.FormValue("auto_save_drafts") == "on" markdownPreviewDefault := r.FormValue("markdown_preview_default") // Validate markdown_preview_default if markdownPreviewDefault != "edit" && markdownPreviewDefault != "preview" { markdownPreviewDefault = "edit" } // Get current preferences (or create if not exists) prefs, err := models.GetUserPreferences(app.DB, userID) if err != nil { log.Printf("Error fetching preferences: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } // Update preferences prefs.AutoSaveDrafts = autoSaveDrafts prefs.MarkdownPreviewDefault = markdownPreviewDefault err = models.UpdateUserPreferences(app.DB, prefs) if err != nil { log.Printf("Error updating preferences: %v", err) http.Error(w, "Failed to save preferences", http.StatusInternalServerError) return } // Redirect back to preferences page with success http.Redirect(w, r, app.Config.ThreadrDir+"/preferences/?saved=true", http.StatusFound) return } // Handle GET request (displaying preferences form) prefs, err := models.GetUserPreferences(app.DB, userID) if err != nil { log.Printf("Error fetching preferences: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } // Check if we should show success message showSuccess := r.URL.Query().Get("saved") == "true" data := struct { PageData Preferences *models.UserPreferences ShowSuccess bool }{ PageData: PageData{ Title: "ThreadR - Preferences", Navbar: "preferences", LoggedIn: true, ShowCookieBanner: false, BasePath: app.Config.ThreadrDir, StaticPath: app.Config.ThreadrDir + "/static", CurrentURL: r.URL.Path, }, Preferences: prefs, ShowSuccess: showSuccess, } if err := app.Tmpl.ExecuteTemplate(w, "preferences", data); err != nil { log.Printf("Error executing template in PreferencesHandler: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } } }