# TopJava Release Notes
### TopJava 26
- поÑинили ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð·Ð°Ð¿ÑоÑов на Ñоздание в Swagger ÑеÑез [ApiModelProperty](https://www.baeldung.com/spring-swagger-hide-field)
- в новой веÑÑии Data JPA `getById`->`getReferenceById`
- мелкие пÑавки
### TopJava 25
- попÑавил `NoHtmlValidator`: `Jsoup.clean().equals` -> `Jsoup.isValid`
- поÑинил `role VARCHAR NOT NULL`
- добавил нового ÑеÑÑового полÑзоваÑÐµÐ»Ñ `guest`
### TopJava 24
- migrate to LTS JDK 17
- add `AbstractBaseEntity.id()`
- fix for `User.registered`: `@Column(..., updatable = false)`
- add `@QueryHints` in `CrudUserRepository`
- add loggin in `RootController`
- fix `@Sql(.., , executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)` for controller tests after service tests
- rename `MATCHER` to `USER_MATCHER/MEAL_MATCHER`
- treat in `ActiveDbProfileResolver` attribute `profiles`
### TopJava 23
- migrate to JDK 16
- в новой spring-data-jpa `getOne` заменили на `getById`
- в UserUtil#prepareToSave ÑбÑал пÑовеÑÐºÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð½Ð° `hasText`. Ðа UI поле пÑовеÑÑеÑÑÑ Ð½Ð° `@NotBlank`
- `ProfileRestController#register` Ð´ÐµÐ»Ð°Ñ Ð¿Ð¾ пÑавилам REST (POST без "/register")
- css ÑÑили `data-...` Ñделал [low-case ÑеÑез деÑиÑÑ](https://stackoverflow.com/questions/36176474/548473)
- `TestMatcher` пеÑеименовал в `MatcherFactory`
- ÐÐ»Ñ Swagger UI помеÑил `AuthorizedUser` анноÑаÑией `@ApiIgnore`
### TopJava 22
- оÑиÑÑка паÑÐ¾Ð»Ñ `AuthorizedUser#userTo`
- заменил `@SafeHtml`, коÑоÑÑй Ñдалили из `hibernate.validator` на [Jsoup.clean](https://stackoverflow.com/a/68888601/548473)
- пеÑÐµÐ½ÐµÑ Ð·Ð°Ð¿ÑÐµÑ Ð½Ð° обновление admin/user в `UserService`
- пÑовеÑÐºÑ email на ÑникалÑноÑÑÑ Ð´Ð»Ñ update Ñ `id=null` в Ñеле запÑоÑа Ñделал на оÑнове анализа `HttpServletRequest.getRequestURI()`
- пÑовеÑÐºÑ ÐºÐ»Ð°ÑÑа в `classpath` в `Profiles#getActiveDbProfile` Ð´ÐµÐ»Ð°Ñ Ð½Ð° `org.springframework.util.ClassUtils#isPresent`
- Ñдалил `type="text/javascript"`
### TopJava 21
- **добавили докÑменÑиÑование REST API: Swagger**
- мигÑиÑовали на JDK 15 и иÑполÑзÑем ÑекÑÑовÑе блоки
- ÐÑÐ½ÐµÑ `produces = MediaType.APPLICATION_JSON_VALUE` на ÑÑÐ¾Ð²ÐµÐ½Ñ ÐºÐ¾Ð½ÑÑоллеÑов
- ÐÑавилÑно иÑполÑзÑем [глабалÑнÑе пеÑеменнÑе в js](https://stackoverflow.com/a/5064235/548473)
- ÐаÑеÑакÑоÑил `inputField.tag`
- ТеÑÑовÑе пеÑеменнÑе пеÑеименовал из UPPERCASE в camelCase
- Ðз ÑеÑÑов ÑеÑвиÑов ÑбÑал `throws Exception` (в IDEA болÑÑе не генеÑÑÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ)
- **ÐигÑиÑовали на Spring Boot 2.4.1**
### TopJava 20
- мигÑиÑовали на JDK 14
- в `@SafeHtml` запÑеÑаем веÑÑ html (`whitelistType = NONE`)
- в `topjava.common.js` в `makeEditable()` вмеÑÑо обÑекÑа конÑекÑÑ Ð¿ÐµÑÐµÐ´Ð°Ñ 3 паÑамеÑÑа
- в UI конÑÑоллеÑаÑ
ÑбÑал пÑеÑÐ¸ÐºÑ `ajax`
- из ÑеÑÑов ÑеÑвиÑов ÑбÑал `repository`. ÐÑи пÑовеÑке ÑеÑез `assertThrows` он не ÑÑебÑеÑÑÑ
- в `TestMatcher` ÑÑенаÑии ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñделал паÑамеÑÑизиÑÑемÑми (паÑÑеÑн ÑÑÑаÑегиÑ)
- в API добавили `/users/{id}/with-meals` (Ñм. [двÑнапÑавленнÑе оÑноÑениÑ](https://www.codeflow.site/ru/article/jackson-bidirectional-relationships-and-infinite-recursion))
- добавил `UserTestData.USER_WITH_MEALS_MATCHER` (пÑовеÑки полÑзоваÑÐµÐ»Ñ ÑÑÐ°Ð·Ñ Ñ ÐµÐ´Ð¾Ð¹) и конÑÑанÑÑ id `NOT_FOUND`
### TopJava 19
- ÐзменилаÑÑ Ð»Ð¾Ð³Ð¸ÐºÐ° Ð´Ð»Ñ Ð¸Ð½ÑеÑвалов вÑемени (иÑклÑÑаем `endTime`)
- Ðаменил ÑобÑÑвеннÑй `MessageUtil` велоÑипед на ÑпÑинговÑй `MessageSourceAccessor`
- Ð ÑолÑÑ
ÑбÑал пÑеÑикÑÑ `ROLE_` ([Role and GrantedAuthority](https://stackoverflow.com/a/19542316/548473))
- ÐобавилÑÑ ÑдобнÑй меÑод `int AbstractBaseEntity.id()`
- Ð¤Ð¸ÐºÑ `Location` в `ProfileRestController.register`
- Ð¤Ð¸ÐºÑ Ð²Ð°Ð»Ð¸Ð´Ð°Ñии `UniqueMailValidator` Ð´Ð»Ñ REST update без `user.id`
- Ðаменил `jdbc.initLocation` на полнÑй пÑÑÑ - IDEA не ÑÑгаеÑÑÑ
- РконÑигÑÑаÑии `cargo-maven2-plugin` Ñделал [индивидÑалÑнÑй конÑекÑÑ Ð¿ÑиложениÑ](https://stackoverflow.com/a/60797999/548473)
- ТеÑÑÑ
- Ðбновил даÑÑ ÐµÐ´Ñ Ð½Ð° 2020г.
- ÐаÑеÑакÑоÑил ÑеÑÑÑ ÑеÑвиÑов на Ñдаление - `NotFoundException` Ð¼Ð¾Ð¶ÐµÑ Ð±ÑоÑаÑÑÑÑ Ð¿Ñи `delete()`
- Ð ÑеÑÑаÑ
конÑÑоллеÑов веÑнÑлÑÑ Ðº ÑеализаÑии без обеÑÑки над `MockMvcRequestBuilders`
- ÐÐ»Ñ `InMemory` ÑеÑÑов подклÑÑÐ°Ñ ÑолÑко `inmemory.xml` (добавил ÑÑда необÑ
одимÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð¸Ð· `spring-app.xml`)
### TopJava 18
- Р`ErrorType` добавил `HttpStatus status`
- Ð PostgreSQL обнаÑÑжилаÑÑ Ð±Ð°Ð³Ð°: гÑаниÑное знаÑение `0:00` из-за оÑибок окÑÑÐ³Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¿Ð°Ð´Ð°ÐµÑ Ð² пÑедÑдÑÑий инÑеÑвал.
ÐоÑалÑ: вÑегда в ÑеÑÑаÑ
пÑовеÑÑйÑе гÑаниÑнÑе знаÑениÑ. Ðобавил ÑÑÐ¾Ñ ÑлÑÑай в ÑеÑÑовÑе даннÑе.
- Ðзменил `MealRepository.getBetween` (пÑÐ¸Ð½Ð¸Ð¼Ð°Ñ `@Nullable LocalDate`). ÐзменилиÑÑ ÑеализаÑии.
- ÐÑделил меÑод `UserService.prepareAndSave`
- Ð TO Ð¿Ð¾Ð»Ñ Ñделал `final`, иÑполÑзÑем `@ConstructorProperties`
- ÐÐ°ÐºÐ¾Ð½ÐµÑ Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð¸Ñовал опиÑание пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° ÑÑÑаниÑке вÑ
ода
- ÐÐ»Ñ Ð¿Ð¾Ð»ÐµÐ¹ ввода Ð´Ð°Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð» `autocomplete="off"`
- ÐÑи закÑÑÑии модалÑного окна закÑÑÐ²Ð°Ñ Ð¾ÐºÐ½Ð¾ оÑибок
- ТеÑÑÑ:
- **ÐмеÑÑо оÑиÑÑки кÑÑей пеÑед каждÑм ÑеÑÑом оÑклÑÑаем кÑÑи Ð´Ð»Ñ Ð²ÑеÑ
ÑеÑÑов**
- **ÐÑÐ½ÐµÑ Ð¾Ð±Ñий код ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½ÑÑоллеÑов в `AbstractControllerTest`. Ðод ÑеÑÑов знаÑиÑелÑно ÑокÑаÑилÑÑ**
- **Сделал ÑипизиÑованнÑй `TestMatchers