Files
Tomas Dvorak d27cf14110 first test
2026-02-08 14:14:55 +01:00

185 lines
4.0 KiB
Go

package utils
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
)
// APIResponse represents a standard API response
type APIResponse struct {
Success bool `json:"success"`
Data interface{} `json:"data,omitempty"`
Message string `json:"message"`
Error string `json:"error,omitempty"`
Timestamp time.Time `json:"timestamp"`
RequestID string `json:"request_id,omitempty"`
}
// PaginatedResponse represents a paginated API response
type PaginatedResponse struct {
APIResponse
Pagination PaginationInfo `json:"pagination"`
}
// PaginationInfo contains pagination metadata
type PaginationInfo struct {
Page int `json:"page"`
PerPage int `json:"per_page"`
Total int64 `json:"total"`
TotalPages int `json:"total_pages"`
HasNext bool `json:"has_next"`
HasPrev bool `json:"has_prev"`
}
// Success sends a successful response
func Success(c *gin.Context, data interface{}, message ...string) {
msg := "Operation successful"
if len(message) > 0 {
msg = message[0]
}
response := APIResponse{
Success: true,
Data: data,
Message: msg,
Timestamp: time.Now(),
RequestID: c.GetString("RequestID"),
}
c.JSON(http.StatusOK, response)
}
// Error sends an error response
func Error(c *gin.Context, statusCode int, err error, message ...string) {
msg := "An error occurred"
if len(message) > 0 {
msg = message[0]
}
response := APIResponse{
Success: false,
Message: msg,
Error: err.Error(),
Timestamp: time.Now(),
RequestID: c.GetString("RequestID"),
}
c.JSON(statusCode, response)
}
// ValidationError sends a validation error response
func ValidationError(c *gin.Context, errors interface{}) {
response := APIResponse{
Success: false,
Message: "Validation failed",
Error: "Invalid input data",
Data: errors,
Timestamp: time.Now(),
RequestID: c.GetString("RequestID"),
}
c.JSON(http.StatusBadRequest, response)
}
// Paginated sends a paginated response
func Paginated(c *gin.Context, data interface{}, pagination PaginationInfo, message ...string) {
msg := "Data retrieved successfully"
if len(message) > 0 {
msg = message[0]
}
response := PaginatedResponse{
APIResponse: APIResponse{
Success: true,
Data: data,
Message: msg,
Timestamp: time.Now(),
RequestID: c.GetString("RequestID"),
},
Pagination: pagination,
}
c.JSON(http.StatusOK, response)
}
// CalculatePagination calculates pagination information
func CalculatePagination(page, perPage int, total int64) PaginationInfo {
if page < 1 {
page = 1
}
if perPage < 1 {
perPage = 10
}
if perPage > 100 {
perPage = 100
}
totalPages := int((total + int64(perPage) - 1) / int64(perPage))
hasNext := page < totalPages
hasPrev := page > 1
return PaginationInfo{
Page: page,
PerPage: perPage,
Total: total,
TotalPages: totalPages,
HasNext: hasNext,
HasPrev: hasPrev,
}
}
// Created sends a created response
func Created(c *gin.Context, data interface{}, message ...string) {
msg := "Resource created successfully"
if len(message) > 0 {
msg = message[0]
}
response := APIResponse{
Success: true,
Data: data,
Message: msg,
Timestamp: time.Now(),
RequestID: c.GetString("RequestID"),
}
c.JSON(http.StatusCreated, response)
}
// Updated sends an updated response
func Updated(c *gin.Context, data interface{}, message ...string) {
msg := "Resource updated successfully"
if len(message) > 0 {
msg = message[0]
}
response := APIResponse{
Success: true,
Data: data,
Message: msg,
Timestamp: time.Now(),
RequestID: c.GetString("RequestID"),
}
c.JSON(http.StatusOK, response)
}
// Deleted sends a deleted response
func Deleted(c *gin.Context, message ...string) {
msg := "Resource deleted successfully"
if len(message) > 0 {
msg = message[0]
}
response := APIResponse{
Success: true,
Message: msg,
Timestamp: time.Now(),
RequestID: c.GetString("RequestID"),
}
c.JSON(http.StatusOK, response)
}