From 70ddd5e706ae357dd3a0f9343181b887e0a9af3e Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Fri, 29 Dec 2023 14:47:22 +0100 Subject: [PATCH] added more changes to db.go --- {scripts => assets/scripts}/addition.js | 0 {scripts => assets/scripts}/game.js | 0 {scripts => assets/scripts}/mathe.js | 0 db.go | 148 ++++++++++++++++++++++++ db/db.go | 138 ---------------------- go.mod | 1 + go.sum | 2 + 7 files changed, 151 insertions(+), 138 deletions(-) rename {scripts => assets/scripts}/addition.js (100%) rename {scripts => assets/scripts}/game.js (100%) rename {scripts => assets/scripts}/mathe.js (100%) create mode 100644 db.go delete mode 100644 db/db.go diff --git a/scripts/addition.js b/assets/scripts/addition.js similarity index 100% rename from scripts/addition.js rename to assets/scripts/addition.js diff --git a/scripts/game.js b/assets/scripts/game.js similarity index 100% rename from scripts/game.js rename to assets/scripts/game.js diff --git a/scripts/mathe.js b/assets/scripts/mathe.js similarity index 100% rename from scripts/mathe.js rename to assets/scripts/mathe.js diff --git a/db.go b/db.go new file mode 100644 index 0000000..a614f60 --- /dev/null +++ b/db.go @@ -0,0 +1,148 @@ +package main + +import ( + "crypto/sha256" + "database/sql" + "encoding/hex" + "fmt" + "os" + + _ "github.com/go-sql-driver/mysql" + "github.com/joho/godotenv" + "github.com/labstack/echo/v4" +) + +var db *sql.DB + +func init() { + err := godotenv.Load() + if err != nil { + fmt.Println("Error loading .env file") + os.Exit(1) + } + + dbHost := os.Getenv("DB_Host") + dbPort := os.Getenv("DB_Port") + dbName := os.Getenv("DB_Name") + dbCharset := os.Getenv("DB_Charset") + dbUser := os.Getenv("DB_User") + dbPassword := os.Getenv("DB_Password") + + // Connect to the database + db, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", dbUser, dbPassword, dbHost, dbPort, dbName, dbCharset)) + // db, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(db:3306)/%s?charset=utf8mb4", dbUser, dbPassword, dbName)) + + if err != nil { + fmt.Println("Error connecting to the database") + os.Exit(1) + } +} + +// User struct +type User struct { + ID int `json:"id"` + Username string `json:"username"` + Vorname string `json:"vorname"` + Nachname string `json:"nachname"` + Email string `json:"email"` + Password string `json:"password"` + LessonCount int `json:"lesson_count"` + Level int `json:"level"` + XP int `json:"xp"` + Coins int `json:"coins"` + IsAdmin sql.NullBool `json:"is_admin"` +} + +// CRUD operations + +func getUsers(c echo.Context) error { + rows, err := db.Query("SELECT * FROM user") + if err != nil { + return err + } + defer rows.Close() + + users := []User{} + for rows.Next() { + user := User{} + err := rows.Scan(&user.ID, &user.Username, &user.Vorname, &user.Nachname, &user.Email, &user.Password, &user.LessonCount, &user.Level, &user.XP, &user.Coins, &user.IsAdmin) + if err != nil { + return err + } + users = append(users, user) + } + + return c.JSON(200, users) +} + +func getUser(c echo.Context) error { + id := c.Param("id") + + row := db.QueryRow("SELECT * FROM user WHERE id = ?", id) + + user := User{} + err := row.Scan(&user.ID, &user.Username, &user.Vorname, &user.Nachname, &user.Email, &user.Password, &user.LessonCount, &user.Level, &user.XP, &user.Coins, &user.IsAdmin) + if err != nil { + return err + } + + return c.JSON(200, user) +} + +func createUser(c echo.Context) error { + user := new(User) + if err := c.Bind(user); err != nil { + return err + } + + // Hash das Passwort + user.Password = hashPassword(user.Password) + + result, err := db.Exec("INSERT INTO user (username, vorname, nachname, email, password, lesson_count, level, xp, coins, isAdmin) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + user.Username, user.Vorname, user.Nachname, user.Email, user.Password, user.LessonCount, user.Level, user.XP, user.Coins, user.IsAdmin) + if err != nil { + return err + } + + lastInsertID, err := result.LastInsertId() + if err != nil { + return err + } + + user.ID = int(lastInsertID) + + return c.JSON(201, user) +} + +func updateUser(c echo.Context) error { + id := c.Param("id") + + user := new(User) + if err := c.Bind(user); err != nil { + return err + } + + _, err := db.Exec("UPDATE user SET username = ?, vorname = ?, nachname = ?, email = ?, password = ?, lesson_count = ?, level = ?, xp = ?, coins = ?, isAdmin = ? WHERE id = ?", + user.Username, user.Vorname, user.Nachname, user.Email, user.Password, user.LessonCount, user.Level, user.XP, user.Coins, user.IsAdmin, id) + if err != nil { + return err + } + + return c.NoContent(204) +} + +func deleteUser(c echo.Context) error { + id := c.Param("id") + + _, err := db.Exec("DELETE FROM user WHERE id = ?", id) + if err != nil { + return err + } + + return c.NoContent(204) +} + +func hashPassword(password string) string { + hash := sha256.Sum256([]byte(password)) + return hex.EncodeToString(hash[:]) +} diff --git a/db/db.go b/db/db.go deleted file mode 100644 index 9676df8..0000000 --- a/db/db.go +++ /dev/null @@ -1,138 +0,0 @@ -package main - -import ( - "database/sql" - "fmt" - - _ "github.com/go-sql-driver/mysql" -) - -// Connect to MySQL database. -type Database struct { - connection *sql.DB - statement *sql.Stmt -} - -func NewDatabase(config map[string]string, username string, password string) (*Database, error) { - dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", username, password, config["host"], config["port"], config["dbname"]) - db, err := sql.Open("mysql", dsn) - if err != nil { - return nil, err - } - - return &Database{ - connection: db, - }, nil -} - -func (d *Database) Query(query string, params ...interface{}) (*Database, error) { - stmt, err := d.connection.Prepare(query) - if err != nil { - return nil, err - } - - d.statement = stmt - - _, err = stmt.Exec(params...) - if err != nil { - return nil, err - } - - return d, nil -} - -func (d *Database) Find() (map[string]interface{}, error) { - result := make(map[string]interface{}) - err := d.statement.QueryRow().Scan(result) - if err != nil { - return nil, err - } - - return result, nil -} - -func (d *Database) FindOrFail() (map[string]interface{}, error) { - result, err := d.Find() - if err != nil { - return nil, err - } - - if result == nil { - return nil, fmt.Errorf("Record not found") - } - - return result, nil -} - -func (d *Database) Get() ([]map[string]interface{}, error) { - rows, err := d.statement.Query() - if err != nil { - return nil, err - } - defer rows.Close() - - columns, err := rows.Columns() - if err != nil { - return nil, err - } - - result := make([]map[string]interface{}, 0) - values := make([]interface{}, len(columns)) - valuePtrs := make([]interface{}, len(columns)) - for rows.Next() { - for i := 0; i < len(columns); i++ { - valuePtrs[i] = &values[i] - } - - err := rows.Scan(valuePtrs...) - if err != nil { - return nil, err - } - - entry := make(map[string]interface{}) - for i, col := range columns { - val := values[i] - b, ok := val.([]byte) - if ok { - entry[col] = string(b) - } else { - entry[col] = val - } - } - - result = append(result, entry) - } - - return result, nil -} - -func (d *Database) Delete(params string) (*Database, error) { - _, err := d.Query("DELETE FROM user WHERE username = ?", params) - if err != nil { - return nil, err - } - - return d, nil -} - -func (d *Database) Update(params map[string]interface{}) (*Database, error) { - _, err := d.Query("UPDATE user SET level = ?, xp = ?, coins = ? WHERE username = ?", params["level"], params["xp"], params["coins"], params["username"]) - if err != nil { - return nil, err - } - - return d, nil -} - -func (d *Database) GetPlayerStats(params string) (map[string]interface{}, error) { - result, err := d.Query("SELECT username, level, lesson_count, xp, coins FROM user WHERE username = ?", params).Get() - if err != nil { - return nil, err - } - - if len(result) == 0 { - return nil, fmt.Errorf("Record not found") - } - - return result[0], nil -} diff --git a/go.mod b/go.mod index 7c4e19e..0212516 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.21.5 require ( github.com/chasefleming/elem-go v0.17.0 + github.com/joho/godotenv v1.5.1 github.com/labstack/echo/v4 v4.11.4 ) diff --git a/go.sum b/go.sum index 596e254..213e730 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrt github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/labstack/echo/v4 v4.11.4 h1:vDZmA+qNeh1pd/cCkEicDMrjtrnMGQ1QFI9gWN1zGq8= github.com/labstack/echo/v4 v4.11.4/go.mod h1:noh7EvLwqDsmh/X/HWKPUl1AjzJrhyptRyEbQJfxen8= github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=