148 lines
3.6 KiB
Go
148 lines
3.6 KiB
Go
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[:])
|
|
}
|