From fd24695764e8b4aae41f6d7517ef654a2869a0cd Mon Sep 17 00:00:00 2001 From: Tamas Gal Date: Thu, 16 Oct 2025 23:48:53 +0200 Subject: [PATCH] Setup database and Data directory --- backend/db.go | 38 ++++++++++++++++++++++++++++++++------ backend/main.go | 15 ++++++++++++++- backend/setup_data_dir.go | 24 ++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 backend/setup_data_dir.go diff --git a/backend/db.go b/backend/db.go index 99e8b3e..0bc912a 100644 --- a/backend/db.go +++ b/backend/db.go @@ -2,22 +2,48 @@ package main import ( "database/sql" + "fmt" "log" + "log/slog" + "os" + "path/filepath" "strings" _ "modernc.org/sqlite" ) +// Create new sqlite database +// If filepath parameter is empty +func NewDatabaseConnection(dataDir string, dbName string) (*sql.DB, error) { + var dbFilePath string + + if dbName == "" { + dbFilePath = filepath.Join(dataDir, "app.db") + } else { + dbFilePath = filepath.Join(dataDir, filepath.Base(dbName)) + } + + db, err := sql.Open("sqlite", dbFilePath) + if err != nil { + return nil, fmt.Errorf("database open error: %w", err) + } + + if err := db.Ping(); err != nil { + return nil, fmt.Errorf("database connection error: %w", err) + } + + return db, nil +} + // database // // Manage database connection to ./app.db // Handles CRUD -func database() *sql.DB { - db, err := sql.Open("sqlite", "./app.db") - if err != nil { - log.Fatal(err) +func database(db *sql.DB) *sql.DB { + if db == nil { + slog.Error("No connection to the database!") + os.Exit(1) } - // Seed default menu items if empty row := db.QueryRow("SELECT COUNT(*) FROM menu_items") var count int @@ -65,7 +91,7 @@ func database() *sql.DB { } // Create users table - _, err = db.Exec(` + _, err := db.Exec(` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, diff --git a/backend/main.go b/backend/main.go index 91fa9a4..2600b26 100644 --- a/backend/main.go +++ b/backend/main.go @@ -36,7 +36,20 @@ func main() { os.Exit(1) } - db := database() + // Setup data directory + dataDir, err := setupDataDir() + if err != nil { + slog.Error("Cannot set data directory: %s; %w", os.Getenv("DATA_DIR"), err) + os.Exit(1) + } + + // Setup database connection + dbConnection, err := NewDatabaseConnection(dataDir, "app.db") + if err != nil { + slog.Error("Databse error", "error", err) + os.Exit(1) + } + db := database(dbConnection) defer db.Close() // Create App diff --git a/backend/setup_data_dir.go b/backend/setup_data_dir.go new file mode 100644 index 0000000..f947a24 --- /dev/null +++ b/backend/setup_data_dir.go @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" +) + +func setupDataDir() (string, error) { + var dataDir string + if os.Getenv("DATA_DIR") == "" { + dataDir = filepath.Join(".", "data") + } else { + dataDir = filepath.Join(".", os.Getenv("DATA_DIR")) + } + + if _, err := os.Stat(dataDir); os.IsNotExist(err) { + err := os.Mkdir(dataDir, 0o755) + if err != nil { + return "", fmt.Errorf("cannot create '%s' directory: %w", dataDir, err) + } + } + return dataDir, nil +}