I am batman
This commit is contained in:
191
internal/handlers/userHandler.go
Normal file
191
internal/handlers/userHandler.go
Normal file
@@ -0,0 +1,191 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user