added more changes to db.go

This commit is contained in:
Patryk Hegenberg 2023-12-29 14:47:22 +01:00
parent e0dca3bbd8
commit 70ddd5e706
7 changed files with 151 additions and 138 deletions

148
db.go Normal file
View file

@ -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[:])
}

138
db/db.go
View file

@ -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
}

1
go.mod
View file

@ -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
)

2
go.sum
View file

@ -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=