// Package httputil provides HTTP utility functions for the KnowFoolery application. package httputil import ( "github.com/gofiber/fiber/v3" ) // Response represents a standard API response. type Response struct { Success bool `json:"success"` Data interface{} `json:"data,omitempty"` Meta *Meta `json:"meta,omitempty"` } // Meta contains response metadata. type Meta struct { Page int `json:"page,omitempty"` PageSize int `json:"page_size,omitempty"` TotalCount int64 `json:"total_count,omitempty"` TotalPages int `json:"total_pages,omitempty"` } // NewResponse creates a new Response. func NewResponse(data interface{}) Response { return Response{ Success: true, Data: data, } } // NewPaginatedResponse creates a new paginated Response. func NewPaginatedResponse(data interface{}, page, pageSize int, totalCount int64) Response { totalPages := int(totalCount) / pageSize if int(totalCount)%pageSize > 0 { totalPages++ } return Response{ Success: true, Data: data, Meta: &Meta{ Page: page, PageSize: pageSize, TotalCount: totalCount, TotalPages: totalPages, }, } } // OK sends a 200 OK response with data. func OK(c fiber.Ctx, data interface{}) error { return c.Status(fiber.StatusOK).JSON(NewResponse(data)) } // Created sends a 201 Created response with data. func Created(c fiber.Ctx, data interface{}) error { return c.Status(fiber.StatusCreated).JSON(NewResponse(data)) } // NoContent sends a 204 No Content response. func NoContent(c fiber.Ctx) error { return c.SendStatus(fiber.StatusNoContent) } // Paginated sends a paginated response. func Paginated(c fiber.Ctx, data interface{}, page, pageSize int, totalCount int64) error { return c.Status(fiber.StatusOK).JSON(NewPaginatedResponse(data, page, pageSize, totalCount)) } // MessageResponse represents a simple message response. type MessageResponse struct { Success bool `json:"success"` Message string `json:"message"` } // Message sends a simple message response. func Message(c fiber.Ctx, message string) error { return c.Status(fiber.StatusOK).JSON(MessageResponse{ Success: true, Message: message, }) } // HealthResponse represents a health check response. type HealthResponse struct { Status string `json:"status"` Service string `json:"service"` Version string `json:"version"` Checks map[string]string `json:"checks,omitempty"` } // Health sends a health check response. func Health(c fiber.Ctx, service, version string, checks map[string]string) error { status := "healthy" for _, check := range checks { if check != "ok" { status = "unhealthy" break } } return c.Status(fiber.StatusOK).JSON(HealthResponse{ Status: status, Service: service, Version: version, Checks: checks, }) }