Mam aplikacje napisaną w spring-boot oraz frontend w angularze. Do tej pory jak chciałem sprawdzić poprawność nadesłanych danych robiłem to w serwisie a zwracanym obiektem był zawsze wrapper (dwa pola: data - zwracany obiekt, status - wynik operacji). Np. przy tworzeniu użytkownika wykryłem że login jest zajęty to zwracałem: {data: null, status "USER_LOGIN_IS_TAKEN"} a jeśli wszystko OK to zwracałem: {data: {USER_OBJECT},status "OK"}. Czyli http code był zawsze 200. We froncie moge z łatwością wyświetlać odpowiednie komunikaty np. w formularzach.
Dzisiaj przeczytałem te dwa artykuły:
https://restfulapi.net/http-methods/
https://www.baeldung.com/javax-validation
Według tych artykułów moje rozwiązanie nie jest dobre ponieważ powinienem operować na http code oraz mogę (chce) wykorzystać javax-validation.
W 2. artykule jest opisane jak zrobić walidacje czy pole jest uzupełnione itp. ale nie ma np. czy taki użytkownik istnieje.
Dalsze rozważania ponumeruje żeby łatwiej się odpowiadało:
- Walidacja
Czyli tak dodaje adnotacje i w kontrolerze daje @Valid. To mi sprawdzi tylko te podstawowe rzeczy jak np. czy nie jest null itp.
Potem muszę w serwisie sprawdzić czy taki użytkownik istnieje. Chciałbym dostać jakiś unikatowy błąd (o tym w punkcie 2).
Tutaj pytanie jak to robić? - bo widzę dwie opcje:
- Strzelam do bazy sprawdzam jak jest zwracam błąd a jak nie ma to strzelam drugi raz żeby dodać
- Próbuje zapisać użytkownika dostaje exception (bo jest constrain na bazie) - jak go złapać? Dostane jakiś konkret żebym mógł stwierdzić co poszło nie tak? Jakie exceptiony mogę dostać? - gdzie znajdę ich liste?
- Zwracany błąd
Według pierwszego artykułu mam zwracać odpowiedni kod. Chciałbym do tego też zwracać odpowiednią wiadomość np. "USER_LOGIN_IS_TAKEN".
Tutaj dwa pytania:
- Jak zwracać taką odpowiedz?
- Jak ustawiać status
Chwiałbym osiągnąć coś takiego że zwracam normalne dto czyli od razu użytkownika jeśli jest OK. A jak jest jakiś błąd to chciałbym dostać informacje co poszło nie tak.
- Przy okazji zapytam jeszcze o nazewnictwo url przy rest
Chodzi mi o jeden przypadek.
Użytkownika można aktywować i dezaktywować. Jest to zmiana wartości pola status.
Pytania:
- Jak metoda?
- Jaki url?
- jedna metoda - changeStatus/editUser / czy dwie - activate() / deactivate()
Mogę to potraktować jako edycje użytkownika i uzyć PUT i wsyłać całego użytkownika na 'users/{id}' albo potraktować to jako edycje częściową i wysłać tylko część - wtedy było by to PATCH i wysyłam tylko status pod 'users/{id}' albo 'users/{id}' (hmm jak to zwaliduję? Jak zapisze tzn wypada zrobić ładny update ale to tego potrzebuje całego użytkownika? )
Mam nadzieję że ktoś znajdzie chwilke czasu na odpowiedz. Z niecierpliwością czekam na odpowiedź