Files
pedestrian-simulator/server/db.go
Steven Polley 512b36b10e
All checks were successful
pedestrian-simulator / build (push) Successful in 58s
use antigravity to rewrite all your code to migrate from flat files to relational database. YOLO
2026-01-11 20:24:50 -07:00

108 lines
2.8 KiB
Go

package main
import (
"database/sql"
"fmt"
"log"
"os"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
func InitDB() {
host := os.Getenv("DB_HOST")
port := os.Getenv("DB_PORT")
name := os.Getenv("DB_DATABASENAME")
user := os.Getenv("DB_USERNAME")
pass := os.Getenv("DB_PASSWORD")
if host == "" {
log.Println("DB_HOST not set, skipping database initialization")
return
}
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", user, pass, host, port, name)
var err error
db, err = sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("Error opening database: %v", err)
}
if err := db.Ping(); err != nil {
log.Fatalf("Error connecting to database: %v", err)
}
log.Println("Connected to MariaDB successfully")
createTables()
}
func createTables() {
queries := []string{
`CREATE TABLE IF NOT EXISTS users (
fitbit_user_id VARCHAR(255) PRIMARY KEY,
display_name VARCHAR(255),
avatar_url TEXT,
created_at DATETIME
)`,
`CREATE TABLE IF NOT EXISTS sessions (
token VARCHAR(255) PRIMARY KEY,
fitbit_user_id VARCHAR(255),
created_at DATETIME,
expires_at DATETIME,
FOREIGN KEY (fitbit_user_id) REFERENCES users(fitbit_user_id) ON DELETE CASCADE
)`,
`CREATE TABLE IF NOT EXISTS fitbit_tokens (
user_id VARCHAR(255) PRIMARY KEY,
access_token TEXT,
refresh_token TEXT,
expires_at DATETIME,
FOREIGN KEY (user_id) REFERENCES users(fitbit_user_id) ON DELETE CASCADE
)`,
`CREATE TABLE IF NOT EXISTS kml_metadata (
id INT AUTO_INCREMENT PRIMARY KEY,
filename VARCHAR(255),
user_id VARCHAR(255),
distance DOUBLE,
is_public BOOLEAN DEFAULT FALSE,
uploaded_at DATETIME,
UNIQUE KEY (user_id, filename),
FOREIGN KEY (user_id) REFERENCES users(fitbit_user_id) ON DELETE CASCADE
)`,
`CREATE TABLE IF NOT EXISTS kml_votes (
kml_id INT,
user_id VARCHAR(255),
vote_value INT,
PRIMARY KEY (kml_id, user_id),
FOREIGN KEY (kml_id) REFERENCES kml_metadata(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(fitbit_user_id) ON DELETE CASCADE
)`,
`CREATE TABLE IF NOT EXISTS trips (
user_id VARCHAR(255) PRIMARY KEY,
start_date VARCHAR(10),
start_time DATETIME,
start_day_initial_steps INT,
previous_total_steps INT,
target_total_steps INT,
last_sync_time DATETIME,
next_sync_time DATETIME,
FOREIGN KEY (user_id) REFERENCES users(fitbit_user_id) ON DELETE CASCADE
)`,
`CREATE TABLE IF NOT EXISTS daily_steps (
user_id VARCHAR(255),
date VARCHAR(10),
steps INT,
PRIMARY KEY (user_id, date),
FOREIGN KEY (user_id) REFERENCES users(fitbit_user_id) ON DELETE CASCADE
)`,
}
for _, query := range queries {
if _, err := db.Exec(query); err != nil {
log.Fatalf("Error creating table: %v\nQuery: %s", err, query)
}
}
log.Println("Database tables initialized")
}