diff --git a/.vscode/launch.json b/.vscode/launch.json index 59709b5..e44b1b0 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -13,6 +13,15 @@ "console": "integratedTerminal", "program": "${workspaceFolder}/cmd/web" }, + { + "name": "server", + "type": "go", + "request": "launch", + "mode": "auto", + "args": ["-document-root", "${workspaceFolder}/env"], + "console": "integratedTerminal", + "program": "${workspaceFolder}/cmd/server" + }, { "name": "cli", "type": "go", diff --git a/cmd/server/api/api.go b/cmd/server/api/api.go index 2cfb816..794e15e 100644 --- a/cmd/server/api/api.go +++ b/cmd/server/api/api.go @@ -164,6 +164,12 @@ func (s HTTPServer) upload(w http.ResponseWriter, r *http.Request) { return } + if err := s.Service.ReloadCache(id); err != nil { + fmt.Fprintln(os.Stderr, "error: failed to reload data from the disk:", err) + internalServerError(w, r) + return + } + // Respond success w.WriteHeader(http.StatusCreated) } @@ -215,7 +221,13 @@ func (s HTTPServer) histUpload(w http.ResponseWriter, r *http.Request) { defer file.Close() if err := s.Service.CopyBackup(gameID, uuid, file); err != nil { - fmt.Fprintln(os.Stderr, "error: failed to write data to disk:", err) + fmt.Fprintln(os.Stderr, "error: failed to write data to the disk:", err) + internalServerError(w, r) + return + } + + if err := s.Service.ReloadCache(gameID); err != nil { + fmt.Fprintln(os.Stderr, "error: failed to reload data from the disk:", err) internalServerError(w, r) return } @@ -271,7 +283,6 @@ func (s HTTPServer) histExists(w http.ResponseWriter, r *http.Request) { ok(finfo, w, r) } - func (s HTTPServer) metadata(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, "id") metadata, err := s.Service.One(id) diff --git a/pkg/data/data.go b/pkg/data/data.go index 4bef18f..dad140f 100644 --- a/pkg/data/data.go +++ b/pkg/data/data.go @@ -378,6 +378,13 @@ func (l Service) Repository() repository.Repository { return l.repo } +func (l Service) ReloadCache(gameID string) error { + if er, ok := l.repo.(*repository.EagerRepository); ok { + return er.ReloadMetadata(repository.NewGameIdentifier(gameID)) + } + return nil +} + func (l Service) apply(src, dst string) error { if err := os.RemoveAll(dst); err != nil { return fmt.Errorf("failed to remove old save: %w", err) diff --git a/pkg/repository/repository.go b/pkg/repository/repository.go index f1783fd..743fc00 100644 --- a/pkg/repository/repository.go +++ b/pkg/repository/repository.go @@ -474,12 +474,6 @@ func (r *EagerRepository) WriteMetadata(id GameIdentifier, m Metadata) error { return err } - // reload from disk because of md5 - m, err = r.Repository.Metadata(id) - if err != nil { - return err - } - d := r.data[id.gameID] d.Metadata = m r.data[id.gameID] = d @@ -539,3 +533,39 @@ func (r *EagerRepository) Remove(id GameIdentifier) error { delete(r.data, id.gameID) return nil } + +func (r *EagerRepository) ReloadMetadata(id GameIdentifier) error { + backup, err := r.Repository.AllHist(id) + if err != nil { + return fmt.Errorf("[%s] failed to load hist data: %w", id, err) + } + + remote, err := r.Repository.Remote(id) + if err != nil { + return fmt.Errorf("[%s] failed to load remote metadata: %w", id, err) + } + + m, err := r.Repository.Metadata(id) + if err != nil { + return fmt.Errorf("[%s] failed to load metadata: %w", id, err) + } + + backups := make(map[string]Backup) + for _, b := range backup { + info, err := r.Repository.Backup(NewBackupIdentifier(id.gameID, b)) + if err != nil { + return fmt.Errorf("[%s] failed to get backup information: %w", id, err) + } + + backups[b] = info + } + + r.data[id.gameID] = Data{ + Metadata: m, + Remote: remote, + DataPath: r.DataPath(id), + Backup: backups, + } + + return nil +}