issue-8: added going forward in backstack and restoring last view
This commit is contained in:
parent
1109f2c9ee
commit
4c187ebb4d
9 changed files with 204 additions and 50 deletions
|
|
@ -5,6 +5,10 @@ import "github.com/lmika/audax/internal/dynamo-browse/models/serialisable"
|
|||
type ViewSnapshotStore interface {
|
||||
Save(rs *serialisable.ViewSnapshot) error
|
||||
SetAsHead(resultSetId int64) error
|
||||
CurrentlyViewedSnapshot() (*serialisable.ViewSnapshot, error)
|
||||
SetCurrentlyViewedSnapshot(resultSetId int64) error
|
||||
Find(resultSetID int64) (*serialisable.ViewSnapshot, error)
|
||||
Head() (*serialisable.ViewSnapshot, error)
|
||||
Remove(resultSetId int64) error
|
||||
Dehead(fromNode *serialisable.ViewSnapshot) error
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,43 +27,89 @@ func (s *ViewSnapshotService) PushSnapshot(rs *models.ResultSet, filter string)
|
|||
}
|
||||
newSnapshot.Filter = filter
|
||||
|
||||
if head, err := s.store.Head(); head != nil {
|
||||
newSnapshot.BackLink = head.ID
|
||||
} else if err != nil {
|
||||
return errors.Wrap(err, "cannot get head result set")
|
||||
oldHead, err := s.store.CurrentlyViewedSnapshot()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "cannot get snapshot head")
|
||||
}
|
||||
|
||||
if oldHead != nil {
|
||||
newSnapshot.BackLink = oldHead.ID
|
||||
|
||||
// Remove all nodes from this point on the head
|
||||
if err := s.store.Dehead(oldHead); err != nil {
|
||||
return errors.Wrap(err, "cannot remove head")
|
||||
}
|
||||
}
|
||||
|
||||
if err := s.store.Save(newSnapshot); err != nil {
|
||||
return errors.Wrap(err, "cannot save snapshot")
|
||||
}
|
||||
|
||||
if oldHead != nil {
|
||||
oldHead.ForeLink = newSnapshot.ID
|
||||
if err := s.store.Save(oldHead); err != nil {
|
||||
return errors.Wrap(err, "cannot update old head")
|
||||
}
|
||||
}
|
||||
|
||||
if err := s.store.SetAsHead(newSnapshot.ID); err != nil {
|
||||
return errors.Wrap(err, "cannot set new snapshot as head")
|
||||
}
|
||||
if err := s.store.SetCurrentlyViewedSnapshot(newSnapshot.ID); err != nil {
|
||||
return errors.Wrap(err, "cannot set new snapshot as head")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *ViewSnapshotService) PopSnapshot() (*serialisable.ViewSnapshot, error) {
|
||||
vs, err := s.store.Head()
|
||||
func (s *ViewSnapshotService) ViewRestore() (*serialisable.ViewSnapshot, error) {
|
||||
vs, err := s.store.CurrentlyViewedSnapshot()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "cannot get snapshot head")
|
||||
} else if vs == nil || vs.BackLink == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
if err := s.store.SetAsHead(vs.BackLink); err != nil {
|
||||
return nil, errors.Wrap(err, "cannot set new head")
|
||||
}
|
||||
if err := s.store.Remove(vs.ID); err != nil {
|
||||
return nil, errors.Wrap(err, "cannot remove old ID")
|
||||
}
|
||||
|
||||
vs, err = s.store.Head()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "cannot get snapshot head")
|
||||
} else if vs == nil || vs.BackLink == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return vs, nil
|
||||
}
|
||||
|
||||
func (s *ViewSnapshotService) ViewBack() (*serialisable.ViewSnapshot, error) {
|
||||
vs, err := s.store.CurrentlyViewedSnapshot()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "cannot get snapshot head")
|
||||
} else if vs == nil || vs.BackLink == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
vsToReturn, err := s.store.Find(vs.BackLink)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "cannot get snapshot head")
|
||||
} else if vsToReturn == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
if err := s.store.SetCurrentlyViewedSnapshot(vsToReturn.ID); err != nil {
|
||||
return nil, errors.Wrap(err, "cannot set new head")
|
||||
}
|
||||
|
||||
return vsToReturn, nil
|
||||
}
|
||||
|
||||
func (s *ViewSnapshotService) ViewForward() (*serialisable.ViewSnapshot, error) {
|
||||
vs, err := s.store.CurrentlyViewedSnapshot()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "cannot get snapshot head")
|
||||
} else if vs == nil || vs.ForeLink == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
vsToReturn, err := s.store.Find(vs.ForeLink)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "cannot get snapshot head")
|
||||
} else if vsToReturn == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
if err := s.store.SetCurrentlyViewedSnapshot(vsToReturn.ID); err != nil {
|
||||
return nil, errors.Wrap(err, "cannot set new head")
|
||||
}
|
||||
|
||||
return vsToReturn, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue