diff --git a/api/daily/common.go b/api/daily/common.go index 2a6b682..f38eb05 100644 --- a/api/daily/common.go +++ b/api/daily/common.go @@ -24,6 +24,7 @@ import ( "crypto/rand" "encoding/base64" "encoding/binary" + "encoding/json" "fmt" "log" "os" @@ -95,6 +96,7 @@ func Init() error { return nil } + S3SaveMigration() _, err = s3scheduler.AddFunc("@weekly", func() { time.Sleep(time.Second) S3SaveMigration() @@ -139,19 +141,19 @@ func S3SaveMigration() { } accounts := db.RetrieveOldAccounts() for _, user := range accounts { - // retrieve save data from db - data, _ := db.RetrieveRawSystemData(user) + data, _ := db.ReadSystemSaveData(user) username, _ := db.FetchUsernameFromUUID(user) + json, _ := json.Marshal(data) _, err := svc.PutObject(context.Background(), &s3.PutObjectInput{ Bucket: aws.String("pokerogue-system"), Key: aws.String(username), - Body: bytes.NewReader(data), + Body: bytes.NewReader(json), }) 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 } - 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) } } diff --git a/api/endpoints.go b/api/endpoints.go index d9fb802..aa8bd38 100644 --- a/api/endpoints.go +++ b/api/endpoints.go @@ -420,6 +420,7 @@ func handleSystem(w http.ResponseWriter, r *http.Request) { if errors.Is(err, sql.ErrNoRows) { http.Error(w, err.Error(), http.StatusNotFound) } else { + fmt.Printf("failed to get system save data: %s\n", err) httpError(w, r, err, http.StatusInternalServerError) } diff --git a/db/savedata.go b/db/savedata.go index 2ce44dc..5b9e9e1 100644 --- a/db/savedata.go +++ b/db/savedata.go @@ -21,6 +21,7 @@ import ( "bytes" "context" "encoding/gob" + "encoding/json" "fmt" "github.com/klauspost/compress/zstd" @@ -62,7 +63,6 @@ func ReadSystemSaveData(uuid []byte) (defs.SystemSaveData, error) { var system defs.SystemSaveData isLocal, err := isSaveInLocalDb(uuid) - if err != nil { return system, err } @@ -242,22 +242,29 @@ func RetrieveSystemSaveFromS3(uuid []byte) error { return err } - var data []byte - _, err = resp.Body.Read(data) - if err != nil { - return err - } + var session defs.SystemSaveData + json.NewDecoder(resp.Body).Decode(&session) + + err = StoreSystemSaveData(uuid, session) - _, err = handle.Exec("REPLACE INTO systemSaveData (uuid, data, timestamp) VALUES (?, ?, UTC_TIMESTAMP())", uuid, data) if err != nil { + fmt.Printf("Failed to store system save data from s3 for user %s\n", username) 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) if err != nil { 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 } @@ -283,19 +290,9 @@ func RetrieveOldAccounts() [][]byte { 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) { _, 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) return }