Mam w robocie typowego CRUDa w Springu (minuta ciszy dla mnie), w Javie 11. CRUD robi ekspansję za ocean, więc trzeba zaimplementować wybór strefy czasowej użytkownika i operować poprawnie na datach i czasach. Problemów z datami było już sporo przy jednej strefie czasowej, a operacje na nich to smutek rozpacz i cierpienie, bo wszystkie daty są trzymane w OffsetDateTime, a z frontendu przychodzi czas lokalny. Jest to ogarnięte jakimś dzikim voodoo w stylu "odejmij godzinę, dodaj 3 minuty, podskocz na lewej nodze a jak zrobisz to ładnie, to zadziała".
No i rozgorzała w teamie dyskusja, jak to powinno być zrobione, czy w encjach powinno być OffsetDateTime, czy nie, czy konwertować OffsetDateTime z encji na LocalDateTime, czy nie. Nagle trzeba użyć Javy, więc wiadomo, pod górkę. Ludzie mają jakieś tam opinie, ale średnio im ufam, bo widziałam już w ich wykonaniu return null;
, operacje na pieniądzach na Double
i 20 dependencies w jednym Service, a także inne trololo
typowe dla programistów Springa, którzy lubią żyć na krawędzi.
Moje pytanie brzmi: Jak to powinno być zrobione, żeby było dobrze - tak by the book
? Jaki typ w encjach? Jaki typ w service? Co zwracać w DTOsach frontowi? Mamy scheduler, który na przykład wysyła przypomnienia użytkownikom, jeśli tego dnia upływa termin zrobienia czegoś, jak to ogarnąć przy różnych strefach czasowych?
Mój koncept jest taki: w bazie wszystko w UTC, w service operujemy na LocalDateTime z UTC, a na koniec zwracamy frontowi LocalDateTime ze strefą użytkownika. Ale czy to wymaga, żeby migrować encje na LocalDateTime? Albo może wręcz przeciwnie, niech nas ręka boska broni?