155 lines
2.5 KiB
Go
155 lines
2.5 KiB
Go
package internal
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"github.com/creasty/defaults"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// User ...
|
|
type User struct {
|
|
Username string
|
|
Password string
|
|
CreatedAt time.Time
|
|
|
|
Recovery string `default:"auto"`
|
|
|
|
Tokens []string `default:"[]"`
|
|
}
|
|
|
|
// Token ...
|
|
type Token struct {
|
|
Signature string
|
|
Value string
|
|
UserAgent string
|
|
CreatedAt time.Time
|
|
ExpiresAt time.Time
|
|
}
|
|
|
|
// URL ...
|
|
type URL struct {
|
|
URL string
|
|
CrawledAt time.Time
|
|
ExpiresAt time.Time
|
|
|
|
hash string
|
|
}
|
|
|
|
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 {
|
|
return u.Username
|
|
}
|
|
|
|
// 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
|
|
}
|
|
|
|
// NewURL ...
|
|
func NewURL(url string) *URL {
|
|
u := &URL{URL: url}
|
|
if err := defaults.Set(u); err != nil {
|
|
log.WithError(err).Error("error creating new URI object")
|
|
}
|
|
return u
|
|
}
|
|
|
|
func LoadURL(data []byte) (u *URL, err error) {
|
|
u = &URL{}
|
|
if err := defaults.Set(u); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err = json.Unmarshal(data, &u); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (u *URL) Hash() string {
|
|
if u.hash != "" {
|
|
return u.hash
|
|
}
|
|
|
|
u.hash = HashURL(u.String())
|
|
|
|
return u.hash
|
|
}
|
|
|
|
func (u *URL) String() string {
|
|
return u.URL
|
|
}
|
|
|
|
func (u *URL) Bytes() ([]byte, error) {
|
|
data, err := json.Marshal(u)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return data, nil
|
|
}
|