From a24554f5dbc50ae46545008417392d73ec45c366 Mon Sep 17 00:00:00 2001 From: Jocadbz Date: Tue, 15 Apr 2025 17:03:45 -0300 Subject: [PATCH] Refactor signup and login handlers, add auto table creation --- handlers/login.go | 3 +- handlers/signup.go | 2 +- main.go | 152 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+), 2 deletions(-) diff --git a/handlers/login.go b/handlers/login.go index 7a0e122..b337bf1 100644 --- a/handlers/login.go +++ b/handlers/login.go @@ -1,6 +1,7 @@ package handlers import ( + "database/sql" "log" "net/http" "threadr/models" @@ -14,7 +15,7 @@ func LoginHandler(app *App) http.HandlerFunc { username := r.FormValue("username") password := r.FormValue("password") user, err := models.GetUserByUsername(app.DB, username) - if err != nil { + if err != nil && err != sql.ErrNoRows { log.Printf("Error fetching user in LoginHandler: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return diff --git a/handlers/signup.go b/handlers/signup.go index 0be0b63..bcb9980 100644 --- a/handlers/signup.go +++ b/handlers/signup.go @@ -29,7 +29,7 @@ func SignupHandler(app *App) http.HandlerFunc { StaticPath: app.Config.ThreadrDir + "/static", CurrentURL: r.URL.Path, }, - Error: "Error creating user: " + err.Error(), + Error: "An error occurred during sign up. Please try again.", } if err := app.Tmpl.ExecuteTemplate(w, "signup", data); err != nil { log.Printf("Error executing template in SignupHandler: %v", err) diff --git a/main.go b/main.go index 2bc8f85..3fc43e4 100644 --- a/main.go +++ b/main.go @@ -26,6 +26,152 @@ func loadConfig(filename string) (*handlers.Config, error) { return &config, err } +func createTablesIfNotExist(db *sql.DB) error { + // Create boards table + _, err := db.Exec(` + CREATE TABLE IF NOT EXISTS boards ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + description TEXT, + private BOOLEAN DEFAULT FALSE, + public_visible BOOLEAN DEFAULT TRUE, + pinned_threads TEXT, + custom_landing_page TEXT, + color_scheme VARCHAR(255) + )`) + if err != nil { + return fmt.Errorf("error creating boards table: %v", err) + } + + // Create users table + _, err = db.Exec(` + CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(255) NOT NULL UNIQUE, + display_name VARCHAR(255), + pfp_url VARCHAR(255), + bio TEXT, + authentication_string VARCHAR(128) NOT NULL, + authentication_salt VARCHAR(255) NOT NULL, + authentication_algorithm VARCHAR(50) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + verified BOOLEAN DEFAULT FALSE, + permissions BIGINT DEFAULT 0 + )`) + if err != nil { + return fmt.Errorf("error creating users table: %v", err) + } + + // Create threads table + _, err = db.Exec(` + CREATE TABLE IF NOT EXISTS threads ( + id INT AUTO_INCREMENT PRIMARY KEY, + board_id INT NOT NULL, + title VARCHAR(255) NOT NULL, + type VARCHAR(50) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + created_by_user_id INT NOT NULL, + accepted_answer_post_id INT, + FOREIGN KEY (board_id) REFERENCES boards(id) + )`) + if err != nil { + return fmt.Errorf("error creating threads table: %v", err) + } + + // Create posts table + _, err = db.Exec(` + CREATE TABLE IF NOT EXISTS posts ( + id INT AUTO_INCREMENT PRIMARY KEY, + thread_id INT NOT NULL, + user_id INT NOT NULL, + post_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + edit_time TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + content TEXT, + attachment_hash BIGINT, + attachment_name VARCHAR(255), + title VARCHAR(255), + reply_to INT DEFAULT -1, + FOREIGN KEY (thread_id) REFERENCES threads(id) + )`) + if err != nil { + return fmt.Errorf("error creating posts table: %v", err) + } + + // Create likes table + _, err = db.Exec(` + CREATE TABLE IF NOT EXISTS likes ( + id INT AUTO_INCREMENT PRIMARY KEY, + post_id INT NOT NULL, + user_id INT NOT NULL, + type VARCHAR(20) NOT NULL, + UNIQUE KEY unique_like (post_id, user_id), + FOREIGN KEY (post_id) REFERENCES posts(id) + )`) + if err != nil { + return fmt.Errorf("error creating likes table: %v", err) + } + + // Create board_permissions table + _, err = db.Exec(` + CREATE TABLE IF NOT EXISTS board_permissions ( + user_id INT NOT NULL, + board_id INT NOT NULL, + permissions BIGINT DEFAULT 0, + PRIMARY KEY (user_id, board_id), + FOREIGN KEY (board_id) REFERENCES boards(id) + )`) + if err != nil { + return fmt.Errorf("error creating board_permissions table: %v", err) + } + + // Create notifications table + _, err = db.Exec(` + CREATE TABLE IF NOT EXISTS notifications ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + type VARCHAR(50) NOT NULL, + related_id INT NOT NULL, + is_read BOOLEAN DEFAULT FALSE, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )`) + if err != nil { + return fmt.Errorf("error creating notifications table: %v", err) + } + + // Create reactions table + _, err = db.Exec(` + CREATE TABLE IF NOT EXISTS reactions ( + id INT AUTO_INCREMENT PRIMARY KEY, + post_id INT NOT NULL, + user_id INT NOT NULL, + emoji VARCHAR(10) NOT NULL, + FOREIGN KEY (post_id) REFERENCES posts(id) + )`) + if err != nil { + return fmt.Errorf("error creating reactions table: %v", err) + } + + // Create reposts table + _, err = db.Exec(` + CREATE TABLE IF NOT EXISTS reposts ( + id INT AUTO_INCREMENT PRIMARY KEY, + thread_id INT NOT NULL, + board_id INT NOT NULL, + user_id INT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (thread_id) REFERENCES threads(id), + FOREIGN KEY (board_id) REFERENCES boards(id) + )`) + if err != nil { + return fmt.Errorf("error creating reposts table: %v", err) + } + + log.Println("Database tables created or already exist") + return nil +} + func main() { config, err := loadConfig("config/config.json") if err != nil { @@ -39,6 +185,12 @@ func main() { } defer db.Close() + // Create tables if they don't exist + err = createTablesIfNotExist(db) + if err != nil { + log.Fatal("Error creating database tables:", err) + } + dir, err := os.Getwd() if err != nil { log.Fatal("Error getting working directory:", err)