Refactor signup and login handlers, add auto table creation
parent
33293d9e3d
commit
05734d6854
|
@ -1,6 +1,7 @@
|
||||||
package handlers
|
package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"threadr/models"
|
"threadr/models"
|
||||||
|
@ -14,7 +15,7 @@ func LoginHandler(app *App) http.HandlerFunc {
|
||||||
username := r.FormValue("username")
|
username := r.FormValue("username")
|
||||||
password := r.FormValue("password")
|
password := r.FormValue("password")
|
||||||
user, err := models.GetUserByUsername(app.DB, username)
|
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)
|
log.Printf("Error fetching user in LoginHandler: %v", err)
|
||||||
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
|
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
|
|
|
@ -29,7 +29,7 @@ func SignupHandler(app *App) http.HandlerFunc {
|
||||||
StaticPath: app.Config.ThreadrDir + "/static",
|
StaticPath: app.Config.ThreadrDir + "/static",
|
||||||
CurrentURL: r.URL.Path,
|
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 {
|
if err := app.Tmpl.ExecuteTemplate(w, "signup", data); err != nil {
|
||||||
log.Printf("Error executing template in SignupHandler: %v", err)
|
log.Printf("Error executing template in SignupHandler: %v", err)
|
||||||
|
|
152
main.go
152
main.go
|
@ -26,6 +26,152 @@ func loadConfig(filename string) (*handlers.Config, error) {
|
||||||
return &config, err
|
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() {
|
func main() {
|
||||||
config, err := loadConfig("config/config.json")
|
config, err := loadConfig("config/config.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -39,6 +185,12 @@ func main() {
|
||||||
}
|
}
|
||||||
defer db.Close()
|
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()
|
dir, err := os.Getwd()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Error getting working directory:", err)
|
log.Fatal("Error getting working directory:", err)
|
||||||
|
|
Loading…
Reference in New Issue