192 lines
5.2 KiB
Go
192 lines
5.2 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"OpsMastery.v5/internal/database"
|
|
"OpsMastery.v5/internal/models"
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
func ListUsers(c *fiber.Ctx) error {
|
|
var users []models.User
|
|
if err := database.DB().Unscoped().Find(&users).Error; err != nil {
|
|
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
|
|
}
|
|
return c.JSON(users)
|
|
}
|
|
|
|
func GetUserByID(c *fiber.Ctx) error {
|
|
id := c.Params("id")
|
|
|
|
var user models.User
|
|
if err := database.DB().First(&user, id).Error; err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
|
|
}
|
|
return c.JSON(user)
|
|
}
|
|
|
|
func DeleteUserByID(c *fiber.Ctx) error {
|
|
id := c.Params("id")
|
|
|
|
userIDParsed, err := strconv.ParseUint(id, 10, 32)
|
|
if err != nil {
|
|
return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "Invalid user ID"})
|
|
}
|
|
|
|
result := database.DB().Unscoped().Delete(&models.User{}, userIDParsed)
|
|
if result.RowsAffected == 0 {
|
|
return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
|
|
}
|
|
if result.Error != nil {
|
|
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": result.Error.Error()})
|
|
}
|
|
return c.Status(http.StatusOK).JSON(fiber.Map{"message": "User deleted successfully"})
|
|
}
|
|
|
|
func UpdateUserByID(c *fiber.Ctx) error {
|
|
id := c.Params("id")
|
|
|
|
var user models.User
|
|
if err := database.DB().First(&user, id).Error; err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
|
|
}
|
|
|
|
var input models.User
|
|
if err := c.BodyParser(&input); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid input"})
|
|
}
|
|
|
|
// Only update fields if present in input
|
|
if input.Name != "" {
|
|
user.Name = input.Name
|
|
}
|
|
if input.Username != "" {
|
|
user.Username = input.Username
|
|
}
|
|
if input.Address != "" {
|
|
user.Address = input.Address
|
|
}
|
|
if input.PhoneNumber != "" {
|
|
user.PhoneNumber = input.PhoneNumber
|
|
}
|
|
if input.Role != "" {
|
|
user.Role = input.Role
|
|
}
|
|
if input.Email != "" {
|
|
user.Email = input.Email
|
|
}
|
|
if input.Password != "" {
|
|
user.Password = input.Password // Consider hashing here!
|
|
}
|
|
// ...handle other fields as needed...
|
|
|
|
if err := database.DB().Save(&user).Error; err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Could not update user"})
|
|
}
|
|
|
|
return c.JSON(user)
|
|
}
|
|
|
|
func SetUserRole(c *fiber.Ctx) error {
|
|
id := c.Params("id")
|
|
var user models.User
|
|
|
|
if err := database.DB().First(&user, id).Error; err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
|
|
}
|
|
|
|
var input struct {
|
|
Role string `json:"role"`
|
|
}
|
|
if err := c.BodyParser(&input); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid input"})
|
|
}
|
|
|
|
user.Role = input.Role
|
|
if err := database.DB().Save(&user).Error; err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Could not update user role"})
|
|
}
|
|
return c.JSON(user)
|
|
}
|
|
|
|
func GetCurrentUser(c *fiber.Ctx) error {
|
|
userID, ok := c.Locals("userID").(uint)
|
|
|
|
if !ok {
|
|
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "User ID not found"})
|
|
}
|
|
|
|
var user models.User
|
|
if err := database.DB().First(&user, userID).Error; err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
|
|
}
|
|
return c.JSON(user)
|
|
}
|
|
|
|
func UpdateCurrentUser(c *fiber.Ctx) error {
|
|
userID, ok := c.Locals("userID").(uint)
|
|
if !ok {
|
|
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "User ID not found"})
|
|
}
|
|
|
|
var user models.User
|
|
if err := database.DB().First(&user, userID).Error; err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
|
|
}
|
|
|
|
// Parse form fields using Fiber's API
|
|
name := c.FormValue("name")
|
|
email := c.FormValue("email")
|
|
// Handle file upload (if needed)
|
|
fileHeader, err := c.FormFile("avatar")
|
|
if err == nil {
|
|
// Process the uploaded file
|
|
file, err := fileHeader.Open()
|
|
if err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Failed to open uploaded file"})
|
|
}
|
|
defer file.Close()
|
|
// ...handle file...
|
|
}
|
|
|
|
// Update user fields
|
|
user.Name = name
|
|
user.Email = email
|
|
|
|
if err := database.DB().Save(&user).Error; err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Could not update user"})
|
|
}
|
|
return c.JSON(user)
|
|
}
|
|
|
|
func GetUserProfilePhoto(c *fiber.Ctx) error {
|
|
id := c.Params("id")
|
|
var user models.User
|
|
if err := database.DB().First(&user, id).Error; err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
|
|
}
|
|
if len(user.ProfilePhoto) == 0 {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Profile photo not found"})
|
|
}
|
|
// You may want to detect the image type; here we default to jpeg
|
|
c.Set("Content-Type", "image/jpeg")
|
|
return c.Send(user.ProfilePhoto)
|
|
}
|
|
|
|
func SearchUsers(c *fiber.Ctx) error {
|
|
q := c.Query("q")
|
|
if q == "" {
|
|
return c.JSON([]models.User{})
|
|
}
|
|
normalized := strings.ToLower(q)
|
|
var users []models.User
|
|
database.DB().Debug().Where(
|
|
"LOWER(username) LIKE ? OR LOWER(email) LIKE ? OR LOWER(name) LIKE ?",
|
|
"%"+normalized+"%", "%"+normalized+"%", "%"+normalized+"%",
|
|
).Find(&users)
|
|
return c.JSON(users)
|
|
}
|