From 572d0459e0c109ad051119757ef65d11b70f6302 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 18 Feb 2020 11:51:18 +0300 Subject: [PATCH 01/59] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 228b708b7094..ab4d97e44213 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,9 @@ Java Enterprise Online Project - Выполнить задание и залить на GitHub (commit + push) - Переключиться в основную ветку проекта master. +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Тех.задание: библия или допускаются изменения. Полуоткрытый интервал.](https://drive.google.com/file/d/123XyBYVeKLC3ZcRr_dUkwyvO9NC6WLkY/view?usp=sharing) +- [Типы промежутков](https://ru.wikipedia.org/wiki/Промежуток_(математика)) + ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW0 ``` Реализовать метод `UserMealsUtil.filteredByCycles` через циклы (`forEach`): From 796d81b362a3e087d016e90e503fe208eb55740b Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 5 Mar 2020 23:56:35 +0300 Subject: [PATCH 02/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab4d97e44213..6b840eac3b03 100644 --- a/README.md +++ b/README.md @@ -175,7 +175,7 @@ Java Enterprise Online Project #### Java (базовые вещи) - Интуит. Программирование на Java - 1й урок MasterJava: Многопоточность -- Основы Java garbage collection +- [Основы Java garbage collection](http://web.archive.org/web/20180831013112/https://ggenikus.github.io/blog/2014/05/04/gc) - Размер Java объектов - Введение в Java Reflection API - Структуры данных в картинках From 80a3c742a574cfaf871982aeedb95fcd62722f66 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 26 Mar 2020 16:02:15 +0300 Subject: [PATCH 03/59] Update cv.md --- cv.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cv.md b/cv.md index a24d881fdeba..60860899fb3c 100644 --- a/cv.md +++ b/cv.md @@ -106,6 +106,8 @@ - Выдели самое главное путем опроса босса и важных коллег. Не распыляйся на мелочи. - [**5 вещей, которые разработчик должен сделать прежде чем попросить о помощи**](https://techrocks.ru/2018/07/16/5-things-a-developer-should-do-before-asking-for-help/) - [**Советы новичкам**](http://blog.csssr.ru/2016/09/19/how-to-be-a-beginner-developer) +- [ТОП-13 ошибок начинающего программиста](https://proglib.io/p/beginners-fails/) +- [25 ошибок начинающего программиста](https://habr.com/ru/post/413129/) - [Нетехнические навыки](https://tproger.ru/experts/softskills-for-job) ## [Отзывы по стажировке Topjava](https://vk.com/topic-74381644_30447246) From bee6ffcbffc764b82c1abd2fb4f6ff1087faa0a1 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 23 Apr 2020 14:05:13 +0300 Subject: [PATCH 04/59] Update ReleaseNotes.md --- ReleaseNotes.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index f4e7412eb816..f0cf1ed046f5 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,4 +1,20 @@ # TopJava Release Notes +### 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` From 2620c6f93e413d51271a5398e8545f3569036638 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 10 May 2020 23:16:00 +0300 Subject: [PATCH 05/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6b840eac3b03..f2777b677f7a 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ Java Enterprise Online Project - без циклов по другим коллекциям - решение должно быть рабочим в общем случае (не только при запуске main) - через Stream API за 1 проход по исходному списку `meals.streem()` - - нельзя использовать внешние коллекции, не являющиеся частью коллектора или 2 раза проходить по исходному списку (его копиям). + - нельзя использовать внешние коллекции, не являющиеся частью коллектора или 2 раза проходить по исходному списку (в том числе модифицированному, например отфильтрованому). Т.е. в решении не должно быть 2 раза `meal.stream()` (в том числе неявно, в составных коллекторах) - возможно дополнительные проходы по частям списка From 3449156db3deb9fb8cb0d4c8d9bd5e8809729304 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 10 May 2020 23:26:52 +0300 Subject: [PATCH 06/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2777b677f7a..eece6c31d014 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ Java Enterprise Online Project - без циклов по другим коллекциям - решение должно быть рабочим в общем случае (не только при запуске main) - через Stream API за 1 проход по исходному списку `meals.streem()` - - нельзя использовать внешние коллекции, не являющиеся частью коллектора или 2 раза проходить по исходному списку (в том числе модифицированному, например отфильтрованому). + - нельзя использовать внешние коллекции, не являющиеся частью коллектора или 2 раза проходить по исходному списку (в том числе модифицированному, например отфильтрованному). Т.е. в решении не должно быть 2 раза `meal.stream()` (в том числе неявно, в составных коллекторах) - возможно дополнительные проходы по частям списка From 052adf67944cf47671f94293014fbcfce7caa270 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 13 May 2020 22:03:35 +0300 Subject: [PATCH 07/59] Update cv.md --- cv.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cv.md b/cv.md index 60860899fb3c..f765942cf700 100644 --- a/cv.md +++ b/cv.md @@ -20,6 +20,7 @@ ### Наши истории (делимся опытом и успехом) ### Тесты/задачи онлайн: +-[Interviewing: the most profitable skill you can learn](https://www.pramp.com) - [Java Programming Test](https://tests4geeks.com/java) - game: test Java skills - Codility lesson tests From 7c31a8ee0c7a6f87064a23a6d69f8b053a4b1cbf Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 13 May 2020 22:04:00 +0300 Subject: [PATCH 08/59] Update cv.md --- cv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cv.md b/cv.md index f765942cf700..51f5a7527ad9 100644 --- a/cv.md +++ b/cv.md @@ -20,7 +20,7 @@ ### Наши истории (делимся опытом и успехом) ### Тесты/задачи онлайн: --[Interviewing: the most profitable skill you can learn](https://www.pramp.com) +- [Interviewing: the most profitable skill you can learn](https://www.pramp.com) - [Java Programming Test](https://tests4geeks.com/java) - game: test Java skills - Codility lesson tests From 54f4ec0d6363ef814f3001f831b484dff60f3a7b Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 13 May 2020 22:05:03 +0300 Subject: [PATCH 09/59] Update cv.md --- cv.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cv.md b/cv.md index 51f5a7527ad9..a330bc3c71cb 100644 --- a/cv.md +++ b/cv.md @@ -20,7 +20,7 @@ ### Наши истории (делимся опытом и успехом) ### Тесты/задачи онлайн: -- [Interviewing: the most profitable skill you can learn](https://www.pramp.com) +- [Interviewing: the most profitable skill you can learn (pramp.com)](https://www.pramp.com/) - [Java Programming Test](https://tests4geeks.com/java) - game: test Java skills - Codility lesson tests @@ -29,7 +29,6 @@ - Sphere online judge - Codility programmers lessons - Hackerrank practice coding -- [Interviewing: the most profitable skill you can learn (pramp.com)](https://www.pramp.com/) - [start.interviewing.io](https://start.interviewing.io/) ## [Тестовое собеседование, самые спрашиваемые темы](http://javaops.ru/interview/test.html) From 5fe982c3fa982a20b6d31aee74dfc15bfff8ab62 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 17 May 2020 23:21:23 +0300 Subject: [PATCH 10/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eece6c31d014..a91e1e814c5a 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ Java Enterprise Online Project ### Полезные ресурсы > ВНИМАНИЕ: -> - **ДЗ первого урока будет связано с [созданием небольшого CRUD приложения (в памяти, без DB) на JSP и сервлетах](http://danielniko.com/2012/04/17/simple-crud-using-jsp-servlet-and-mysql/)**. Введение будет, но предварительное знакомство не помешает. +> - **ДЗ первого урока будет связано с [созданием небольшого CRUD приложения (в памяти, без DB) на JSP и сервлетах](https://danielniko.wordpress.com/2012/04/17/simple-crud-using-jsp-servlet-and-mysql/)**. Введение будет, но предварительное знакомство не помешает. > - основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия! Все остальное - опционально. From c2180201f5095afdaf632c3e71681acf44d56014 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 19 May 2020 11:43:39 +0300 Subject: [PATCH 11/59] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a91e1e814c5a..040f70a6e44e 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,8 @@ Java Enterprise Online Project - Шпаргалка Java Stream API - Алексея Владыкин: Элементы функционального программирования в Java - Yakov Fain о новом в Java 8 -- stream.map vs forEach +- stream.map vs forEach Date: Tue, 19 May 2020 11:45:35 +0300 Subject: [PATCH 12/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 040f70a6e44e..f7cefcd90fb8 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ Java Enterprise Online Project Т.е. в решении не должно быть 2 раза `meal.stream()` (в том числе неявно, в составных коллекторах) - возможно дополнительные проходы по частям списка -- [Полное руководство по Java 8 Stream API в картинках и примерах](https://easyjava.ru/java/language/java-8-stream-api-chast-shestaya-sobstvennyj-kollektor/) +- [Java 8 Stream API, часть шестая: собственный коллектор](https://easyjava.ru/java/language/java-8-stream-api-chast-shestaya-sobstvennyj-kollektor) - [Руководство по Java 8 Stream API: Collector](https://annimon.com/article/2778#collector) ### Замечания по использованию Stream API: From 3b91874e6df53a7d7fcebb7efa8fc0bf40ad2be9 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 19 May 2020 11:46:05 +0300 Subject: [PATCH 13/59] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f7cefcd90fb8..6a58dbce5545 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,6 @@ Java Enterprise Online Project - нельзя использовать внешние коллекции, не являющиеся частью коллектора или 2 раза проходить по исходному списку (в том числе модифицированному, например отфильтрованному). Т.е. в решении не должно быть 2 раза `meal.stream()` (в том числе неявно, в составных коллекторах) - возможно дополнительные проходы по частям списка - - [Java 8 Stream API, часть шестая: собственный коллектор](https://easyjava.ru/java/language/java-8-stream-api-chast-shestaya-sobstvennyj-kollektor) - [Руководство по Java 8 Stream API: Collector](https://annimon.com/article/2778#collector) From 18f0374c537cd28f46b4e1db8f98fc5088f8ac9a Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 19 May 2020 11:47:22 +0300 Subject: [PATCH 14/59] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6a58dbce5545..d3a4c1e67cec 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,8 @@ Java Enterprise Online Project - нельзя использовать внешние коллекции, не являющиеся частью коллектора или 2 раза проходить по исходному списку (в том числе модифицированному, например отфильтрованному). Т.е. в решении не должно быть 2 раза `meal.stream()` (в том числе неявно, в составных коллекторах) - возможно дополнительные проходы по частям списка + +Ресурсы: - [Java 8 Stream API, часть шестая: собственный коллектор](https://easyjava.ru/java/language/java-8-stream-api-chast-shestaya-sobstvennyj-kollektor) - [Руководство по Java 8 Stream API: Collector](https://annimon.com/article/2778#collector) From ba240e81eca53c90ca40ec4bfa771393bc8ef71e Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 20 May 2020 22:16:40 +0300 Subject: [PATCH 15/59] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d3a4c1e67cec..8755b22281f5 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,8 @@ Java Enterprise Online Project - [Git - для новичков](https://www.youtube.com/watch?list=PLY4rE9dstrJyTdVJpv7FibSaXB4BHPInb&v=PEKN8NtBDQ0) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Работа с проектом (выполнять инструкции) -**ВНИМАНИЕ: выбирайте для проекта простой пусть без пробелов и русских букв, например (Windows) `c:\projects\topjava\`. Иначе впоследствии будут проблемы** +- **ВНИМАНИЕ: выбирайте для проекта простой пусть без пробелов и русских букв, например (Windows) `c:\projects\topjava\`. Иначе впоследствии будут проблемы** +- **Плагин уже Git Intergation не требуется и вкладку `Version control` в IDEA переименовали в `Git`** ### Патч [prepare_to_HW0.patch](https://drive.google.com/file/d/1LNPpu9OkuCpfpD8ZJHO-o0vwu49p2i5M) (скачать и положить в каталог вашего проекта) > Проект постоянно улучшается, поэтому видео иногда отличается от кода проекта. Изменения указываю после видео: From 7eb4a67c93f47950a420d561b7de6956c1a9eb1b Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sat, 23 May 2020 19:10:30 +0300 Subject: [PATCH 16/59] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8755b22281f5..777992140667 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Java Enterprise Online Project - Git Overview - [Основы Git за 20 минут](https://www.youtube.com/watch?v=TMeZGvtQnT8) - [Git - для новичков](https://www.youtube.com/watch?list=PLY4rE9dstrJyTdVJpv7FibSaXB4BHPInb&v=PEKN8NtBDQ0) + - [Руководство по написанию комментариев в коммитах](https://techrocks.ru/2019/12/02/writing-good-commit-messages) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Работа с проектом (выполнять инструкции) - **ВНИМАНИЕ: выбирайте для проекта простой пусть без пробелов и русских букв, например (Windows) `c:\projects\topjava\`. Иначе впоследствии будут проблемы** From efd86a06ca26f316d5a38a58de6b887789c7cd36 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 24 May 2020 01:00:39 +0300 Subject: [PATCH 17/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 777992140667..754e9d2cdf25 100644 --- a/README.md +++ b/README.md @@ -154,7 +154,7 @@ Java Enterprise Online Project - 10: `System.out.println` нельзя делать нигде, кроме как в `main`. Позже введем логирование. - 11: Результаты, возвращаемые `UserMealsUtil.filteredByStreams` мы будем использовать [в нашем приложении](http://topjava.herokuapp.com/) для фильтрации по времени и отображения еды правильным цветом. - 12: Обращайте внимание на комментарии к вашим коммитам в git. Они должны быть короткие и информативные (лучше на english) -- 13: Не полагайтесь в решении на то, что список будет подаваться отсортированным. Такого условия нет. +- 13: Не полагайтесь в решении на то, что список еды будет подаваться отсортированным. Такого условия нет. ----- ## [Пример 7-го занятия онлайн стажировки, несколько видео открыто](https://github.com/JavaOPs/topjava/blob/master/doc/lesson07.md) From 628eb10dea9635fd23acb08b6477f897d14426d8 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 24 May 2020 13:32:50 +0300 Subject: [PATCH 18/59] Update graduation.md --- graduation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/graduation.md b/graduation.md index 6e4af3e023cc..c1cb45c337b2 100644 --- a/graduation.md +++ b/graduation.md @@ -66,6 +66,7 @@ _Антуан де Сент-Экзюпери_ - 21: Проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, Доступ к AuthorizedUser). - 22: Не размещайте логику приложения и преобразования в TO в слое доступа к DB - 23: Если используете кэширование, **тщательно продумайте, что надо кэшировать (самые частые запросы)**, а что нет (большие или редкозапрашиваемые данные)! +- 24: Если задание на English, `readme.md` тоже пишите на English. То же самое относится к языку резюме: вакансия на English предполагает ваше резюме на English. ## Попробуйте подергать свое API по всем типичным сценариям ТЗ! - Удобно использовать? Можно сделать проще? Например чтобы проголосовать за ресторан залогиненному юзеру достаточно `restorauntId`. From c7a9d42c53c720477944de607b83e722ef3fb750 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 24 May 2020 13:37:51 +0300 Subject: [PATCH 19/59] Update graduation.md --- graduation.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index c1cb45c337b2..60fdff4b9d1d 100644 --- a/graduation.md +++ b/graduation.md @@ -66,7 +66,10 @@ _Антуан де Сент-Экзюпери_ - 21: Проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, Доступ к AuthorizedUser). - 22: Не размещайте логику приложения и преобразования в TO в слое доступа к DB - 23: Если используете кэширование, **тщательно продумайте, что надо кэшировать (самые частые запросы)**, а что нет (большие или редкозапрашиваемые данные)! -- 24: Если задание на English, `readme.md` тоже пишите на English. То же самое относится к языку резюме: вакансия на English предполагает ваше резюме на English. +- 24: `readme.md`: + - Если задание на English, описание пишите также на English (то же самое относится к языку резюме: вакансия на English предполагает ваше резюме на English) + - Требуемые примеры `curl` не прячте- пишите здесь! + - Проверяют люди с опытом в Java: не надо писать инструкций, как устанавливать Java и Maven:) ## Попробуйте подергать свое API по всем типичным сценариям ТЗ! - Удобно использовать? Можно сделать проще? Например чтобы проголосовать за ресторан залогиненному юзеру достаточно `restorauntId`. From 7d0145036d3e3e1c69fd053cb6195379aaf9c9ff Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 27 May 2020 13:45:01 +0300 Subject: [PATCH 20/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 754e9d2cdf25..379464cf4f6b 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Java Enterprise Online Project - [Сергей Куксенко — Stream API, часть 1](https://www.youtube.com/watch?v=O8oN4KSZEXE) - [Сергей Куксенко — Stream API, часть 2](https://www.youtube.com/watch?v=i0Jr2l3jrDA) -### Optional 2 (+5 бонусов) +### Optional 2 (+5 бонусов, только после выполнения базового и Optional задания!) Сделать реализацию со сложностью O(N) (обратите внимание на п.13 замечаний): - циклом за 1 проход по `List` - без циклов по другим коллекциям From 6464f3cab8aa6fdfd9732d83ee15e972dc9809b7 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 27 May 2020 16:02:09 +0300 Subject: [PATCH 21/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 379464cf4f6b..39f4548d8b6f 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ Java Enterprise Online Project ### Optional 2 (+5 бонусов, только после выполнения базового и Optional задания!) Сделать реализацию со сложностью O(N) (обратите внимание на п.13 замечаний): - циклом за 1 проход по `List` - - без циклов по другим коллекциям + - без циклов по другим коллекциям (к ним также относим методы коллекций `addAll()/removeAll()`) - решение должно быть рабочим в общем случае (не только при запуске main) - через Stream API за 1 проход по исходному списку `meals.streem()` - нельзя использовать внешние коллекции, не являющиеся частью коллектора или 2 раза проходить по исходному списку (в том числе модифицированному, например отфильтрованному). From 8f2c0376054663ce5c73dcbb68a7a2d3cdab6298 Mon Sep 17 00:00:00 2001 From: JavaOPs Date: Thu, 28 May 2020 11:32:08 +0300 Subject: [PATCH 22/59] Update graduate --- graduation.md | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/graduation.md b/graduation.md index 60fdff4b9d1d..af0f4f74078c 100644 --- a/graduation.md +++ b/graduation.md @@ -26,7 +26,7 @@ P.P.S.: Asume that your API will be used by a frontend developer to build fronte ----------------------------- ### ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Рекомендации -- Если ты закончил [стажировку Topjava](http://javaops.ru/reg/topjava/grd), **cделай новый проект и добавляй туда из Topjava только то что нужно!** Локализация, типы ошибок, BeanMatcher, Json View, излишние делегирования и наследования - **не нужны!** +- **Сделай новый проект и добавляй туда из Topjava только то что нужно! Локализация, типы ошибок, BeanMatcher, Json View, излишние делегирования и наследования - не нужны!** - **API продумывай с точки зрения не программиста и объектов, а с точки зрения того, кто им будет пользоваться (frontend)** - **Сначала сделай основной сценарий по ТЗ. Все остальное (если очень хочется, 3 раза подумай) - потом.** @@ -45,27 +45,36 @@ _Антуан де Сент-Экзюпери_ - 5.2 НЕ надо делать абстрактных контроллеров на всякий случай. - 5.3 НЕ надо делать **классов репозиториев и сервисов**, если там нет ничего, кроме делегирования. - 5.4 Из потребностей приложения (которую надо самим придумать) реализовывать только очевидные сценарии. Те.- НИЧЕГО ЛИШНЕГО. -- 6: базу лучше взять без установки (H2 или HSQLDB). Ваше приложение должно сразу запуститься, **без всяких настроек и переменных окружения** +- 6: База Данных + - берите без установки (H2 или HSQLDB). Одну!! Ваше приложение должно сразу запуститься, **без всяких настроек и переменных окружения** + - сделайте индексы к таблицам. Попробуйте обеспечит UNIQUE (один голос пользователя в день, один уникальный пункт меню в день). Следите за порядком полей в индексе. + - **историю еды и голосований сделать НУЖНО! Есть базовые вещи, которые закладываются в архитектуру приложения и неочевидные доработки к ТЗ, которых лучше не делать.** - 7: по возможности сделать JUnit тесты - 8: уделяйте внимание обработке ошибок -- 9: далаем REST API в соответствии с концепцией REST - - [15 тривиальных фактов о правильной работе с протоколом HTTP](https://habrahabr.ru/company/yandex/blog/265569/) - - 10 Best Practices for Better RESTful API +- 9: далаем REST API в соответствии с концепцией REST (url в общем имеют вид`{ресурс}/{id_ресурсa}[/{подресурс}/{id_подресурсa}][параметры]`) + - **[15 тривиальных фактов о правильной работе с протоколом HTTP](https://habrahabr.ru/company/yandex/blog/265569/)** + - **10 Best Practices for Better RESTful API** - [REST resource hierarchy](https://stackoverflow.com/questions/20951419/what-are-best-practices-for-rest-nested-resources) - 10: не смешивайте TO и Entity вместе. Лучше всего, если они будут независимыми друг от друга. -- 11: если приложению в объекте требуется только его id, используйте reference (как мы при сохранении еды вставляем туда юзера) -- 12: [Use for money in java app](http://stackoverflow.com/a/43051227/548473) -- 13: **Историю еды и голосований сделать НУЖНО! Есть базовые вещи, которые закладываются в архитектуру приложения и неочевидные доработки к ТЗ, которых лучше не делать.** -- 14: Еще раз про [hashCode/equals в Entity](https://stackoverflow.com/questions/5031614/the-jpa-hashcode-equals-dilemma): не делайте сравнение по полям! -- 15: Название пакетов, имен классов для `model/to/web` достаточно стандартные (например `model/domain`). НЕ надо придумывать своих собственных правил. +- 11: не размещайте логику приложения и преобразования в TO в слое доступа к DB +- 12: если приложению в объекте требуется только его id, используйте reference (как мы при сохранении еды вставляем туда юзера) +- 13: [Use for money in java app](http://stackoverflow.com/a/43051227/548473) +- 14: еще раз про [hashCode/equals в Entity](https://stackoverflow.com/questions/5031614/the-jpa-hashcode-equals-dilemma): не делайте сравнение по полям! +- 15: название пакетов, имен классов для `model/to/web` достаточно стандартные (например `model/domain`). НЕ надо придумывать своих собственных правил. - 16: **Используйте DATA-JPA** (можно без лишней делегации, напрямую из сервиса/контроллера дергать Repository). -- 17: В DATA-JPA 2.x используются `Optional`. Попробуйте работать с ними, это безопасный способ работать с null значениями (используйте `orElseThrow`). -- 18: На topjava мы смотрели разные варианты использования, тут делаем максимально просто. С TO многие вещи упрощаются. -- 19: Проверьте, не торчат ли из кода учебные уши topjava, типа `ProfileRestController.testUTF()`, `AbstractServiceTest.printResult()` или закомментированные `JdbcTemplate`. Назначение этого проекта совсем другое. +- 17: в DATA-JPA 2.x используются `Optional`. Попробуйте работать с ними, это безопасный способ работать с null значениями (используйте `orElseThrow`). +- 18: на topjava мы смотрели разные варианты использования, тут делаем максимально просто. С TO многие вещи упрощаются. +- 19: проверьте, не торчат ли из кода учебные уши topjava, типа `ProfileRestController.testUTF()`, `AbstractServiceTest.printResult()` или закомментированные `JdbcTemplate`. Назначение этого проекта совсем другое. - 20: ORM работает с объектами. [В простейших случаях fk_id как поля допустимы](https://stackoverflow.com/questions/6311776/hibernate-foreign-keys-instead-of-entities), но при этом JPA их уже никак не обрабатывает и не используйте их вместе с объектами. Ссылка на stackoverwrflow в коде обязательна! -- 21: Проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, Доступ к AuthorizedUser). -- 22: Не размещайте логику приложения и преобразования в TO в слое доступа к DB -- 23: Если используете кэширование, **тщательно продумайте, что надо кэшировать (самые частые запросы)**, а что нет (большие или редкозапрашиваемые данные)! +- 21: проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, Доступ к AuthorizedUser). +- 22: Кэширование + - необязательно, но желательно + - **тщательно продумайте, что надо кэшировать (самые частые запросы)**, а что нет (большие или редкозапрашиваемые данные)! + - проверьте соответствие ключей к кэшу (параметры кэшируемого метода) с конфигурацией (например в singleNonExpiryCache, heap=1 в кэше может содержаться только ОДНО значение). +- 23: Валидация + - желательна + - одних аннотаций недостаточно. Должны быть `@Valid/@Validation` + - проверяйте входные данные при `create/update` в контроллерах! В TopJava это `ValidationUtil.checkNew()/assureIdConsistent()` - 24: `readme.md`: - Если задание на English, описание пишите также на English (то же самое относится к языку резюме: вакансия на English предполагает ваше резюме на English) - Требуемые примеры `curl` не прячте- пишите здесь! From 79efab669a610cb09e16621ff25d9240046911cf Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 31 May 2020 23:26:28 +0300 Subject: [PATCH 23/59] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 39f4548d8b6f..c0d69a45fe7e 100644 --- a/README.md +++ b/README.md @@ -119,12 +119,12 @@ Java Enterprise Online Project ### Optional 2 (+5 бонусов, только после выполнения базового и Optional задания!) Сделать реализацию со сложностью O(N) (обратите внимание на п.13 замечаний): - циклом за 1 проход по `List` - - без циклов по другим коллекциям (к ним также относим методы коллекций `addAll()/removeAll()`) - - решение должно быть рабочим в общем случае (не только при запуске main) + - без циклов по другим коллекциям/массивам (к ним также относим методы коллекций `addAll()/removeAll()`) + - решение должно быть рабочим в общем случае (работать в приложении с многими пользователями, не только при запуске main) - через Stream API за 1 проход по исходному списку `meals.streem()` - - нельзя использовать внешние коллекции, не являющиеся частью коллектора или 2 раза проходить по исходному списку (в том числе модифицированному, например отфильтрованному). - Т.е. в решении не должно быть 2 раза `meal.stream()` (в том числе неявно, в составных коллекторах) - - возможно дополнительные проходы по частям списка + - нельзя использовать внешние коллекции, не являющиеся частью коллектора + - возможно дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Те например нельзя разбить список на на 2 подсписка с четными и нечетными датами и затем их объединить, с подсчетом превышения для каждого элемента. + Ресурсы: - [Java 8 Stream API, часть шестая: собственный коллектор](https://easyjava.ru/java/language/java-8-stream-api-chast-shestaya-sobstvennyj-kollektor) From 7664bb38066ab8843696b719a8bdc13a3e138e07 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 4 Jun 2020 18:14:35 +0300 Subject: [PATCH 24/59] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c0d69a45fe7e..f2020bbfcd53 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ Java Enterprise Online Project - решение должно быть рабочим в общем случае (работать в приложении с многими пользователями, не только при запуске main) - через Stream API за 1 проход по исходному списку `meals.streem()` - нельзя использовать внешние коллекции, не являющиеся частью коллектора + - нельзя 2 раза проходить по исходному списку (в том числе его отфильтрованной копии) - возможно дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Те например нельзя разбить список на на 2 подсписка с четными и нечетными датами и затем их объединить, с подсчетом превышения для каждого элемента. From 2cf32713038aae3a29ed2bb3f49ce8ca75ac9068 Mon Sep 17 00:00:00 2001 From: "admin@javaops.ru" Date: Thu, 4 Jun 2020 18:27:09 +0300 Subject: [PATCH 25/59] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2020bbfcd53..638048568128 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Java Enterprise Online Project > - в `UserMeals/UserMealWithExcess` поля изменились на `private` > - обновил данные `UserMealsUtil.meals` и переименовал некоторые пременные, поля и методы > - добавил `UserMealWithExcess.toString()` и метод для выполнения _Optional домашнего задания_ - +> - метод фильтрации в `TimeUtil` переименовали в `isBetweenHalfOpen` (также изменилась логика сравнения - `startTime` включается в интервал) ## Инструкция по шагам (из видео): - Установить ПО (git, JDK8, IntelliJ IDEA, Maven) From 4331b732f57e2bbef144489026f07581d1fa0d6f Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 17 Jun 2020 15:35:54 +0300 Subject: [PATCH 26/59] Update graduation.md --- graduation.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/graduation.md b/graduation.md index af0f4f74078c..4580cd250957 100644 --- a/graduation.md +++ b/graduation.md @@ -67,15 +67,16 @@ _Антуан де Сент-Экзюпери_ - 19: проверьте, не торчат ли из кода учебные уши topjava, типа `ProfileRestController.testUTF()`, `AbstractServiceTest.printResult()` или закомментированные `JdbcTemplate`. Назначение этого проекта совсем другое. - 20: ORM работает с объектами. [В простейших случаях fk_id как поля допустимы](https://stackoverflow.com/questions/6311776/hibernate-foreign-keys-instead-of-entities), но при этом JPA их уже никак не обрабатывает и не используйте их вместе с объектами. Ссылка на stackoverwrflow в коде обязательна! - 21: проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, Доступ к AuthorizedUser). -- 22: Кэширование +- 22: обновление в базе делается через `update`, даже если `delete/insert` сократит java код на несколько строк +- 23: Кэширование - необязательно, но желательно - **тщательно продумайте, что надо кэшировать (самые частые запросы)**, а что нет (большие или редкозапрашиваемые данные)! - проверьте соответствие ключей к кэшу (параметры кэшируемого метода) с конфигурацией (например в singleNonExpiryCache, heap=1 в кэше может содержаться только ОДНО значение). -- 23: Валидация +- 24: Валидация - желательна - одних аннотаций недостаточно. Должны быть `@Valid/@Validation` - проверяйте входные данные при `create/update` в контроллерах! В TopJava это `ValidationUtil.checkNew()/assureIdConsistent()` -- 24: `readme.md`: +- 25: `readme.md`: - Если задание на English, описание пишите также на English (то же самое относится к языку резюме: вакансия на English предполагает ваше резюме на English) - Требуемые примеры `curl` не прячте- пишите здесь! - Проверяют люди с опытом в Java: не надо писать инструкций, как устанавливать Java и Maven:) From 64590f1ca576fbc18c743227f61ca33eb21c14f4 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 17 Jun 2020 15:44:52 +0300 Subject: [PATCH 27/59] Update graduation.md --- graduation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index 4580cd250957..3c8d83d87b49 100644 --- a/graduation.md +++ b/graduation.md @@ -39,7 +39,7 @@ _Антуан де Сент-Экзюпери_ - 1: **читаем ТЗ ОЧЕНЬ внимательно, НЕ надо ничего своего туда домысливать и творчески изменять** - 2: **тщательно считайте количество обращений в базу на каждый запрос. Особенно при запросах от юзеров, которых очень много! Также на сложность запросов от них, чтобы не положить базу** - 3: **тщательно считайте количество запросов в вашем API для отображения нужной информации** -- 4: **учитывайте, что пользователей может быть ооочень много, а админов- мало** +- 4: учитывайте, что **пользователей может быть ОООЧЕНЬ много, а админов - МАЛО** - 5: в проекте (и тестовом задании на работу) в отличие от нашего учебного topjava оставляйте только необходимый для работы приложения код, ничего лишнего: - 5.1 НЕ надо делать разные профили базы и работы с ней. - 5.2 НЕ надо делать абстрактных контроллеров на всякий случай. From 3823848bb585a052d04d6f55c4654e8a6c25b0ea Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 20 Sep 2020 15:47:52 +0300 Subject: [PATCH 28/59] Update graduation.md --- graduation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index 3c8d83d87b49..7dd13808b7e1 100644 --- a/graduation.md +++ b/graduation.md @@ -37,7 +37,7 @@ P.P.S.: Asume that your API will be used by a frontend developer to build fronte _Антуан де Сент-Экзюпери_ - 1: **читаем ТЗ ОЧЕНЬ внимательно, НЕ надо ничего своего туда домысливать и творчески изменять** -- 2: **тщательно считайте количество обращений в базу на каждый запрос. Особенно при запросах от юзеров, которых очень много! Также на сложность запросов от них, чтобы не положить базу** +- 2: **тщательно считайте количество обращений в базу на каждый запрос. Особенно при запросах от юзеров, которых очень много! Также на сложность запросов от них, чтобы не положить базу**. Самое худшее в коде - обращение в базу в цикле. - 3: **тщательно считайте количество запросов в вашем API для отображения нужной информации** - 4: учитывайте, что **пользователей может быть ОООЧЕНЬ много, а админов - МАЛО** - 5: в проекте (и тестовом задании на работу) в отличие от нашего учебного topjava оставляйте только необходимый для работы приложения код, ничего лишнего: From f2d884f882826c78d00020049f42a5d81cf1c3ae Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 20 Sep 2020 15:49:23 +0300 Subject: [PATCH 29/59] Update graduation.md --- graduation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index 7dd13808b7e1..34809fc454db 100644 --- a/graduation.md +++ b/graduation.md @@ -61,7 +61,7 @@ _Антуан де Сент-Экзюпери_ - 13: [Use for money in java app](http://stackoverflow.com/a/43051227/548473) - 14: еще раз про [hashCode/equals в Entity](https://stackoverflow.com/questions/5031614/the-jpa-hashcode-equals-dilemma): не делайте сравнение по полям! - 15: название пакетов, имен классов для `model/to/web` достаточно стандартные (например `model/domain`). НЕ надо придумывать своих собственных правил. -- 16: **Используйте DATA-JPA** (можно без лишней делегации, напрямую из сервиса/контроллера дергать Repository). +- 16: **Используйте DATA-JPA** (сделайте без лишней делегации, напрямую из сервиса/контроллера дергать Repository). - 17: в DATA-JPA 2.x используются `Optional`. Попробуйте работать с ними, это безопасный способ работать с null значениями (используйте `orElseThrow`). - 18: на topjava мы смотрели разные варианты использования, тут делаем максимально просто. С TO многие вещи упрощаются. - 19: проверьте, не торчат ли из кода учебные уши topjava, типа `ProfileRestController.testUTF()`, `AbstractServiceTest.printResult()` или закомментированные `JdbcTemplate`. Назначение этого проекта совсем другое. From fd2d8522aab499c9aae6d12832b91d8f48bd68cb Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 20 Sep 2020 16:46:23 +0300 Subject: [PATCH 30/59] Update graduation.md --- graduation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/graduation.md b/graduation.md index 34809fc454db..d947b113c79f 100644 --- a/graduation.md +++ b/graduation.md @@ -49,6 +49,7 @@ _Антуан де Сент-Экзюпери_ - берите без установки (H2 или HSQLDB). Одну!! Ваше приложение должно сразу запуститься, **без всяких настроек и переменных окружения** - сделайте индексы к таблицам. Попробуйте обеспечит UNIQUE (один голос пользователя в день, один уникальный пункт меню в день). Следите за порядком полей в индексе. - **историю еды и голосований сделать НУЖНО! Есть базовые вещи, которые закладываются в архитектуру приложения и неочевидные доработки к ТЗ, которых лучше не делать.** + - при популировании добавте записи за сегодняшний день - now(), чтобы всегда были актуальные исходные данные - 7: по возможности сделать JUnit тесты - 8: уделяйте внимание обработке ошибок - 9: далаем REST API в соответствии с концепцией REST (url в общем имеют вид`{ресурс}/{id_ресурсa}[/{подресурс}/{id_подресурсa}][параметры]`) From b2b9a19dbf33f24e9a1e532c6d74a498328370e1 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 20 Sep 2020 22:20:46 +0300 Subject: [PATCH 31/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 638048568128..38831adc6f29 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ Java Enterprise Online Project - решение должно быть рабочим в общем случае (работать в приложении с многими пользователями, не только при запуске main) - через Stream API за 1 проход по исходному списку `meals.streem()` - нельзя использовать внешние коллекции, не являющиеся частью коллектора - - нельзя 2 раза проходить по исходному списку (в том числе его отфильтрованной копии) + - нельзя 2 раза проходить по исходному списку (в том числе его отфильтрованной или преобразованной копии) - возможно дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Те например нельзя разбить список на на 2 подсписка с четными и нечетными датами и затем их объединить, с подсчетом превышения для каждого элемента. From 7c7e37e548ddc01369ff9448a1a9d390be387141 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 21 Sep 2020 17:37:53 +0300 Subject: [PATCH 32/59] Update graduation.md --- graduation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index d947b113c79f..208ee73c69cb 100644 --- a/graduation.md +++ b/graduation.md @@ -76,7 +76,7 @@ _Антуан де Сент-Экзюпери_ - 24: Валидация - желательна - одних аннотаций недостаточно. Должны быть `@Valid/@Validation` - - проверяйте входные данные при `create/update` в контроллерах! В TopJava это `ValidationUtil.checkNew()/assureIdConsistent()` + - проверяйте входные данные при `create/update` **в контроллерах!** В TopJava это `ValidationUtil.checkNew()/assureIdConsistent()` - 25: `readme.md`: - Если задание на English, описание пишите также на English (то же самое относится к языку резюме: вакансия на English предполагает ваше резюме на English) - Требуемые примеры `curl` не прячте- пишите здесь! From 9c995f9b94680892e8e805462de14e1797aebc29 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 24 Sep 2020 14:26:51 +0300 Subject: [PATCH 33/59] Update graduation.md --- graduation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/graduation.md b/graduation.md index 208ee73c69cb..a4468a0f8ec9 100644 --- a/graduation.md +++ b/graduation.md @@ -50,6 +50,7 @@ _Антуан де Сент-Экзюпери_ - сделайте индексы к таблицам. Попробуйте обеспечит UNIQUE (один голос пользователя в день, один уникальный пункт меню в день). Следите за порядком полей в индексе. - **историю еды и голосований сделать НУЖНО! Есть базовые вещи, которые закладываются в архитектуру приложения и неочевидные доработки к ТЗ, которых лучше не делать.** - при популировании добавте записи за сегодняшний день - now(), чтобы всегда были актуальные исходные данные + - таблицы обычно именуются в единственном числе. Исключение - users, т. к. user - зарезервированное слово. `date`/`timestamp` - зарезервированное слово, лучше избегать их при именовании - 7: по возможности сделать JUnit тесты - 8: уделяйте внимание обработке ошибок - 9: далаем REST API в соответствии с концепцией REST (url в общем имеют вид`{ресурс}/{id_ресурсa}[/{подресурс}/{id_подресурсa}][параметры]`) From 00424a0eaa980dcfcacc6bc6a9bef81b4472b983 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 28 Sep 2020 22:45:15 +0300 Subject: [PATCH 34/59] Update ReleaseNotes.md --- ReleaseNotes.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index f0cf1ed046f5..bf225b9b0647 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,4 +1,15 @@ # TopJava Release Notes + +### Topjava 20 +- мигрировали на JDK 14 +- в `@SafeHtml` запрещаем весь html (`whitelistType = NONE`) +- в API добавили `/users/{id}/with-meals` (см. [двунаправленные отношения](https://www.codeflow.site/ru/article/jackson-bidirectional-relationships-and-infinite-recursion)) +- в js убрал объект контекст, передаю 3-мя параметрами +- в UI контроллерах убрал префикс `ajax` +- из тестов сервисов убрал `repository`. При проверке через `assertThrows` он не требуется +- в `TestMatcher` сценарии сравнения сделал параметризируемыми (паттерн стратегия) +- добавил `UserTestData.USER_WITH_MEALS_MATCHER` (проверки пользователя сразу с едой) и константу id `NOT_FOUND` + ### Topjava 19 - Изменилась логика для интервалов времени (исключаем `endTime`) - Заменил собственный `MessageUtil` велосипед на спринговый `MessageSourceAccessor` From 61cd81364ee3d2247ef9a53958d23d21a8671f6b Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 28 Sep 2020 22:50:02 +0300 Subject: [PATCH 35/59] Update ReleaseNotes.md --- ReleaseNotes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index bf225b9b0647..b102200d7ac1 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -3,11 +3,11 @@ ### Topjava 20 - мигрировали на JDK 14 - в `@SafeHtml` запрещаем весь html (`whitelistType = NONE`) -- в API добавили `/users/{id}/with-meals` (см. [двунаправленные отношения](https://www.codeflow.site/ru/article/jackson-bidirectional-relationships-and-infinite-recursion)) -- в js убрал объект контекст, передаю 3-мя параметрами +- в `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 From 91841cb912cc4ff8711016f34a166cfe94789469 Mon Sep 17 00:00:00 2001 From: "admin@javaops.ru" Date: Thu, 29 Oct 2020 14:10:49 +0300 Subject: [PATCH 36/59] fix grammar --- ReleaseNotes.md | 2 +- description.md | 125 +++++++++++++++++++++++------------------------- graduation.md | 40 ++++++++-------- 3 files changed, 81 insertions(+), 86 deletions(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index b102200d7ac1..65a0c209f4c1 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -29,7 +29,7 @@ ### Topjava 18 - В `ErrorType` добавил `HttpStatus status` -- В PostgreSQL обнаружилась бага: граничное значение `0:00` из за ошибок округления попадает в предыдущий интервал. +- В PostgreSQL обнаружилась бага: граничное значение `0:00` из-за ошибок округления попадает в предыдущий интервал. Мораль: всегда в тестах проверяйте граничные значения. Добавил этот случай в тестовые данные. - Изменил `MealRepository.getBetween` (принимаю `@Nullable LocalDate`). Изменились реализации. - Выделил метод `UserService.prepareAndSave` diff --git a/description.md b/description.md index d2448ca99e57..0619c6d9516d 100644 --- a/description.md +++ b/description.md @@ -1,77 +1,72 @@ #### Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и сохранением в базах данных Postgresql и HSQLDB. -- Основное внимание будет уделяться способам решения многочисленных проблем разработки в Spring/JPA, а также структурному (красивому и надежному) java кодированию и архитектуре приложения. -- Каждая итерация проекта закрепляется домашним заданием по реализации схожей функциональности. Следующее занятие начинается с разбора домашних заданий. -- Большое внимание уделяется тестированию кода: в проекте более 100 JUnit тестов. -- Несмотря на относительно небольшой размер, приложение разрабатывается с нуля как большой проект (например мы используем кэш 2-го уровня Hibernate, настраиваем Jackson для работы с ленивой загрузкой +- Основное внимание будет уделяться способам решения многочисленных проблем разработки в Spring/JPA, а также структурному (красивому и надежному) java кодированию и архитектуре приложения. +- Каждая итерация проекта закрепляется домашним заданием по реализации схожей функциональности. Следующее занятие начинается с разбора домашних заданий. +- Большое внимание уделяется тестированию кода: в проекте более 100 JUnit тестов. +- Несмотря на относительно небольшой размер, приложение разрабатывается с нуля как большой проект (например, мы используем кэш 2-го уровня Hibernate, настраиваем Jackson для работы с ленивой загрузкой Hibernate, делаем конверторы для типов LocalDateTime (Java 8 time API). - Разбираются архитектурные паттерны: слои приложения и как правильно разбивать логику по слоям, когда нужно применять Data Transfer Object. - Т.е на выходе получается не учебный проект, а хорошо маштабируемый шаблон для большого проекта на всех пройденных технологиях. -- Большое внимание уделяется деталям: популяция базы, использование транзакционности, тесты сервисов и REST - контроллеров, насторойка EntityManagerFactory, - выбор реализации пула коннектов. Особое внимание уделяется работе с базой: через Spring JDBC, Spring ORM и - Spring Data Jpa. -- Используются самые востребованные на сегодняшний момент фреймворки: Maven, Spring Security 4 - вместе с Spring Security Test, наиболее удобный для работы с базой проект Spring Data Jpa, библиотека логирования logback, реализующая SLF4J, повсеместно используемый Bootstrap и jQuery. +- Разбираются архитектурные паттерны: слои приложения и как правильно разбивать логику по слоям, когда нужно применять Data Transfer Object. То есть на выходе получается не учебный проект, а хорошо масштабируемый шаблон для большого проекта на всех пройденных технологиях. +- Большое внимание уделяется деталям: популяция базы, использование транзакционности, тесты сервисов и REST контроллеров, настройка EntityManagerFactory, выбор реализации пула коннектов. Особое внимание уделяется работе с базой: через Spring JDBC, Spring ORM и Spring Data Jpa. +- Используются самые востребованные на сегодняшний момент фреймворки: Maven, Spring Security 4 вместе с Spring Security Test, наиболее удобный для работы с базой проекта Spring Data Jpa, библиотека логирования logback, реализующая SLF4J, повсеместно используемый Bootstrap и jQuery. #### Демо разрабатываемого приложения ## План проекта (ссылки на некоторые темы открыты для просмотра) ### Архитектура проекта. Персистентность. -- Системы управления версиями -- Java 8: Lambda, Stream API -- Обзор используемых в проекте технологий и инструментов. -- Инструмент сборки Maven. -- WAR. Веб-контейнер Tomcat. Сервлеты. -- Логирование. -- Обзор стандартных библиотек. Apache Commons, Guava -- Слои приложения. Создание каркаса приложения. -- Обзор Spring Framework. Spring Context. -- Тестирование через JUnit. -- Spring Test -- Базы данных. PostgreSQL. Обзор NoSQL и Java persistence solution без ORM. -- Настройка Database в IDEA. -- Скрипты инициализации базы. Spring Jdbc Template. -- Spring: инициализация и популирование DB -- ORM. Hibernate. JPA. +- Системы управления версиями +- Java 8: Lambda, Stream API +- Обзор используемых в проекте технологий и инструментов. +- Инструмент сборки Maven. +- WAR. Веб-контейнер Tomcat. Сервлеты. +- Логирование. +- Обзор стандартных библиотек. Apache Commons, Guava +- Слои приложения. Создание каркаса приложения. +- Обзор Spring Framework. Spring Context. +- Тестирование через JUnit. +- Spring Test +- Базы данных. PostgreSQL. Обзор NoSQL и Java persistence solution без ORM. +- Настройка Database в IDEA. +- Скрипты инициализации базы. Spring Jdbc Template. +- Spring: инициализация и популирование DB +- ORM. Hibernate. JPA. - [Тестирование JPA сервиса через AssertJ](https://www.youtube.com/watch?v=BlyaXT6tOaw) -- Поддержка HSQLDB -- Транзакции -- Профили Maven и Spring -- Пул коннектов -- Spring Data JPA -- Кэш Hibernate +- Поддержка HSQLDB +- Транзакции +- Профили Maven и Spring +- Пул коннектов +- Spring Data JPA +- Кэш Hibernate ### Разработка WEB -- Spring кэш -- Spring Web -- JSP, JSTL, i18n -- Tomcat maven plugin. JNDI -- Spring Web MVC -- Spring Internationalization -- Тестирование Spring MVC -- REST контроллеры -- Тестирование REST контроллеров. Jackson. -- jackson-datatype-hibernate. Тестирование через матчеры. -- Тестирование через SoapUi. UTF-8 -- WebJars. -- Bootstrap. jQuery datatables. -- AJAX. jQuery. Notifications. -- Spring Security -- Spring Binding/Validation -- Работа с datatables через Ajax. -- Spring Security Test +- Spring кэш +- Spring Web +- JSP, JSTL, i18n +- Tomcat maven plugin. JNDI +- Spring Web MVC +- Spring Internationalization +- Тестирование Spring MVC +- REST контроллеры +- Тестирование REST контроллеров. Jackson. +- jackson-datatype-hibernate. Тестирование через матчеры. +- Тестирование через SoapUi. UTF-8 +- WebJars. +- Bootstrap. jQuery datatables. +- AJAX. jQuery. Notifications. +- Spring Security +- Spring Binding/Validation +- Работа с datatables через Ajax. +- Spring Security Test - [Кастомизация JSON (@JsonView) и валидации (groups)](https://drive.google.com/open?id=0B9Ye2auQ_NsFRTFsTjVHR2dXczA) -- Encoding password -- CSRF (добавление в проект защиты от межсайтовой подделки запроса) -- form-login. Spring Security Taglib -- Handler interceptor -- Spring Exception Handling -- Смена локали -- Фильтрация JSON через @JsonView -- Защита от XSS (Cross Site Scripting) -- Деплой в Heroku -- Локализация datatables, ошибок валидации -- Обработка ошибок 404 (NotFound) -- Доступ к AuthorizedUser -- Собеседование. Разработка ПО +- Encoding password +- CSRF (добавление в проект защиты от межсайтовой подделки запроса) +- form-login. Spring Security Taglib +- Handler interceptor +- Spring Exception Handling +- Смена локали +- Фильтрация JSON с помощью @JsonView +- Защита от XSS (Cross Site Scripting) +- Деплой в Heroku +- Локализация datatables, ошибок валидации +- Обработка ошибок 404 (NotFound) +- Доступ к AuthorizedUser +- Собеседование. Разработка ПО \ No newline at end of file diff --git a/graduation.md b/graduation.md index a4468a0f8ec9..442ce82b8c47 100644 --- a/graduation.md +++ b/graduation.md @@ -11,17 +11,17 @@ Build a voting system for deciding where to have lunch. * Users can vote on which restaurant they want to have lunch at * Only one vote counted per user * If user votes again the same day: - - If it is before 11:00 we asume that he changed his mind. + - If it is before 11:00 we assume that he changed his mind. - If it is after 11:00 then it is too late, vote can't be changed -Each restaurant provides new menu each day. +Each restaurant provides a new menu each day. As a result, provide a link to github repository. It should contain the code, README.md with API documentation and couple curl commands to test it. ----------------------------- P.S.: Make sure everything works with latest version that is on github :) -P.P.S.: Asume that your API will be used by a frontend developer to build frontend on top of that. +P.P.S.: Assume that your API will be used by a frontend developer to build frontend on top of that. ----------------------------- ### ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Рекомендации @@ -30,7 +30,7 @@ P.P.S.: Asume that your API will be used by a frontend developer to build fronte - **API продумывай с точки зрения не программиста и объектов, а с точки зрения того, кто им будет пользоваться (frontend)** - **Сначала сделай основной сценарий по ТЗ. Все остальное (если очень хочется, 3 раза подумай) - потом.** -*Представьте себе, что ПМ (лид, архитектор) дал вам ТЗ и некоторое время недоступен. У вас конечно есть много мыслей, для чего нужно приложение, как исправить ТЗ, дополнить его и сделать правильно. НО НЕ НАДО ИХ РЕАЛИЗОВЫВАТЬ В КОДЕ. Нужно сделать все максимально просто, удобно для доработок и для использования со стороны клиента (если конечно в ТЗ нет оговорок). Все свои вопросы и предложения и хотелки оформляйете отдельно (в `read.me` например). Если делаете что-то сложнее простейшего случая (например справочник еды)- обязательно напишите в read.me. Как и выбор стратегии кэширования.* +*Представьте себе, что ПМ (лид, архитектор) дал вам ТЗ и некоторое время недоступен. У вас, конечно, есть много мыслей, для чего нужно приложение, как исправить ТЗ, дополнить его и сделать правильно. НО НЕ НАДО ИХ РЕАЛИЗОВЫВАТЬ В КОДЕ. Нужно сделать все максимально просто, удобно для доработок и для использования со стороны клиента (если, конечно, в ТЗ нет оговорок). Все свои вопросы, предложения и хотелки оформляйте отдельно (в `read.me` например). Если делаете что-то сложнее простейшего случая (например, справочник еды) - обязательно напишите в read.me. Как и выбор стратегии кэширования.* > Совершенство достигнуто не тогда, когда нечего добавить, а тогда, когда нечего отнять @@ -40,20 +40,20 @@ _Антуан де Сент-Экзюпери_ - 2: **тщательно считайте количество обращений в базу на каждый запрос. Особенно при запросах от юзеров, которых очень много! Также на сложность запросов от них, чтобы не положить базу**. Самое худшее в коде - обращение в базу в цикле. - 3: **тщательно считайте количество запросов в вашем API для отображения нужной информации** - 4: учитывайте, что **пользователей может быть ОООЧЕНЬ много, а админов - МАЛО** -- 5: в проекте (и тестовом задании на работу) в отличие от нашего учебного topjava оставляйте только необходимый для работы приложения код, ничего лишнего: - - 5.1 НЕ надо делать разные профили базы и работы с ней. - - 5.2 НЕ надо делать абстрактных контроллеров на всякий случай. - - 5.3 НЕ надо делать **классов репозиториев и сервисов**, если там нет ничего, кроме делегирования. - - 5.4 Из потребностей приложения (которую надо самим придумать) реализовывать только очевидные сценарии. Те.- НИЧЕГО ЛИШНЕГО. +- 5: в проекте (и тестовом задании на работу), в отличие от нашего учебного topjava, оставляйте только необходимый для работы приложения код, ничего лишнего: + - 5.1 НЕ надо делать разные профили базы и работы с ней + - 5.2 НЕ надо делать абстрактных контроллеров на всякий случай + - 5.3 НЕ надо делать **классов репозиториев и сервисов**, если там нет ничего, кроме делегирования + - 5.4 Из потребностей приложения (которую надо самим придумать) реализовывать только очевидные сценарии. То есть НИЧЕГО ЛИШНЕГО. - 6: База Данных - берите без установки (H2 или HSQLDB). Одну!! Ваше приложение должно сразу запуститься, **без всяких настроек и переменных окружения** - - сделайте индексы к таблицам. Попробуйте обеспечит UNIQUE (один голос пользователя в день, один уникальный пункт меню в день). Следите за порядком полей в индексе. + - сделайте индексы к таблицам. Попробуйте обеспечит UNIQUE (один голос пользователя в день, один уникальный пункт меню в день). Следите за порядком полей в индексе - **историю еды и голосований сделать НУЖНО! Есть базовые вещи, которые закладываются в архитектуру приложения и неочевидные доработки к ТЗ, которых лучше не делать.** - при популировании добавте записи за сегодняшний день - now(), чтобы всегда были актуальные исходные данные - таблицы обычно именуются в единственном числе. Исключение - users, т. к. user - зарезервированное слово. `date`/`timestamp` - зарезервированное слово, лучше избегать их при именовании - 7: по возможности сделать JUnit тесты - 8: уделяйте внимание обработке ошибок -- 9: далаем REST API в соответствии с концепцией REST (url в общем имеют вид`{ресурс}/{id_ресурсa}[/{подресурс}/{id_подресурсa}][параметры]`) +- 9: делаем REST API в соответствии с концепцией REST (url в общем имеют вид`{ресурс}/{id_ресурсa}[/{подресурс}/{id_подресурсa}][параметры]`) - **[15 тривиальных фактов о правильной работе с протоколом HTTP](https://habrahabr.ru/company/yandex/blog/265569/)** - **10 Best Practices for Better RESTful API** - [REST resource hierarchy](https://stackoverflow.com/questions/20951419/what-are-best-practices-for-rest-nested-resources) @@ -62,25 +62,25 @@ _Антуан де Сент-Экзюпери_ - 12: если приложению в объекте требуется только его id, используйте reference (как мы при сохранении еды вставляем туда юзера) - 13: [Use for money in java app](http://stackoverflow.com/a/43051227/548473) - 14: еще раз про [hashCode/equals в Entity](https://stackoverflow.com/questions/5031614/the-jpa-hashcode-equals-dilemma): не делайте сравнение по полям! -- 15: название пакетов, имен классов для `model/to/web` достаточно стандартные (например `model/domain`). НЕ надо придумывать своих собственных правил. -- 16: **Используйте DATA-JPA** (сделайте без лишней делегации, напрямую из сервиса/контроллера дергать Repository). -- 17: в DATA-JPA 2.x используются `Optional`. Попробуйте работать с ними, это безопасный способ работать с null значениями (используйте `orElseThrow`). -- 18: на topjava мы смотрели разные варианты использования, тут делаем максимально просто. С TO многие вещи упрощаются. -- 19: проверьте, не торчат ли из кода учебные уши topjava, типа `ProfileRestController.testUTF()`, `AbstractServiceTest.printResult()` или закомментированные `JdbcTemplate`. Назначение этого проекта совсем другое. -- 20: ORM работает с объектами. [В простейших случаях fk_id как поля допустимы](https://stackoverflow.com/questions/6311776/hibernate-foreign-keys-instead-of-entities), но при этом JPA их уже никак не обрабатывает и не используйте их вместе с объектами. Ссылка на stackoverwrflow в коде обязательна! +- 15: название пакетов, имен классов для `model/to/web` достаточно стандартные (например `model/domain`). НЕ надо придумывать своих собственных правил +- 16: **Используйте DATA-JPA** (можно без лишней делегации, напрямую из сервиса/контроллера дергать Repository) +- 17: в DATA-JPA 2.x используются `Optional`. Попробуйте работать с ними, это безопасный способ работать с null значениями (используйте `orElseThrow`) +- 18: на topjava мы смотрели разные варианты использования, тут делаем максимально просто. С TO многие вещи упрощаются +- 19: проверьте, не торчат ли из кода учебные уши topjava, типа `ProfileRestController.testUTF()`, `AbstractServiceTest.printResult()` или закомментированные `JdbcTemplate`. Назначение этого проекта совсем другое +- 20: ORM работает с объектами. [В простейших случаях fk_id как поля допустимы](https://stackoverflow.com/questions/6311776/hibernate-foreign-keys-instead-of-entities), но при этом JPA их уже никак не обрабатывает и не используйте их вместе с объектами. Ссылка на stackoverflow в коде обязательна! - 21: проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, Доступ к AuthorizedUser). - 22: обновление в базе делается через `update`, даже если `delete/insert` сократит java код на несколько строк - 23: Кэширование - необязательно, но желательно - - **тщательно продумайте, что надо кэшировать (самые частые запросы)**, а что нет (большие или редкозапрашиваемые данные)! + - **тщательно продумайте, что надо кэшировать (самые частые запросы)**, а что нет (большие или редко запрашиваемые данные)! - проверьте соответствие ключей к кэшу (параметры кэшируемого метода) с конфигурацией (например в singleNonExpiryCache, heap=1 в кэше может содержаться только ОДНО значение). - 24: Валидация - желательна - одних аннотаций недостаточно. Должны быть `@Valid/@Validation` - проверяйте входные данные при `create/update` **в контроллерах!** В TopJava это `ValidationUtil.checkNew()/assureIdConsistent()` - 25: `readme.md`: - - Если задание на English, описание пишите также на English (то же самое относится к языку резюме: вакансия на English предполагает ваше резюме на English) - - Требуемые примеры `curl` не прячте- пишите здесь! + - Если задание на English, описание пишите также на English (тоже самое относится к языку резюме: вакансия на English предполагает ваше резюме на English) + - Требуемые примеры `curl` не прячьте, а пишите здесь! - Проверяют люди с опытом в Java: не надо писать инструкций, как устанавливать Java и Maven:) ## Попробуйте подергать свое API по всем типичным сценариям ТЗ! From bddd4a8dffcca8b081a25862586b6e09e850a8b5 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 23 Nov 2020 12:02:40 +0300 Subject: [PATCH 37/59] Update cv.md --- cv.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cv.md b/cv.md index a330bc3c71cb..04a98a01039d 100644 --- a/cv.md +++ b/cv.md @@ -109,5 +109,7 @@ - [ТОП-13 ошибок начинающего программиста](https://proglib.io/p/beginners-fails/) - [25 ошибок начинающего программиста](https://habr.com/ru/post/413129/) - [Нетехнические навыки](https://tproger.ru/experts/softskills-for-job) - +- Типичные ошибки начинающих программистов от JavaRush: + - [Часть 1](https://javarush.ru/groups/posts/3044-razbor-tipichnihkh-oshibok-nachinajujshikh-programmistov-chastjh-1) + - [Часть 2](https://javarush.ru/groups/posts/3055-razbor-tipichnihkh-oshibok-nachinajujshikh-programmistov-chastjh-2) ## [Отзывы по стажировке Topjava](https://vk.com/topic-74381644_30447246) From 325763b91c1a02b99061b39ede1085dbffda9d09 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 7 Dec 2020 23:33:54 +0300 Subject: [PATCH 38/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 38831adc6f29..9636181f4588 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ Java Enterprise Online Project - Выполнить задание и залить на GitHub (commit + push) - Переключиться в основную ветку проекта master. -## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Тех.задание: библия или допускаются изменения. Полуоткрытый интервал.](https://drive.google.com/file/d/123XyBYVeKLC3ZcRr_dUkwyvO9NC6WLkY/view?usp=sharing) +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Тех.задание: библия или допускаются изменения. Полуоткрытый интервал.](https://drive.google.com/file/d/1BpTzjNFjS0TSekCyt_xvt6YoLvuw5KTZ/view) - [Типы промежутков](https://ru.wikipedia.org/wiki/Промежуток_(математика)) ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW0 From 52f1f76870923b3715f1d9561547de45bcb1fbdf Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 21 Dec 2020 17:32:32 +0300 Subject: [PATCH 39/59] Update cv.md --- cv.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cv.md b/cv.md index 04a98a01039d..cc5ff22da638 100644 --- a/cv.md +++ b/cv.md @@ -88,6 +88,7 @@ - Яндекс агрегатор - HH - LinkedIn +- ХабрКарьера - djinni.co (более актуально для Украины) ## Как выжить на испытательном сроке From 1edcd14a9f5d1c780add0a7f2e56069e711c3b3d Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 21 Dec 2020 17:40:10 +0300 Subject: [PATCH 40/59] Update cv.md --- cv.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cv.md b/cv.md index cc5ff22da638..46a3442a81f4 100644 --- a/cv.md +++ b/cv.md @@ -89,8 +89,10 @@ - HH - LinkedIn - ХабрКарьера +- [headz.io](https://app.headz.io/candidates/new) - djinni.co (более актуально для Украины) + ## Как выжить на испытательном сроке - Учись грамотно формулировать проблему. Проблема "у меня не работает" может иметь тысячи причин. В процессе формулирования очень часто приходит ее решение. From 5f6d0c40136522bfa67e6b856997f402f295660e Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sat, 16 Jan 2021 00:31:31 +0300 Subject: [PATCH 41/59] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 9636181f4588..1bf92ee2cdd5 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Java Enterprise Online Project - Java 8: Lambda выражения - Java 8: Потоки - Pуководство по Java 8 Stream -- Java 8 Stream API в картинках и примерах +- [Полное руководство по Java 8 Stream API в картинках и примерах](https://annimon.com/article/2778) - [7 способов использовать groupingBy в Stream API](https://habrahabr.ru/post/348536) - Лямбда-выражения в Java 8 - A Guide to Java 8 @@ -111,7 +111,6 @@ Java Enterprise Online Project - Алексея Владыкин: Элементы функционального программирования в Java - Yakov Fain о новом в Java 8 - stream.map vs forEach Date: Mon, 18 Jan 2021 00:28:34 +0300 Subject: [PATCH 42/59] Update ReleaseNotes.md --- ReleaseNotes.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 65a0c209f4c1..7c03206fe59c 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,15 @@ # TopJava Release Notes +### 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`) From c2344fec7ec9f27edb507ec78aa05cbf912be732 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 18 Jan 2021 02:08:41 +0300 Subject: [PATCH 43/59] Update cv.md --- cv.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cv.md b/cv.md index 46a3442a81f4..17e0faf1ee83 100644 --- a/cv.md +++ b/cv.md @@ -111,6 +111,7 @@ - [**Советы новичкам**](http://blog.csssr.ru/2016/09/19/how-to-be-a-beginner-developer) - [ТОП-13 ошибок начинающего программиста](https://proglib.io/p/beginners-fails/) - [25 ошибок начинающего программиста](https://habr.com/ru/post/413129/) +- [Путеводитель по синдрому самозванца](https://dou.ua/lenta/articles/impostor-syndrome-guide-part1/) - [Нетехнические навыки](https://tproger.ru/experts/softskills-for-job) - Типичные ошибки начинающих программистов от JavaRush: - [Часть 1](https://javarush.ru/groups/posts/3044-razbor-tipichnihkh-oshibok-nachinajujshikh-programmistov-chastjh-1) From 2ec0a12b5ecbbc6191188ae38d2bd42085578b73 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 18 Jan 2021 02:10:14 +0300 Subject: [PATCH 44/59] Update cv.md --- cv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cv.md b/cv.md index 17e0faf1ee83..73ca6a62be71 100644 --- a/cv.md +++ b/cv.md @@ -111,7 +111,7 @@ - [**Советы новичкам**](http://blog.csssr.ru/2016/09/19/how-to-be-a-beginner-developer) - [ТОП-13 ошибок начинающего программиста](https://proglib.io/p/beginners-fails/) - [25 ошибок начинающего программиста](https://habr.com/ru/post/413129/) -- [Путеводитель по синдрому самозванца](https://dou.ua/lenta/articles/impostor-syndrome-guide-part1/) +- [Путеводитель по синдрому самозванца](https://vc.ru/hr/167443-eshche-odin-putevoditel-po-sindromu-samozvanca-korni-prichiny-simptomy-i-posledstviya-chast-1) - [Нетехнические навыки](https://tproger.ru/experts/softskills-for-job) - Типичные ошибки начинающих программистов от JavaRush: - [Часть 1](https://javarush.ru/groups/posts/3044-razbor-tipichnihkh-oshibok-nachinajujshikh-programmistov-chastjh-1) From 4be539c0796b7cd3028cd2279259e23cb19624aa Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 22 Jan 2021 15:40:25 +0300 Subject: [PATCH 45/59] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 1bf92ee2cdd5..7cae831f37ca 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,11 @@ Java Enterprise Online Project ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Работа с проектом (выполнять инструкции) - **ВНИМАНИЕ: выбирайте для проекта простой пусть без пробелов и русских букв, например (Windows) `c:\projects\topjava\`. Иначе впоследствии будут проблемы** - **Плагин уже Git Intergation не требуется и вкладку `Version control` в IDEA переименовали в `Git`** + +Для переключения режима отображения изменений из вкладки Commit в Git: Local Changes нужно переключить `Settings/Preferences | Version Control | Commit | Use non-modal commit interface` или в контекстном меню вкладки `Commit`: + +![image](https://user-images.githubusercontent.com/13649199/105491518-72d8f300-5cc7-11eb-8b79-c46382562deb.png) ![image](https://user-images.githubusercontent.com/13649199/105488663-05c35e80-5cc3-11eb-962e-30f403d623e8.png) + ### Патч [prepare_to_HW0.patch](https://drive.google.com/file/d/1LNPpu9OkuCpfpD8ZJHO-o0vwu49p2i5M) (скачать и положить в каталог вашего проекта) > Проект постоянно улучшается, поэтому видео иногда отличается от кода проекта. Изменения указываю после видео: From a779519ad62dc8287b7a9296397a3521c453bdf3 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 28 Jan 2021 00:30:29 +0300 Subject: [PATCH 46/59] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7cae831f37ca..cb332ffa033b 100644 --- a/README.md +++ b/README.md @@ -198,6 +198,7 @@ Java Enterprise Online Project - A Guide to Java 8 ### Туториалы, разное +- [Открытый курс: Spring Boot + HATEOAS](https://javaops.ru/view/bootjava) - [Что нужно знать о бэкенде новичку в веб-разработке](https://tproger.ru/translations/backend-web-development) - [Туториалы: Spring Framework, Hibernate, Java Core, JDBC](http://proselyte.net/tutorials/) From c91877064f1b5b7554849e02d7479cdabac24219 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 28 Jan 2021 11:41:19 +0300 Subject: [PATCH 47/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cb332ffa033b..71288706bc75 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ Java Enterprise Online Project - Оцените Time complexity алгоритма. Если она больше O(N), например O(N*N) или N*log(N), сделайте O(N). ``` - Java 8 Date and Time API -- Алгоритмы и структуры данных для начинающих: сложность алгоритмов +- Алгоритмы и структуры данных для начинающих: сложность алгоритмов - [Головач: сложность алгоритмов в теме коллекций](https://www.youtube.com/watch?v=Ek9ijOiplNE&feature=youtu.be&t=778) - Time complexity - Временная сложность алгоритма From d026d2cf746fca5b071f3b54422ffeb46dcb3868 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 29 Jan 2021 12:25:27 +0300 Subject: [PATCH 48/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71288706bc75..8a58f7f11632 100644 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ Java Enterprise Online Project ## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Замечания к HW0 - 1: Код проекта менять можно! Одна из распространенных ошибок как в тестовых заданиях на собеседовании, так и при работе на проекте, что ничего нельзя менять. Конечно при правках в рабочем проекте обязательно нужно проконсультироваться/проревьюироваться у авторов кода (находится по истории VCS) -- 2: Наследовать `UserMealWithExcess` от `UserMeal` я не буду, т.к. это разные сущности: Transfer Object и Entity. Мы будет их проходить на 2м уроке. +- 2: Наследовать `UserMealWithExcess` от `UserMeal` нельзя, т.к. это разные сущности: Transfer Object и Entity. Мы будет их проходить на 2м уроке. Это относится и к зависимости. - 3: Правильная реализация должна быть простой и красивой, можно сделать 2-мя способами: через стримы и через циклы. Сложность должна быть O(N), т.е. без вложенных стримов и циклов. - 4: При реализации через циклы посмотрите в `Map` на методы `getOrDefault` или `merge` - 5: **При реализации через `Stream` заменяйте `forEach` оператором `stream.map(..)`** From 86a6795a6e1997d32c972f53b7a7c045ac55f1dc Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 2 Feb 2021 20:06:39 +0300 Subject: [PATCH 49/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a58f7f11632..470cce9ecab8 100644 --- a/README.md +++ b/README.md @@ -192,7 +192,7 @@ Java Enterprise Online Project - Введение в Java Reflection API - Структуры данных в картинках - Обзор java.util.concurrent.* -- Синхронизация потоков +- Синхронизация потоков - String literal pool - Маленькие хитрости Java - A Guide to Java 8 From dc1eed9977324cd4b5f5d066382edc572aa09317 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 2 Feb 2021 20:10:55 +0300 Subject: [PATCH 50/59] Update description.md --- description.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/description.md b/description.md index 0619c6d9516d..58fb5d2cdf74 100644 --- a/description.md +++ b/description.md @@ -16,24 +16,24 @@ Hibernate, делаем конверторы для типов LocalDateTime (Ja - Системы управления версиями - Java 8: Lambda, Stream API - Обзор используемых в проекте технологий и инструментов. -- Инструмент сборки Maven. +- Инструмент сборки Maven - WAR. Веб-контейнер Tomcat. Сервлеты. - Логирование. - Обзор стандартных библиотек. Apache Commons, Guava - Слои приложения. Создание каркаса приложения. - Обзор Spring Framework. Spring Context. - Тестирование через JUnit. -- Spring Test +- Spring Test - Базы данных. PostgreSQL. Обзор NoSQL и Java persistence solution без ORM. - Настройка Database в IDEA. - Скрипты инициализации базы. Spring Jdbc Template. -- Spring: инициализация и популирование DB +- Spring: инициализация и популирование DB - ORM. Hibernate. JPA. - [Тестирование JPA сервиса через AssertJ](https://www.youtube.com/watch?v=BlyaXT6tOaw) - Поддержка HSQLDB - Транзакции - Профили Maven и Spring -- Пул коннектов +- Пул коннектов - Spring Data JPA - Кэш Hibernate @@ -69,4 +69,4 @@ Hibernate, делаем конверторы для типов LocalDateTime (Ja - Локализация datatables, ошибок валидации - Обработка ошибок 404 (NotFound) - Доступ к AuthorizedUser -- Собеседование. Разработка ПО \ No newline at end of file +- Собеседование. Разработка ПО From fada483294ca81e52c50622b864646106a66d5bd Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sat, 27 Feb 2021 21:51:50 +0300 Subject: [PATCH 51/59] Update cv.md --- cv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cv.md b/cv.md index 73ca6a62be71..878437e24bb4 100644 --- a/cv.md +++ b/cv.md @@ -93,7 +93,7 @@ - djinni.co (более актуально для Украины) -## Как выжить на испытательном сроке +

Как выжить на испытательном сроке

- Учись грамотно формулировать проблему. Проблема "у меня не работает" может иметь тысячи причин. В процессе формулирования очень часто приходит ее решение. - Учись инвестигировать проблему. Внимательное чтение логов и умение дебажить - основные навыки From 1d8f32a0b890d5b7a7c04ed798c10df51841ca9d Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sat, 27 Feb 2021 21:54:16 +0300 Subject: [PATCH 52/59] Update cv.md --- cv.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cv.md b/cv.md index 878437e24bb4..d3789a9e796a 100644 --- a/cv.md +++ b/cv.md @@ -94,6 +94,7 @@

Как выжить на испытательном сроке

+ - Учись грамотно формулировать проблему. Проблема "у меня не работает" может иметь тысячи причин. В процессе формулирования очень часто приходит ее решение. - Учись инвестигировать проблему. Внимательное чтение логов и умение дебажить - основные навыки @@ -113,6 +114,7 @@ - [25 ошибок начинающего программиста](https://habr.com/ru/post/413129/) - [Путеводитель по синдрому самозванца](https://vc.ru/hr/167443-eshche-odin-putevoditel-po-sindromu-samozvanca-korni-prichiny-simptomy-i-posledstviya-chast-1) - [Нетехнические навыки](https://tproger.ru/experts/softskills-for-job) +- Видео [Junior и испытательный срок на первой работе](https://www.youtube.com/watch?v=GsGlsCbok-c) - Типичные ошибки начинающих программистов от JavaRush: - [Часть 1](https://javarush.ru/groups/posts/3044-razbor-tipichnihkh-oshibok-nachinajujshikh-programmistov-chastjh-1) - [Часть 2](https://javarush.ru/groups/posts/3055-razbor-tipichnihkh-oshibok-nachinajujshikh-programmistov-chastjh-2) From 699c90299d78fcbb30ebb65f7ec2712d4925d29d Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sat, 10 Apr 2021 12:12:14 +0300 Subject: [PATCH 53/59] Update cv.md --- cv.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cv.md b/cv.md index d3789a9e796a..f459060b227a 100644 --- a/cv.md +++ b/cv.md @@ -37,6 +37,8 @@ - Михаил Портнов. Собеседование на работу: как продать себя грамотно - Михаил Портнов. Какие вопросы мы задаем на собеседовании? - Михаил Портнов. Собеседование на работу: жизненный путь +- [Лёша Корепанов. Признаки плохих компаний для программиста](https://www.youtube.com/watch?v=Sj-WSWr-n7U) +- [Лёша Корепанов. Как отвечать на вопросы, которые ты не знаешь. Техническое интервью для программиста](https://www.youtube.com/watch?v=Beoh3tfgPEk) - Канал: Резюме, поиск работы, интервью - Яков Файн: Как стать профессиональным Java разработчиком - Ответы на вопросы на собеседовании Junior Java Developer From b7f28e7176958c11c1e49680be14559eb8045ed7 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 16 Apr 2021 15:10:41 +0300 Subject: [PATCH 54/59] Update description.md --- description.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/description.md b/description.md index 58fb5d2cdf74..0834140f19a7 100644 --- a/description.md +++ b/description.md @@ -70,3 +70,11 @@ Hibernate, делаем конверторы для типов LocalDateTime (Ja - Обработка ошибок 404 (NotFound) - Доступ к AuthorizedUser - Собеседование. Разработка ПО + +### Миграция на Spring Boot +- Основы Spring Boot. Spring Boot maven plugin +- Lombok, база H2, ApplicationRunner +- Spring Data REST + HATEOAS +- Swagger/ OpenAPI 3.0 +- Тестирование и кэширование в Spring Boot +- Миграция приложения TopJava на Spring Boot From bc6880c6100e3abcc932958ae72717fcf369af90 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 26 May 2021 13:42:29 +0300 Subject: [PATCH 55/59] Update graduation.md --- graduation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/graduation.md b/graduation.md index 442ce82b8c47..50494a26ab8f 100644 --- a/graduation.md +++ b/graduation.md @@ -82,6 +82,7 @@ _Антуан де Сент-Экзюпери_ - Если задание на English, описание пишите также на English (тоже самое относится к языку резюме: вакансия на English предполагает ваше резюме на English) - Требуемые примеры `curl` не прячьте, а пишите здесь! - Проверяют люди с опытом в Java: не надо писать инструкций, как устанавливать Java и Maven:) +- 26: на управление (CRUD) рестаранами и едой должны быть ОТДЕЛЬНЫЕ контроллеры. Не надо все, что может админ сваливать в одну кучу! ## Попробуйте подергать свое API по всем типичным сценариям ТЗ! - Удобно использовать? Можно сделать проще? Например чтобы проголосовать за ресторан залогиненному юзеру достаточно `restorauntId`. From 8c4236cdbaa50c5d397be711be33065c4ee388f7 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 26 May 2021 17:55:43 +0300 Subject: [PATCH 56/59] Update graduation.md --- graduation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index 50494a26ab8f..e04d13c35885 100644 --- a/graduation.md +++ b/graduation.md @@ -82,7 +82,7 @@ _Антуан де Сент-Экзюпери_ - Если задание на English, описание пишите также на English (тоже самое относится к языку резюме: вакансия на English предполагает ваше резюме на English) - Требуемые примеры `curl` не прячьте, а пишите здесь! - Проверяют люди с опытом в Java: не надо писать инструкций, как устанавливать Java и Maven:) -- 26: на управление (CRUD) рестаранами и едой должны быть ОТДЕЛЬНЫЕ контроллеры. Не надо все, что может админ сваливать в одну кучу! +- 26: на управление (CRUD) рестаранами и едой должны быть ОТДЕЛЬНЫЕ контроллеры. Не надо все, что может админ, сваливать в одну кучу! ## Попробуйте подергать свое API по всем типичным сценариям ТЗ! - Удобно использовать? Можно сделать проще? Например чтобы проголосовать за ресторан залогиненному юзеру достаточно `restorauntId`. From 657ed5fcd836df938c6d540cd7cc919c5e50ece9 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 28 May 2021 15:52:56 +0300 Subject: [PATCH 57/59] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 470cce9ecab8..2941a385669b 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ Java Enterprise Online Project - циклом за 1 проход по `List` - без циклов по другим коллекциям/массивам (к ним также относим методы коллекций `addAll()/removeAll()`) - решение должно быть рабочим в общем случае (работать в приложении с многими пользователями, не только при запуске main) -- через Stream API за 1 проход по исходному списку `meals.streem()` +- через Stream API за 1 проход по исходному списку `meals.stream()` - нельзя использовать внешние коллекции, не являющиеся частью коллектора - нельзя 2 раза проходить по исходному списку (в том числе его отфильтрованной или преобразованной копии) - возможно дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Те например нельзя разбить список на на 2 подсписка с четными и нечетными датами и затем их объединить, с подсчетом превышения для каждого элемента. From 1dcc68b58d81d385c867835fa28561f72396fbea Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 28 May 2021 15:54:28 +0300 Subject: [PATCH 58/59] Create README.md From ad6225f2f50a3edbc5eb46f6af969e2995027df4 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 30 May 2021 10:48:37 +0300 Subject: [PATCH 59/59] Update graduation.md --- graduation.md | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/graduation.md b/graduation.md index e04d13c35885..4aa2c1b00dae 100644 --- a/graduation.md +++ b/graduation.md @@ -16,7 +16,7 @@ Build a voting system for deciding where to have lunch. Each restaurant provides a new menu each day. -As a result, provide a link to github repository. It should contain the code, README.md with API documentation and couple curl commands to test it. +As a result, provide a link to github repository. It should contain the code, README.md with API documentation and couple curl commands to test it (better - Swagger). ----------------------------- P.S.: Make sure everything works with latest version that is on github :) @@ -27,8 +27,9 @@ P.P.S.: Assume that your API will be used by a frontend developer to build front ### ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Рекомендации - **Сделай новый проект и добавляй туда из Topjava только то что нужно! Локализация, типы ошибок, BeanMatcher, Json View, излишние делегирования и наследования - не нужны!** -- **API продумывай с точки зрения не программиста и объектов, а с точки зрения того, кто им будет пользоваться (frontend)** +- **Рекомендую переписать проект современно: Spring Boot + Swagger/OpenAPI 3.0. Оптимально подойдет код миграции TopJava на Spring Boot в конце стажировки.** - **Сначала сделай основной сценарий по ТЗ. Все остальное (если очень хочется, 3 раза подумай) - потом.** +- API продумывай с точки зрения не программиста и объектов, а с точки зрения того, кто им будет пользоваться (frontend) *Представьте себе, что ПМ (лид, архитектор) дал вам ТЗ и некоторое время недоступен. У вас, конечно, есть много мыслей, для чего нужно приложение, как исправить ТЗ, дополнить его и сделать правильно. НО НЕ НАДО ИХ РЕАЛИЗОВЫВАТЬ В КОДЕ. Нужно сделать все максимально просто, удобно для доработок и для использования со стороны клиента (если, конечно, в ТЗ нет оговорок). Все свои вопросы, предложения и хотелки оформляйте отдельно (в `read.me` например). Если делаете что-то сложнее простейшего случая (например, справочник еды) - обязательно напишите в read.me. Как и выбор стратегии кэширования.* @@ -36,11 +37,11 @@ P.P.S.: Assume that your API will be used by a frontend developer to build front _Антуан де Сент-Экзюпери_ -- 1: **читаем ТЗ ОЧЕНЬ внимательно, НЕ надо ничего своего туда домысливать и творчески изменять** -- 2: **тщательно считайте количество обращений в базу на каждый запрос. Особенно при запросах от юзеров, которых очень много! Также на сложность запросов от них, чтобы не положить базу**. Самое худшее в коде - обращение в базу в цикле. -- 3: **тщательно считайте количество запросов в вашем API для отображения нужной информации** -- 4: учитывайте, что **пользователей может быть ОООЧЕНЬ много, а админов - МАЛО** -- 5: в проекте (и тестовом задании на работу), в отличие от нашего учебного topjava, оставляйте только необходимый для работы приложения код, ничего лишнего: +- 1: **Читаем ТЗ ОЧЕНЬ внимательно, НЕ надо ничего своего туда домысливать и творчески изменять** +- 2: **Тщательно считайте количество обращений в базу на каждый запрос. Особенно при запросах от юзеров, которых очень много! Также на сложность запросов от них, чтобы не положить базу**. Самое худшее в коде - обращение в базу в цикле. +- 3: **Тщательно считайте количество запросов в вашем API для отображения нужной информации** +- 4: Учитывайте, что **пользователей может быть ОООЧЕНЬ много, а админов - МАЛО** +- 5: В проекте (и тестовом задании на работу), в отличие от нашего учебного topjava, оставляйте только необходимый для работы приложения код, ничего лишнего: - 5.1 НЕ надо делать разные профили базы и работы с ней - 5.2 НЕ надо делать абстрактных контроллеров на всякий случай - 5.3 НЕ надо делать **классов репозиториев и сервисов**, если там нет ничего, кроме делегирования @@ -51,27 +52,27 @@ _Антуан де Сент-Экзюпери_ - **историю еды и голосований сделать НУЖНО! Есть базовые вещи, которые закладываются в архитектуру приложения и неочевидные доработки к ТЗ, которых лучше не делать.** - при популировании добавте записи за сегодняшний день - now(), чтобы всегда были актуальные исходные данные - таблицы обычно именуются в единственном числе. Исключение - users, т. к. user - зарезервированное слово. `date`/`timestamp` - зарезервированное слово, лучше избегать их при именовании -- 7: по возможности сделать JUnit тесты -- 8: уделяйте внимание обработке ошибок -- 9: делаем REST API в соответствии с концепцией REST (url в общем имеют вид`{ресурс}/{id_ресурсa}[/{подресурс}/{id_подресурсa}][параметры]`) +- 7: По возможности сделать JUnit тесты +- 8: Уделяйте внимание обработке ошибок +- 9: Делаем REST API в соответствии с концепцией REST (url в общем имеют вид`{ресурс}/{id_ресурсa}[/{подресурс}/{id_подресурсa}][параметры]`) - **[15 тривиальных фактов о правильной работе с протоколом HTTP](https://habrahabr.ru/company/yandex/blog/265569/)** - **10 Best Practices for Better RESTful API** - [REST resource hierarchy](https://stackoverflow.com/questions/20951419/what-are-best-practices-for-rest-nested-resources) -- 10: не смешивайте TO и Entity вместе. Лучше всего, если они будут независимыми друг от друга. -- 11: не размещайте логику приложения и преобразования в TO в слое доступа к DB -- 12: если приложению в объекте требуется только его id, используйте reference (как мы при сохранении еды вставляем туда юзера) +- 10: Не смешивайте TO и Entity вместе. Лучше всего, если они будут независимыми друг от друга. +- 11: Не размещайте логику приложения и преобразования в TO в слое доступа к DB +- 12: Если приложению в объекте требуется только его id, используйте reference (как мы при сохранении еды вставляем туда юзера) - 13: [Use for money in java app](http://stackoverflow.com/a/43051227/548473) -- 14: еще раз про [hashCode/equals в Entity](https://stackoverflow.com/questions/5031614/the-jpa-hashcode-equals-dilemma): не делайте сравнение по полям! -- 15: название пакетов, имен классов для `model/to/web` достаточно стандартные (например `model/domain`). НЕ надо придумывать своих собственных правил +- 14: Еще раз про [hashCode/equals в Entity](https://stackoverflow.com/questions/5031614/the-jpa-hashcode-equals-dilemma): не делайте сравнение по полям! +- 15: Название пакетов, имен классов для `model/to/web` достаточно стандартные (например `model/domain`). НЕ надо придумывать своих собственных правил - 16: **Используйте DATA-JPA** (можно без лишней делегации, напрямую из сервиса/контроллера дергать Repository) -- 17: в DATA-JPA 2.x используются `Optional`. Попробуйте работать с ними, это безопасный способ работать с null значениями (используйте `orElseThrow`) -- 18: на topjava мы смотрели разные варианты использования, тут делаем максимально просто. С TO многие вещи упрощаются -- 19: проверьте, не торчат ли из кода учебные уши topjava, типа `ProfileRestController.testUTF()`, `AbstractServiceTest.printResult()` или закомментированные `JdbcTemplate`. Назначение этого проекта совсем другое +- 17: В DATA-JPA 2.x используются `Optional`. Попробуйте работать с ними, это безопасный способ работать с null значениями (используйте `orElseThrow`) +- 18: На topjava мы смотрели разные варианты использования, тут делаем максимально просто. С TO многие вещи упрощаются +- 19: Проверьте, не торчат ли из кода учебные уши topjava, типа `ProfileRestController.testUTF()`, `AbstractServiceTest.printResult()` или закомментированные `JdbcTemplate`. Назначение этого проекта совсем другое - 20: ORM работает с объектами. [В простейших случаях fk_id как поля допустимы](https://stackoverflow.com/questions/6311776/hibernate-foreign-keys-instead-of-entities), но при этом JPA их уже никак не обрабатывает и не используйте их вместе с объектами. Ссылка на stackoverflow в коде обязательна! -- 21: проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, Доступ к AuthorizedUser). -- 22: обновление в базе делается через `update`, даже если `delete/insert` сократит java код на несколько строк +- 21: Проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, Доступ к AuthorizedUser). +- 22: Обновление в базе делается через `update`, даже если `delete/insert` сократит java код на несколько строк - 23: Кэширование - - необязательно, но желательно + - необязательно, но желательно. Чем проще реализация - тем лучше. - **тщательно продумайте, что надо кэшировать (самые частые запросы)**, а что нет (большие или редко запрашиваемые данные)! - проверьте соответствие ключей к кэшу (параметры кэшируемого метода) с конфигурацией (например в singleNonExpiryCache, heap=1 в кэше может содержаться только ОДНО значение). - 24: Валидация @@ -80,13 +81,13 @@ _Антуан де Сент-Экзюпери_ - проверяйте входные данные при `create/update` **в контроллерах!** В TopJava это `ValidationUtil.checkNew()/assureIdConsistent()` - 25: `readme.md`: - Если задание на English, описание пишите также на English (тоже самое относится к языку резюме: вакансия на English предполагает ваше резюме на English) - - Требуемые примеры `curl` не прячьте, а пишите здесь! + - Требуемые примеры `curl` не прячьте, а пишите здесь! Оптимально - ссылка на Swagger. - Проверяют люди с опытом в Java: не надо писать инструкций, как устанавливать Java и Maven:) -- 26: на управление (CRUD) рестаранами и едой должны быть ОТДЕЛЬНЫЕ контроллеры. Не надо все, что может админ, сваливать в одну кучу! +- 26: На управление (CRUD) рестаранами и едой должны быть ОТДЕЛЬНЫЕ контроллеры. Не надо все, что может админ, сваливать в одну кучу! ## Попробуйте подергать свое API по всем типичным сценариям ТЗ! - Удобно использовать? Можно сделать проще? Например чтобы проголосовать за ресторан залогиненному юзеру достаточно `restorauntId`. -- Сколько раз пришлось его вызвать API для типичного сценария (нарпимер посмотреть рестораны с едой)? +- Сколько раз пришлось его вызвать API для типичного сценария (нарпимер посмотреть рестораны с едой на сегодня)? - Сколько запросов к базе было сделано? Можно ли сократить (например с FETCH/Graph или через кэширование)? - **API ДОЛЖНО соответствовать принципам REST (см. ссылки выше)** - **ОБЯЗАТЕЛЬНО: запустите `mvn test`- ошибок быть не должно**