Files
spyda/internal/models.go
2021-02-01 23:46:26 +10:00

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
}