advanced models/controllers/service docs update

This commit is contained in:
Ravi Prasad
2025-05-12 19:40:51 -05:00
parent b6a3b59b3c
commit 8cad0e1980
10 changed files with 586 additions and 69 deletions
+65 -46
View File
@@ -1,44 +1,58 @@
package controllers
import (
"github.com/gofiber/fiber/v2"
"gorm.io/gorm"
"github.com/nprasad2077/NBA_Go/services"
"github.com/nprasad2077/NBA_Go/models"
"github.com/gofiber/fiber/v2"
"gorm.io/gorm"
"github.com/nprasad2077/NBA_Go/models"
"github.com/nprasad2077/NBA_Go/services"
)
func FetchPlayerAdvancedStats(db *gorm.DB) fiber.Handler {
return func(c *fiber.Ctx) error {
season := c.QueryInt("season", 2025)
// Call service and assign err here
err := services.FetchAndStorePlayerAdvancedStats(db, season)
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"message": "Player stats fetched and saved."})
}
// AdvancedStatsResponse is the swagger response model for GetAllAdvancedPlayerStats
// It wraps the returned player advanced stats and pagination metadata.
type AdvancedStatsResponse struct {
Data []models.PlayerAdvancedStat `json:"data"`
Pagination struct {
Total int64 `json:"total"`
Page int `json:"page"`
PageSize int `json:"pageSize"`
Pages int64 `json:"pages"`
} `json:"pagination"`
}
// FetchPlayerAdvancedStats returns a handler that imports advanced stats for a season
// Note: not exposed in Swagger docs, only internal use.
func FetchPlayerAdvancedStats(db *gorm.DB) fiber.Handler {
return func(c *fiber.Ctx) error {
season := c.QueryInt("season", 2025)
isPlayoff := c.QueryBool("isPlayoff", false)
if err := services.FetchAndStorePlayerAdvancedStats(db, season, isPlayoff); err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
// GetAllPlayerStats godoc
// @Security ApiKeyAuth
// @Summary Get player stats
// @Description Returns filtered and paginated player stats
// @Tags PlayerStats
// @Accept json
// @Produce json
// @Param season query int false "Season (e.g., 2025)"
// @Param team query string false "Team abbreviation (e.g., MIL)"
// @Param playerId query string false "Player ID (e.g., greenaj01)"
// @Param page query int false "Page number" default(1)
// @Param pageSize query int false "Page size" default(20)
// @Param sortBy query string false "Field to sort by (e.g., per, games, winShares)"
// @Param ascending query bool false "Sort ascending (default false)"
// @Success 200 {object} map[string]interface{}
// @Router /api/playeradvancedstats [get]
return c.JSON(fiber.Map{"message": "Player stats fetched and saved."})
}
}
// GetAllAdvancedPlayerStats godoc
// @Security ApiKeyAuth
// @Summary Get player advanced stats
// @Description Returns filtered and paginated player advanced stats
// @Tags PlayerStats
// @Accept json
// @Produce json
// @Param season query int false "Season (e.g., 2025)"
// @Param team query string false "Team abbreviation (e.g., MIL)"
// @Param playerId query string false "Player ID (e.g., greenaj01)"
// @Param page query int false "Page number" default(1)
// @Param pageSize query int false "Page size" default(20)
// @Param sortBy query string false "Field to sort by" default(winShares)
// @Param ascending query bool false "Sort ascending" default(false)
// @Param isPlayoff query bool false "Whether playoffs?"
// @Success 200 {object} controllers.AdvancedStatsResponse
// @Failure 500 {object} map[string]string
// @Router /api/playeradvancedstats [get]
func GetAllAdvancedPlayerStats(db *gorm.DB) fiber.Handler {
return func(c *fiber.Ctx) error {
var stats []models.PlayerAdvancedStat
@@ -54,7 +68,7 @@ func GetAllAdvancedPlayerStats(db *gorm.DB) fiber.Handler {
offset := (page - 1) * pageSize
// Sorting
sortBy := c.Query("sortBy", "win_shares") // default field
sortBy := c.Query("sortBy", "win_shares")
ascending := c.QueryBool("ascending", false)
order := sortBy + " DESC"
if ascending {
@@ -74,23 +88,28 @@ func GetAllAdvancedPlayerStats(db *gorm.DB) fiber.Handler {
query = query.Where("player_id = ?", playerId)
}
var total int64
query.Count(&total) // get total count before pagination
if c.Query("isPlayoff") != "" {
isPlayoff := c.QueryBool("isPlayoff", false)
query = query.Where("is_playoff = ?", isPlayoff)
}
// Count total
var total int64
query.Count(&total)
// Fetch page
err := query.Order(order).Limit(pageSize).Offset(offset).Find(&stats).Error
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
// Response with metadata
return c.JSON(fiber.Map{
"data": stats,
"pagination": fiber.Map{
"total": total,
"page": page,
"pageSize": pageSize,
"pages": (total + int64(pageSize) - 1) / int64(pageSize),
},
})
// Build response
resp := AdvancedStatsResponse{Data: stats}
resp.Pagination.Total = total
resp.Pagination.Page = page
resp.Pagination.PageSize = pageSize
resp.Pagination.Pages = (total + int64(pageSize) - 1) / int64(pageSize)
return c.JSON(resp)
}
}
}