From 8a581da1d86750ff688122c219f0d4ff0dbef28c Mon Sep 17 00:00:00 2001 From: Alex <$(pass /github/email)> Date: Sun, 29 Sep 2024 21:16:58 +0200 Subject: [PATCH] add driversLicence model --- internal/constants/constants.go | 38 +++++++++++++++++++ internal/controllers/user_controller.go | 2 - internal/database/db.go | 31 +++++++++++++++ internal/models/drivers_licence.go | 27 +++++++++++++ internal/models/user.go | 2 + .../drivers_licence_repository.go | 25 ++++++++++++ internal/repositories/user_repository.go | 20 ++++------ internal/server/server.go | 3 +- internal/services/user_service.go | 3 +- 9 files changed, 135 insertions(+), 16 deletions(-) create mode 100644 internal/models/drivers_licence.go create mode 100644 internal/repositories/drivers_licence_repository.go diff --git a/internal/constants/constants.go b/internal/constants/constants.go index 6b7ddd2..18b287d 100644 --- a/internal/constants/constants.go +++ b/internal/constants/constants.go @@ -7,6 +7,25 @@ type roles struct { Admin int8 } +type licences struct { + AM string + A1 string + A2 string + A string + B string + C1 string + C string + D1 string + D string + BE string + C1E string + CE string + D1E string + DE string + L string + T string +} + const ( UnverifiedStatus = iota + 1 VerifiedStatus @@ -29,6 +48,25 @@ var Roles = roles{ Admin: 8, } +var Licences = licences{ + AM: "AM", + A1: "A1", + A2: "A2", + A: "A", + B: "B", + C1: "C1", + C: "C", + D1: "D1", + D: "D", + BE: "BE", + C1E: "C1E", + CE: "CE", + D1E: "D1E", + DE: "DE", + L: "L", + T: "T", +} + const PRIV_VIEW = 1 const PRIV_ADD = 2 const PRIV_EDIT = 4 diff --git a/internal/controllers/user_controller.go b/internal/controllers/user_controller.go index 76216d9..80bf75f 100644 --- a/internal/controllers/user_controller.go +++ b/internal/controllers/user_controller.go @@ -209,7 +209,6 @@ func (uc *UserController) RegisterUser(c *gin.Context) { c.JSON(http.StatusNotAcceptable, gin.H{"error": "No subscription model provided"}) return } - logger.Error.Printf("user.membership: %#v", regData.User.Membership) selectedModel, err := uc.MembershipService.GetModelByName(®Data.User.Membership.SubscriptionModel.Name) if err != nil { logger.Error.Printf("%v:No subscription model found: %#v", regData.User.Email, err) @@ -217,7 +216,6 @@ func (uc *UserController) RegisterUser(c *gin.Context) { return } regData.User.Membership.SubscriptionModel = *selectedModel - // logger.Info.Printf("REGISTERING user: %#v", regData.User) regData.User.RoleID = constants.Roles.Member diff --git a/internal/database/db.go b/internal/database/db.go index c81eda1..c9c646a 100644 --- a/internal/database/db.go +++ b/internal/database/db.go @@ -27,6 +27,8 @@ func Open(dbPath string, adminMail string) error { &models.Membership{}, &models.Consent{}, &models.Verification{}, + &models.DriversLicence{}, + &models.LicenceCategory{}, &models.BankAccount{}); err != nil { logger.Error.Fatalf("Couldn't create database: %v", err) return err @@ -51,6 +53,13 @@ func Open(dbPath string, adminMail string) error { return err } + categories := createLicenceCategories() + for _, model := range categories { + result := db.Create(&model) + if result.Error != nil { + return result.Error + } + } admin, err := createAdmin(adminMail, createdModel.ID) if err != nil { return err @@ -73,6 +82,28 @@ func createSubscriptionModels() []models.SubscriptionModel { }, } } + +func createLicenceCategories() []models.LicenceCategory { + return []models.LicenceCategory{ + {Category: "AM"}, + {Category: "A1"}, + {Category: "A2"}, + {Category: "A"}, + {Category: "B"}, + {Category: "C1"}, + {Category: "C"}, + {Category: "D1"}, + {Category: "D"}, + {Category: "BE"}, + {Category: "C1E"}, + {Category: "CE"}, + {Category: "D1E"}, + {Category: "DE"}, + {Category: "R"}, + {Category: "L"}, + } +} + // TODO: Landing page to create an admin func createAdmin(userMail string, subscriptionModelID uint) (*models.User, error) { diff --git a/internal/models/drivers_licence.go b/internal/models/drivers_licence.go new file mode 100644 index 0000000..12fef9f --- /dev/null +++ b/internal/models/drivers_licence.go @@ -0,0 +1,27 @@ +package models + +import ( + "time" + + "gorm.io/gorm" +) + +type DriversLicence struct { + gorm.Model + Status int8 `json:"licence_status" validate:"omitempty,number"` + LicenceNumber string `json:"licence_number" validate:"safe_content"` + IssuedDate time.Time `json:"licence_issued_date" validate:"omitempty,lte"` + ExpirationDate time.Time `json:"licence_expiration_date" validate:"omitempty,gt"` + IssuingCountry string `json:"licence_country" validate:"safe_content"` + LicenceCategories []LicenceCategory `json:"licence_categories" gorm:"many2many:licence_2_categories"` +} + +type LicenceCategory struct { + gorm.Model + Category string `json:"licence_category" validate:"safe_content"` +} + +// func (d *DriversLicence) BeforeCreate(tx *gorm.DB) (err error) { +// d.Status = constants.UnverifiedStatus +// return +// } diff --git a/internal/models/user.go b/internal/models/user.go index 8005ba7..d3f16e5 100644 --- a/internal/models/user.go +++ b/internal/models/user.go @@ -29,6 +29,8 @@ type User struct { VerificationID uint Membership Membership `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"membership"` MembershipID uint + DriversLicence DriversLicence `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"drivers_licence"` + DriversLicenceID uint ID uint `json:"id"` PaymentStatus int8 `json:"payment_status"` Status int8 `json:"status"` diff --git a/internal/repositories/drivers_licence_repository.go b/internal/repositories/drivers_licence_repository.go new file mode 100644 index 0000000..32b717e --- /dev/null +++ b/internal/repositories/drivers_licence_repository.go @@ -0,0 +1,25 @@ +package repositories + +import ( + "GoMembership/internal/database" + "GoMembership/internal/models" +) + +type DriversLicenceInterface interface { + FindCategoryByName(categoryName string) (models.LicenceCategory, error) + FindCategoriesByIDs(ids []uint) ([]models.LicenceCategory, error) +} + +type DriversLicenceRepository struct{} + +func (r *DriversLicenceRepository) FindCategoriesByIDs(ids []uint) ([]models.LicenceCategory, error) { + var categories []models.LicenceCategory + err := database.DB.Where("id IN ?", ids).Find(&categories).Error + return categories, err +} + +func (r *DriversLicenceRepository) FindCategoryByName(categoryName string) (models.LicenceCategory, error) { + var category models.LicenceCategory + err := database.DB.Where("category = ?", categoryName).First(&category).Error + return category, err +} diff --git a/internal/repositories/user_repository.go b/internal/repositories/user_repository.go index 8d65fe0..6bacc8a 100644 --- a/internal/repositories/user_repository.go +++ b/internal/repositories/user_repository.go @@ -68,12 +68,10 @@ func (ur *UserRepository) UpdateUser(user *models.User) (*models.User, error) { func (ur *UserRepository) GetUsers(where map[string]interface{}) (*[]models.User, error) { var users []models.User result := database.DB. - Preload("Consents"). - Preload("BankAccount"). - Preload("Verification"). - Preload("Membership", func(db *gorm.DB) *gorm.DB { - return db.Preload("SubscriptionModel") - }).Where(where).Find(&users) + Preload(clause.Associations). + Preload("Membership.SubscriptionModel"). + Preload("DriversLicence.LicenceCategories"). + Where(where).Find(&users) if result.Error != nil { if result.Error == gorm.ErrRecordNotFound { return nil, gorm.ErrRecordNotFound @@ -86,12 +84,10 @@ func (ur *UserRepository) GetUsers(where map[string]interface{}) (*[]models.User func (ur *UserRepository) GetUserByID(userID *uint) (*models.User, error) { var user models.User result := database.DB. - Preload("Consents"). - Preload("BankAccount"). - Preload("Verification"). - Preload("Membership", func(db *gorm.DB) *gorm.DB { - return db.Preload("SubscriptionModel") - }).First(&user, userID) + Preload(clause.Associations). + Preload("Membership.SubscriptionModel"). + Preload("DriversLicence.LicenceCategories"). + First(&user, userID) if result.Error != nil { if result.Error == gorm.ErrRecordNotFound { return nil, gorm.ErrRecordNotFound diff --git a/internal/server/server.go b/internal/server/server.go index fe7aa4b..bbcd982 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -39,7 +39,8 @@ func Run() { membershipService := &services.MembershipService{Repo: membershipRepo, SubscriptionRepo: subscriptionRepo} var userRepo repositories.UserRepositoryInterface = &repositories.UserRepository{} - userService := &services.UserService{Repo: userRepo} + var licenceRepo repositories.DriversLicenceInterface = &repositories.DriversLicenceRepository{} + userService := &services.UserService{Repo: userRepo, Licences: licenceRepo} userController := &controllers.UserController{Service: userService, EmailService: emailService, ConsentService: consentService, BankAccountService: bankAccountService, MembershipService: membershipService} membershipController := &controllers.MembershipController{Service: *membershipService} diff --git a/internal/services/user_service.go b/internal/services/user_service.go index 2a31ba7..30f7f68 100644 --- a/internal/services/user_service.go +++ b/internal/services/user_service.go @@ -28,7 +28,8 @@ type UserServiceInterface interface { } type UserService struct { - Repo repositories.UserRepositoryInterface + Repo repositories.UserRepositoryInterface + Licences repositories.DriversLicenceInterface } func (service *UserService) UpdateUser(user *models.User, userRole int8) (*models.User, error) {