From b0c28428022ba190e9ebfa5d48e9b14ed54557d3 Mon Sep 17 00:00:00 2001 From: SnippetsX Date: Wed, 4 Dec 2024 01:26:59 +0300 Subject: [PATCH] Implement database connection and refactor welcome handler --- cmd/admin_backend/main.go | 7 ++-- config.json | 2 +- go.mod | 5 +++ go.sum | 6 ++++ pkg/db/db_connection.go | 51 +++++++++++++++++++++++++++ pkg/db/db_login.go | 48 +++++++++++++++++++++++++ pkg/handlers/login/login.go | 44 +++++++++++++++++++++++ pkg/handlers/{ => welcome}/welcome.go | 2 +- 8 files changed, 161 insertions(+), 4 deletions(-) create mode 100644 go.sum create mode 100644 pkg/db/db_connection.go create mode 100644 pkg/db/db_login.go create mode 100644 pkg/handlers/login/login.go rename pkg/handlers/{ => welcome}/welcome.go (96%) diff --git a/cmd/admin_backend/main.go b/cmd/admin_backend/main.go index 2942fed..282bc45 100644 --- a/cmd/admin_backend/main.go +++ b/cmd/admin_backend/main.go @@ -1,7 +1,8 @@ package main import ( - "admin_dashboard_backend/pkg/handlers" + "admin_dashboard_backend/pkg/db" + "admin_dashboard_backend/pkg/handlers/welcome" "encoding/json" "fmt" "log" @@ -27,8 +28,10 @@ func main() { port = "84" // default port } + // Initialize database connection + db.InitDB() // Define routes - http.HandleFunc("/welcome", handlers.HandlersWelcome) + http.HandleFunc("/welcome", welcome.HandlersWelcome) // Start server fmt.Printf("Server is running on port %s...\n", port) diff --git a/config.json b/config.json index 9908aad..6523616 100644 --- a/config.json +++ b/config.json @@ -4,7 +4,7 @@ "databaseUser": "root", "databasePassword": "1234", "database": "app", - "databasePort": 3306, + "databasePort": "3306", "developerMode": true, "developerLogin": true, "forceDevLogin": true, diff --git a/go.mod b/go.mod index f96821c..13e3029 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,8 @@ module admin_dashboard_backend go 1.23.4 + +require ( + filippo.io/edwards25519 v1.1.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2853cf2 --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= diff --git a/pkg/db/db_connection.go b/pkg/db/db_connection.go new file mode 100644 index 0000000..cf1e11e --- /dev/null +++ b/pkg/db/db_connection.go @@ -0,0 +1,51 @@ +package db + +import ( + "database/sql" + "encoding/json" + "log" + "os" + + _ "github.com/go-sql-driver/mysql" +) + +type Config struct { + Host string `json:"databaseHost"` + Port string `json:"databasePort"` + User string `json:"databaseUser"` + Password string `json:"databasePassword"` + DBName string `json:"database"` +} + +var DB *sql.DB + +func InitDB() { + config := loadConfig() + dsn := config.User + ":" + config.Password + "@tcp(" + config.Host + ":" + config.Port + ")/" + config.DBName + + var err error + DB, err = sql.Open("mysql", dsn) + if err != nil { + log.Fatal("Error connecting to database:", err) + } + + err = DB.Ping() + if err != nil { + log.Fatal("Error pinging database:", err) + } +} + +func loadConfig() Config { + file, err := os.ReadFile("config.json") + if err != nil { + log.Fatal("Error reading config file:", err) + } + + var config Config + err = json.Unmarshal(file, &config) + if err != nil { + log.Fatal("Error parsing config file:", err) + } + + return config +} diff --git a/pkg/db/db_login.go b/pkg/db/db_login.go new file mode 100644 index 0000000..a6678e4 --- /dev/null +++ b/pkg/db/db_login.go @@ -0,0 +1,48 @@ +package db + +import ( + "database/sql" + "log" + + _ "github.com/go-sql-driver/mysql" +) + +var db *sql.DB + +func Init() { + var err error + db, err = sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname") + if err != nil { + log.Fatal(err) + } + + if err = db.Ping(); err != nil { + log.Fatal(err) + } +} + +func Login(username, password string) (bool, error) { + var dbPassword string + query := "SELECT password FROM users WHERE username = ?" + err := db.QueryRow(query, username).Scan(&dbPassword) + if err != nil { + if err == sql.ErrNoRows { + return false, nil + } + return false, err + } + + if dbPassword != password { + return false, nil + } + + return true, nil + var token string + query = "SELECT token FROM users WHERE username = ?" + err = db.QueryRow(query, username).Scan(&token) + if err != nil { + return false, err + } + + return true, token +} diff --git a/pkg/handlers/login/login.go b/pkg/handlers/login/login.go new file mode 100644 index 0000000..1387d4b --- /dev/null +++ b/pkg/handlers/login/login.go @@ -0,0 +1,44 @@ +package login + +import ( + "admin_dashboard_backend/pkg/db" + "encoding/json" + "log" + "net/http" +) + +type Request struct { + Username string `json:"username"` + Password string `json:"password"` +} + +type Response struct { + Token string `json:"token"` +} + +func HandlersLogin(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + var request Request + if err := json.NewDecoder(r.Body).Decode(&request); err != nil { + http.Error(w, "Bad request", http.StatusBadRequest) + return + } + + token, err := db.Login(request.Username, request.Password) + if err != nil { + log.Println("Error logging in:", err) + http.Error(w, "Internal server error", http.StatusInternalServerError) + return + } + + response := Response{ + Token: token, + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(response) +} diff --git a/pkg/handlers/welcome.go b/pkg/handlers/welcome/welcome.go similarity index 96% rename from pkg/handlers/welcome.go rename to pkg/handlers/welcome/welcome.go index 685b936..d7f745d 100644 --- a/pkg/handlers/welcome.go +++ b/pkg/handlers/welcome/welcome.go @@ -1,4 +1,4 @@ -package handlers +package welcome import ( "encoding/json"