User backend registration

This commit is contained in:
Leons Aleksandrovs
2025-07-05 22:17:14 +03:00
parent 8916f3e394
commit 66ed77e758
6 changed files with 100 additions and 13 deletions
+47 -6
View File
@@ -1,34 +1,75 @@
package controllers
import (
"backend/models"
"backend/utils"
"errors"
"fmt"
"log"
"net/http"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"github.com/jackc/pgx/v5/pgconn"
)
type User struct{}
type RegisterForm struct {
Email string `json:"email" validate:"required,email"`
Name string `json:"name" validate:"required"`
Password string `json:"password" validate:"required"`
RepeatPassword string `json:"repeatPassword" validate:"required"`
Name string `json:"name" validate:"required,min=2,max=50"`
Password string `json:"password" validate:"required,min=8"`
RepeatPassword string `json:"repeatPassword" validate:"required,min=8,eqfield=Password"`
}
func (u *User) Register(c *gin.Context) {
// Receive data from frontend, check if data is okay, hash password, call model
var data RegisterForm
if err := c.ShouldBindJSON(&data); err != nil {
// TODO: Handle error
utils.Error(c, err.Error(), http.StatusInternalServerError)
}
// Validate data
validate := validator.New()
if err := validate.Struct(data); err != nil {
// Handle error
log.Printf("[ERROR]: %v", err.Error())
utils.Error(c, err.Error(), http.StatusBadRequest)
return
}
// fmt.Println(data)
// Hash password
hash, err := utils.HashPassword(data.Password)
if err != nil {
utils.Error(c, err.Error(), http.StatusInternalServerError)
return
}
// Insert into database
userMod := models.User{}
if err := userMod.Create(data.Email, data.Name, hash); err != nil {
// Find out postgres error
var pgErr *pgconn.PgError
if !errors.As(err, &pgErr) {
// Unknown error
utils.Error(c, fmt.Sprintf("[UNEXPECTED DB ERROR] %v", err.Error()), http.StatusInternalServerError)
return
}
// Postgres error
log.Printf("[ERROR] Postgres code: %s", pgErr.Code)
if pgErr.Code == "23505" {
// UNIQUE constraint violation (EMAIL TAKEN)
utils.Error(c, "Email already exists", http.StatusBadRequest)
return
}
// Unknown error
utils.Error(c, fmt.Sprintf("[UNKNOWN ERROR] %v", err.Error()), http.StatusInternalServerError)
return
}
// Return success
utils.Success(c, gin.H{
"message": "Successfully registered",
})
}