This commit is contained in:
2026-04-18 14:38:37 +03:00
parent 3ee88f9343
commit 6c871cd9eb
21 changed files with 1736 additions and 22 deletions

View File

@@ -3,6 +3,7 @@ package socialrating
import (
"errors"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
@@ -26,10 +27,79 @@ type ChangeResponse struct {
CurrentRating models.UserSocialRating `json:"currentRating"`
}
type UsersResponse struct {
Users []UserWithRating `json:"users"`
}
type UserRatingResponse struct {
User UserWithRating `json:"user"`
}
type HistoryResponse struct {
Operations []models.SocialRatingOperation `json:"operations"`
}
func NewHandler(service Service) Handler {
return Handler{Service: service}
}
func (h Handler) ListUsers(ctx *gin.Context) {
limit := parsePositiveLimit(ctx.Query("limit"), 50)
users, err := h.Service.ListUsersWithRatings(limit)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{"error": "failed to load users"})
return
}
ctx.JSON(http.StatusOK, UsersResponse{Users: users})
}
func (h Handler) GetUser(ctx *gin.Context) {
userID, err := parseUintParam(ctx.Param("userId"))
if err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
user, err := h.Service.GetUserRating(userID)
if err != nil {
handleApplyChangeError(ctx, err)
return
}
ctx.JSON(http.StatusOK, UserRatingResponse{User: user})
}
func (h Handler) GetUserHistory(ctx *gin.Context) {
userID, err := parseUintParam(ctx.Param("userId"))
if err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
limit := parsePositiveLimit(ctx.Query("limit"), 50)
operations, err := h.Service.GetUserHistory(userID, limit)
if err != nil {
handleApplyChangeError(ctx, err)
return
}
ctx.JSON(http.StatusOK, HistoryResponse{Operations: operations})
}
func (h Handler) GetRecentOperations(ctx *gin.Context) {
limit := parsePositiveLimit(ctx.Query("limit"), 50)
operations, err := h.Service.GetRecentOperations(limit)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{"error": "failed to load operations"})
return
}
ctx.JSON(http.StatusOK, HistoryResponse{Operations: operations})
}
func (h Handler) Increase(ctx *gin.Context) {
h.applySignedChange(ctx, "increase", 1)
}
@@ -97,3 +167,12 @@ func handleApplyChangeError(ctx *gin.Context, err error) {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
}
func parseUintParam(raw string) (uint, error) {
value, err := strconv.ParseUint(raw, 10, 64)
if err != nil || value == 0 {
return 0, errors.New("invalid user id")
}
return uint(value), nil
}