Skip to content

Latest commit

 

History

History
277 lines (253 loc) · 26 KB

ReleaseNotes.md

File metadata and controls

277 lines (253 loc) · 26 KB

TopJava Release Notes

Topjava 25

  • в NoHtmlValidator делаю проверку через Jsoup.isValid
  • в user_roles.role добавил NOT NULL
  • в тестах добавил 3-го пользователя Guset без ролей и еды

Topjava 24

  • migrate to JDK 17
  • добавил логирование в RootController
  • в AbstractServiceTest популирование БД делаю после теста (executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD). Если последние тесты на сервисы портят БД, тесты на контроллеры могут упасть
  • в ActiveDbProfileResolver добавил парсинг profiles
  • добавил @QueryHint HINT_PASS_DISTINCT_THROUGH в реализацию Data JPA

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 через дефисы
  • TestMatcher переименовал в MatcherFactory
  • Для Swagger UI пометил AuthorizedUser аннотацией @ApiIgnore

Topjava 22

  • очистка пароля AuthorizedUser#userTo
  • заменил @SafeHtml, который удалили из hibernate.validator на Jsoup.clean
  • перенес запрет на обновление 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
  • Зарефакторил 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 (см. двунаправленные отношения)
  • добавил UserTestData.USER_WITH_MEALS_MATCHER (проверки пользователя сразу с едой) и константу id NOT_FOUND

Topjava 19

  • Изменилась логика для интервалов времени (исключаем endTime)
  • Заменил собственный MessageUtil велосипед на спринговый MessageSourceAccessor
  • В ролях убрал префиксы ROLE_ (Role and GrantedAuthority)
  • Добавился удобный метод int AbstractBaseEntity.id()
  • Фикс Location в ProfileRestController.register
  • Фикс валидации UniqueMailValidator для REST update без user.id
  • Заменил jdbc.initLocation на полный путь - IDEA не ругается
  • В конфигурации cargo-maven2-plugin сделал индивидуальный контекст приложения
  • Тесты
    • Обновил даты еды на 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<T> для проверки результатов тестов. В классах UserTestData и MealTestData создаю его инстансы с заданным типом и методикой сравнения.
    • В тестах delete и create проверяю результат напрямую (не через getAll)

Topjava 17

  • Удалил Impl из названий репозиториев
  • Удалил интерфейсы к сервисам, использую классы
  • Добавил AdminRestController.enable, вызов через PATCH метод
  • Добавил валидацию для jdbc через Bean Validation API
  • Перенес работу в UI с профилем из RootController в ProfileUIController
  • SLF4JBridgeHandler инициализирую только в профиле postgres

Topjava 16

Topjava 15

  • Миграция на Servlet API 4.0 / Tomcat 9.x
  • Миграция на JDK11
  • JUnit5 fix: junit-platform-surefire-provider не нужен
  • Рефакторинг тестов:
    • в RootControllerTest.testUsers для проверки используем AssertionMatcher адаптер
    • вместо content().json() от jsonassert десериализуем json и используем сравнения через AssertJ
  • В javascript место глабальных переменных и одинаковой функции обновления таблицы задаю их в объекте контекст, который передаю в makeEditable() как параметр
  • Починил back в браузере после логина. Кнопки входа и регистрации отображаю только для isAnonymous()

Topjava 14

  • Миграция на JUnit 5
  • Для измерения времени в тестах использую Spring StopWatch
  • SimpleJdbcInsert и NamedParameterJdbcTemplate конструируются (и берут настройки) из jdbcTemplate
  • AuthorizedUser зарефакторился в SecurityUtil
  • В javascript заменил var на let/const. Поддержка 95% браузеров
  • Подправил UI фильтрации и заголовка страниц, добавилась кнопка Cancel в профиль
  • Починил баг в FireFox: пустой ответ по ajax
  • Сделал вход в приложение при нажании кнопок Зайти как ...
  • Добавил регистрацию пользователя по REST
  • Преименовал js файлы согласно javascript filename naming convention
  • Сделал проверку startTime/endTime на фильтре времени (после обновления datetimepicker до 2.5.20)

Topjava 13

Topjava 12

