diff --git a/internal/controllers/user_controller.go b/internal/controllers/user_controller.go index c7d01c1..fc04322 100644 --- a/internal/controllers/user_controller.go +++ b/internal/controllers/user_controller.go @@ -7,6 +7,7 @@ import ( // "github.com/gorilla/mux" "net/http" // "strconv" + "GoMembership/internal/utils" "GoMembership/pkg/logger" ) @@ -20,29 +21,38 @@ func NewUserController(service services.UserService, emailService *services.Emai } func (uc *UserController) RegisterUser(w http.ResponseWriter, r *http.Request) { - logger.Info.Println("registering user") + rh := utils.NewResponseHandler(w) + var user models.User if err := json.NewDecoder(r.Body).Decode(&user); err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) + // http.Error(w, err.Error(), http.StatusBadRequest) logger.Error.Printf("Couldn't decode Userdata: %v", err) + rh.RespondWithError(http.StatusBadRequest, "Couldn't decode userdata") return } - if err := uc.service.RegisterUser(&user); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) + id, err := uc.service.RegisterUser(&user) + if err != nil { + // http.Error(w, err.Error(), http.StatusInternalServerError) logger.Error.Printf("Couldn't register User: %v", err) + rh.RespondWithError(http.StatusInternalServerError, "Couldn't register User") return } // Send welcome email to the user if err := uc.emailService.SendWelcomeEmail(user); err != nil { logger.Error.Printf("Failed to send welcome email to user: %v", err) + // rh.RespondWithError(http.StatusServiceUnavailable, "User creation succeeded, but failed to send welcome email to user") } // Notify admin of new user registration if err := uc.emailService.NotifyAdminOfNewUser(user.Email); err != nil { logger.Error.Printf("Failed to notify admin of new user registration: %v", err) + // rh.RespondWithError(http.StatusServiceUnavailable, "User creation succeeded, but failed to notify admin of new user registration") } - w.WriteHeader(http.StatusCreated) + rh.RespondWithJSON(http.StatusCreated, map[string]interface{}{ + "status": "success", + "id": id, + }) } /* func (uc *UserController) LoginUser(w http.ResponseWriter, r *http.Request) { diff --git a/internal/repositories/user_repository.go b/internal/repositories/user_repository.go index dd9eb2c..c444a46 100644 --- a/internal/repositories/user_repository.go +++ b/internal/repositories/user_repository.go @@ -7,11 +7,26 @@ import ( ) type UserRepository interface { - CreateUser(user *models.User) error + CreateUser(user *models.User) (int64, error) FindUserByID(id int) (*models.User, error) FindUserByEmail(email string) (*models.User, error) } +func (repo *userRepository) CreateUser(user *models.User) (int64, error) { + query := "INSERT INTO users (first_name, last_name, email, password, salt, iban, bic, mandate_reference, mandate_date_signed, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + result, err := repo.db.Exec(query, user.FirstName, user.LastName, user.Email, user.Password, user.Salt, user.IBAN, user.BIC, user.MandateReference, user.MandateDateSigned, user.CreatedAt, user.UpdatedAt) + if err != nil { + return -1, err + } + + lastInsertID, err := result.LastInsertId() + if err != nil { + return -1, err + } + + return lastInsertID, err +} + type userRepository struct { db *sql.DB } @@ -20,12 +35,6 @@ func NewUserRepository(db *sql.DB) UserRepository { return &userRepository{db} } -func (repo *userRepository) CreateUser(user *models.User) error { - query := "INSERT INTO users (first_name, last_name, email, password, salt, iban, bic, mandate_reference, mandate_date_signed, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" - _, err := repo.db.Exec(query, user.FirstName, user.LastName, user.Email, user.Password, user.Salt, user.IBAN, user.BIC, user.MandateReference, user.MandateDateSigned, user.CreatedAt, user.UpdatedAt) - return err -} - func (repo *userRepository) FindUserByID(id int) (*models.User, error) { var user models.User query := "SELECT id, first_name, last_name, email, iban, bic, mandate_reference FROM users WHERE id = ?" diff --git a/internal/services/user_service.go b/internal/services/user_service.go index 4b4fe5c..d19ad89 100644 --- a/internal/services/user_service.go +++ b/internal/services/user_service.go @@ -11,7 +11,7 @@ import ( ) type UserService interface { - RegisterUser(user *models.User) error + RegisterUser(user *models.User) (int64, error) // AuthenticateUser(email, password string) (*models.User, error) } @@ -23,16 +23,16 @@ func NewUserService(repo repositories.UserRepository) UserService { return &userService{repo} } -func (service *userService) RegisterUser(user *models.User) error { +func (service *userService) RegisterUser(user *models.User) (int64, error) { salt := make([]byte, 16) if _, err := rand.Read(salt); err != nil { - return err + return -1, err } user.Salt = base64.StdEncoding.EncodeToString(salt) hashedPassword, err := HashPassword(user.Password, user.Salt) if err != nil { - return err + return -1, err } user.Password = string(hashedPassword) user.CreatedAt = time.Now() diff --git a/internal/utils/response_handler.go b/internal/utils/response_handler.go new file mode 100644 index 0000000..f271e7e --- /dev/null +++ b/internal/utils/response_handler.go @@ -0,0 +1,35 @@ +package utils + +import ( + "encoding/json" + "net/http" +) + +type ResponseHandler struct { + Writer http.ResponseWriter +} + +type Response struct { + Status string `json:"status"` + Message string `json:"message"` +} + +func NewResponseHandler(w http.ResponseWriter) *ResponseHandler { + return &ResponseHandler{Writer: w} +} + +func (rh *ResponseHandler) RespondWithError(code int, message string) { + response := Response{ + Status: "error", + Message: message, + } + rh.Writer.Header().Set("Content-Type", "application/json") + rh.Writer.WriteHeader(code) + json.NewEncoder(rh.Writer).Encode(response) +} + +func (rh *ResponseHandler) RespondWithJSON(code int, payload interface{}) { + rh.Writer.Header().Set("Content-Type", "application/json") + rh.Writer.WriteHeader(code) + json.NewEncoder(rh.Writer).Encode(payload) +}