add: update handling

This commit is contained in:
$(pass /github/name)
2024-09-20 08:29:00 +02:00
parent 62624cd0f8
commit 00facf8758
4 changed files with 406 additions and 157 deletions

View File

@@ -1,8 +1,6 @@
package repositories
import (
"time"
"gorm.io/gorm"
"GoMembership/internal/constants"
@@ -16,13 +14,13 @@ import (
type UserRepositoryInterface interface {
CreateUser(user *models.User) (int64, error)
UpdateUser(userID int64, user *models.User) error
UpdateUser(user *models.User) (*models.User, error)
GetUsers(where map[string]interface{}) (*[]models.User, error)
GetUserByID(id int64) (*models.User, error)
GetUserByID(userID *int64) (*models.User, error)
GetUserByEmail(email string) (*models.User, error)
SetVerificationToken(user *models.User, token *string) (int64, error)
SetVerificationToken(verification *models.Verification) (int64, error)
IsVerified(userID *int64) (bool, error)
VerifyUserOfToken(token *string) (*models.User, error)
GetVerificationOfToken(token *string) (*models.Verification, error)
}
type UserRepository struct{}
@@ -35,21 +33,36 @@ func (ur *UserRepository) CreateUser(user *models.User) (int64, error) {
return user.ID, nil
}
func (ur *UserRepository) UpdateUser(userID int64, user *models.User) error {
// logger.Info.Printf("Updating User: %#v\n", user)
func (ur *UserRepository) UpdateUser(user *models.User) (*models.User, error) {
if user == nil {
return errors.ErrNoData
}
result := database.DB.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&user)
if result.Error != nil {
return result.Error
return nil, errors.ErrNoData
}
if result.RowsAffected == 0 {
return errors.ErrNoRowsAffected
err := database.DB.Transaction(func(tx *gorm.DB) error {
if err := tx.First(&models.User{}, user.ID).Error; err != nil {
return err
}
result := tx.Session(&gorm.Session{FullSaveAssociations: true}).Updates(user)
if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return errors.ErrNoRowsAffected
}
return nil
})
if err != nil {
return nil, err
}
return nil
var updatedUser models.User
if err := database.DB.First(&updatedUser, user.ID).Error; err != nil {
return nil, err
}
return &updatedUser, nil
}
func (ur *UserRepository) GetUsers(where map[string]interface{}) (*[]models.User, error) {
@@ -70,7 +83,7 @@ func (ur *UserRepository) GetUsers(where map[string]interface{}) (*[]models.User
return &users, nil
}
func (ur *UserRepository) GetUserByID(id int64) (*models.User, error) {
func (ur *UserRepository) GetUserByID(userID *int64) (*models.User, error) {
var user models.User
result := database.DB.
Preload("Consents").
@@ -78,7 +91,7 @@ func (ur *UserRepository) GetUserByID(id int64) (*models.User, error) {
Preload("Verification").
Preload("Membership", func(db *gorm.DB) *gorm.DB {
return db.Preload("SubscriptionModel")
}).First(&user, id)
}).First(&user, userID)
if result.Error != nil {
if result.Error == gorm.ErrRecordNotFound {
return nil, gorm.ErrRecordNotFound
@@ -112,7 +125,8 @@ func (ur *UserRepository) IsVerified(userID *int64) (bool, error) {
return user.Status != constants.UnverifiedStatus, nil
}
func (ur *UserRepository) VerifyUserOfToken(token *string) (*models.User, error) {
func (ur *UserRepository) GetVerificationOfToken(token *string) (*models.Verification, error) {
var emailVerification models.Verification
result := database.DB.Where("verification_token = ?", token).First(&emailVerification)
if result.Error != nil {
@@ -121,49 +135,10 @@ func (ur *UserRepository) VerifyUserOfToken(token *string) (*models.User, error)
}
return nil, result.Error
}
// Check if the user is already verified
verified, err := ur.IsVerified(&emailVerification.UserID)
if err != nil {
return nil, err
}
user, err := ur.GetUserByID(emailVerification.UserID)
if err != nil {
return nil, err
}
if verified {
return user, errors.ErrAlreadyVerified
}
// Update user status to active
t := time.Now()
emailVerification.EmailVerifiedAt = &t
user.Status = constants.VerifiedStatus
user.Verification = emailVerification
err = ur.UpdateUser(emailVerification.UserID, user)
if err != nil {
return nil, err
}
return user, nil
return &emailVerification, nil
}
func (ur *UserRepository) SetVerificationToken(user *models.User, token *string) (int64, error) {
// Check if user is already verified
verified, err := ur.IsVerified(&user.ID)
if err != nil {
return -1, err
}
if verified {
return -1, errors.ErrAlreadyVerified
}
// Prepare the Verification record
verification := models.Verification{
UserID: user.ID,
VerificationToken: *token,
}
func (ur *UserRepository) SetVerificationToken(verification *models.Verification) (int64, error) {
// Use GORM to insert or update the Verification record
result := database.DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "user_id"}},