diff --git a/api/endpoints.go b/api/endpoints.go index 22c2a8a..5a51552 100644 --- a/api/endpoints.go +++ b/api/endpoints.go @@ -200,7 +200,7 @@ func handleSession(w http.ResponseWriter, r *http.Request) { switch r.PathValue("action") { case "get": save, err := savedata.GetSession(uuid, slot) - if errors.Is(err, sql.ErrNoRows) { + if errors.Is(err, savedata.ErrSaveNotExist) { http.Error(w, err.Error(), http.StatusNotFound) return } @@ -220,7 +220,7 @@ func handleSession(w http.ResponseWriter, r *http.Request) { } existingSave, err := savedata.GetSession(uuid, slot) - if err != nil && !errors.Is(err, sql.ErrNoRows) { + if err != nil && !errors.Is(err, savedata.ErrSaveNotExist) { httpError(w, r, fmt.Errorf("failed to retrieve session save data: %s", err), http.StatusInternalServerError) return } else { @@ -339,7 +339,7 @@ func handleUpdateAll(w http.ResponseWriter, r *http.Request) { } existingPlaytime, err := savedata.GetPlaytime(uuid) - if err != nil && !errors.Is(err, sql.ErrNoRows) { + if err != nil && !errors.Is(err, savedata.ErrSaveNotExist) { httpError(w, r, fmt.Errorf("failed to retrieve playtime: %s", err), http.StatusInternalServerError) return } else { @@ -356,7 +356,7 @@ func handleUpdateAll(w http.ResponseWriter, r *http.Request) { } existingSave, err := savedata.GetSession(uuid, data.SessionSlotId) - if err != nil && !errors.Is(err, sql.ErrNoRows) { + if err != nil && !errors.Is(err, savedata.ErrSaveNotExist) { httpError(w, r, fmt.Errorf("failed to retrieve session save data: %s", err), http.StatusInternalServerError) return } else { @@ -417,7 +417,7 @@ func handleSystem(w http.ResponseWriter, r *http.Request) { save, err := savedata.GetSystem(uuid) if err != nil { - if errors.Is(err, sql.ErrNoRows) { + if errors.Is(err, savedata.ErrSaveNotExist) { http.Error(w, err.Error(), http.StatusNotFound) } else { httpError(w, r, fmt.Errorf("failed to get system save data: %s", err), http.StatusInternalServerError) @@ -441,7 +441,7 @@ func handleSystem(w http.ResponseWriter, r *http.Request) { } existingPlaytime, err := savedata.GetPlaytime(uuid) - if err != nil && !errors.Is(err, sql.ErrNoRows) { + if err != nil && !errors.Is(err, savedata.ErrSaveNotExist) { httpError(w, r, fmt.Errorf("failed to retrieve playtime: %s", err), http.StatusInternalServerError) return } else { diff --git a/api/savedata/session.go b/api/savedata/session.go index d750f7a..060542b 100644 --- a/api/savedata/session.go +++ b/api/savedata/session.go @@ -18,6 +18,9 @@ package savedata import ( + "database/sql" + "errors" + "github.com/pagefaultgames/rogueserver/db" "github.com/pagefaultgames/rogueserver/defs" ) @@ -25,6 +28,10 @@ import ( func GetSession(uuid []byte, slot int) (defs.SessionSaveData, error) { session, err := db.ReadSessionSaveData(uuid, slot) if err != nil { + if errors.Is(err, sql.ErrNoRows) { + err = ErrSaveNotExist + } + return session, err } diff --git a/api/savedata/system.go b/api/savedata/system.go index 68410fd..19e7b1d 100644 --- a/api/savedata/system.go +++ b/api/savedata/system.go @@ -18,21 +18,33 @@ package savedata import ( + "database/sql" + "errors" "fmt" "os" + "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/pagefaultgames/rogueserver/db" "github.com/pagefaultgames/rogueserver/defs" ) +var ErrSaveNotExist = errors.New("save does not exist") + func GetSystem(uuid []byte) (defs.SystemSaveData, error) { var system defs.SystemSaveData var err error if os.Getenv("S3_SYSTEM_BUCKET_NAME") != "" { // use S3 system, err = db.GetSystemSaveFromS3(uuid) + var nokey *types.NoSuchKey + if errors.As(err, &nokey) { + err = ErrSaveNotExist + } } else { // use database system, err = db.ReadSystemSaveData(uuid) + if errors.Is(err, sql.ErrNoRows) { + err = ErrSaveNotExist + } } if err != nil { return system, err