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(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) }