126 lines
3.4 KiB
Go
126 lines
3.4 KiB
Go
package controllers
|
|
|
|
import (
|
|
"InfantrySkillCalculator/models"
|
|
"InfantrySkillCalculator/utils"
|
|
"github.com/gin-gonic/gin"
|
|
"net/http"
|
|
)
|
|
|
|
type AddCacheInput struct {
|
|
PlayerID uint `json:"player_id" binding:"required"`
|
|
Score float32 `json:"score" gorm:"default:-1.0"`
|
|
GameTag string `json:"game_tag" binding:"required"`
|
|
}
|
|
|
|
type UpdateCacheInput struct {
|
|
Score float32 `json:"score" gorm:"default:-1.0"`
|
|
}
|
|
|
|
// GetCacheByPlayerID GET /cache/:player_id
|
|
func GetCacheByPlayerID(c *gin.Context) {
|
|
playerId := utils.StringToUint(c.Param("player_id"))
|
|
|
|
game, err := GetActiveGame(c)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "No active game available!"})
|
|
return
|
|
}
|
|
|
|
val, err := models.PlayerCache.GetScore(playerId, game.Tag)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})
|
|
} else {
|
|
c.JSON(http.StatusOK, val)
|
|
}
|
|
}
|
|
|
|
// AddCache POST /cache
|
|
func AddCache(c *gin.Context) {
|
|
var input AddCacheInput
|
|
if err := c.BindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
var game models.Game
|
|
if err := FindGameByTag(&game, input.GameTag).Error; err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Game not found!"})
|
|
return
|
|
}
|
|
|
|
err := models.PlayerCache.SetScore(input.PlayerID, input.GameTag, input.Score)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Cache update failed! Error: " + err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, nil)
|
|
}
|
|
|
|
// UpdateCacheByPlayerID PATCH /cache/:id?game=TAG
|
|
func UpdateCacheByPlayerID(c *gin.Context) {
|
|
playerID := utils.StringToUint(c.Param("id"))
|
|
gameTag := c.Request.URL.Query().Get("game")
|
|
score := utils.StringToFloat(c.PostForm("score"))
|
|
|
|
err := models.PlayerCache.SetScore(playerID, gameTag, score)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Cache update failed! Error: " + err.Error()})
|
|
} else {
|
|
c.JSON(http.StatusOK, nil)
|
|
}
|
|
}
|
|
|
|
// DeleteCacheByPlayerID DELETE /cache/:id?game=TAG
|
|
func DeleteCacheByPlayerID(c *gin.Context) {
|
|
playerID := utils.StringToUint(c.Param("id"))
|
|
gameTag := c.Request.URL.Query().Get("game")
|
|
|
|
if err := models.PlayerCache.DeleteScore(playerID, gameTag); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
} else {
|
|
c.JSON(http.StatusOK, nil)
|
|
}
|
|
}
|
|
|
|
// DeleteAllCaches DELETE /cache
|
|
func DeleteAllCaches(c *gin.Context) {
|
|
if err := models.PlayerCache.PurgeCache(); err != nil {
|
|
c.String(http.StatusBadRequest, err.Error())
|
|
} else {
|
|
c.String(http.StatusOK, "Purged all caches!")
|
|
}
|
|
}
|
|
|
|
func UpdateCacheAfterExpiry(key string) {
|
|
utils.Logger.Println("[KeepUpdated] Cache expired: " + key)
|
|
|
|
playerId, err := models.PlayerCache.GetPlayerIdFromCacheKey(key)
|
|
if err != nil {
|
|
utils.Logger.Fatal(err)
|
|
}
|
|
|
|
var player models.Player
|
|
if err := models.DB.
|
|
Preload("Clan").
|
|
Where("id = ?", playerId).
|
|
First(&player).Error; err != nil {
|
|
|
|
utils.Logger.Println("Failed to find player: " + err.Error())
|
|
}
|
|
|
|
if player.Clan.KeepUpdated {
|
|
score := CalcPlayerScore(player.Name, "BF2042")
|
|
if score == score && score != -1 { // not NaN
|
|
if err := models.PlayerCache.SetScore(player.ID, "BF2042", score); err != nil {
|
|
utils.Logger.Println("Failed to update cache: " + err.Error())
|
|
} else {
|
|
utils.Logger.Println("[KeepUpdated] Updated cache for player " + player.Name)
|
|
}
|
|
} else {
|
|
utils.Logger.Println("[KeepUpdated] Received NaN for player " + player.Name)
|
|
}
|
|
}
|
|
}
|