del obsolete repos and services
This commit is contained in:
@@ -1,10 +0,0 @@
|
|||||||
package repositories
|
|
||||||
|
|
||||||
import (
|
|
||||||
"GoMembership/internal/database"
|
|
||||||
"GoMembership/internal/models"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (r *UserRepository) SetUserStatus(id uint, status uint) error {
|
|
||||||
return database.DB.Model(&models.User{}).Where("id = ?", id).Update("status", status).Error
|
|
||||||
}
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
package repositories
|
|
||||||
|
|
||||||
import (
|
|
||||||
"gorm.io/gorm"
|
|
||||||
|
|
||||||
"GoMembership/internal/database"
|
|
||||||
|
|
||||||
"gorm.io/gorm/clause"
|
|
||||||
|
|
||||||
"GoMembership/internal/models"
|
|
||||||
"GoMembership/pkg/errors"
|
|
||||||
"GoMembership/pkg/logger"
|
|
||||||
)
|
|
||||||
|
|
||||||
type UserRepositoryInterface interface {
|
|
||||||
CreateUser(user *models.User) (uint, error)
|
|
||||||
UpdateUser(user *models.User) (*models.User, error)
|
|
||||||
GetUsers(where map[string]interface{}) (*[]models.User, error)
|
|
||||||
GetUserByEmail(email string) (*models.User, error)
|
|
||||||
IsVerified(userID *uint) (bool, error)
|
|
||||||
GetVerificationOfToken(token *string, verificationType *string) (*models.Verification, error)
|
|
||||||
SetVerificationToken(verification *models.Verification) (token string, err error)
|
|
||||||
DeleteVerification(id uint, verificationType string) error
|
|
||||||
DeleteUser(id uint) error
|
|
||||||
SetUserStatus(id uint, status uint) error
|
|
||||||
}
|
|
||||||
|
|
||||||
type UserRepository struct{}
|
|
||||||
|
|
||||||
func (ur *UserRepository) DeleteUser(id uint) error {
|
|
||||||
return database.DB.Delete(&models.User{}, "id = ?", id).Error
|
|
||||||
}
|
|
||||||
|
|
||||||
func PasswordExists(userID *uint) (bool, error) {
|
|
||||||
var user models.User
|
|
||||||
result := database.DB.Select("password").First(&user, userID)
|
|
||||||
if result.Error != nil {
|
|
||||||
return false, result.Error
|
|
||||||
}
|
|
||||||
return user.Password != "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ur *UserRepository) CreateUser(user *models.User) (uint, error) {
|
|
||||||
result := database.DB.Create(user)
|
|
||||||
if result.Error != nil {
|
|
||||||
logger.Error.Printf("Create User error: %#v", result.Error)
|
|
||||||
return 0, result.Error
|
|
||||||
}
|
|
||||||
return user.ID, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ur *UserRepository) UpdateUser(user *models.User) (*models.User, error) {
|
|
||||||
if user == nil {
|
|
||||||
return nil, errors.ErrNoData
|
|
||||||
}
|
|
||||||
|
|
||||||
err := database.DB.Transaction(func(tx *gorm.DB) error {
|
|
||||||
// Check if the user exists in the database
|
|
||||||
var existingUser models.User
|
|
||||||
|
|
||||||
if err := tx.Preload(clause.Associations).
|
|
||||||
Preload("Membership").
|
|
||||||
Preload("Membership.SubscriptionModel").
|
|
||||||
Preload("Licence").
|
|
||||||
Preload("Licence.Categories").
|
|
||||||
First(&existingUser, user.ID).Error; err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Update the user's main fields
|
|
||||||
result := tx.Session(&gorm.Session{FullSaveAssociations: true}).Omit("Password").Updates(user)
|
|
||||||
if result.Error != nil {
|
|
||||||
return result.Error
|
|
||||||
}
|
|
||||||
if result.RowsAffected == 0 {
|
|
||||||
return errors.ErrNoRowsAffected
|
|
||||||
}
|
|
||||||
|
|
||||||
if user.Password != "" {
|
|
||||||
if err := tx.Model(&models.User{}).
|
|
||||||
Where("id = ?", user.ID).
|
|
||||||
Update("Password", user.Password).Error; err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the Membership if provided
|
|
||||||
if user.Membership.ID != 0 {
|
|
||||||
if err := tx.Model(&existingUser.Membership).Updates(user.Membership).Error; err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replace categories if Licence and Categories are provided
|
|
||||||
if user.Licence != nil {
|
|
||||||
if err := tx.Model(&user.Licence).Association("Categories").Replace(user.Licence.Categories); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var updatedUser models.User
|
|
||||||
if err := database.DB.Preload("Licence.Categories").
|
|
||||||
Preload("Membership").
|
|
||||||
First(&updatedUser, user.ID).Error; err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &updatedUser, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ur *UserRepository) GetUsers(where map[string]interface{}) (*[]models.User, error) {
|
|
||||||
var users []models.User
|
|
||||||
result := database.DB.
|
|
||||||
Preload(clause.Associations).
|
|
||||||
Preload("Membership.SubscriptionModel").
|
|
||||||
Preload("Licence.Categories").
|
|
||||||
Where(where).Find(&users)
|
|
||||||
if result.Error != nil {
|
|
||||||
if result.Error == gorm.ErrRecordNotFound {
|
|
||||||
return nil, gorm.ErrRecordNotFound
|
|
||||||
}
|
|
||||||
return nil, result.Error
|
|
||||||
}
|
|
||||||
return &users, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetUserByID(userID *uint) (*models.User, error) {
|
|
||||||
var user models.User
|
|
||||||
result := database.DB.
|
|
||||||
Preload(clause.Associations).
|
|
||||||
Preload("Membership").
|
|
||||||
Preload("Membership.SubscriptionModel").
|
|
||||||
Preload("Licence.Categories").
|
|
||||||
First(&user, userID)
|
|
||||||
if result.Error != nil {
|
|
||||||
if result.Error == gorm.ErrRecordNotFound {
|
|
||||||
return nil, gorm.ErrRecordNotFound
|
|
||||||
}
|
|
||||||
return nil, result.Error
|
|
||||||
}
|
|
||||||
return &user, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ur *UserRepository) GetUserByEmail(email string) (*models.User, error) {
|
|
||||||
var user models.User
|
|
||||||
result := database.DB.Where("email = ?", email).First(&user)
|
|
||||||
if result.Error != nil {
|
|
||||||
if result.Error == gorm.ErrRecordNotFound {
|
|
||||||
return nil, gorm.ErrRecordNotFound
|
|
||||||
}
|
|
||||||
return nil, result.Error
|
|
||||||
}
|
|
||||||
return &user, nil
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
package repositories
|
|
||||||
|
|
||||||
import (
|
|
||||||
"GoMembership/internal/constants"
|
|
||||||
"GoMembership/internal/database"
|
|
||||||
"GoMembership/internal/models"
|
|
||||||
|
|
||||||
"gorm.io/gorm"
|
|
||||||
"gorm.io/gorm/clause"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (ur *UserRepository) IsVerified(userID *uint) (bool, error) {
|
|
||||||
var user models.User
|
|
||||||
result := database.DB.Select("status").First(&user, userID)
|
|
||||||
if result.Error != nil {
|
|
||||||
if result.Error == gorm.ErrRecordNotFound {
|
|
||||||
return false, gorm.ErrRecordNotFound
|
|
||||||
}
|
|
||||||
return false, result.Error
|
|
||||||
}
|
|
||||||
return user.Status > constants.DisabledStatus, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ur *UserRepository) GetVerificationOfToken(token *string, verificationType *string) (*models.Verification, error) {
|
|
||||||
|
|
||||||
var emailVerification models.Verification
|
|
||||||
result := database.DB.Where("verification_token = ? AND type = ?", token, verificationType).First(&emailVerification)
|
|
||||||
if result.Error != nil {
|
|
||||||
if result.Error == gorm.ErrRecordNotFound {
|
|
||||||
return nil, gorm.ErrRecordNotFound
|
|
||||||
}
|
|
||||||
return nil, result.Error
|
|
||||||
}
|
|
||||||
return &emailVerification, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ur *UserRepository) SetVerificationToken(verification *models.Verification) (token string, err error) {
|
|
||||||
|
|
||||||
result := database.DB.Clauses(clause.OnConflict{
|
|
||||||
Columns: []clause.Column{{Name: "user_id"}},
|
|
||||||
DoUpdates: clause.AssignmentColumns([]string{"verification_token", "created_at", "type"}),
|
|
||||||
}).Create(&verification)
|
|
||||||
|
|
||||||
if result.Error != nil {
|
|
||||||
return "", result.Error
|
|
||||||
}
|
|
||||||
|
|
||||||
return verification.VerificationToken, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ur *UserRepository) DeleteVerification(id uint, verificationType string) error {
|
|
||||||
result := database.DB.Where("user_id = ? AND type = ?", id, verificationType).Delete(&models.Verification{})
|
|
||||||
if result.Error != nil {
|
|
||||||
return result.Error
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package services
|
|
||||||
|
|
||||||
import (
|
|
||||||
"GoMembership/internal/constants"
|
|
||||||
"GoMembership/internal/models"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (s *UserService) HandlePasswordChangeRequest(user *models.User) (token string, err error) {
|
|
||||||
// Deactivate user and reset Verification
|
|
||||||
if err := s.SetUserStatus(user.ID, constants.DisabledStatus); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := s.RevokeVerification(&user.ID, constants.VerificationTypes.Password); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate a token
|
|
||||||
return s.SetVerificationToken(&user.ID, &constants.VerificationTypes.Password)
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
package services
|
|
||||||
|
|
||||||
func (s *UserService) SetUserStatus(id uint, status uint) error {
|
|
||||||
return s.Repo.SetUserStatus(id, status)
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
package services
|
|
||||||
|
|
||||||
import (
|
|
||||||
"GoMembership/internal/models"
|
|
||||||
"GoMembership/internal/utils"
|
|
||||||
"GoMembership/pkg/errors"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (s *UserService) SetVerificationToken(id *uint, verificationType *string) (string, error) {
|
|
||||||
|
|
||||||
token, err := utils.GenerateVerificationToken()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if user is already verified
|
|
||||||
verified, err := s.Repo.IsVerified(id)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
if verified {
|
|
||||||
return "", errors.ErrAlreadyVerified
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prepare the Verification record
|
|
||||||
verification := models.Verification{
|
|
||||||
UserID: *id,
|
|
||||||
VerificationToken: token,
|
|
||||||
Type: *verificationType,
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.Repo.SetVerificationToken(&verification)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *UserService) RevokeVerification(id *uint, verificationType string) error {
|
|
||||||
return s.Repo.DeleteVerification(*id, verificationType)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (service *UserService) VerifyUser(token *string, verificationType *string) (*models.Verification, error) {
|
|
||||||
verification, err := service.Repo.GetVerificationOfToken(token, verificationType)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the user is already verified
|
|
||||||
verified, err := service.Repo.IsVerified(&verification.UserID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if verified {
|
|
||||||
return nil, errors.ErrAlreadyVerified
|
|
||||||
}
|
|
||||||
t := time.Now()
|
|
||||||
verification.VerifiedAt = &t
|
|
||||||
|
|
||||||
return verification, nil
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user