ADD: added new user data model and updated the administration site

This commit is contained in:
hwinkel
2025-11-20 23:15:21 +01:00
parent 3818fbf460
commit 846a922a41
12 changed files with 766 additions and 123 deletions

View File

@@ -32,6 +32,7 @@ func GetPlayers(c *gin.Context, db *sql.DB) {
}
func CreatePlayer(c *gin.Context, db *sql.DB) {
log.Println("CreatePlayer called")
var newPlayer User
var err error
if err := c.ShouldBindJSON(&newPlayer); err != nil {
@@ -149,5 +150,6 @@ func DeletePlayer(c *gin.Context, db *sql.DB) {
log.Printf("User %s (%s) deleted player with ID: %s", c.GetString("userId"), c.GetString("email"), playerID)
common.RespondMessage(c, "Player deleted successfully")
c.JSON(http.StatusOK, gin.H{"message": "Player deleted successfully"})
// common.RespondSuccess(c, "Player deleted successfully")
}

View File

@@ -7,23 +7,24 @@ import (
"time"
"github.com/google/uuid"
"github.com/lib/pq"
)
type User struct {
UUID string `db:"uuid" sql:"VARCHAR(255)" index:"true"`
Username string `db:"username" sql:"VARCHAR(100)"`
Email string `db:"email" sql:"VARCHAR(255)" index:"true"`
lastname string `db:"lastname" sql:"VARCHAR(100)"`
fistname string `db:"fistname" sql:"VARCHAR(100)"`
password string `db:"password_hash" sql:"VARCHAR(255)"`
phone string `db:"phone" sql:"VARCHAR(20)"`
avatarURL string `db:"avatar_url" sql:"VARCHAR(255)"`
IsActive bool `db:"is_active" sql:"BOOLEAN"`
birthday time.Time `db:"birthday" sql:"DATE"`
createdAt time.Time `db:"created_at" sql:"TIMESTAMP"`
updatedAt time.Time `db:"updated_at" sql:"TIMESTAMP"`
LastLogin time.Time `db:"last_login" sql:"TIMESTAMP"`
Role []string `ignore:"true"` // wird NICHT in der DB angelegt
UUID string `db:"uuid" sql:"VARCHAR(255)" index:"true"`
Username string `db:"username" sql:"VARCHAR(100)"`
Email string `db:"email" sql:"VARCHAR(255)" index:"true"`
lastname sql.NullString `db:"lastname" sql:"VARCHAR(100)"`
firstname sql.NullString `db:"firstname" sql:"VARCHAR(100)"`
password string `db:"password_hash" sql:"VARCHAR(255)"`
phone sql.NullString `db:"phone" sql:"VARCHAR(20)"`
avatarURL sql.NullString `db:"avatar_url" sql:"VARCHAR(255)"`
IsActive sql.NullBool `db:"is_active" sql:"BOOLEAN"`
birthday *time.Time `db:"birthday" sql:"DATE"`
createdAt *time.Time `db:"created_at" sql:"TIMESTAMP"`
updatedAt *time.Time `db:"updated_at" sql:"TIMESTAMP"`
LastLogin *time.Time `db:"last_login" sql:"TIMESTAMP"`
Role []string `ignore:"true"` // wird NICHT in der DB angelegt
}
@@ -173,7 +174,7 @@ func savePlayer(db *sql.DB, player User) error {
log.Printf("Saving player: ID=%v, Name=%v, Email=%v", player.UUID, player.Username, player.Email)
stmt := "INSERT INTO public.users (id, name, email,password_hash) VALUES ($1, $2, $3,$4)"
stmt := "INSERT INTO public.users (UUID, username, email,password_hash) VALUES ($1, $2, $3,$4)"
log.Printf("Generated SQL statement: %s", stmt)
_, err := db.Exec(stmt, player.UUID, player.Username, player.Email, player.password)
@@ -203,7 +204,7 @@ func AddRoleToPlayer(db *sql.DB, playerID string, role []string) error {
log.Printf("Adding role '%s' to player with ID: %s", role, playerID)
stmt := "INSERT INTO public.roles (player_id, role) VALUES ($1, $2)"
_, err := db.Exec(stmt, playerID, role)
_, err := db.Exec(stmt, playerID, pq.Array(role))
if err != nil {
log.Printf("Error adding role to player with ID %s: %v", playerID, err)
return err
@@ -214,7 +215,11 @@ func AddRoleToPlayer(db *sql.DB, playerID string, role []string) error {
}
func GetAllPlayers(db *sql.DB) ([]User, error) {
rows, err := db.Query("SELECT id, name, email FROM public.users")
// rows, err := db.Query("SELECT id, name, email FROM public.users")
// rows, err := db.Query("SELECT u.uuid, u.email, u.username, u.firstname,u.lastname,u.birthday, u.is_active, u.created_at, ur.roleFROM public.users u
// LEFT JOIN roles ur ON u.uuid::uuid = ur.player_id ORDER BY u.uuid ASC")
rows, err := db.Query(getPLayerWithRolesQuery)
if err != nil {
log.Printf("Error retrieving users: %v", err)
return nil, err
@@ -224,7 +229,16 @@ func GetAllPlayers(db *sql.DB) ([]User, error) {
var users []User
for rows.Next() {
var player User
if err := rows.Scan(&player.UUID, &player.Username, &player.Email); err != nil {
if err := rows.Scan(&player.UUID,
&player.Email,
&player.Username,
&player.firstname,
&player.lastname,
&player.birthday,
&player.IsActive,
&player.createdAt,
(*pq.StringArray)(&player.Role),
); err != nil {
log.Printf("Error scanning player row: %v", err)
return nil, err
}
@@ -268,15 +282,15 @@ func GetPlayerByName(db *sql.DB, name string) (User, error) {
}
// DeletePlayer deletes a player from the database by ID.
func deletePlayer(db *sql.DB, id string) error {
func deletePlayer(db *sql.DB, uuid string) error {
// Delete the player from the database
log.Printf("Deleting player with ID: %s", id)
_, err := db.Exec("DELETE FROM public.users WHERE id = $1", id)
log.Printf("Deleting player with ID: %s", uuid)
_, err := db.Exec("DELETE FROM public.users WHERE uuid = $1", uuid)
if err != nil {
log.Printf("Error deleting player with ID %s: %v", id, err)
log.Printf("Error deleting player with ID %s: %v", uuid, err)
return err
}
log.Printf("User with ID %s deleted successfully", id)
log.Printf("User with ID %s deleted successfully", uuid)
return nil
}

View File

@@ -0,0 +1,19 @@
package player
const getPLayerWithRolesQuery = `
SELECT
u.uuid,
u.email,
u.username,
u.firstname,
u.lastname,
u.birthday,
u.is_active,
u.created_at,
ur.role
FROM public.users u
LEFT JOIN roles ur ON u.uuid = ur.player_id::uuid
`
// GROUP BY u.uuid
// ORDER BY u.uuid ASC;