package handlers import ( "net/http" "time" "github.com/gin-gonic/gin" "admintemplate/internal/auth" "admintemplate/internal/database" "admintemplate/internal/models" ) type UserHandler struct { db *database.DB } func NewUserHandler(db *database.DB) *UserHandler { return &UserHandler{db: db} } func (h *UserHandler) ListUsers(c *gin.Context) { query := "SELECT id, username, email, role, active, created_at, updated_at FROM users ORDER BY id" rows, err := h.db.Query(query) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch users"}) return } defer rows.Close() var users []models.User for rows.Next() { var user models.User err := rows.Scan( &user.ID, &user.Username, &user.Email, &user.Role, &user.Active, &user.CreatedAt, &user.UpdatedAt, ) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to scan user"}) return } users = append(users, user) } c.JSON(http.StatusOK, users) } func (h *UserHandler) GetUser(c *gin.Context) { id := c.Param("id") var user models.User query := "SELECT id, username, email, role, active, created_at, updated_at FROM users WHERE id = ?" err := h.db.QueryRow(query, id).Scan( &user.ID, &user.Username, &user.Email, &user.Role, &user.Active, &user.CreatedAt, &user.UpdatedAt, ) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) return } c.JSON(http.StatusOK, user) } type CreateUserRequest struct { Username string `json:"username" binding:"required"` Password string `json:"password" binding:"required"` Email string `json:"email" binding:"required,email"` Role string `json:"role" binding:"required"` } func (h *UserHandler) CreateUser(c *gin.Context) { var req CreateUserRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } hashedPassword, err := auth.HashPassword(req.Password) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to hash password"}) return } now := time.Now() query := `INSERT INTO users (username, password, email, role, active, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)` result, err := h.db.Exec(query, req.Username, hashedPassword, req.Email, req.Role, true, now, now) if err != nil { c.JSON(http.StatusConflict, gin.H{"error": "Username or email already exists"}) return } id, _ := result.LastInsertId() c.JSON(http.StatusCreated, gin.H{"id": id, "message": "User created successfully"}) } type UpdateUserRequest struct { Email string `json:"email"` Role string `json:"role"` Active *bool `json:"active"` } func (h *UserHandler) UpdateUser(c *gin.Context) { id := c.Param("id") var req UpdateUserRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } query := "UPDATE users SET email = ?, role = ?, active = ?, updated_at = ? WHERE id = ?" _, err := h.db.Exec(query, req.Email, req.Role, req.Active, time.Now(), id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update user"}) return } c.JSON(http.StatusOK, gin.H{"message": "User updated successfully"}) } func (h *UserHandler) DeleteUser(c *gin.Context) { id := c.Param("id") query := "DELETE FROM users WHERE id = ?" _, err := h.db.Exec(query, id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete user"}) return } c.JSON(http.StatusOK, gin.H{"message": "User deleted successfully"}) }