Files
booking/package/backend/internal/user/handler.go
T
2026-06-03 02:17:07 +03:00

87 lines
1.7 KiB
Go

package user
import (
"errors"
"encoding/json"
"fmt"
"log"
"net/http"
"net/mail"
"github.com/go-chi/chi/v5"
"github.com/jackc/pgx/v5/pgxpool"
)
type Handler struct {
service Service
}
func NewHandler(pool *pgxpool.Pool) Handler {
return Handler {
service: NewService(NewRepo(pool)),
}
}
type RegisterRequest struct {
Email string `json:"email"`
Password string `json:"password"`
}
type RegisterValidationError struct {
message string
}
func (e RegisterValidationError) Error() string {
return e.message
}
func (req RegisterRequest) Validate() error {
if _, err := mail.ParseAddress(req.Email); err != nil {
return RegisterValidationError {
message: "invalid email",
}
}
if len(req.Password) < 10 {
return RegisterValidationError {
message: "password is too short",
}
}
return nil
}
func (h Handler) RegisterHandler(w http.ResponseWriter, r *http.Request) {
var req RegisterRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "invalid json", http.StatusBadRequest)
return
}
if err := req.Validate(); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
err := h.service.Register(r.Context(), req.Email, req.Password)
if err != nil {
log.Println("could not register: ", err)
switch {
case errors.Is(err, ErrEmailAlreadyExists):
http.Error(w, "email already exists", http.StatusConflict)
default:
http.Error(w, "internal error", http.StatusInternalServerError)
}
return
}
w.WriteHeader(http.StatusCreated)
fmt.Fprintln(w, "success")
}
func (h Handler) AttachHandlers(router chi.Router) {
router.Post("/register", h.RegisterHandler)
// router.Post("/login", LoginHandler)
}