all repos

onasty @ 2e2e5be

a one-time notes service

onasty/internal/models/tokens.go (view raw)

Olexandr Smirnov Olexandr Smirnov
ss2316544@gmail.com
feat(api): change email (#191)..., 9 months ago
1
package models
2
3
import (
4
	"errors"
5
	"net/mail"
6
	"time"
7
8
	"github.com/gofrs/uuid/v5"
9
)
10
11
var (
12
	ErrResetPasswordTokenExpired  = errors.New("reset password token expired")
13
	ErrResetPasswordTokenNotFound = errors.New("reset password token not found")
14
15
	ErrChangeEmailTokenExpired       = errors.New("change email token expired")
16
	ErrChangeEmailTokenNotFound      = errors.New("change email token not found")
17
	ErrChangeEmailTokenIsAlreadyUsed = errors.New("change email token is already used")
18
)
19
20
type ResetPasswordToken struct {
21
	UserID    uuid.UUID
22
	Token     string
23
	CreatedAt time.Time
24
	ExpiresAt time.Time
25
}
26
27
func (p ResetPasswordToken) IsExpired() bool {
28
	return p.ExpiresAt.Before(time.Now())
29
}
30
31
type VerificationToken struct {
32
	UserID    uuid.UUID
33
	Token     string
34
	CreatedAt time.Time
35
	ExpiresAt time.Time
36
}
37
38
type ChangeEmailToken struct {
39
	UserID    uuid.UUID
40
	Token     string
41
	NewEmail  string
42
	CreatedAt time.Time
43
	ExpiresAt time.Time
44
}
45
46
func (c ChangeEmailToken) IsExpired() bool {
47
	return c.ExpiresAt.Before(time.Now())
48
}
49
50
func (c ChangeEmailToken) Validate() error {
51
	_, err := mail.ParseAddress(c.NewEmail)
52
	if err != nil {
53
		return ErrUserInvalidEmail
54
	}
55
56
	return nil
57
}