aboutsummaryrefslogtreecommitdiff
path: root/database
diff options
context:
space:
mode:
authorBobby <[email protected]>2025-07-13 14:22:20 +0530
committerBobby <[email protected]>2025-07-13 14:22:20 +0530
commit3d7f8602d45583f25e2428bf6f8123453646dc08 (patch)
treeecd707d298099ae9fda55efc3f0d1daf48f7b6e9 /database
parentbf112649d039f8f02e2135a74d8b506f7c31c784 (diff)
downloadimageboard-3d7f8602d45583f25e2428bf6f8123453646dc08.tar.xz
imageboard-3d7f8602d45583f25e2428bf6f8123453646dc08.zip
registration controllers and email sending support
Diffstat (limited to 'database')
-rw-r--r--database/database.go1
-rw-r--r--database/tokens.go65
-rw-r--r--database/user.go12
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
+}