add: update handling
This commit is contained in:
@@ -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"}},
|
||||
|
||||
Reference in New Issue
Block a user