feat: Refactor system save data handling to use JSON and improve error logging

This commit is contained in:
Frederico Santos 2024-10-15 23:52:59 +01:00
parent e0633b86a7
commit 72426e5932
3 changed files with 23 additions and 23 deletions

View File

@ -24,6 +24,7 @@ import (
"crypto/rand" "crypto/rand"
"encoding/base64" "encoding/base64"
"encoding/binary" "encoding/binary"
"encoding/json"
"fmt" "fmt"
"log" "log"
"os" "os"
@ -95,6 +96,7 @@ func Init() error {
return nil return nil
} }
S3SaveMigration()
_, err = s3scheduler.AddFunc("@weekly", func() { _, err = s3scheduler.AddFunc("@weekly", func() {
time.Sleep(time.Second) time.Sleep(time.Second)
S3SaveMigration() S3SaveMigration()
@ -139,19 +141,19 @@ func S3SaveMigration() {
} }
accounts := db.RetrieveOldAccounts() accounts := db.RetrieveOldAccounts()
for _, user := range accounts { for _, user := range accounts {
// retrieve save data from db data, _ := db.ReadSystemSaveData(user)
data, _ := db.RetrieveRawSystemData(user)
username, _ := db.FetchUsernameFromUUID(user) username, _ := db.FetchUsernameFromUUID(user)
json, _ := json.Marshal(data)
_, err := svc.PutObject(context.Background(), &s3.PutObjectInput{ _, err := svc.PutObject(context.Background(), &s3.PutObjectInput{
Bucket: aws.String("pokerogue-system"), Bucket: aws.String("pokerogue-system"),
Key: aws.String(username), Key: aws.String(username),
Body: bytes.NewReader(data), Body: bytes.NewReader(json),
}) })
if err != nil { if err != nil {
log.Printf("error while saving data in s3 for user %s: %s", user, err) log.Printf("error while saving data in s3 for user %s: %s", username, err)
continue continue
} }
fmt.Printf("Saved data in s3 for user %s\n", user) fmt.Printf("Saved data in s3 for user %s\n", username)
db.UpdateLocation(user, username) db.UpdateLocation(user, username)
} }
} }

View File

@ -420,6 +420,7 @@ func handleSystem(w http.ResponseWriter, r *http.Request) {
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
http.Error(w, err.Error(), http.StatusNotFound) http.Error(w, err.Error(), http.StatusNotFound)
} else { } else {
fmt.Printf("failed to get system save data: %s\n", err)
httpError(w, r, err, http.StatusInternalServerError) httpError(w, r, err, http.StatusInternalServerError)
} }

View File

@ -21,6 +21,7 @@ import (
"bytes" "bytes"
"context" "context"
"encoding/gob" "encoding/gob"
"encoding/json"
"fmt" "fmt"
"github.com/klauspost/compress/zstd" "github.com/klauspost/compress/zstd"
@ -62,7 +63,6 @@ func ReadSystemSaveData(uuid []byte) (defs.SystemSaveData, error) {
var system defs.SystemSaveData var system defs.SystemSaveData
isLocal, err := isSaveInLocalDb(uuid) isLocal, err := isSaveInLocalDb(uuid)
if err != nil { if err != nil {
return system, err return system, err
} }
@ -242,22 +242,29 @@ func RetrieveSystemSaveFromS3(uuid []byte) error {
return err return err
} }
var data []byte var session defs.SystemSaveData
_, err = resp.Body.Read(data) json.NewDecoder(resp.Body).Decode(&session)
if err != nil {
return err err = StoreSystemSaveData(uuid, session)
}
_, err = handle.Exec("REPLACE INTO systemSaveData (uuid, data, timestamp) VALUES (?, ?, UTC_TIMESTAMP())", uuid, data)
if err != nil { if err != nil {
fmt.Printf("Failed to store system save data from s3 for user %s\n", username)
return err return err
} }
fmt.Printf("Retrieved system save data from s3 for user %s\n", username)
_, err = handle.Exec("UPDATE accounts SET isInLocalDb = 1 WHERE uuid = ?", uuid) _, err = handle.Exec("UPDATE accounts SET isInLocalDb = 1 WHERE uuid = ?", uuid)
if err != nil { if err != nil {
return err return err
} }
_, err = client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{
Bucket: aws.String("pokerogue-system"),
Key: aws.String(username),
})
if err != nil {
fmt.Printf("Failed to delete object %s from s3: %s\n", username, err)
}
return nil return nil
} }
@ -283,19 +290,9 @@ func RetrieveOldAccounts() [][]byte {
return users return users
} }
func RetrieveRawSystemData(uuid []byte) ([]byte, error) {
var data []byte
err := handle.QueryRow("SELECT data FROM systemSaveData WHERE uuid = ?", uuid).Scan(&data)
if err != nil {
return nil, err
}
return data, nil
}
func UpdateLocation(uuid []byte, username string) { func UpdateLocation(uuid []byte, username string) {
_, err := handle.Exec("UPDATE accounts SET isInLocalDb = 0 WHERE uuid = ?", uuid) _, err := handle.Exec("UPDATE accounts SET isInLocalDb = 0 WHERE uuid = ?", uuid)
if err == nil { if err != nil {
fmt.Printf("Failed to update location for user %s\n", username) fmt.Printf("Failed to update location for user %s\n", username)
return return
} }