100 lines
2.8 KiB
Go
100 lines
2.8 KiB
Go
package auth
|
|
|
|
import (
|
|
"RenewCMS/api/pkg/apperr"
|
|
"RenewCMS/api/pkg/claims"
|
|
"RenewCMS/api/pkg/publicuser"
|
|
validator "RenewCMS/api/pkg/validator"
|
|
"RenewCMS/internal/domain/user"
|
|
"RenewCMS/internal/infrastructure/useCases"
|
|
"encoding/json"
|
|
"errors"
|
|
"net/http"
|
|
)
|
|
|
|
type VerificationHandler struct {
|
|
VerifyUseCase *useCases.VerifyUserUseCase
|
|
CancelUseCase *useCases.CancelRegistrationUseCase
|
|
IsProduction bool
|
|
}
|
|
|
|
type VerifyCredentials struct {
|
|
Code string `json:"code" validate:"required"`
|
|
}
|
|
|
|
func NewVerificationHandler(verify *useCases.VerifyUserUseCase, cancel *useCases.CancelRegistrationUseCase, isProduction bool) *VerificationHandler {
|
|
return &VerificationHandler{
|
|
VerifyUseCase: verify,
|
|
CancelUseCase: cancel,
|
|
IsProduction: isProduction,
|
|
}
|
|
}
|
|
|
|
func (h *VerificationHandler) Verify(w http.ResponseWriter, r *http.Request) {
|
|
var credentials VerifyCredentials
|
|
err := json.NewDecoder(r.Body).Decode(&credentials)
|
|
if err != nil {
|
|
http.Error(w, apperr.BodyErrorMessage, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
err = validator.Validate.Struct(credentials)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
userId, ok := claims.UserId(r)
|
|
if !ok {
|
|
http.Error(w, apperr.UnauthorizedErrorMessage, http.StatusUnauthorized)
|
|
return
|
|
}
|
|
|
|
verifiedUser, err := h.VerifyUseCase.Verify(r.Context(), userId, credentials.Code)
|
|
if err != nil {
|
|
if errors.Is(err, user.ErrUserNotFound) {
|
|
http.Error(w, apperr.UnauthorizedErrorMessage, http.StatusUnauthorized)
|
|
return
|
|
}
|
|
if errors.Is(err, user.ErrInvalidVerificationCode) || errors.Is(err, user.ErrVerificationCodeExpired) {
|
|
http.Error(w, apperr.VerificationFailedErrorMessage, http.StatusForbidden)
|
|
return
|
|
}
|
|
http.Error(w, "Internal server error", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
body, err := json.Marshal(publicuser.New(verifiedUser))
|
|
if err != nil {
|
|
http.Error(w, "Internal server error", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
_, _ = w.Write(body)
|
|
}
|
|
|
|
func (h *VerificationHandler) CancelRegistration(w http.ResponseWriter, r *http.Request) {
|
|
userId, ok := claims.UserId(r)
|
|
if !ok {
|
|
http.Error(w, apperr.UnauthorizedErrorMessage, http.StatusUnauthorized)
|
|
return
|
|
}
|
|
|
|
err := h.CancelUseCase.CancelRegistration(userId)
|
|
if err != nil {
|
|
if errors.Is(err, user.ErrUserNotFound) {
|
|
http.Error(w, apperr.UnauthorizedErrorMessage, http.StatusUnauthorized)
|
|
return
|
|
}
|
|
if errors.Is(err, user.ErrAlreadyVerified) {
|
|
http.Error(w, apperr.AlreadyVerifiedErrorMessage, http.StatusForbidden)
|
|
return
|
|
}
|
|
http.Error(w, "Internal server error", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
removeJwtCookie(w, h.IsProduction)
|
|
message, _ := json.Marshal(map[string]any{"message": "Registration cancelled! Account deleted and HTTPonly jwt cookie cleared"})
|
|
_, _ = w.Write(message)
|
|
}
|