diff --git a/sessionmanagermdl/sessionmanager.go b/sessionmanagermdl/sessionmanager.go index 771a3ddaed2244e3e572f1cd4d266c8b920e0253..bcde051d05354001266697e755abac7ca43940e7 100644 --- a/sessionmanagermdl/sessionmanager.go +++ b/sessionmanagermdl/sessionmanager.go @@ -122,6 +122,40 @@ func Retrieve(key string) (Entry, error) { } } +// RetrieveAndExtend returns the entry and extends the entry expiration by provided `SECONDS`, only if remaining time < extendBy. +// If extendBy < 0, it is same as Retrieve function. +func RetrieveAndExtend(key string, extendBy int64) (Entry, error) { + entry, err := Retrieve(key) + if err != nil { + return Entry{}, err + } + + if extendBy > 0 { + timeRemaining := entry.ExpiredAT - time.Now().Unix() + + if timeRemaining < extendBy { + // update with new expiratin + entry.ExpiredAT = time.Now().Add(time.Second * time.Duration(extendBy)).Unix() + + Store(key, entry) + } + } + + return entry, nil +} + +// RetrieveAndDelete deletes the entry after first retrieval +func RetrieveAndDelete(key string) (Entry, error) { + entry, err := Retrieve(key) + if err != nil { + return Entry{}, err + } + + store.Delete(key) + + return entry, nil +} + // Delete removes the entry from session manager. If the key is not present, error `ErrSessionNotFound` will be thrown. Caller can ignore error if this is acceptable. func Delete(key string) error { _, ok := store.Get(key)