From 0fa57bfe755e2059d14f86c65472a15af0f990a0 Mon Sep 17 00:00:00 2001 From: Alex <$(pass /github/email)> Date: Mon, 4 Nov 2024 17:19:32 +0100 Subject: [PATCH] made Licence optional --- internal/controllers/controllers_test.go | 2 +- internal/controllers/user_controller_test.go | 24 +++++++++--- internal/database/db.go | 2 +- internal/models/drivers_licence.go | 8 ++-- internal/models/user.go | 16 ++++++-- internal/repositories/licence_repository.go | 2 +- internal/repositories/user_repository.go | 40 ++++++++++++-------- internal/services/user_service.go | 13 ++++--- 8 files changed, 69 insertions(+), 38 deletions(-) diff --git a/internal/controllers/controllers_test.go b/internal/controllers/controllers_test.go index fb92a6f..c047c91 100644 --- a/internal/controllers/controllers_test.go +++ b/internal/controllers/controllers_test.go @@ -258,7 +258,7 @@ func getBaseUser() models.User { Phone: "01738484993", BankAccount: models.BankAccount{IBAN: "DE89370400440532013000"}, Membership: models.Membership{SubscriptionModel: models.SubscriptionModel{Name: "Basic"}}, - Licence: models.Licence{}, + Licence: nil, ProfilePicture: "", Password: "password123", Company: "", diff --git a/internal/controllers/user_controller_test.go b/internal/controllers/user_controller_test.go index 3df9b1d..369f4a4 100644 --- a/internal/controllers/user_controller_test.go +++ b/internal/controllers/user_controller_test.go @@ -425,7 +425,14 @@ func testUpdateUser(t *testing.T, loginCookie http.Cookie) { t.Fatalf("Failed to get test user: %v", err) } user := (*users)[0] - + if user.Licence == nil { + user.Licence = &models.Licence{ + Number: "Z021AB37X13", + ExpirationDate: time.Now().UTC().AddDate(1, 0, 0), + IssuedDate: time.Now().UTC().AddDate(-1, 0, 0), + IssuingCountry: "Deutschland", + } + } tests := []struct { name string setupCookie func(*http.Request) @@ -713,9 +720,6 @@ func testUpdateUser(t *testing.T, loginCookie http.Cookie) { assert.Equal(t, updatedUser.Membership.SubscriptionModelID, updatedUserFromDB.Membership.SubscriptionModelID, "Membership.SubscriptionModelID mismatch") assert.Equal(t, updatedUser.Membership.ParentMembershipID, updatedUserFromDB.Membership.ParentMembershipID, "Membership.ParentMembershipID mismatch") - if updatedUser.Licence.Status == 0 { - updatedUser.Licence.Status = constants.UnverifiedStatus - } assert.Equal(t, updatedUser.Licence.Status, updatedUserFromDB.Licence.Status, "Licence.Status mismatch") assert.Equal(t, updatedUser.Licence.Number, updatedUserFromDB.Licence.Number, "Licence.Number mismatch") assert.Equal(t, updatedUser.Licence.IssuedDate, updatedUserFromDB.Licence.IssuedDate, "Licence.IssuedDate mismatch") @@ -1094,7 +1098,11 @@ func getTestUsers() []RegisterUserTest { Assert: false, Input: GenerateInputJSON(customizeInput(func(user models.User) models.User { user.Email = "john.wronglicence.doe@example.com" - user.Licence.Number = "AAAA12345AA" + user.Licence = &models.Licence{ + Number: "AAAA12345AA", + ExpirationDate: time.Now().AddDate(1, 0, 0), + IssuedDate: time.Now().AddDate(-1, 0, 0), + } return user })), }, @@ -1105,7 +1113,11 @@ func getTestUsers() []RegisterUserTest { Assert: true, Input: GenerateInputJSON(customizeInput(func(user models.User) models.User { user.Email = "john.correctLicenceNumber@example.com" - user.Licence.Number = "B072RRE2I55" + user.Licence = &models.Licence{ + Number: "B072RRE2I55", + ExpirationDate: time.Now().AddDate(1, 0, 0), + IssuedDate: time.Now().AddDate(-1, 0, 0), + } return user })), }, diff --git a/internal/database/db.go b/internal/database/db.go index c6a6b3a..6a47c73 100644 --- a/internal/database/db.go +++ b/internal/database/db.go @@ -154,7 +154,7 @@ func createAdmin(userMail string, subscriptionModelID uint) (*models.User, error SubscriptionModelID: subscriptionModelID, }, BankAccount: models.BankAccount{}, - Licence: models.Licence{ + Licence: &models.Licence{ Status: constants.UnverifiedStatus, }, }, nil diff --git a/internal/models/drivers_licence.go b/internal/models/drivers_licence.go index 8f6e238..6c0e60c 100644 --- a/internal/models/drivers_licence.go +++ b/internal/models/drivers_licence.go @@ -7,11 +7,11 @@ import ( type Licence struct { ID uint `json:"id" gorm:"primaryKey"` Status int8 `json:"status" binding:"omitempty,number"` - Number string `json:"number" binding:"omitempty,euDriversLicence,safe_content"` - IssuedDate time.Time `json:"issued_date" binding:"omitempty,lte"` - ExpirationDate time.Time `json:"expiration_date" binding:"omitempty,gt"` + Number string `json:"number" binding:"omitempty,safe_content"` + IssuedDate time.Time `json:"issued_date" binding:"omitempty"` + ExpirationDate time.Time `json:"expiration_date" binding:"omitempty"` IssuingCountry string `json:"country" binding:"safe_content"` - Categories []Category `json:"licence_categories" gorm:"many2many:licence_2_categories"` + Categories []Category `json:"categories" gorm:"many2many:licence_2_categories"` } type Category struct { diff --git a/internal/models/user.go b/internal/models/user.go index 889cded..2c05cce 100644 --- a/internal/models/user.go +++ b/internal/models/user.go @@ -29,7 +29,7 @@ type User struct { VerificationID uint Membership Membership `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"membership"` MembershipID uint - Licence Licence `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"licence"` + Licence *Licence `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"licence"` LicenceID uint ID uint `json:"id"` PaymentStatus int8 `json:"payment_status"` @@ -60,7 +60,7 @@ func (u *User) PasswordMatches(plaintextPassword string) (bool, error) { } func (u *User) Safe() map[string]interface{} { - return map[string]interface{}{ + result := map[string]interface{}{ "email": u.Email, "first_name": u.FirstName, "last_name": u.LastName, @@ -90,6 +90,9 @@ func (u *User) Safe() map[string]interface{} { "included_per_month": u.Membership.SubscriptionModel.IncludedPerMonth, }, }, + "licence": map[string]interface{}{ + "id": 0, + }, "bank_account": map[string]interface{}{ "id": u.BankAccount.ID, "mandate_date_signed": u.BankAccount.MandateDateSigned, @@ -99,7 +102,10 @@ func (u *User) Safe() map[string]interface{} { "bic": u.BankAccount.BIC, "mandate_reference": u.BankAccount.MandateReference, }, - "licence": map[string]interface{}{ + } + + if u.Licence != nil { + result["licence"] = map[string]interface{}{ "id": u.Licence.ID, "number": u.Licence.Number, "status": u.Licence.Status, @@ -107,6 +113,8 @@ func (u *User) Safe() map[string]interface{} { "expiration_date": u.Licence.ExpirationDate, "country": u.Licence.IssuingCountry, "licence_categories": u.Licence.Categories, - }, + } } + + return result } diff --git a/internal/repositories/licence_repository.go b/internal/repositories/licence_repository.go index 0edcff4..c504e58 100644 --- a/internal/repositories/licence_repository.go +++ b/internal/repositories/licence_repository.go @@ -26,6 +26,6 @@ func (r *LicenceRepository) FindCategoriesByIDs(ids []uint) ([]models.Category, func (r *LicenceRepository) FindCategoryByName(categoryName string) (models.Category, error) { var category models.Category - err := database.DB.Where("category = ?", categoryName).First(&category).Error + err := database.DB.Where("name = ?", categoryName).First(&category).Error return category, err } diff --git a/internal/repositories/user_repository.go b/internal/repositories/user_repository.go index d95d212..65f44f9 100644 --- a/internal/repositories/user_repository.go +++ b/internal/repositories/user_repository.go @@ -42,7 +42,8 @@ func (ur *UserRepository) UpdateUser(user *models.User) (*models.User, error) { 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("Licence.Categories"). + if err := tx.Preload("Licence"). + Preload("Licence.Categories"). Preload("Membership"). First(&existingUser, user.ID).Error; err != nil { return err @@ -56,13 +57,29 @@ func (ur *UserRepository) UpdateUser(user *models.User) (*models.User, error) { return errors.ErrNoRowsAffected } - // Handle the update of the LicenceCategories explicitly - if user.Licence.ID != 0 { - // Replace the Categories with the new list - if err := tx.Model(&existingUser.Licence).Association("Categories").Replace(user.Licence.Categories); err != nil { - return err - } - } + // Handle the update or creation of Licence and its Categories + // if user.Licence != nil { + // if existingUser.Licence == nil { + // // Create new Licence if it doesn't exist + // logger.Error.Printf("Licence creation: %+v", user.Licence) + // if err := tx.Create(user.Licence).Error; err != nil { + // return err + // } + // // Update user with new licence ID + // // if err := tx.Model(&existingUser).Update("licence_id", user.Licence.ID).Error; err != nil { + // // return err + // // } + // } else { + // // Update existing licence + // if err := tx.Model(&existingUser.Licence).Updates(user.Licence).Error; err != nil { + // return err + // } + // } + // // Replace the Categories with the new list + // if err := tx.Model(&existingUser.Licence).Association("Categories").Replace(user.Licence.Categories); err != nil { + // return err + // } + // } // Update the Membership if provided if user.Membership.ID != 0 { @@ -71,13 +88,6 @@ func (ur *UserRepository) UpdateUser(user *models.User) (*models.User, error) { } } - // Update the Licence fields if provided - if user.Licence.ID != 0 { - if err := tx.Model(&existingUser.Licence).Updates(user.Licence).Error; err != nil { - return err - } - } - return nil }) diff --git a/internal/services/user_service.go b/internal/services/user_service.go index 3f723e4..65b69ad 100644 --- a/internal/services/user_service.go +++ b/internal/services/user_service.go @@ -37,11 +37,10 @@ func (service *UserService) UpdateUser(user *models.User, userRole int8) (*model setPassword(user.Password, user) } - user.UpdatedAt = time.Now() - if user.Licence.Status == 0 { - // This is a new drivers licence - user.Licence.Status = constants.UnverifiedStatus - } + // if user.Licence.Status == 0 { + // // This is a new drivers licence + // user.Licence.Status = constants.UnverifiedStatus + // } updatedUser, err := service.Repo.UpdateUser(user) @@ -66,7 +65,9 @@ func (service *UserService) RegisterUser(user *models.User) (uint, string, error user.CreatedAt = time.Now() user.UpdatedAt = time.Now() user.PaymentStatus = constants.AwaitingPaymentStatus - user.Licence.Status = constants.UnverifiedStatus + // if user.Licence == nil { + // user.Licence = &models.Licence{Status: constants.UnverifiedStatus} + // } user.BankAccount.MandateDateSigned = time.Now() id, err := service.Repo.CreateUser(user)