From 3d7f8602d45583f25e2428bf6f8123453646dc08 Mon Sep 17 00:00:00 2001 From: Bobby Date: Sun, 13 Jul 2025 14:22:20 +0530 Subject: registration controllers and email sending support --- database/database.go | 1 + database/tokens.go | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ database/user.go | 12 ++++++++++ 3 files changed, 78 insertions(+) create mode 100644 database/tokens.go (limited to 'database') 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 +} -- cgit v1.2.3