2022-09-28 09:01:17 +02:00
|
|
|
package entity
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
// UIDs represents a slice of unique ID strings.
|
|
|
|
type UIDs []string
|
|
|
|
|
|
|
|
// String returns all UIDs as comma separated string.
|
|
|
|
func (u UIDs) String() string {
|
|
|
|
return u.Join(",")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Join returns all UIDs as custom separated string.
|
|
|
|
func (u UIDs) Join(s string) string {
|
|
|
|
return strings.Join(u, s)
|
|
|
|
}
|
|
|
|
|
|
|
|
// SessionData represents User Session data.
|
|
|
|
type SessionData struct {
|
|
|
|
Tokens []string `json:"tokens"` // Share Tokens.
|
|
|
|
Shares UIDs `json:"shares"` // Share UIDs.
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewSessionData creates a new session data struct and returns a pointer to it.
|
|
|
|
func NewSessionData() *SessionData {
|
|
|
|
return &SessionData{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// RefreshShares updates the list of shared UIDs in the session data.
|
|
|
|
func (data *SessionData) RefreshShares() *SessionData {
|
|
|
|
var shares []string
|
|
|
|
|
|
|
|
for _, token := range data.Tokens {
|
|
|
|
links := FindValidLinks(token, "")
|
|
|
|
|
|
|
|
if len(links) == 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, link := range links {
|
|
|
|
shares = append(shares, link.ShareUID)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
data.Shares = shares
|
|
|
|
|
|
|
|
return data
|
|
|
|
}
|
|
|
|
|
|
|
|
// RedeemToken appends a new token and updates the list of shared UIDs in the session data.
|
|
|
|
func (data *SessionData) RedeemToken(token string) (n int) {
|
|
|
|
links := FindValidLinks(token, "")
|
|
|
|
|
|
|
|
// No valid links found?
|
|
|
|
if n = len(links); n == 0 {
|
2022-10-02 11:38:30 +02:00
|
|
|
return n
|
2022-09-28 09:01:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Append new token.
|
|
|
|
data.Tokens = append(data.Tokens, token)
|
|
|
|
|
|
|
|
// Append new shares.
|
|
|
|
for _, link := range links {
|
|
|
|
data.Shares = append(data.Shares, link.ShareUID)
|
|
|
|
link.Redeem()
|
|
|
|
}
|
|
|
|
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
// NoShares checks if the session has no shares yet.
|
|
|
|
func (data SessionData) NoShares() bool {
|
|
|
|
return len(data.Shares) == 0
|
|
|
|
}
|
|
|
|
|
|
|
|
// HasShares checks if the session has any shares.
|
|
|
|
func (data SessionData) HasShares() bool {
|
|
|
|
return len(data.Shares) > 0
|
|
|
|
}
|
|
|
|
|
|
|
|
// HasShare if the session includes the specified share
|
|
|
|
func (data SessionData) HasShare(uid string) bool {
|
2022-09-30 00:42:19 +02:00
|
|
|
if uid == "" || data.NoShares() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2022-09-28 09:01:17 +02:00
|
|
|
for _, share := range data.Shares {
|
|
|
|
if share == uid {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// SharedUIDs returns shared entity UIDs.
|
|
|
|
func (data SessionData) SharedUIDs() UIDs {
|
|
|
|
if len(data.Tokens) > 0 && len(data.Shares) == 0 {
|
|
|
|
data.RefreshShares()
|
|
|
|
}
|
|
|
|
|
|
|
|
return data.Shares
|
|
|
|
}
|