Compare commits

...

2 Commits

Author SHA1 Message Date
Alex
2acbe703eb add: subscription seeding, enhance admin creation 2024-09-29 21:06:30 +02:00
Alex
72017c97ff add: UserRole for privelige handling 2024-09-29 21:03:32 +02:00
3 changed files with 61 additions and 19 deletions

View File

@@ -72,7 +72,8 @@ func (uc *UserController) UpdateHandler(c *gin.Context) {
// user.RoleID = existingUser.RoleID // user.RoleID = existingUser.RoleID
// } // }
updatedUser, err := uc.Service.UpdateUser(&user) updatedUser, err := uc.Service.UpdateUser(&user, userRole)
if err != nil { if err != nil {
switch err { switch err {
case errors.ErrUserNotFound: case errors.ErrUserNotFound:

View File

@@ -38,11 +38,24 @@ func Open(dbPath string, adminMail string) error {
var count int64 var count int64
db.Model(&models.User{}).Count(&count) db.Model(&models.User{}).Count(&count)
if count == 0 { if count == 0 {
subscriptionModels := createSubscriptionModels()
for _, model := range subscriptionModels {
result := db.Create(&model)
if result.Error != nil {
return result.Error
}
}
logger.Error.Printf("Init Subscriptions: %v", subscriptionModels)
var createdModel models.SubscriptionModel
if err := db.First(&createdModel).Error; err != nil {
return err
}
admin, err := createAdmin(adminMail, createdModel.ID) admin, err := createAdmin(adminMail, createdModel.ID)
if err != nil { if err != nil {
return err return err
} }
result := db.Create(&admin) result := db.Session(&gorm.Session{FullSaveAssociations: true}).Create(&admin)
if result.Error != nil { if result.Error != nil {
return result.Error return result.Error
} }
@@ -50,7 +63,18 @@ func Open(dbPath string, adminMail string) error {
return nil return nil
} }
func createSubscriptionModels() []models.SubscriptionModel {
return []models.SubscriptionModel{
{
Name: "Keins",
Details: "Dieses Modell ist für Vereinsmitglieder, die keinen Wunsch haben, an dem Carhsharing teilzunehmen.",
HourlyRate: 999,
MonthlyFee: 0,
},
}
}
// TODO: Landing page to create an admin // TODO: Landing page to create an admin
func createAdmin(userMail string, subscriptionModelID uint) (*models.User, error) { func createAdmin(userMail string, subscriptionModelID uint) (*models.User, error) {
passwordBytes := make([]byte, 12) passwordBytes := make([]byte, 12)
_, err := rand.Read(passwordBytes) _, err := rand.Read(passwordBytes)
@@ -59,10 +83,8 @@ func createAdmin(userMail string, subscriptionModelID uint) (*models.User, error
} }
// Encode into a URL-safe base64 string // Encode into a URL-safe base64 string
password, err := base64.URLEncoding.EncodeToString(passwordBytes)[:12], nil password := base64.URLEncoding.EncodeToString(passwordBytes)[:12]
if err != nil {
return nil, err
}
hash, err := argon2id.CreateHash(password, argon2id.DefaultParams) hash, err := argon2id.CreateHash(password, argon2id.DefaultParams)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -76,14 +98,25 @@ func createAdmin(userMail string, subscriptionModelID uint) (*models.User, error
return &models.User{ return &models.User{
FirstName: "ad", FirstName: "ad",
LastName: "min", LastName: "min",
DateOfBirth: time.Now(), DateOfBirth: time.Now().AddDate(-20, 0, 0),
Password: hash, Password: hash,
Address: "Downhill 4", Address: "Downhill 4",
ZipCode: "9999", ZipCode: "99999",
City: "TechTown", City: "TechTown",
Phone: "0123455678",
Email: userMail, Email: userMail,
Status: constants.ActiveStatus, Status: constants.ActiveStatus,
RoleID: constants.Roles.Editor, RoleID: constants.Roles.Admin,
Membership: models.Membership{
Status: constants.DisabledStatus,
StartDate: time.Now(),
SubscriptionModelID: subscriptionModelID,
},
BankAccount: models.BankAccount{
AccountHolderName: "Niemand",
Bank: "Keine",
IBAN: "DE49700500000008447644", //fake
},
}, nil }, nil
} }

View File

@@ -31,9 +31,10 @@ type UserService struct {
Repo repositories.UserRepositoryInterface Repo repositories.UserRepositoryInterface
} }
func (service *UserService) UpdateUser(user *models.User) (*models.User, error) { func (service *UserService) UpdateUser(user *models.User, userRole int8) (*models.User, error) {
if err := validateUserData(user); err != nil { if err := validateUserData(user, userRole); err != nil {
logger.Error.Printf("Failed to validate user data: %v", err)
return nil, errors.ErrInvalidUserData return nil, errors.ErrInvalidUserData
} }
@@ -58,8 +59,8 @@ func (service *UserService) UpdateUser(user *models.User) (*models.User, error)
return updatedUser, nil return updatedUser, nil
} }
if err := validateUserData(user); err != nil {
func (service *UserService) RegisterUser(user *models.User) (uint, string, error) { func (service *UserService) RegisterUser(user *models.User) (uint, string, error) {
if err := validateUserData(user, user.RoleID); err != nil {
return http.StatusNotAcceptable, "", err return http.StatusNotAcceptable, "", err
} }
@@ -68,7 +69,6 @@ func (service *UserService) RegisterUser(user *models.User) (uint, string, error
user.Status = constants.UnverifiedStatus user.Status = constants.UnverifiedStatus
user.CreatedAt = time.Now() user.CreatedAt = time.Now()
user.UpdatedAt = time.Now() user.UpdatedAt = time.Now()
id, err := service.Repo.CreateUser(user) id, err := service.Repo.CreateUser(user)
if err != nil && strings.Contains(err.Error(), "UNIQUE constraint failed") { if err != nil && strings.Contains(err.Error(), "UNIQUE constraint failed") {
@@ -150,15 +150,23 @@ func (service *UserService) VerifyUser(token *string) (*models.User, error) {
return user, nil return user, nil
} }
func validateUserData(user *models.User) error { func validateUserData(user *models.User, userRole int8) error {
validate := validator.New() validate := validator.New()
validate.RegisterValidation("safe_content", utils.ValidateSafeContent)
if userRole == constants.Roles.Admin {
validate.RegisterValidation("membershipField", utils.ValidateToTrue)
validate.RegisterValidation("age", utils.ValidateToTrue)
validate.RegisterValidation("bic", utils.ValidateToTrue)
validate.RegisterValidation("subscriptionModel", utils.ValidateToTrue)
validate.RegisterValidation("iban", utils.ValidateToTrue)
} else {
validate.RegisterValidation("membershipField", utils.ValidateRequiredMembershipField)
validate.RegisterValidation("age", utils.AgeValidator) validate.RegisterValidation("age", utils.AgeValidator)
validate.RegisterValidation("bic", utils.BICValidator) validate.RegisterValidation("bic", utils.BICValidator)
validate.RegisterValidation("iban", utils.IBANValidator)
validate.RegisterValidation("subscriptionModel", utils.SubscriptionModelValidator) validate.RegisterValidation("subscriptionModel", utils.SubscriptionModelValidator)
validate.RegisterValidation("safe_content", utils.ValidateSafeContent) validate.RegisterValidation("iban", utils.IBANValidator)
validate.RegisterValidation("membershipField", utils.ValidateRequiredMembershipField) }
return validate.Struct(user) return validate.Struct(user)
} }