87 lines
1.7 KiB
Go
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)
|
|
}
|