package handlers import ( "strconv" "strings" "github.com/gin-gonic/gin" ) // isDuplicateErr checks if a database error indicates a unique constraint violation. func isDuplicateErr(err error) bool { if err == nil { return false } msg := err.Error() return strings.Contains(msg, "UNIQUE constraint failed") || strings.Contains(msg, "duplicate key value violates unique constraint") } // getUserID extracts the authenticated user ID from the gin context. // Set by the Auth middleware. func getUserID(c *gin.Context) string { return c.GetString("user_id") } // parsePagination extracts page, perPage, and offset from query params. // Defaults: page=1, per_page=50, max per_page=200. func parsePagination(c *gin.Context) (page, perPage, offset int) { page, _ = strconv.Atoi(c.DefaultQuery("page", "1")) if page < 1 { page = 1 } perPage, _ = strconv.Atoi(c.DefaultQuery("per_page", "50")) if perPage < 1 { perPage = 50 } if perPage > 200 { perPage = 200 } offset = (page - 1) * perPage return }