diff options
author | Santo Cariotti <santo@dcariotti.me> | 2025-04-17 16:11:34 +0200 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2025-04-17 16:11:34 +0200 |
commit | 95da822f025b544f700729afc676ba0f3c981154 (patch) | |
tree | 89b07c3a4e8797e67cb08e8f6603b7e7eae3b0e1 /internal | |
parent | 56c7e99b59a52f19598d33a46aea0516bd4d609f (diff) |
Outcome for a game
Diffstat (limited to 'internal')
-rw-r--r-- | internal/api/database/models.go | 1 | ||||
-rw-r--r-- | internal/api/handlers/handlers.go | 63 |
2 files changed, 64 insertions, 0 deletions
diff --git a/internal/api/database/models.go b/internal/api/database/models.go index a6e76c5..cd0d12d 100644 --- a/internal/api/database/models.go +++ b/internal/api/database/models.go @@ -19,6 +19,7 @@ type Game struct { Name string `json:"name"` IP1 string `json:"ip1"` IP2 string `json:"ip2"` + Outcome string `json:"outcome"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } diff --git a/internal/api/handlers/handlers.go b/internal/api/handlers/handlers.go index 55fa121..41779c7 100644 --- a/internal/api/handlers/handlers.go +++ b/internal/api/handlers/handlers.go @@ -130,6 +130,7 @@ func NewPlay(w http.ResponseWriter, r *http.Request) { Name: name, IP1: payload.IP, IP2: "", + Outcome: "*", } result := db.Create(&play) @@ -266,3 +267,65 @@ func GetGameId(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(game) } + +func EndGame(w http.ResponseWriter, r *http.Request) { + log, _ := logger.GetLogger() + vars := mux.Vars(r) + id := vars["id"] + log.Info(fmt.Sprintf("POST /play/%s/end", id)) + + claims, err := auth.ValidateJWT(r.Header.Get("Authorization")) + + if err != nil { + JsonError(&w, err.Error()) + return + } + + var payload struct { + Outcome string `json:"outcome"` + } + + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + JsonError(&w, err.Error()) + return + } + + if err != nil { + JsonError(&w, err.Error()) + return + } + + db, _ := database.GetDb() + + var game database.Game + + // FIXME: this is not secure + result := db.Where("id = ? AND (player1_id = ? OR player2_id = ?)", id, claims.UserID, claims.UserID).First(&game) + if result.Error != nil { + JsonError(&w, result.Error.Error()) + return + } + + game.Outcome = payload.Outcome + + if err := db.Save(&game).Error; err != nil { + JsonError(&w, err.Error()) + return + } + + result = db.Where("id = ?", game.ID). + Preload("Player1", func(db *gorm.DB) *gorm.DB { + return db.Omit("Password") + }). + Preload("Player2", func(db *gorm.DB) *gorm.DB { + return db.Omit("Password") + }). + First(&game) + + if result.Error != nil { + JsonError(&w, result.Error.Error()) + return + } + + json.NewEncoder(w).Encode(game) +} |