package internal import ( "encoding/json" "fmt" "net/url" "time" "github.com/creasty/defaults" log "github.com/sirupsen/logrus" ) // User ... type User struct { Username string Password string Email string CreatedAt time.Time Tokens []string `default:"[]"` } // Token ... type Token struct { Signature string Value string UserAgent string CreatedAt time.Time ExpiresAt time.Time } func LoadToken(data []byte) (token *Token, err error) { token = &Token{} if err := defaults.Set(token); err != nil { return nil, err } if err = json.Unmarshal(data, &token); err != nil { return nil, err } return } func (t *Token) Bytes() ([]byte, error) { data, err := json.Marshal(t) if err != nil { return nil, err } return data, nil } // NewUser ... func NewUser() *User { user := &User{} if err := defaults.Set(user); err != nil { log.WithError(err).Error("error creating new user object") } return user } func LoadUser(data []byte) (user *User, err error) { user = &User{} if err := defaults.Set(user); err != nil { return nil, err } if err = json.Unmarshal(data, &user); err != nil { return nil, err } return } func (u *User) String() string { url, err := url.Parse(u.URL) if err != nil { log.WithError(err).Warn("error parsing user url") return u.Username } return fmt.Sprintf("%s@%s", u.Username, url.Hostname()) } // HasToken will add a token to a user if it doesn't exist already func (u *User) AddToken(token *Token) { if !u.HasToken(token.Signature) { u.Tokens = append(u.Tokens, token.Signature) } } // HasToken will compare a token value with stored tokens func (u *User) HasToken(token string) bool { for _, t := range u.Tokens { if t == token { return true } } return false } func (u *User) Bytes() ([]byte, error) { data, err := json.Marshal(u) if err != nil { return nil, err } return data, nil }