package routes import ( "errors" "net/http" "git.artlef.fr/PersonalLibraryManager/internal/appcontext" "git.artlef.fr/PersonalLibraryManager/internal/dto" "git.artlef.fr/PersonalLibraryManager/internal/model" "git.artlef.fr/PersonalLibraryManager/internal/myvalidator" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" ) func PostSignupHandler(ac appcontext.AppContext) { if ac.Config.DisableRegistration { myvalidator.ReturnErrorsAsJsonResponse(&ac, myvalidator.HttpError{ StatusCode: http.StatusForbidden, Err: errors.New("Registration has been disabled on this instance."), }) return } var user dto.UserSignup err := ac.C.ShouldBindJSON(&user) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } userDb, err := userWsToDb(user) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } var existingUser model.User err = ac.Db.Where("name = ?", user.Username).First(&existingUser).Error if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } if err == nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, myvalidator.HttpError{ StatusCode: http.StatusInternalServerError, Err: errors.New("An user with this name already exists."), }) return } err = ac.Db.Model(&model.User{}).Save(&userDb).Error if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } ac.C.String(200, "Success") } func userWsToDb(u dto.UserSignup) (model.User, error) { user := model.User{ Name: u.Username, Password: "", } hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost) if err != nil { return user, err } user.Password = string(hashedPassword) return user, nil }