package controllers import ( "GoMembership/internal/models" "GoMembership/internal/services" "net/http" "github.com/gin-gonic/gin" "GoMembership/pkg/logger" ) type UserController struct { Service services.UserServiceInterface EmailService *services.EmailService ConsentService services.ConsentServiceInterface BankAccountService services.BankAccountServiceInterface MembershipService services.MembershipServiceInterface } type RegistrationData struct { User models.User `json:"user"` } func (uc *UserController) RegisterUser(c *gin.Context) { var regData RegistrationData if err := c.ShouldBindJSON(®Data); err != nil { logger.Error.Printf("Couldn't decode Userdata: %v", err) c.JSON(http.StatusBadRequest, gin.H{"error": "Couldn't decode userdata"}) return } logger.Info.Printf("registering user: %#v", regData.User) selectedModel, err := uc.MembershipService.GetModelByName(®Data.User.Membership.SubscriptionModel.Name) if err != nil { logger.Error.Printf("No subscription model found: %#v", err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Not a valid subscription model"}) return } regData.User.Membership.SubscriptionModel = *selectedModel // Register User id, token, err := uc.Service.RegisterUser(®Data.User) if err != nil { logger.Error.Printf("Couldn't register User: %v", err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Couldn't register User"}) return } regData.User.ID = id // Register Consents var consents = [2]models.Consent{ { FirstName: regData.User.FirstName, LastName: regData.User.LastName, Email: regData.User.Email, ConsentType: "TermsOfService", }, { FirstName: regData.User.FirstName, LastName: regData.User.LastName, Email: regData.User.Email, ConsentType: "Privacy", }, } for _, consent := range consents { _, err = uc.ConsentService.RegisterConsent(&consent) if err != nil { logger.Error.Printf("Couldn't register consent: %v", err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Couldn't register User-consent"}) return } } // Send notifications if err := uc.EmailService.SendVerificationEmail(®Data.User, &token); err != nil { logger.Error.Printf("Failed to send email verification email to user: %v", err) // Proceed without returning error since user registration is successful } // Notify admin of new user registration if err := uc.EmailService.NotifyAdminOfNewUser(®Data.User); err != nil { logger.Error.Printf("Failed to notify admin of new user registration: %v", err) // Proceed without returning error since user registration is successful } c.JSON(http.StatusCreated, gin.H{ "status": "success", "id": regData.User.ID, }) } func (uc *UserController) VerifyMailHandler(c *gin.Context) { token := c.Query("token") if token == "" { logger.Error.Println("Missing token to verify mail") c.HTML(http.StatusBadRequest, "verification_error.html", gin.H{"ErrorMessage": "Missing token"}) return } user, err := uc.Service.VerifyUser(&token) if err != nil { logger.Error.Printf("Cannot verify user: %v", err) c.HTML(http.StatusUnauthorized, "verification_error.html", gin.H{"ErrorMessage": "Emailadresse wurde schon bestätigt. Sollte dies nicht der Fall sein, wende Dich bitte an info@carsharing-hasloh.de."}) return } membership, err := uc.MembershipService.FindMembershipByUserID(user.ID) if err != nil { logger.Error.Printf("Cannot get membership of user %v: %v", user.ID, err) c.HTML(http.StatusInternalServerError, "verifiction_error.html", gin.H{"ErrorMessage": "Nutzer konnte nicht gefunden werden.. Merkwürdig.. wende Dich bitte an info@carsharing-hasloh.de."}) return } uc.EmailService.SendWelcomeEmail(user, membership) c.HTML(http.StatusOK, "verification_success.html", gin.H{"FirstName": user.FirstName}) } /* func (uc *UserController) LoginUser(w http.ResponseWriter, r *http.Request) { var credentials struct { Email string `json:"email"` Password string `json:"password"` } user, err := services.UserService.AuthenticateUser(credentials.Email, credentials.Password) if err != nil { http.Error(w, err.Error(), http.StatusUnauthorized) return } json.NewEncoder(w).Encode(user) } */ /* func (uc *UserController) GetUserID(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { http.Error(w, "Invalid user ID", http.StatusBadRequest) return } user, err := services.UserService.GetUserByID(id) if err != nil { http.Error(w, "User not found: "+err.Error(), http.StatusNotFound) } } */