diff options
| author | Bobby <[email protected]> | 2025-07-13 14:22:20 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2025-07-13 14:22:20 +0530 |
| commit | 3d7f8602d45583f25e2428bf6f8123453646dc08 (patch) | |
| tree | ecd707d298099ae9fda55efc3f0d1daf48f7b6e9 /database | |
| parent | bf112649d039f8f02e2135a74d8b506f7c31c784 (diff) | |
| download | imageboard-3d7f8602d45583f25e2428bf6f8123453646dc08.tar.xz imageboard-3d7f8602d45583f25e2428bf6f8123453646dc08.zip | |
registration controllers and email sending support
Diffstat (limited to 'database')
| -rw-r--r-- | database/database.go | 1 | ||||
| -rw-r--r-- | database/tokens.go | 65 | ||||
| -rw-r--r-- | database/user.go | 12 |
3 files changed, 78 insertions, 0 deletions
diff --git a/database/database.go b/database/database.go index d284c0f..dedae59 100644 --- a/database/database.go +++ b/database/database.go @@ -64,6 +64,7 @@ func autoMigrate() error { &models.ImageSize{}, &models.Tag{}, &models.Comment{}, + &models.EmailToken{}, ) } diff --git a/database/tokens.go b/database/tokens.go new file mode 100644 index 0000000..ddbc1f6 --- /dev/null +++ b/database/tokens.go @@ -0,0 +1,65 @@ +package database + +import ( + "fmt" + "imageboard/models" + "imageboard/utils/validators" + "time" +) + +func GenerateEmailToken(userID int, tokenType models.EmailTokenType) (*models.EmailToken, error) { + var existingToken models.EmailToken + if err := DB.Where("user_id = ? AND type = ?", userID, tokenType).First(&existingToken).Error; err == nil { + if err := DB.Delete(&existingToken).Error; err != nil { + return nil, err + } + } + + tokenValue, err := validators.GenerateRandomToken() + if err != nil { + return nil, err + } + + var expirationDuration time.Duration + switch tokenType { + case models.EmailTokenTypeVerification: + expirationDuration = 24 * time.Hour + case models.EmailTokenTypePasswordReset: + expirationDuration = 1 * time.Hour + case models.EmailTokenTypeChangeEmail: + expirationDuration = 1 * time.Hour + default: + expirationDuration = 1 * time.Hour + } + + token := &models.EmailToken{ + UserID: uint(userID), + Token: tokenValue, + Type: tokenType, + ExpiresAt: time.Now().Add(expirationDuration), + } + + if err := DB.Create(token).Error; err != nil { + return nil, err + } + + return token, nil +} + +func VerifyToken(userID int, token string, tokenType models.EmailTokenType) (*models.EmailToken, error) { + var emailToken models.EmailToken + if err := DB.Where("user_id = ? AND token = ? AND type = ?", userID, token, tokenType).First(&emailToken).Error; err != nil { + return nil, err + } + + if !emailToken.IsValid() { + return nil, fmt.Errorf("token is invalid or expired") + } + + emailToken.MarkAsUsed() + if err := DB.Save(&emailToken).Error; err != nil { + return nil, fmt.Errorf("failed to mark token as used: %w", err) + } + + return &emailToken, nil +} diff --git a/database/user.go b/database/user.go index c512038..4fe7e18 100644 --- a/database/user.go +++ b/database/user.go @@ -9,3 +9,15 @@ func GetUserByUsername(username string) (*models.User, error) { } return &user, nil } + +func GetUserByID(userID uint) (*models.User, error) { + var user models.User + if err := DB.Where("id = ?", userID).First(&user).Error; err != nil { + return nil, err + } + return &user, nil +} + +func CreateUser(user *models.User) error { + return DB.Create(user).Error +} |
