- в
NoHtmlValidator
делаю проверку черезJsoup.isValid
- в
user_roles.role
добавилNOT NULL
- в тестах добавил 3-го пользователя
Guset
без ролей и еды
- migrate to JDK 17
- добавил логирование в
RootController
- в
AbstractServiceTest
популирование БД делаю после теста (executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD
). Если последние тесты на сервисы портят БД, тесты на контроллеры могут упасть - в
ActiveDbProfileResolver
добавил парсингprofiles
- добавил
@QueryHint HINT_PASS_DISTINCT_THROUGH
в реализацию Data JPA
- 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
- очистка пароля
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"
- добавили документирование REST API: Swagger
- мигрировали на JDK 15 и используем текстовые блоки
- Вынес
produces = MediaType.APPLICATION_JSON_VALUE
на уровень контроллеров - Правильно используем глабальные переменные в js
- Зарефакторил
inputField.tag
- Тестовые переменные переименовал из UPPERCASE в camelCase
- Из тестов сервисов убрал
throws Exception
(в IDEA больше не генерятся по умолчанию) - Мигрировали на Spring Boot 2.4.1
- мигрировали на 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
(проверки пользователя сразу с едой) и константу idNOT_FOUND
- Изменилась логика для интервалов времени (исключаем
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
)
- В
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
)
- Удалил
Impl
из названий репозиториев - Удалил интерфейсы к сервисам, использую классы
- Добавил
AdminRestController.enable
, вызов через PATCH метод - Добавил валидацию для jdbc через Bean Validation API
- Перенес работу в UI с профилем из
RootController
вProfileUIController
SLF4JBridgeHandler
инициализирую только в профилеpostgres
- Выделил общий код реализации хранения в памяти в
InMemoryBaseRepositoryImpl
- Сделал подтверждение для удаления записей
- Обновились видео 7-го занятия. Выложил его как пример занятия, некоторые видео открыты
- Сделали валидации дублирования email через
WebDataBinder
иValidator
- Миграция на 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()
- Миграция на 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)
- Миграция на Botstrap 4
- Добавил Responsive behaviors - при уменшении ширины экрана навигация сворачивается в кнопку
- Для отображения цвета еды и выключенного юзера использую data-* атрибуты
- В
inputField.tag
передаю как параметр код для локализации label, а вi18n.jsp
передаю как параметрpage
. См. JSP include action with parameter example
- Миграция на Spring 5
- обновил версии: Ehcache 3.x, datatables, datetimepicker
- добавил видео решений HW0 с одним проходом
- поправил видео Обзор Spring Framework. Spring Context. Дописал про Constructor injection.
- заменил видео про тетсирование сервисов. Вместо самодельных матчеров стали использовать AssertJ. Видео Тестирование UserService через AssertJ, время 1:53
- сделал видео с jQuery конвертерами и дефолтными группами валидации при сохранении в базу
- сделал видео с новым
DelegatingPasswordEncoder
и Json READ/WRITE access - убрал
AccessType.PROPERTY
дляAbstractBaseEntity.id
(см. fixed HHH-3718) - удалил
PasswordUtil
, возвращаю статусNO_CONTENT
для REST delete, убрал группы валидации вUserTo
- заменил в jQuery success на done
- вместо
lang.jsp
сделал общийbodyHeader.jsp
-
добавил
- доп. решение HW1 через одним return и O(N)
- раскрасил лог (Logback layouts coloring)
-
рефакторинг
- починил коммит формы по 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.
- починил коммит формы по cancel (
-
правки
- переименовал
ModelMatcher
вBeanMatcher
и починил: можно сравнивать только упорядоченные коллекции (List) - поменял зависимость
org.hibernate:hibernate-validator
наorg.hibernate.validator:hibernate-validator
(warning при сборке)
- переименовал
- добавил
- доступ к AuthorizedUser через
@AuthenticationPrincipal
и authentication Tag - Обработку 404 NotFound
- локализацию ошибок валидации
- проверки json в тестах через JSONassert и через jsonPath
- логирование от Postgres Driver
- в
.travis.yml
сборку только ветки master - защиту от кэширование ajax запросов в IE
- обработку запрета модификации системный юзеров через универсальный
ApplicationException
- доступ к AuthorizedUser через
- рефакторинг
- сделал
@EntityGraph
черезattributePaths
- реализаовал обработку дублирования
user.email
иmeal.dateTime
через Controller Based Exception Handling - поменял отключение транзакционности в тестах через
@Transactional(propagation = Propagation.NEVER)
- сделал выбор в сервлете через switch
- все логгирование сделал через {} форматирование и поправил его в контроллерах (поле проверки id)
- перешел на конструктор DI
- в
ModelMatcher
переименовалComparator
->Equality
- заинлайнил все лямбды (компараторы, ModelMatcher.equality)
- поменялась реализация
JdbcUserRepositoryImpl.getAll()
- на UI кнопки в таблице заменились на линки, поправил сообщения локализации
- сделал кастомизацию JSON (@JsonView) и валидацию (groups) для данных еды, отдаваемых на UI
- в
JdbcUserRepositoryImpl
поменялMapSqlParameterSource
наBeanPropertySqlParameterSource
- сделал
- удалил
- зависимость
javax.transaction.jta
(уже не нужна) ${spring.version}
вpom.xml
зависимостях (уже есть вspring-framework-bom
)- distinct из запроса Hibernate на пользователей с ролями. Оптимизация запроса distinct: 15.16.2
- лишние
<div>
тэги (shadow
иview-box
)
- зависимость
- добавил
- выбор профиля базы через
ActiveProfilesResolver
/AllActiveProfileResolver
на основе драйвера базы в classpath - видео Cascade. Auto generate DDL.
- проверку на правильность id в Ajax/Rest контроллерах (treat IDs in REST body)
- тесты на валидацию входных значений контроллеров и зависимость на имплементацию
- Bootstrap Glyphicons
- выбор профиля базы через
- рефакторинг
- переименовал
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
- переименовал
- добавил:
- защиту от XSS (Cross-Site Scripting)
- интеграцию с Dependency Ci и Travis Ci
- локализацию календаря
- сводку по результатам тестов
- примеры запросов curl в
config/curl.md
- DataTables/Bootstrap 3 integration
- тесты на профиль деплоя Heroku (общее количество JUnit тестов стало 102)
- удалил зависимость
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
)
- переименовал все классы
- добавил:
- JPA 2.1 EntityGraph
- Jackson @JsonView
- валидацию объектов REST
- i18n в JavaScript
- проверку предусловий и видео Методы улучшения качества кода
- интеграцию с проверкой кода в Codacy
- сравнение вермени исполнения запросов при различных meals индексах
- tomcat7-maven-plugin плагин перключили на Tomcat 8 (cargo-maven2-plugin)
- рефакторинг
- обработка ошибок сделал с array
- матчеров тестирования (сделал автоматические обертки и сравнение на основе передаваемого компаратора)
- вынес форматирование даты в
functions.tld
- добавил
- выпускной проект
- в таблицу 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'
- убрал
LoggerWrapper
- Dandelion обертку к datatables
- обновил
- Hibernate до 5.x и Hibernate Validator, добавились новые зависимости и
jackson-datatype-hibernate5
- datatables API (1.10)
- Postgres драйвер. Новый драйвер поддерживает Java 8 Time API, разделил реализацию JdbcMealRepositoryImpl на Java8 (Postgresql) и Timestamp (HSQL)
- Hibernate до 5.x и Hibernate Validator, добавились новые зависимости и