Ja osobiście zrobilem validacje na backendzie, w taki sposób ze skleiłem customowego validatora:
RegisterValidator
Następnie ten validator validator jest używany w controllerze przy rejestracji:
AuthController
Gdzie jak coś sie posypie to jest rzucany exception który następnie jest tłumaczony na odpowiedni response.
Jeżeli chciałbyś faktycznie to na frontendzie zrobić co wg mnie troche mija sie z celem to jedynym sensownym rozwiązaniem mogło by być:
Kopiuj
GET users/{username}
Tylko tutaj fajnie by było dodać case'a który robił by jakaś walidacje czy jeżeli masz prawo do obejrzenia profilu użytkownika to zwraca ci DTO całe (również zawierające poufne dane typu hasło itp), a jeżeli nie to zwróciłoby jakieś okrojone i wtedy we froncie mógłbyś sprawdzić czy sie matchują jakieś pola i zwrócić informacje o błędzie.
Ewentualnie coś takiego jeszcze:
Kopiuj
GET publicprofiles/{username}
I wtedy ten endpoint zwracałby pola które musisz sprawdzić przy rejestracji. (PS: Obydwa sposoby są co najmniej słabe).
No tyle że jednak lepszym rozwiązaniem jest po prostu wysłanie POST'a do rejestracji i jak wróci ci status odpowiedzi i ResponseBody po prostu sprawdzic czy status jest 404 i wtedy odczytać z ResposeBody opis błedów, ewentualnie 201 i wtedy wyciągnąć z headera location link i wypluć użytkownikowi.
**Teraz zauważ że w przypadku pierwszych 2 sposobów aby użytkownik się zarejestrował i dał mu odpowiedź musi zawsze polecieć 2 zapytania do backendu. Co jest tragicznym rozwiązaniem. **Dlatego że może wystąpić sytuacja że jak już pobierzesz te profile będziesz sprawdzał czy istnieje juz cos takiego na backendzie i w tym czasie inny użytkownik zrobi to samo, albo nawet zaczął przed tobą. I wystąpi coś na wzór wyścigu. Między twoim pierwszym i drugim requestem poleci POST utworzenia użytkownika o danych które do tej pory nie istniały. Ty będziesz posiadał informacje że użytkownik o tych danych może być utworzony, a tutaj się w miedzy czasie ktos zarejestrował tymi danymi. Wyślesz POST'a i dostaniesz albo InternalServerError albo inna odpowiedź jeżeli ustawiłeś sobie mapowanie Internali (chyba że nie ustawiłeś sobie constrains'ów na bazie na unique). Dlatego lepszym rozwiązaniem jest jednak korzystanie z jedno krokowej rejestracji.