Topjava 11

  • добавил

  • рефакторинг

    • починил коммит формы по cancel (history.back()) в FireFox
    • заменил неработающий DependencyCi на VersionEye c проверкой зависимостей на uptodate
    • починил CrudUserRepository.getWithMeals() через @EntityGraph. С неколькими ролями (у админа) еда дублируется
    • починил тесты контроллеров с профилем JDBC (JpaUtil отсутствует в контексте JDBC)
    • переименовал meal.jsp/user.jsp в mealForm.jsp/userForm.jsp
    • в InMemoryMealRepositoryImpl.save() сделал update атомарным
    • переименовал методы сервисов save в create
    • переименовал и cделал классы BaseEntity и NamedEntity абстрактными
    • обновил Noty и API с ним до 3.1.0. Добавил glyphicon в сообщения Noty
    • заменил MATCHER_WITH_EXCEED на валидацию через JSONassert.
    • поменял Deprecated валидаторы org.hibernate.validator.constraints на javax.validation.constraints
    • убрал пароль из результатов REST через @JsonProperty READ_ONLY / WRITE_ONLY. Тесты на REST пришлось починить добавлением добавлением в JSON пароля как дополнительного параметра (JsonUtil.writeWithExtraProps)
    • убрал JSON View и сделал преобразование времени на UI с помощью jQuery converters
    • поменял группу валидации по умолчанию при сохранении через JPA. Теперь все валидаторы в модели работаю по умолчанию (groups не требуется).
    • Добавил в ErrorInfo тип ошибки ErrorType + i18n.
  • правки

    • переименовал ModelMatcher в BeanMatcher и починил: можно сравнивать только упорядоченные коллекции (List)
    • поменял зависимость org.hibernate:hibernate-validator на org.hibernate.validator:hibernate-validator (warning при сборке)

Topjava 10

Topjava 9

  • добавил
  • рефакторинг
    • переименовал TimeUtil в DateTimeUtil
    • переименовал ExceptionUtil в ValidationUtil
    • заменил валидацию @NotEmpty на @NotBlank
    • заменил CascadeType.REMOVE на @OnDelete
    • изменил JdbcUserRepositoryImpl.getAll()
    • обновил jQuery до 3.x, исключил из зависимостей webjars ненужные jQuery
    • cделал загрузку скриптов асинхронной
    • фильтр еды сделал в Bootstrap Panels
    • вместо Persistable ввел интерфейс HasId и наследую от него как Entity, так и TO
    • сделал универсальную обработку исключений дублирования email и dateTime

Topjava 8

  • добавил:
  • удалил зависимость jul-to-slf4j
  • рефакторинг
    • переименовал все классы UserMeal** в Meal**, JSP
    • переименовал LoggedUser в AuthorizedUser
    • починил работа с PK Hibernate в случае ленивой загрузки (баг HHH-3718)
    • поменял в BaseEntity equals/hashCode/implements Persistable
    • в InMemoryMealRepositoryImpl выделил метод getAllStream
    • перенес проверки пердусловий Assert из InMemory репозиториев в сервисы
    • переименовал классы Proxy* на более адекватные Crud*
    • поменял реализацию JpaMealRepositoryImpl.get, добавил в JPA модель @BatchSize
    • вместо @RequestMapping ввел Spring 4.3 аннотации @Get/Post/...Mapping
    • поменял авторизацию в тестах не-REST контроллеров
    • перенес вызовы UserUtil.prepareToSave из AbstractUserController в UserServiceImpl
    • зарефакторил обработку ошибок (ExceptionInfoHandler)

Topjava 7

Topjava 3-6

  • добавил
    • выпускной проект
    • в таблицу meals составной индекс
    • константы Profiles.ACTIVE_DB, Profiles.DB_IMPLEMENTATION
    • проверки и тесты на NotFound для UserMealService.getWithUser и UserService.getWithMeals
    • в MockMvc фильтр CharacterEncodingFilter
    • защиту от межсайтовой подделки запроса, видео Межсайтовая подделка запроса (CSRF)
    • ограничение на диапазон дат для фильтра еды
  • рефакторинг
    • UserMealsUtil, ProfileRestController, компараторов в репозитоии
    • LoggedUser отнаследовал от org.springframework.security.core.userdetails.User
    • переименовал DbTest в AbstractServiceTest и перенес сюда @ActiveProfiles
    • сделал выполнение скриптов в тестах через аннотацию @Sql
    • вместо использования id и селектора сделал обработчик onclick
    • изменил формат ввода даты в форме без 'T'
  • убрал
  • обновил
    • Hibernate до 5.x и Hibernate Validator, добавились новые зависимости и jackson-datatype-hibernate5
    • datatables API (1.10)
    • Postgres драйвер. Новый драйвер поддерживает Java 8 Time API, разделил реализацию JdbcMealRepositoryImpl на Java8 (Postgresql) и Timestamp (HSQL)