From 08978526da5a84c1108652b99281c3c05f592c9c Mon Sep 17 00:00:00 2001 From: ganka-xn Date: Fri, 15 Nov 2024 20:43:21 +0300 Subject: [PATCH 01/12] VK & Yandex has been deleted --- resources/static/fontawesome/css/all.css | 6 ++++ resources/view/login.html | 8 ----- resources/view/unauth/register.html | 8 ----- .../jira/bugtracking/attachment/FileUtil.java | 5 +++ .../task/ActivityTrackingService.java | 20 +++++++++++ .../jira/bugtracking/task/TagController.java | 22 ++++++++++++ .../jira/bugtracking/task/TagService.java | 10 ++++++ .../handler/VkOAuth2UserDataHandler.java | 35 ------------------- .../handler/YandexOAuth2UserDataHandler.java | 21 ----------- src/main/resources/application.yaml | 26 ++------------ .../web/ProfileRestControllerTest.java | 4 +++ src/test/resources/application-test.yaml | 13 ++++++- 12 files changed, 81 insertions(+), 97 deletions(-) create mode 100644 src/main/java/com/javarush/jira/bugtracking/task/ActivityTrackingService.java create mode 100644 src/main/java/com/javarush/jira/bugtracking/task/TagController.java create mode 100644 src/main/java/com/javarush/jira/bugtracking/task/TagService.java delete mode 100644 src/main/java/com/javarush/jira/login/internal/sociallogin/handler/VkOAuth2UserDataHandler.java delete mode 100644 src/main/java/com/javarush/jira/login/internal/sociallogin/handler/YandexOAuth2UserDataHandler.java diff --git a/resources/static/fontawesome/css/all.css b/resources/static/fontawesome/css/all.css index af5980828..5652a68f6 100644 --- a/resources/static/fontawesome/css/all.css +++ b/resources/static/fontawesome/css/all.css @@ -8603,9 +8603,11 @@ readers do not read off random characters that represent icons */ content: "\f3e8"; } +/* .fa-vk:before { content: "\f189"; } +*/ .fa-untappd:before { content: "\f405"; @@ -9955,9 +9957,11 @@ readers do not read off random characters that represent icons */ content: "\f3bc"; } +/* .fa-yandex:before { content: "\f413"; } +*/ .fa-readme:before { content: "\f4d5"; @@ -10183,9 +10187,11 @@ readers do not read off random characters that represent icons */ content: "\f7c6"; } +/* .fa-yandex-international:before { content: "\f414"; } +*/ .fa-cc-amex:before { content: "\f1f3"; diff --git a/resources/view/login.html b/resources/view/login.html index 8765ca8ff..d49ce5691 100644 --- a/resources/view/login.html +++ b/resources/view/login.html @@ -48,14 +48,6 @@

Sign in

type="button"> - - - - - - diff --git a/resources/view/unauth/register.html b/resources/view/unauth/register.html index 2ba955045..52a892bd3 100644 --- a/resources/view/unauth/register.html +++ b/resources/view/unauth/register.html @@ -77,14 +77,6 @@

Registration

type="button"> - - - - - - diff --git a/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java b/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java index 6cffbe175..10bfd5dc0 100644 --- a/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java +++ b/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java @@ -16,10 +16,14 @@ import java.nio.file.Path; import java.nio.file.Paths; + @UtilityClass public class FileUtil { private static final String ATTACHMENT_PATH = "./attachments/%s/"; +//todo Сделать рефакторинг метода com.javarush.jira.bugtracking.attachment.FileUtil#upload, +// чтоб он использовал современный подход для работы с файловой системмой. + //io -> nio public static void upload(MultipartFile multipartFile, String directoryPath, String fileName) { if (multipartFile.isEmpty()) { throw new IllegalRequestDataException("Select a file to upload."); @@ -36,6 +40,7 @@ public static void upload(MultipartFile multipartFile, String directoryPath, Str } } + //nio public static Resource download(String fileLink) { Path path = Paths.get(fileLink); try { diff --git a/src/main/java/com/javarush/jira/bugtracking/task/ActivityTrackingService.java b/src/main/java/com/javarush/jira/bugtracking/task/ActivityTrackingService.java new file mode 100644 index 000000000..3c3fb6ec8 --- /dev/null +++ b/src/main/java/com/javarush/jira/bugtracking/task/ActivityTrackingService.java @@ -0,0 +1,20 @@ +package com.javarush.jira.bugtracking.task; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +//todo Добавить подсчет времени сколько задача находилась в работе и тестировании. +// Написать 2 метода на уровне сервиса, которые параметром принимают задачу и возвращают затраченное время: +// Сколько задача находилась в работе (ready_for_review минус in_progress ). +// Сколько задача находилась на тестировании (done минус ready_for_review). +// Для написания этого задания, нужно добавить в конец скрипта инициализации базы данных changelog.sql 3 записи в таблицу ACTIVITY +// insert into ACTIVITY ( ID, AUTHOR_ID, TASK_ID, UPDATED, STATUS_CODE ) values ... +// Со статусами: +// время начала работы над задачей – in_progress +// время окончания разработки - ready_for_review +// время конца тестирования - done + +@Service +@RequiredArgsConstructor +public class ActivityTrackingService { +} diff --git a/src/main/java/com/javarush/jira/bugtracking/task/TagController.java b/src/main/java/com/javarush/jira/bugtracking/task/TagController.java new file mode 100644 index 000000000..67f4fe27c --- /dev/null +++ b/src/main/java/com/javarush/jira/bugtracking/task/TagController.java @@ -0,0 +1,22 @@ +package com.javarush.jira.bugtracking.task; + +import lombok.Data; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +//todo задача 7 +// Добавить новый функционал: добавления тегов к задаче (REST API + реализация на сервисе). +// Фронт делать необязательно. Таблица task_tag уже создана. + + +@RestController +@RequestMapping +public class TagController { + + private final TagService tagService; + + + public TagController(TagService tagService) { + this.tagService = tagService; + } +} diff --git a/src/main/java/com/javarush/jira/bugtracking/task/TagService.java b/src/main/java/com/javarush/jira/bugtracking/task/TagService.java new file mode 100644 index 000000000..b9c840bc4 --- /dev/null +++ b/src/main/java/com/javarush/jira/bugtracking/task/TagService.java @@ -0,0 +1,10 @@ +package com.javarush.jira.bugtracking.task; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class TagService { + +} diff --git a/src/main/java/com/javarush/jira/login/internal/sociallogin/handler/VkOAuth2UserDataHandler.java b/src/main/java/com/javarush/jira/login/internal/sociallogin/handler/VkOAuth2UserDataHandler.java deleted file mode 100644 index e8e05be05..000000000 --- a/src/main/java/com/javarush/jira/login/internal/sociallogin/handler/VkOAuth2UserDataHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.javarush.jira.login.internal.sociallogin.handler; - -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -@Component("vk") -public class VkOAuth2UserDataHandler implements OAuth2UserDataHandler { - @Override - public String getFirstName(OAuth2UserData oAuth2UserData) { - return getAttribute(oAuth2UserData, "first_name"); - } - - @Override - public String getLastName(OAuth2UserData oAuth2UserData) { - return getAttribute(oAuth2UserData, "last_name"); - } - - @Override - public String getEmail(OAuth2UserData oAuth2UserData) { - return oAuth2UserData.getData("email"); - } - - private String getAttribute(OAuth2UserData oAuth2UserData, String name) { - List> attributesResponse = oAuth2UserData.getData("response"); - if (attributesResponse != null) { - Map attributes = attributesResponse.get(0); - if (attributes != null) { - return (String) attributes.get(name); - } - } - return null; - } -} diff --git a/src/main/java/com/javarush/jira/login/internal/sociallogin/handler/YandexOAuth2UserDataHandler.java b/src/main/java/com/javarush/jira/login/internal/sociallogin/handler/YandexOAuth2UserDataHandler.java deleted file mode 100644 index e8ea1ac1d..000000000 --- a/src/main/java/com/javarush/jira/login/internal/sociallogin/handler/YandexOAuth2UserDataHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.javarush.jira.login.internal.sociallogin.handler; - -import org.springframework.stereotype.Component; - -@Component("yandex") -public class YandexOAuth2UserDataHandler implements OAuth2UserDataHandler { - @Override - public String getFirstName(OAuth2UserData oAuth2UserData) { - return oAuth2UserData.getData("first_name"); - } - - @Override - public String getLastName(OAuth2UserData oAuth2UserData) { - return oAuth2UserData.getData("last_name"); - } - - @Override - public String getEmail(OAuth2UserData oAuth2UserData) { - return oAuth2UserData.getData("default_email"); - } -} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 7fcba1570..e6ce7d02f 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -30,6 +30,8 @@ spring: username: jira password: JiraRush + #todo Вынести чувствительную информацию в отдельный проперти файл: + liquibase: changeLog: "classpath:db/changelog.sql" @@ -61,20 +63,6 @@ spring: scope: - email - profile - vk: - client-id: 51562377 - client-secret: jNM1YHQy1362Mqs49wUN - client-name: Vkontakte - redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" - client-authentication-method: client_secret_post - authorization-grant-type: authorization_code - scope: email - yandex: - client-id: 2f3395214ba84075956b76a34b231985 - client-secret: ed236c501e444a609b0f419e5e88f1e1 - client-name: Yandex - redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" - authorization-grant-type: authorization_code gitlab: client-id: b8520a3266089063c0d8261cce36971defa513f5ffd9f9b7a3d16728fc83a494 client-secret: e72c65320cf9d6495984a37b0f9cc03ec46be0bb6f071feaebbfe75168117004 @@ -83,16 +71,6 @@ spring: authorization-grant-type: authorization_code scope: read_user provider: - vk: - authorization-uri: https://oauth.vk.com/authorize - token-uri: https://oauth.vk.com/access_token - user-info-uri: https://api.vk.com/method/users.get?v=8.1 - user-name-attribute: response - yandex: - authorization-uri: https://oauth.yandex.ru/authorize - token-uri: https://oauth.yandex.ru/token - user-info-uri: https://login.yandex.ru/info - user-name-attribute: login gitlab: authorization-uri: https://gitlab.com/oauth/authorize token-uri: https://gitlab.com/oauth/token diff --git a/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java b/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java index a6fd5e3bf..b51ba96a3 100644 --- a/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java +++ b/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java @@ -3,6 +3,10 @@ import com.javarush.jira.AbstractControllerTest; +//todo +// mockMVC + mockito + junit +// Написать тесты для всех публичных методов контроллера ProfileRestController. +// Хоть методов только 2, но тестовых методов должно быть больше, т.к. нужно проверить success and unsuccess path. class ProfileRestControllerTest extends AbstractControllerTest { } \ No newline at end of file diff --git a/src/test/resources/application-test.yaml b/src/test/resources/application-test.yaml index 51137fd06..07a55d3b6 100644 --- a/src/test/resources/application-test.yaml +++ b/src/test/resources/application-test.yaml @@ -1,8 +1,19 @@ spring.cache.type: none + spring: init: mode: always + datasource: url: jdbc:postgresql://localhost:5433/jira-test username: jira - password: JiraRush \ No newline at end of file + password: JiraRush + + #todo Вынести чувствительную информацию в отдельный проперти файл: + # логин, пароль БД, идентификаторы для OAuth регистрации/авторизации, настройки почты + # Значения этих проперти должны считываться при старте сервера из переменных окружения машины. + + #todo Переделать тесты так, чтоб во время тестов использовалась in memory БД (H2), а не PostgreSQL. + # Для этого нужно определить 2 бина, и выборка какой из них использовать должно определяться активным профилем Spring. + # H2 не поддерживает все фичи, которые есть у PostgreSQL, + # поэтому тебе прийдется немного упростить скрипты с тестовыми данными. \ No newline at end of file From dd5dcc30a08a98f4ba447e4537560633f7cf1893 Mon Sep 17 00:00:00 2001 From: ganka-xn Date: Tue, 19 Nov 2024 15:34:13 +0300 Subject: [PATCH 02/12] Task 2. Put env vars to environment-vars.yaml --- .gitignore | 3 +- src/main/resources/application.yaml | 49 +----------------------- src/main/resources/environment-vars.yaml | 49 ++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 49 deletions(-) create mode 100644 src/main/resources/environment-vars.yaml diff --git a/.gitignore b/.gitignore index cd38e2e7b..67702562f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,4 @@ target logs attachments *.patch - - +#src/main/resources/environment-vars.yaml \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index e6ce7d02f..5df77ed2f 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,13 +1,14 @@ # https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html app: host-url: http://localhost:8080 - test-mail: jira4jr@gmail.com templates-update-cache: 5s mail-sending-props: core-pool-size: 8 max-pool-size: 100 spring: + config: + import: classpath:environment-vars.yaml init: mode: never jpa: @@ -25,12 +26,6 @@ spring: default_batch_fetch_size: 20 # https://stackoverflow.com/questions/21257819/what-is-the-difference-between-hibernate-jdbc-fetch-size-and-hibernate-jdbc-batc jdbc.batch_size: 20 - datasource: - url: jdbc:postgresql://localhost:5432/jira - username: jira - password: JiraRush - - #todo Вынести чувствительную информацию в отдельный проперти файл: liquibase: changeLog: "classpath:db/changelog.sql" @@ -48,50 +43,10 @@ spring: cache-names: users caffeine.spec: maximumSize=10000,expireAfterAccess=5m - security: - oauth2: - client: - registration: - github: - client-id: 3d0d8738e65881fff266 - client-secret: 0f97031ce6178b7dfb67a6af587f37e222a16120 - scope: - - email - google: - client-id: 329113642700-f8if6pu68j2repq3ef6umd5jgiliup60.apps.googleusercontent.com - client-secret: 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 - scope: - - email - - profile - gitlab: - client-id: b8520a3266089063c0d8261cce36971defa513f5ffd9f9b7a3d16728fc83a494 - client-secret: e72c65320cf9d6495984a37b0f9cc03ec46be0bb6f071feaebbfe75168117004 - client-name: GitLab - redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" - authorization-grant-type: authorization_code - scope: read_user - provider: - gitlab: - authorization-uri: https://gitlab.com/oauth/authorize - token-uri: https://gitlab.com/oauth/token - user-info-uri: https://gitlab.com/api/v4/user - user-name-attribute: email - sql: init: mode: always - mail: - properties: - mail: - smtp: - starttls: - enable: true - auth: true - host: smtp.gmail.com - username: jira4jr@gmail.com - password: zdfzsrqvgimldzyj - port: 587 thymeleaf.check-template-location: false mvc.throw-exception-if-no-handler-found: true diff --git a/src/main/resources/environment-vars.yaml b/src/main/resources/environment-vars.yaml new file mode 100644 index 000000000..60a892897 --- /dev/null +++ b/src/main/resources/environment-vars.yaml @@ -0,0 +1,49 @@ +app: + test-mail: jira4jr@gmail.com + +spring: + datasource: + url: jdbc:postgresql://localhost:5432/jira + username: jira + password: JiraRush + + security: + oauth2: + client: + registration: + github: + client-id: 3d0d8738e65881fff266 + client-secret: 0f97031ce6178b7dfb67a6af587f37e222a16120 + scope: + - email + google: + client-id: 329113642700-f8if6pu68j2repq3ef6umd5jgiliup60.apps.googleusercontent.com + client-secret: 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 + scope: + - email + - profile + gitlab: + client-id: b8520a3266089063c0d8261cce36971defa513f5ffd9f9b7a3d16728fc83a494 + client-secret: e72c65320cf9d6495984a37b0f9cc03ec46be0bb6f071feaebbfe75168117004 + client-name: GitLab + redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" + authorization-grant-type: authorization_code + scope: read_user + provider: + gitlab: + authorization-uri: https://gitlab.com/oauth/authorize + token-uri: https://gitlab.com/oauth/token + user-info-uri: https://gitlab.com/api/v4/user + user-name-attribute: email + + mail: + properties: + mail: + smtp: + starttls: + enable: true + auth: true + host: smtp.gmail.com + username: jira4jr@gmail.com + password: zdfzsrqvgimldzyj + port: 587 \ No newline at end of file From d359e89f770343693a67ce726a77d33c55a533ea Mon Sep 17 00:00:00 2001 From: ganka-xn Date: Sat, 23 Nov 2024 19:31:26 +0300 Subject: [PATCH 03/12] Task 6. FileUtil refactoring --- .../jira/bugtracking/attachment/FileUtil.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java b/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java index 10bfd5dc0..b64c8cf3a 100644 --- a/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java +++ b/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java @@ -7,36 +7,38 @@ import org.springframework.core.io.UrlResource; import org.springframework.web.multipart.MultipartFile; -import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.net.MalformedURLException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; @UtilityClass public class FileUtil { private static final String ATTACHMENT_PATH = "./attachments/%s/"; -//todo Сделать рефакторинг метода com.javarush.jira.bugtracking.attachment.FileUtil#upload, -// чтоб он использовал современный подход для работы с файловой системмой. //io -> nio public static void upload(MultipartFile multipartFile, String directoryPath, String fileName) { if (multipartFile.isEmpty()) { throw new IllegalRequestDataException("Select a file to upload."); } - File dir = new File(directoryPath); - if (dir.exists() || dir.mkdirs()) { - File file = new File(directoryPath + fileName); - try (OutputStream outStream = new FileOutputStream(file)) { - outStream.write(multipartFile.getBytes()); - } catch (IOException ex) { - throw new IllegalRequestDataException("Failed to upload file" + multipartFile.getOriginalFilename()); + Path dirPath = Paths.get(directoryPath); + + try { + if (Files.notExists(dirPath)) { + Files.createDirectories(dirPath); } + + Path filePath = dirPath.resolve(fileName); + Files.write(filePath, multipartFile.getBytes(), + StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + + } catch (IOException e) { + String errorMessage = String.format("Error while uploading file: %s", multipartFile.getOriginalFilename()); + throw new IllegalRequestDataException(errorMessage); } } From 6a505c4008d331486a209a034bcb0a234ba0c09e Mon Sep 17 00:00:00 2001 From: ganka-xn Date: Sat, 30 Nov 2024 12:35:05 +0300 Subject: [PATCH 04/12] Task 5. ProfileRestController tests added. ProfileTestData refactoring. --- .../web/ProfileRestControllerTest.java | 150 ++++++++++++++- .../profile/internal/web/ProfileTestData.java | 178 ++++++++++++------ 2 files changed, 270 insertions(+), 58 deletions(-) diff --git a/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java b/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java index b51ba96a3..9e58be4a8 100644 --- a/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java +++ b/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java @@ -2,11 +2,151 @@ import com.javarush.jira.AbstractControllerTest; +import com.javarush.jira.common.util.JsonUtil; +import com.javarush.jira.profile.ProfileTo; +import com.javarush.jira.profile.internal.ProfileMapper; +import com.javarush.jira.profile.internal.ProfileRepository; +import com.javarush.jira.profile.internal.model.Profile; + +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.transaction.annotation.Transactional; + +import static com.javarush.jira.login.internal.web.UserTestData.ADMIN_MAIL; +import static com.javarush.jira.login.internal.web.UserTestData.USER_MAIL; +import static com.javarush.jira.profile.internal.web.ProfileRestController.REST_URL; +import static com.javarush.jira.profile.internal.web.ProfileTestData.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -//todo -// mockMVC + mockito + junit -// Написать тесты для всех публичных методов контроллера ProfileRestController. -// Хоть методов только 2, но тестовых методов должно быть больше, т.к. нужно проверить success and unsuccess path. class ProfileRestControllerTest extends AbstractControllerTest { -} \ No newline at end of file + @Autowired + private ProfileRepository profileRepository; + + @Autowired + private ProfileMapper profileMapper; + + @Test + @WithUserDetails(value = USER_MAIL) + void shouldSucceeded_WhenUserAuthorized() throws Exception { + perform(MockMvcRequestBuilders.get(REST_URL)) + .andExpect(status().isOk()) + .andDo(print()) + .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(PROFILE_DTO_MATCHER.contentJson(USER_PROFILE_DTO)); + } + + @Test + @WithUserDetails(value = ADMIN_MAIL) + void shouldSucceeded_WhenAdminAuthorized() throws Exception { + perform(MockMvcRequestBuilders.get(REST_URL)) + .andExpect(status().isOk()) + .andDo(print()) + .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(PROFILE_DTO_MATCHER.contentJson(ADMIN_PROFILE_DTO)); + } + + @Test + void shouldFail_WhenUnauthorized() throws Exception { + perform(MockMvcRequestBuilders.get(REST_URL)) + .andExpect(status().isUnauthorized()); + } + + @Test + @Transactional + @WithUserDetails(value = USER_MAIL) + void shouldSucceeded_WhenUpdateWithUserProfile() throws Exception { + Profile userProfileToUpdate = profileRepository.getExisted(USER_ID); + ProfileTo userProfileDTOtoUpdate = profileMapper.toTo(userProfileToUpdate); + + userProfileDTOtoUpdate.setMailNotifications(USER_NOTIFICATIONS_UPDATED); + userProfileDTOtoUpdate.setContacts(USER_CONTACTS_UPDATED); + + perform( + MockMvcRequestBuilders.put(REST_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(JsonUtil.writeValue(userProfileDTOtoUpdate))) + .andDo(print()) + .andExpect(status().isNoContent()); + + Profile userDbProfileAfterUpdate = profileRepository.getExisted(USER_ID); + ProfileTo userDbProfileDTOAfterUpdate = profileMapper.toTo(userDbProfileAfterUpdate); + + assertEquals(userProfileDTOtoUpdate, userDbProfileDTOAfterUpdate); + } + + // alternative + @Test + @Transactional + @WithUserDetails(value = ADMIN_MAIL) + void shouldSucceeded_WhenUpdateWithAdminProfile() throws Exception { + ProfileTo adminProfileDTOtoUpdate = ProfileTestData.getUpdatedAdminDTO(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(JsonUtil.writeValue(adminProfileDTOtoUpdate))) + .andDo(print()) + .andExpect(status().isNoContent()); + + perform(MockMvcRequestBuilders.get(REST_URL)) + .andExpect(status().isOk()) + .andDo(print()) + .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andExpect(PROFILE_DTO_MATCHER.contentJson(adminProfileDTOtoUpdate)); + } + + @Test + @Transactional + @WithUserDetails(value = ADMIN_MAIL) + void shouldFail_WhenUpdateWithInvalidDTO() throws Exception { + ProfileTo invalidDTO = getInvalidDTO(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(JsonUtil.writeValue(invalidDTO))) + .andDo(print()) + .andExpect(status().isUnprocessableEntity()); + } + + @Test + @Transactional + @WithUserDetails(value = ADMIN_MAIL) + void shouldFail_WhenUpdateWithUnknownNotificationDTO() throws Exception { + ProfileTo unknownNotificationTo = getWithUnknownNotificationDTO(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(JsonUtil.writeValue(unknownNotificationTo))) + .andDo(print()) + .andExpect(status().isUnprocessableEntity()); + } + + @Test + @Transactional + @WithUserDetails(value = ADMIN_MAIL) + void shouldFail_WhenUpdateWithUnknownContactDTO() throws Exception { + ProfileTo unknownContactTo = getWithUnknownContactDTO(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(JsonUtil.writeValue(unknownContactTo))) + .andDo(print()) + .andExpect(status().isUnprocessableEntity()); + } + + @Test + @WithUserDetails(value = ADMIN_MAIL) + @Transactional + void shouldFail_WhenUpdateWithContactHtmlUnsafeDTO() throws Exception { + ProfileTo contactHtmlUnsafeTo = getWithContactHtmlUnsafeDTO(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(JsonUtil.writeValue(contactHtmlUnsafeTo))) + .andDo(print()) + .andExpect(status().isUnprocessableEntity()); + } +} diff --git a/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java b/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java index fb4407268..6f06344b6 100644 --- a/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java +++ b/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java @@ -3,86 +3,158 @@ import com.javarush.jira.MatcherFactory; import com.javarush.jira.profile.ContactTo; import com.javarush.jira.profile.ProfileTo; -import com.javarush.jira.profile.internal.model.Contact; -import com.javarush.jira.profile.internal.model.Profile; import java.util.Collections; import java.util.Set; public class ProfileTestData { - public static MatcherFactory.Matcher PROFILE_MATCHER = - MatcherFactory.usingIgnoringFieldsComparator(Profile.class, "user"); - - public static ProfileTo USER_PROFILE_TO = new ProfileTo(null, - Set.of("assigned", "overdue", "deadline"), - Set.of(new ContactTo("skype", "userSkype"), - new ContactTo("mobile", "+01234567890"), - new ContactTo("website", "user.com"))); - public static ProfileTo GUEST_PROFILE_EMPTY_TO = new ProfileTo(null, - Set.of(), - Set.of()); - - public static ProfileTo getNewTo() { - return new ProfileTo(null, - Set.of("three_days_before_deadline", "two_days_before_deadline", "one_day_before_deadline"), - Set.of(new ContactTo("tg", "guestTg"))); - } - public static Profile getNew(long id) { - Profile profile = new Profile(); - profile.setId(id); - profile.setMailNotifications(14); - profile.setContacts(Set.of(new Contact(id, "tg", "guestTg"))); - return profile; - } + public static MatcherFactory.Matcher PROFILE_DTO_MATCHER = + MatcherFactory.usingIgnoringFieldsComparator(ProfileTo.class, "user"); - public static ProfileTo getUpdatedTo() { - return new ProfileTo(null, - Set.of("assigned", "three_days_before_deadline", "two_days_before_deadline", "one_day_before_deadline", "deadline", "overdue"), - Set.of(new ContactTo("skype", "newSkype"), - new ContactTo("mobile", "+380987654321"), - new ContactTo("website", "new.com"), - new ContactTo("github", "newGitHub"), - new ContactTo("tg", "newTg"), - new ContactTo("vk", "newVk"), - new ContactTo("linkedin", "newLinkedin"))); + public static final Long ADMIN_ID = 2L; + public static final Long USER_ID = 1L; + + private static final String ASSIGNED = "assigned"; + private static final String THREE_DAYS_BEFORE_DEADLINE = "three_days_before_deadline"; + private static final String TWO_DAYS_BEFORE_DEADLINE = "two_days_before_deadline"; + private static final String ONE_DAY_BEFORE_DEADLINE = "one_day_before_deadline"; + private static final String DEADLINE = "deadline"; + private static final String OVERDUE = "overdue"; + + private static final ContactTo USER_CONTACT_SKYPE = new ContactTo("skype", "userSkype"); + private static final ContactTo USER_CONTACT_MOBILE = new ContactTo("mobile", "+01234567890"); + private static final ContactTo USER_CONTACT_WEBSITE = new ContactTo("website", "user.com"); + + private static final ContactTo USER_CONTACT_SKYPE_UPDATED = new ContactTo("skype", "newSkype"); + private static final ContactTo USER_CONTACT_MOBILE_UPDATED = new ContactTo("mobile", "+380987654321"); + private static final ContactTo USER_CONTACT_WEBSITE_UPDATED = new ContactTo("website", "new.com"); + private static final ContactTo USER_CONTACT_GITHUB_UPDATED = new ContactTo("github", "newGitHub"); + private static final ContactTo USER_CONTACT_TG_UPDATED = new ContactTo("tg", "newTg"); + private static final ContactTo USER_CONTACT_VK_UPDATED = new ContactTo("vk", "newVk"); + private static final ContactTo USER_CONTACT_LINKEDIN_UPDATED = new ContactTo("linkedin", "newLinkedin"); + + private static final ContactTo ADMIN_CONTACT_GITHUB = new ContactTo("github", "adminGitHub"); + private static final ContactTo ADMIN_CONTACT_TG = new ContactTo("tg", "adminTg"); + private static final ContactTo ADMIN_CONTACT_VK = new ContactTo("vk", "adminVk"); + + private static final ContactTo ADMIN_CONTACT_GITHUB_UPDATED = new ContactTo("github", "newAdminGitHub"); + private static final ContactTo ADMIN_CONTACT_TG_UPDATED = new ContactTo("tg", "newAdminTg"); + private static final ContactTo ADMIN_CONTACT_VK_UPDATED = new ContactTo("vk", "newAdminVk"); + private static final ContactTo ADMIN_CONTACT_SKYPE_UPDATED = new ContactTo("skype", "newAdminSkype"); + private static final ContactTo ADMIN_CONTACT_MOBILE_UPDATED = new ContactTo("mobile", "newAdminMobile"); + private static final ContactTo ADMIN_CONTACT_WEBSITE_UPDATED = new ContactTo("website", "newAdminWebsite"); + private static final ContactTo ADMIN_CONTACT_LINKEDIN_UPDATED = new ContactTo("linkedin", "newAdminLinkedin"); + + public static final Set USER_NOTIFICATIONS = Set.of( + ASSIGNED, + OVERDUE, + DEADLINE + ); + + public static final Set USER_CONTACTS = Set.of( + USER_CONTACT_SKYPE, + USER_CONTACT_MOBILE, + USER_CONTACT_WEBSITE + ); + + public static final Set USER_NOTIFICATIONS_UPDATED = Set.of( + ASSIGNED, + THREE_DAYS_BEFORE_DEADLINE, + TWO_DAYS_BEFORE_DEADLINE, + ONE_DAY_BEFORE_DEADLINE, + DEADLINE, + OVERDUE + ); + + public static final Set USER_CONTACTS_UPDATED = Set.of( + USER_CONTACT_SKYPE_UPDATED, + USER_CONTACT_MOBILE_UPDATED, + USER_CONTACT_WEBSITE_UPDATED, + USER_CONTACT_GITHUB_UPDATED, + USER_CONTACT_TG_UPDATED, + USER_CONTACT_VK_UPDATED, + USER_CONTACT_LINKEDIN_UPDATED + ); + + public static final Set ADMIN_NOTIFICATIONS = Set.of( + TWO_DAYS_BEFORE_DEADLINE, + ONE_DAY_BEFORE_DEADLINE, + THREE_DAYS_BEFORE_DEADLINE + ); + + public static final Set ADMIN_CONTACTS = Set.of( + ADMIN_CONTACT_GITHUB, + ADMIN_CONTACT_TG, + ADMIN_CONTACT_VK + ); + + public static final Set ADMIN_NOTIFICATIONS_UPDATED = Set.of( + THREE_DAYS_BEFORE_DEADLINE, + TWO_DAYS_BEFORE_DEADLINE, + ONE_DAY_BEFORE_DEADLINE, + DEADLINE + ); + + public static final Set ADMIN_CONTACTS_UPDATED = Set.of( + ADMIN_CONTACT_GITHUB_UPDATED, + ADMIN_CONTACT_TG_UPDATED, + ADMIN_CONTACT_VK_UPDATED, + ADMIN_CONTACT_SKYPE_UPDATED, + ADMIN_CONTACT_MOBILE_UPDATED, + ADMIN_CONTACT_WEBSITE_UPDATED, + ADMIN_CONTACT_LINKEDIN_UPDATED + ); + + public static ProfileTo ADMIN_PROFILE_DTO = new ProfileTo( + ADMIN_ID, + ADMIN_NOTIFICATIONS, + ADMIN_CONTACTS + ); + + public static ProfileTo USER_PROFILE_DTO = new ProfileTo( + USER_ID, + USER_NOTIFICATIONS, + USER_CONTACTS + ); + + public static ProfileTo getUpdatedUserDTO() { + return new ProfileTo( + USER_ID, + USER_NOTIFICATIONS_UPDATED, + USER_CONTACTS_UPDATED + ); } - public static Profile getUpdated(long id) { - Profile profile = new Profile(); - profile.setId(id); - profile.setMailNotifications(63); - profile.setContacts(Set.of(new Contact(id, "skype", "newSkype"), - new Contact(id, "mobile", "+380987654321"), - new Contact(id, "website", "new.com"), - new Contact(id, "github", "newGitHub"), - new Contact(id, "tg", "newTg"), - new Contact(id, "vk", "newVk"), - new Contact(id, "linkedin", "newLinkedin"))); - return profile; + public static ProfileTo getUpdatedAdminDTO() { + return new ProfileTo( + ADMIN_ID, + ADMIN_NOTIFICATIONS_UPDATED, + ADMIN_CONTACTS_UPDATED + ); } - public static ProfileTo getInvalidTo() { + public static ProfileTo getInvalidDTO() { return new ProfileTo(null, Set.of(""), Set.of(new ContactTo("skype", ""))); } - public static ProfileTo getWithUnknownNotificationTo() { + public static ProfileTo getWithUnknownNotificationDTO() { return new ProfileTo(null, Set.of("WrongNotification"), Collections.emptySet()); } - public static ProfileTo getWithUnknownContactTo() { + public static ProfileTo getWithUnknownContactDTO() { return new ProfileTo(null, Collections.emptySet(), Set.of(new ContactTo("WrongContactCode", "contact"))); } - public static ProfileTo getWithContactHtmlUnsafeTo() { + public static ProfileTo getWithContactHtmlUnsafeDTO() { return new ProfileTo(null, Collections.emptySet(), Set.of(new ContactTo("tg", ""))); } -} +} \ No newline at end of file From d15ab13a7103b6fad6133b7eb1614094e455f9bb Mon Sep 17 00:00:00 2001 From: ganka-xn Date: Sat, 30 Nov 2024 20:24:00 +0300 Subject: [PATCH 05/12] -- _To -> DTO refactoring --- README.md | 13 ++- resources/view/layout/bugtrackLayout.html | 8 +- resources/view/profile.html | 6 +- resources/view/project.html | 2 +- resources/view/sprint-edit.html | 4 +- resources/view/sprint.html | 2 +- resources/view/task-edit.html | 10 +- resources/view/task.html | 6 +- resources/view/unauth/register.html | 2 +- .../javarush/jira/bugtracking/Handlers.java | 34 +++---- .../attachment/AttachmentMapper.java | 4 +- .../attachment/to/AttachmentDTO.java | 11 +++ .../attachment/to/AttachmentTo.java | 11 --- .../dashboard/DashboardUIController.java | 2 +- .../project/ProjectController.java | 16 ++-- .../bugtracking/project/ProjectMapper.java | 4 +- .../project/ProjectMapperFull.java | 4 +- .../project/ProjectUIController.java | 20 ++-- .../to/{ProjectTo.java => ProjectDTO.java} | 6 +- .../project/to/ProjectDTOFull.java | 14 +++ .../bugtracking/project/to/ProjectToFull.java | 14 --- .../bugtracking/sprint/SprintController.java | 16 ++-- .../jira/bugtracking/sprint/SprintMapper.java | 8 +- .../bugtracking/sprint/SprintMapperFull.java | 4 +- .../sprint/SprintUIController.java | 20 ++-- .../to/{SprintTo.java => SprintDTO.java} | 6 +- .../bugtracking/sprint/to/SprintDTOFull.java | 14 +++ .../bugtracking/sprint/to/SprintToFull.java | 14 --- .../bugtracking/task/ActivityService.java | 26 ++--- .../jira/bugtracking/task/TaskController.java | 52 +++++----- .../jira/bugtracking/task/TaskService.java | 46 ++++----- .../bugtracking/task/TaskUIController.java | 76 +++++++-------- .../jira/bugtracking/task/TaskUtil.java | 34 +++---- .../task/mapper/ActivityMapper.java | 8 +- .../task/mapper/TaskExtMapper.java | 12 +-- .../task/mapper/TaskFullMapper.java | 6 +- .../bugtracking/task/mapper/TaskMapper.java | 6 +- .../to/{ActivityTo.java => ActivityDTO.java} | 12 +-- .../task/to/{TaskTo.java => TaskDTO.java} | 6 +- .../jira/bugtracking/task/to/TaskDTOExt.java | 55 +++++++++++ .../jira/bugtracking/task/to/TaskDTOFull.java | 27 ++++++ .../jira/bugtracking/task/to/TaskToExt.java | 55 ----------- .../jira/bugtracking/task/to/TaskToFull.java | 27 ------ .../tree/{NodeTo.java => NodeDTO.java} | 6 +- .../jira/bugtracking/tree/NodeMapper.java | 12 +-- .../jira/bugtracking/tree/TreeNode.java | 4 +- .../bugtracking/tree/TreeRestController.java | 18 ++-- .../com/javarush/jira/common/BaseHandler.java | 26 ++--- .../com/javarush/jira/common/BaseMapper.java | 12 +-- .../javarush/jira/common/TimestampMapper.java | 6 +- .../common/to/{BaseTo.java => BaseDTO.java} | 6 +- .../common/to/{CodeTo.java => CodeDTO.java} | 4 +- .../common/to/{NamedTo.java => NamedDTO.java} | 4 +- .../common/to/{TitleTo.java => TitleDTO.java} | 4 +- .../jira/login/{UserTo.java => UserDTO.java} | 8 +- .../jira/login/internal/UserHandler.java | 4 +- .../jira/login/internal/UserMapper.java | 8 +- .../internal/verification/ConfirmData.java | 8 +- .../RegistrationConfirmEvent.java | 4 +- .../internal/web/AdminUserController.java | 10 +- .../internal/web/RegisterController.java | 16 ++-- .../login/internal/web/UserController.java | 10 +- .../login/internal/web/UserUIController.java | 6 +- .../jira/mail/internal/MailListeners.java | 2 +- .../{ContactTo.java => ContactDTO.java} | 4 +- .../{ProfileTo.java => ProfileDTO.java} | 10 +- .../jira/profile/internal/ProfileMapper.java | 14 +-- .../jira/profile/internal/ProfileUtil.java | 14 +-- .../web/AbstractProfileController.java | 18 ++-- .../internal/web/ProfilePostRequest.java | 4 +- .../internal/web/ProfileRestController.java | 8 +- .../internal/web/ProfileUIController.java | 2 +- .../jira/ref/{RefTo.java => RefDTO.java} | 6 +- .../javarush/jira/ref/ReferenceService.java | 24 ++--- .../jira/ref/internal/ReferenceMapper.java | 4 +- .../ref/internal/web/ReferenceController.java | 28 +++--- src/main/resources/data4dev/data.sql | 4 +- .../sprint/SprintControllerTest.java | 30 +++--- .../bugtracking/sprint/SprintTestData.java | 24 ++--- .../bugtracking/task/TaskControllerTest.java | 76 +++++++-------- .../jira/bugtracking/task/TaskTestData.java | 56 +++++------ .../javarush/jira/common/util/UtilTest.java | 12 +-- .../internal/web/RegisterControllerTest.java | 10 +- .../internal/web/UserControllerTest.java | 14 +-- .../jira/login/internal/web/UserTestData.java | 4 +- .../web/ProfileRestControllerTest.java | 22 ++--- .../profile/internal/web/ProfileTestData.java | 96 +++++++++---------- .../internal/web/ProjectControllerTest.java | 14 +-- .../project/internal/web/ProjectTestData.java | 20 ++-- .../internal/web/ReferenceControllerTest.java | 16 ++-- .../ref/internal/web/ReferenceTestData.java | 6 +- 91 files changed, 726 insertions(+), 715 deletions(-) create mode 100644 src/main/java/com/javarush/jira/bugtracking/attachment/to/AttachmentDTO.java delete mode 100644 src/main/java/com/javarush/jira/bugtracking/attachment/to/AttachmentTo.java rename src/main/java/com/javarush/jira/bugtracking/project/to/{ProjectTo.java => ProjectDTO.java} (68%) create mode 100644 src/main/java/com/javarush/jira/bugtracking/project/to/ProjectDTOFull.java delete mode 100644 src/main/java/com/javarush/jira/bugtracking/project/to/ProjectToFull.java rename src/main/java/com/javarush/jira/bugtracking/sprint/to/{SprintTo.java => SprintDTO.java} (68%) create mode 100644 src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintDTOFull.java delete mode 100644 src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintToFull.java rename src/main/java/com/javarush/jira/bugtracking/task/to/{ActivityTo.java => ActivityDTO.java} (79%) rename src/main/java/com/javarush/jira/bugtracking/task/to/{TaskTo.java => TaskDTO.java} (72%) create mode 100644 src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOExt.java create mode 100644 src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOFull.java delete mode 100644 src/main/java/com/javarush/jira/bugtracking/task/to/TaskToExt.java delete mode 100644 src/main/java/com/javarush/jira/bugtracking/task/to/TaskToFull.java rename src/main/java/com/javarush/jira/bugtracking/tree/{NodeTo.java => NodeDTO.java} (68%) rename src/main/java/com/javarush/jira/common/to/{BaseTo.java => BaseDTO.java} (85%) rename src/main/java/com/javarush/jira/common/to/{CodeTo.java => CodeDTO.java} (84%) rename src/main/java/com/javarush/jira/common/to/{NamedTo.java => NamedDTO.java} (86%) rename src/main/java/com/javarush/jira/common/to/{TitleTo.java => TitleDTO.java} (72%) rename src/main/java/com/javarush/jira/login/{UserTo.java => UserDTO.java} (84%) rename src/main/java/com/javarush/jira/profile/{ContactTo.java => ContactDTO.java} (88%) rename src/main/java/com/javarush/jira/profile/{ProfileTo.java => ProfileDTO.java} (77%) rename src/main/java/com/javarush/jira/ref/{RefTo.java => RefDTO.java} (83%) diff --git a/README.md b/README.md index 719b268f5..ef46660ee 100644 --- a/README.md +++ b/README.md @@ -27,4 +27,15 @@ - https://habr.com/ru/articles/259055/ Список выполненных задач: -... \ No newline at end of file +1. Разобраться со структурой проекта (onboarding). +2. Удалить социальные сети: vk, yandex. Easy task +3. Вынести чувствительную информацию в отдельный проперти файл: + логин + пароль БД + идентификаторы для OAuth регистрации/авторизации + настройки почты +Значения этих проперти должны считываться при старте сервера из переменных окружения машины. +5. Написать тесты для всех публичных методов контроллера ProfileRestController. +Хоть методов только 2, но тестовых методов должно быть больше, т.к. нужно проверить success and unsuccess path. +6. Рефакторинг метода com.javarush.jira.bugtracking.attachment.FileUtil#upload, +чтобы он использовал современный подход для работы с файловой системмой. \ No newline at end of file diff --git a/resources/view/layout/bugtrackLayout.html b/resources/view/layout/bugtrackLayout.html index 4ed3d01c9..c21e3dfbe 100644 --- a/resources/view/layout/bugtrackLayout.html +++ b/resources/view/layout/bugtrackLayout.html @@ -1,7 +1,7 @@ - + @@ -12,7 +12,7 @@

-


@@ -66,10 +66,10 @@
-
+
-
+

diff --git a/resources/view/profile.html b/resources/view/profile.html index 3f4e0a638..989b23d93 100644 --- a/resources/view/profile.html +++ b/resources/view/profile.html @@ -1,9 +1,9 @@ - - - + + + diff --git a/resources/view/project.html b/resources/view/project.html index b86c73806..df89e1325 100644 --- a/resources/view/project.html +++ b/resources/view/project.html @@ -1,6 +1,6 @@ - + - - + + diff --git a/resources/view/sprint.html b/resources/view/sprint.html index f3ac3c75d..267683bc4 100644 --- a/resources/view/sprint.html +++ b/resources/view/sprint.html @@ -1,6 +1,6 @@ - + - - - - - + + + + + - + - - + + diff --git a/resources/view/unauth/register.html b/resources/view/unauth/register.html index 52a892bd3..9cc5ffa63 100644 --- a/resources/view/unauth/register.html +++ b/resources/view/unauth/register.html @@ -8,7 +8,7 @@

Registration

- +
{ + public static class ProjectHandler extends UserBelongHandler { public ProjectHandler(ProjectRepository repository, ProjectMapper mapper) { super(repository, mapper); } } @Component - public static class SprintHandler extends UserBelongHandler { + public static class SprintHandler extends UserBelongHandler { public SprintHandler(SprintRepository repository, SprintMapper mapper) { super(repository, mapper, null, (sprint, dbSprint) -> { // link spring to other project not allowed SprintMapper.checkProjectBelong(sprint.getProjectId(), dbSprint); @@ -60,42 +60,42 @@ public SprintHandler(SprintRepository repository, SprintMapper mapper) { } @Component - public static class TaskHandler extends UserBelongHandler { + public static class TaskHandler extends UserBelongHandler { public TaskHandler(TaskRepository repository, TaskMapper mapper) { super(repository, mapper); } } @Component - public static class TaskFullHandler extends UserBelongHandler { + public static class TaskFullHandler extends UserBelongHandler { public TaskFullHandler(TaskRepository repository, TaskFullMapper mapper) { super(repository, mapper); } } @Component - public static class TaskExtHandler extends UserBelongHandler { + public static class TaskExtHandler extends UserBelongHandler { public TaskExtHandler(TaskRepository repository, TaskExtMapper mapper) { super(repository, mapper); } } @Component - public static class ActivityHandler extends BaseHandler { + public static class ActivityHandler extends BaseHandler { public ActivityHandler(ActivityRepository repository, ActivityMapper mapper) { super(repository, mapper); } } @Component - public static class AttachmentHandler extends BaseHandler { + public static class AttachmentHandler extends BaseHandler { public AttachmentHandler(AttachmentRepository repository, AttachmentMapper mapper) { super(repository, mapper); } } @Slf4j - public static class UserBelongHandler, M extends BaseMapper> extends BaseHandler { + public static class UserBelongHandler, M extends BaseMapper> extends BaseHandler { @Autowired private UserBelongRepository belongRepository; @@ -113,7 +113,7 @@ public List getAllBelongs(long objectId) { @Transactional public E createWithBelong(T to, ObjectType type, String userTypeCode) { - E created = super.createFromTo(to); + E created = super.createFromDTO(to); createUserBelong(created.id(), type, AuthUser.authId(), userTypeCode); return created; } diff --git a/src/main/java/com/javarush/jira/bugtracking/attachment/AttachmentMapper.java b/src/main/java/com/javarush/jira/bugtracking/attachment/AttachmentMapper.java index 86478646b..7d334113b 100644 --- a/src/main/java/com/javarush/jira/bugtracking/attachment/AttachmentMapper.java +++ b/src/main/java/com/javarush/jira/bugtracking/attachment/AttachmentMapper.java @@ -1,10 +1,10 @@ package com.javarush.jira.bugtracking.attachment; -import com.javarush.jira.bugtracking.attachment.to.AttachmentTo; +import com.javarush.jira.bugtracking.attachment.to.AttachmentDTO; import com.javarush.jira.common.BaseMapper; import com.javarush.jira.common.TimestampMapper; import org.mapstruct.Mapper; @Mapper(config = TimestampMapper.class) -public interface AttachmentMapper extends BaseMapper { +public interface AttachmentMapper extends BaseMapper { } diff --git a/src/main/java/com/javarush/jira/bugtracking/attachment/to/AttachmentDTO.java b/src/main/java/com/javarush/jira/bugtracking/attachment/to/AttachmentDTO.java new file mode 100644 index 000000000..3b613b624 --- /dev/null +++ b/src/main/java/com/javarush/jira/bugtracking/attachment/to/AttachmentDTO.java @@ -0,0 +1,11 @@ +package com.javarush.jira.bugtracking.attachment.to; + +import com.javarush.jira.common.to.NamedDTO; +import lombok.Getter; + +@Getter +public class AttachmentDTO extends NamedDTO { + public AttachmentDTO(Long id, String name) { + super(id, name); + } +} diff --git a/src/main/java/com/javarush/jira/bugtracking/attachment/to/AttachmentTo.java b/src/main/java/com/javarush/jira/bugtracking/attachment/to/AttachmentTo.java deleted file mode 100644 index 97d9f6773..000000000 --- a/src/main/java/com/javarush/jira/bugtracking/attachment/to/AttachmentTo.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.javarush.jira.bugtracking.attachment.to; - -import com.javarush.jira.common.to.NamedTo; -import lombok.Getter; - -@Getter -public class AttachmentTo extends NamedTo { - public AttachmentTo(Long id, String name) { - super(id, name); - } -} diff --git a/src/main/java/com/javarush/jira/bugtracking/dashboard/DashboardUIController.java b/src/main/java/com/javarush/jira/bugtracking/dashboard/DashboardUIController.java index 8a941c94c..f72c86acf 100644 --- a/src/main/java/com/javarush/jira/bugtracking/dashboard/DashboardUIController.java +++ b/src/main/java/com/javarush/jira/bugtracking/dashboard/DashboardUIController.java @@ -23,7 +23,7 @@ public class DashboardUIController { @GetMapping public String showDashboard(Model model) { log.info("show dashboard"); - model.addAttribute("projects", handler.getAllTos(TimestampRepository.NEWEST_FIRST)); + model.addAttribute("projects", handler.getAllDTOs(TimestampRepository.NEWEST_FIRST)); model.addAttribute("taskStatusRefs", ReferenceService.getRefs(RefType.TASK_STATUS)); return "dashboard"; } diff --git a/src/main/java/com/javarush/jira/bugtracking/project/ProjectController.java b/src/main/java/com/javarush/jira/bugtracking/project/ProjectController.java index 5ebd02ee3..22153712b 100644 --- a/src/main/java/com/javarush/jira/bugtracking/project/ProjectController.java +++ b/src/main/java/com/javarush/jira/bugtracking/project/ProjectController.java @@ -1,7 +1,7 @@ package com.javarush.jira.bugtracking.project; import com.javarush.jira.bugtracking.Handlers; -import com.javarush.jira.bugtracking.project.to.ProjectTo; +import com.javarush.jira.bugtracking.project.to.ProjectDTO; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -22,25 +22,25 @@ public class ProjectController { private final Handlers.ProjectHandler handler; @GetMapping("/projects") - public List getAll() { - return handler.getAllTos(ProjectRepository.NEWEST_FIRST); + public List getAll() { + return handler.getAllDTOs(ProjectRepository.NEWEST_FIRST); } @GetMapping("/projects/{id}") - public ProjectTo getById(@PathVariable Long id) { + public ProjectDTO getById(@PathVariable Long id) { return handler.getTo(id); } @PostMapping(path = "/mngr/projects", consumes = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity create(@Valid @RequestBody ProjectTo projectTo) { - Project created = handler.createWithBelong(projectTo, PROJECT, "project_author"); + public ResponseEntity create(@Valid @RequestBody ProjectDTO projectDTO) { + Project created = handler.createWithBelong(projectDTO, PROJECT, "project_author"); return createdResponse(REST_URL + "/projects", created); } @PutMapping("/mngr/projects/{id}") @ResponseStatus(HttpStatus.NO_CONTENT) - public void update(@Valid @RequestBody ProjectTo projectTo, @PathVariable Long id) { - handler.updateFromTo(projectTo, id); + public void update(@Valid @RequestBody ProjectDTO projectDTO, @PathVariable Long id) { + handler.updateFromDTO(projectDTO, id); } @PatchMapping("/mngr/projects/{id}") diff --git a/src/main/java/com/javarush/jira/bugtracking/project/ProjectMapper.java b/src/main/java/com/javarush/jira/bugtracking/project/ProjectMapper.java index 7868e2ad0..dda46ce28 100644 --- a/src/main/java/com/javarush/jira/bugtracking/project/ProjectMapper.java +++ b/src/main/java/com/javarush/jira/bugtracking/project/ProjectMapper.java @@ -1,10 +1,10 @@ package com.javarush.jira.bugtracking.project; -import com.javarush.jira.bugtracking.project.to.ProjectTo; +import com.javarush.jira.bugtracking.project.to.ProjectDTO; import com.javarush.jira.common.BaseMapper; import com.javarush.jira.common.TimestampMapper; import org.mapstruct.Mapper; @Mapper(config = TimestampMapper.class) -public interface ProjectMapper extends BaseMapper { +public interface ProjectMapper extends BaseMapper { } diff --git a/src/main/java/com/javarush/jira/bugtracking/project/ProjectMapperFull.java b/src/main/java/com/javarush/jira/bugtracking/project/ProjectMapperFull.java index 4e68e2b21..3d5363776 100644 --- a/src/main/java/com/javarush/jira/bugtracking/project/ProjectMapperFull.java +++ b/src/main/java/com/javarush/jira/bugtracking/project/ProjectMapperFull.java @@ -1,10 +1,10 @@ package com.javarush.jira.bugtracking.project; -import com.javarush.jira.bugtracking.project.to.ProjectToFull; +import com.javarush.jira.bugtracking.project.to.ProjectDTOFull; import com.javarush.jira.common.BaseMapper; import com.javarush.jira.common.TimestampMapper; import org.mapstruct.Mapper; @Mapper(config = TimestampMapper.class) -public interface ProjectMapperFull extends BaseMapper { +public interface ProjectMapperFull extends BaseMapper { } diff --git a/src/main/java/com/javarush/jira/bugtracking/project/ProjectUIController.java b/src/main/java/com/javarush/jira/bugtracking/project/ProjectUIController.java index 811ac317b..1c83230fb 100644 --- a/src/main/java/com/javarush/jira/bugtracking/project/ProjectUIController.java +++ b/src/main/java/com/javarush/jira/bugtracking/project/ProjectUIController.java @@ -2,7 +2,7 @@ import com.javarush.jira.bugtracking.Handlers; import com.javarush.jira.bugtracking.ObjectType; -import com.javarush.jira.bugtracking.project.to.ProjectTo; +import com.javarush.jira.bugtracking.project.to.ProjectDTO; import com.javarush.jira.common.BaseHandler; import com.javarush.jira.common.util.Util; import jakarta.validation.Valid; @@ -28,7 +28,7 @@ public class ProjectUIController { @GetMapping("/projects/{id}") public String get(@PathVariable long id, @RequestParam(required = false) boolean fragment, Model model) { - model.addAttribute("project", mapperFull.toTo(Util.checkExist(id, handler.getRepository().findFullById(id)))); + model.addAttribute("project", mapperFull.toDTO(Util.checkExist(id, handler.getRepository().findFullById(id)))); model.addAttribute("fragment", fragment); model.addAttribute("attachs", attachmentHandler.getRepository().getAllForObject(id, ObjectType.PROJECT)); model.addAttribute("belongs", handler.getAllBelongs(id)); @@ -49,26 +49,26 @@ public String editFormNew(@RequestParam(required = false) Long parentId, Model m log.info("editFormNew for task with parentId {}", parentId); Project newProject = new Project(); newProject.setParentId(parentId); - model.addAttribute("project", handler.getMapper().toTo(newProject)); + model.addAttribute("project", handler.getMapper().toDTO(newProject)); model.addAttribute("types", getRefs(PROJECT)); return "project-edit"; } @PostMapping("/mngr/projects") - public String createOrUpdate(@Valid @ModelAttribute("project") ProjectTo projectTo, BindingResult result, Model model) { + public String createOrUpdate(@Valid @ModelAttribute("project") ProjectDTO projectDTO, BindingResult result, Model model) { if (result.hasErrors()) { model.addAttribute("types", getRefs(PROJECT)); - if (!projectTo.isNew()) { - model.addAttribute("attachs", attachmentHandler.getRepository().getAllForObject(projectTo.id(), ObjectType.PROJECT)); + if (!projectDTO.isNew()) { + model.addAttribute("attachs", attachmentHandler.getRepository().getAllForObject(projectDTO.id(), ObjectType.PROJECT)); } return "project-edit"; } - Long id = projectTo.getId(); - if (projectTo.isNew()) { - Project project = handler.createWithBelong(projectTo, ObjectType.PROJECT, "project_author"); + Long id = projectDTO.getId(); + if (projectDTO.isNew()) { + Project project = handler.createWithBelong(projectDTO, ObjectType.PROJECT, "project_author"); id = project.getId(); } else { - handler.updateFromTo(projectTo, projectTo.id()); + handler.updateFromDTO(projectDTO, projectDTO.id()); } return "redirect:/ui/projects/" + id; } diff --git a/src/main/java/com/javarush/jira/bugtracking/project/to/ProjectTo.java b/src/main/java/com/javarush/jira/bugtracking/project/to/ProjectDTO.java similarity index 68% rename from src/main/java/com/javarush/jira/bugtracking/project/to/ProjectTo.java rename to src/main/java/com/javarush/jira/bugtracking/project/to/ProjectDTO.java index 19dc1c2a3..82f9d786e 100644 --- a/src/main/java/com/javarush/jira/bugtracking/project/to/ProjectTo.java +++ b/src/main/java/com/javarush/jira/bugtracking/project/to/ProjectDTO.java @@ -1,12 +1,12 @@ package com.javarush.jira.bugtracking.project.to; -import com.javarush.jira.common.to.TitleTo; +import com.javarush.jira.common.to.TitleDTO; import com.javarush.jira.common.util.validation.Code; import com.javarush.jira.common.util.validation.Description; import lombok.Getter; @Getter -public class ProjectTo extends TitleTo { +public class ProjectDTO extends TitleDTO { @Description String description; @@ -15,7 +15,7 @@ public class ProjectTo extends TitleTo { Long parentId; - public ProjectTo(Long id, String code, String title, String description, String typeCode, Long parentId) { + public ProjectDTO(Long id, String code, String title, String description, String typeCode, Long parentId) { super(id, code, title); this.description = description; this.typeCode = typeCode; diff --git a/src/main/java/com/javarush/jira/bugtracking/project/to/ProjectDTOFull.java b/src/main/java/com/javarush/jira/bugtracking/project/to/ProjectDTOFull.java new file mode 100644 index 000000000..ced23743d --- /dev/null +++ b/src/main/java/com/javarush/jira/bugtracking/project/to/ProjectDTOFull.java @@ -0,0 +1,14 @@ +package com.javarush.jira.bugtracking.project.to; + +import com.javarush.jira.common.to.CodeDTO; +import lombok.Value; + +@Value +public class ProjectDTOFull extends ProjectDTO { + CodeDTO parent; + + public ProjectDTOFull(Long id, String code, String title, String description, String typeCode, CodeDTO parent) { + super(id, code, title, description, typeCode, parent == null ? null : parent.getId()); + this.parent = parent; + } +} \ No newline at end of file diff --git a/src/main/java/com/javarush/jira/bugtracking/project/to/ProjectToFull.java b/src/main/java/com/javarush/jira/bugtracking/project/to/ProjectToFull.java deleted file mode 100644 index cd1e30f72..000000000 --- a/src/main/java/com/javarush/jira/bugtracking/project/to/ProjectToFull.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.javarush.jira.bugtracking.project.to; - -import com.javarush.jira.common.to.CodeTo; -import lombok.Value; - -@Value -public class ProjectToFull extends ProjectTo { - CodeTo parent; - - public ProjectToFull(Long id, String code, String title, String description, String typeCode, CodeTo parent) { - super(id, code, title, description, typeCode, parent == null ? null : parent.getId()); - this.parent = parent; - } -} \ No newline at end of file diff --git a/src/main/java/com/javarush/jira/bugtracking/sprint/SprintController.java b/src/main/java/com/javarush/jira/bugtracking/sprint/SprintController.java index 67611735f..0aedbf83a 100644 --- a/src/main/java/com/javarush/jira/bugtracking/sprint/SprintController.java +++ b/src/main/java/com/javarush/jira/bugtracking/sprint/SprintController.java @@ -2,7 +2,7 @@ import com.javarush.jira.bugtracking.Handlers; import com.javarush.jira.bugtracking.project.ProjectRepository; -import com.javarush.jira.bugtracking.sprint.to.SprintTo; +import com.javarush.jira.bugtracking.sprint.to.SprintDTO; import jakarta.annotation.Nullable; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; @@ -32,15 +32,15 @@ public class SprintController { private final Handlers.SprintHandler handler; @GetMapping("/sprints/{id}") - public SprintTo get(@PathVariable long id) { + public SprintDTO get(@PathVariable long id) { return handler.getTo(id); } @GetMapping("/sprints/by-project") - public List getAllByProject(@RequestParam long projectId, @RequestParam @Nullable Boolean enabled) { + public List getAllByProject(@RequestParam long projectId, @RequestParam @Nullable Boolean enabled) { log.info("get all for project {} and enabled {}", projectId, enabled); checkProjectExists(projectId); - return handler.getMapper().toToList( + return handler.getMapper().toDTOList( enabled != Boolean.TRUE ? handler.getRepository().getAllByProject(projectId) : handler.getRepository().getAllEnabledByProject(projectId) @@ -60,15 +60,15 @@ public List getAllByProjectAndStatus(@RequestParam long projectId, @NotB @PostMapping(path = "/mngr/sprints", consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.CREATED) - public ResponseEntity createWithLocation(@Valid @RequestBody SprintTo sprintTo) { - Sprint created = handler.createWithBelong(sprintTo, SPRINT, "sprint_author"); + public ResponseEntity createWithLocation(@Valid @RequestBody SprintDTO sprintDTO) { + Sprint created = handler.createWithBelong(sprintDTO, SPRINT, "sprint_author"); return createdResponse(REST_URL + "/sprints", created); } @PutMapping(path = "/mngr/sprints/{id}", consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.NO_CONTENT) - public void update(@Validated @RequestBody SprintTo sprintTo, @PathVariable long id) { - handler.updateFromTo(sprintTo, id); + public void update(@Validated @RequestBody SprintDTO sprintDTO, @PathVariable long id) { + handler.updateFromDTO(sprintDTO, id); } @Transactional diff --git a/src/main/java/com/javarush/jira/bugtracking/sprint/SprintMapper.java b/src/main/java/com/javarush/jira/bugtracking/sprint/SprintMapper.java index 251ea23b3..a89036d79 100644 --- a/src/main/java/com/javarush/jira/bugtracking/sprint/SprintMapper.java +++ b/src/main/java/com/javarush/jira/bugtracking/sprint/SprintMapper.java @@ -1,6 +1,6 @@ package com.javarush.jira.bugtracking.sprint; -import com.javarush.jira.bugtracking.sprint.to.SprintTo; +import com.javarush.jira.bugtracking.sprint.to.SprintDTO; import com.javarush.jira.common.BaseMapper; import com.javarush.jira.common.TimestampMapper; import com.javarush.jira.common.error.DataConflictException; @@ -9,7 +9,7 @@ import org.mapstruct.MappingTarget; @Mapper(config = TimestampMapper.class) -public interface SprintMapper extends BaseMapper { +public interface SprintMapper extends BaseMapper { static long checkProjectBelong(long projectId, Sprint dbSprint) { if (projectId != dbSprint.getProjectId()) throw new DataConflictException("Sprint " + dbSprint.id() + " doesn't belong to Project " + projectId); @@ -17,6 +17,6 @@ static long checkProjectBelong(long projectId, Sprint dbSprint) { } @Override - @Mapping(target = "projectId", expression = "java(SprintMapper.checkProjectBelong(sprintTo.getProjectId(), sprint))") - Sprint updateFromTo(SprintTo sprintTo, @MappingTarget Sprint sprint); + @Mapping(target = "projectId", expression = "java(SprintMapper.checkProjectBelong(sprintDTO.getProjectId(), sprint))") + Sprint updateFromDTO(SprintDTO sprintDTO, @MappingTarget Sprint sprint); } diff --git a/src/main/java/com/javarush/jira/bugtracking/sprint/SprintMapperFull.java b/src/main/java/com/javarush/jira/bugtracking/sprint/SprintMapperFull.java index e0e7c8fcc..bd53c3a90 100644 --- a/src/main/java/com/javarush/jira/bugtracking/sprint/SprintMapperFull.java +++ b/src/main/java/com/javarush/jira/bugtracking/sprint/SprintMapperFull.java @@ -1,10 +1,10 @@ package com.javarush.jira.bugtracking.sprint; -import com.javarush.jira.bugtracking.sprint.to.SprintToFull; +import com.javarush.jira.bugtracking.sprint.to.SprintDTOFull; import com.javarush.jira.common.BaseMapper; import com.javarush.jira.common.TimestampMapper; import org.mapstruct.Mapper; @Mapper(config = TimestampMapper.class) -public interface SprintMapperFull extends BaseMapper { +public interface SprintMapperFull extends BaseMapper { } diff --git a/src/main/java/com/javarush/jira/bugtracking/sprint/SprintUIController.java b/src/main/java/com/javarush/jira/bugtracking/sprint/SprintUIController.java index 5c2b0100d..b4799a7a3 100644 --- a/src/main/java/com/javarush/jira/bugtracking/sprint/SprintUIController.java +++ b/src/main/java/com/javarush/jira/bugtracking/sprint/SprintUIController.java @@ -2,7 +2,7 @@ import com.javarush.jira.bugtracking.Handlers; import com.javarush.jira.bugtracking.project.ProjectRepository; -import com.javarush.jira.bugtracking.sprint.to.SprintTo; +import com.javarush.jira.bugtracking.sprint.to.SprintDTO; import com.javarush.jira.common.BaseHandler; import com.javarush.jira.common.util.Util; import jakarta.validation.Valid; @@ -32,7 +32,7 @@ public class SprintUIController { @GetMapping("/sprints/{id}") public String get(@PathVariable long id, @RequestParam(required = false) boolean fragment, Model model) { log.info("get {}", id); - model.addAttribute("sprint", mapperFull.toTo(Util.checkExist(id, handler.getRepository().findFullById(id)))); + model.addAttribute("sprint", mapperFull.toDTO(Util.checkExist(id, handler.getRepository().findFullById(id)))); model.addAttribute("fragment", fragment); model.addAttribute("attachs", attachmentHandler.getRepository().getAllForObject(id, SPRINT)); model.addAttribute("belongs", handler.getAllBelongs(id)); @@ -53,25 +53,25 @@ public String editFormNew(@RequestParam long projectId, Model model) { log.info("editFormNew for sprint with project {}", projectId); Sprint newSprint = new Sprint(); newSprint.setProjectId(projectId); - model.addAttribute("sprint", handler.getMapper().toTo(newSprint)); + model.addAttribute("sprint", handler.getMapper().toDTO(newSprint)); model.addAttribute("statuses", getRefs(SPRINT_STATUS)); return "sprint-edit"; } @PostMapping("/mngr/sprints") - public String createOrUpdate(@Valid @ModelAttribute("sprint") SprintTo sprintTo, BindingResult result, Model model) { + public String createOrUpdate(@Valid @ModelAttribute("sprint") SprintDTO sprintDTO, BindingResult result, Model model) { if (result.hasErrors()) { model.addAttribute("statuses", getRefs(SPRINT_STATUS)); - if (!sprintTo.isNew()) { - model.addAttribute("attachs", attachmentHandler.getRepository().getAllForObject(sprintTo.id(), SPRINT)); + if (!sprintDTO.isNew()) { + model.addAttribute("attachs", attachmentHandler.getRepository().getAllForObject(sprintDTO.id(), SPRINT)); } return "sprint-edit"; } - Long id = sprintTo.getId(); - if (sprintTo.isNew()) { - id = handler.createWithBelong(sprintTo, SPRINT, "sprint_author").id(); + Long id = sprintDTO.getId(); + if (sprintDTO.isNew()) { + id = handler.createWithBelong(sprintDTO, SPRINT, "sprint_author").id(); } else { - handler.updateFromTo(sprintTo, sprintTo.id()); + handler.updateFromDTO(sprintDTO, sprintDTO.id()); } return "redirect:/ui/sprints/" + id; } diff --git a/src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintTo.java b/src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintDTO.java similarity index 68% rename from src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintTo.java rename to src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintDTO.java index 687d34708..5b81dfad8 100644 --- a/src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintTo.java +++ b/src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintDTO.java @@ -1,19 +1,19 @@ package com.javarush.jira.bugtracking.sprint.to; import com.javarush.jira.common.HasCode; -import com.javarush.jira.common.to.CodeTo; +import com.javarush.jira.common.to.CodeDTO; import com.javarush.jira.common.util.validation.Code; import jakarta.validation.constraints.NotNull; import lombok.Getter; @Getter -public class SprintTo extends CodeTo implements HasCode { +public class SprintDTO extends CodeDTO implements HasCode { @Code String statusCode; @NotNull Long projectId; - public SprintTo(Long id, String code, String statusCode, Long projectId) { + public SprintDTO(Long id, String code, String statusCode, Long projectId) { super(id, code); this.statusCode = statusCode; this.projectId = projectId; diff --git a/src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintDTOFull.java b/src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintDTOFull.java new file mode 100644 index 000000000..5fce8ef94 --- /dev/null +++ b/src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintDTOFull.java @@ -0,0 +1,14 @@ +package com.javarush.jira.bugtracking.sprint.to; + +import com.javarush.jira.common.to.CodeDTO; +import lombok.Value; + +@Value +public class SprintDTOFull extends SprintDTO { + CodeDTO project; + + public SprintDTOFull(Long id, String code, String statusCode, CodeDTO project) { + super(id, code, statusCode, project.getId()); + this.project = project; + } +} diff --git a/src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintToFull.java b/src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintToFull.java deleted file mode 100644 index 3bfd4cc6f..000000000 --- a/src/main/java/com/javarush/jira/bugtracking/sprint/to/SprintToFull.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.javarush.jira.bugtracking.sprint.to; - -import com.javarush.jira.common.to.CodeTo; -import lombok.Value; - -@Value -public class SprintToFull extends SprintTo { - CodeTo project; - - public SprintToFull(Long id, String code, String statusCode, CodeTo project) { - super(id, code, statusCode, project.getId()); - this.project = project; - } -} diff --git a/src/main/java/com/javarush/jira/bugtracking/task/ActivityService.java b/src/main/java/com/javarush/jira/bugtracking/task/ActivityService.java index 7938541bb..570b54b83 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/ActivityService.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/ActivityService.java @@ -1,7 +1,7 @@ package com.javarush.jira.bugtracking.task; import com.javarush.jira.bugtracking.Handlers; -import com.javarush.jira.bugtracking.task.to.ActivityTo; +import com.javarush.jira.bugtracking.task.to.ActivityDTO; import com.javarush.jira.common.error.DataConflictException; import com.javarush.jira.login.AuthUser; import lombok.RequiredArgsConstructor; @@ -26,23 +26,23 @@ private static void checkBelong(HasAuthorId activity) { } @Transactional - public Activity create(ActivityTo activityTo) { - checkBelong(activityTo); - Task task = taskRepository.getExisted(activityTo.getTaskId()); - if (activityTo.getStatusCode() != null) { - task.checkAndSetStatusCode(activityTo.getStatusCode()); + public Activity create(ActivityDTO activityDTO) { + checkBelong(activityDTO); + Task task = taskRepository.getExisted(activityDTO.getTaskId()); + if (activityDTO.getStatusCode() != null) { + task.checkAndSetStatusCode(activityDTO.getStatusCode()); } - if (activityTo.getTypeCode() != null) { - task.setTypeCode(activityTo.getTypeCode()); + if (activityDTO.getTypeCode() != null) { + task.setTypeCode(activityDTO.getTypeCode()); } - return handler.createFromTo(activityTo); + return handler.createFromDTO(activityDTO); } @Transactional - public void update(ActivityTo activityTo, long id) { - checkBelong(handler.getRepository().getExisted(activityTo.getId())); - handler.updateFromTo(activityTo, id); - updateTaskIfRequired(activityTo.getTaskId(), activityTo.getStatusCode(), activityTo.getTypeCode()); + public void update(ActivityDTO activityDTO, long id) { + checkBelong(handler.getRepository().getExisted(activityDTO.getId())); + handler.updateFromDTO(activityDTO, id); + updateTaskIfRequired(activityDTO.getTaskId(), activityDTO.getStatusCode(), activityDTO.getTypeCode()); } @Transactional diff --git a/src/main/java/com/javarush/jira/bugtracking/task/TaskController.java b/src/main/java/com/javarush/jira/bugtracking/task/TaskController.java index b53f7ff37..1ae5aa2e0 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/TaskController.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/TaskController.java @@ -3,10 +3,10 @@ import com.javarush.jira.bugtracking.Handlers; import com.javarush.jira.bugtracking.UserBelong; import com.javarush.jira.bugtracking.UserBelongRepository; -import com.javarush.jira.bugtracking.task.to.ActivityTo; -import com.javarush.jira.bugtracking.task.to.TaskTo; -import com.javarush.jira.bugtracking.task.to.TaskToExt; -import com.javarush.jira.bugtracking.task.to.TaskToFull; +import com.javarush.jira.bugtracking.task.to.ActivityDTO; +import com.javarush.jira.bugtracking.task.to.TaskDTO; +import com.javarush.jira.bugtracking.task.to.TaskDTOExt; +import com.javarush.jira.bugtracking.task.to.TaskDTOFull; import com.javarush.jira.bugtracking.tree.ITreeNode; import com.javarush.jira.common.util.Util; import com.javarush.jira.login.AuthUser; @@ -42,27 +42,27 @@ public class TaskController { @GetMapping("/{id}") - public TaskToFull get(@PathVariable long id) { + public TaskDTOFull get(@PathVariable long id) { log.info("get task by id={}", id); return taskService.get(id); } @GetMapping("/by-sprint") - public List getAllBySprint(@RequestParam long sprintId) { + public List getAllBySprint(@RequestParam long sprintId) { log.info("get all for sprint {}", sprintId); - return sortTasksAsTree(handler.getMapper().toToList(handler.getRepository().findAllBySprintId(sprintId))); + return sortTasksAsTree(handler.getMapper().toDTOList(handler.getRepository().findAllBySprintId(sprintId))); } - private List sortTasksAsTree(List tasks) { + private List sortTasksAsTree(List tasks) { List roots = Util.makeTree(tasks, TaskTreeNode::new); - List sortedTasks = new ArrayList<>(); + List sortedTasks = new ArrayList<>(); roots.forEach(root -> { - sortedTasks.add(root.taskTo); + sortedTasks.add(root.taskDTO); List subNodes = root.subNodes(); LinkedList stack = new LinkedList<>(subNodes); while (!stack.isEmpty()) { TaskTreeNode node = stack.poll(); - sortedTasks.add(node.taskTo); + sortedTasks.add(node.taskDTO); node.subNodes().forEach(stack::addFirst); } }); @@ -70,21 +70,21 @@ private List sortTasksAsTree(List tasks) { } @GetMapping("/by-project") - public List getAllByProject(@RequestParam long projectId) { + public List getAllByProject(@RequestParam long projectId) { log.info("get all for project {}", projectId); - return handler.getMapper().toToList(handler.getRepository().findAllByProjectId(projectId)); + return handler.getMapper().toDTOList(handler.getRepository().findAllByProjectId(projectId)); } @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.CREATED) - public ResponseEntity createWithLocation(@Valid @RequestBody TaskToExt taskTo) { - return createdResponse(REST_URL, taskService.create(taskTo)); + public ResponseEntity createWithLocation(@Valid @RequestBody TaskDTOExt taskDTO) { + return createdResponse(REST_URL, taskService.create(taskDTO)); } @PutMapping(path = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.NO_CONTENT) - public void update(@Valid @RequestBody TaskToExt taskTo, @PathVariable long id) { - taskService.update(taskTo, id); + public void update(@Valid @RequestBody TaskDTOExt taskDTOExt, @PathVariable long id) { + taskService.update(taskDTOExt, id); } @PatchMapping("/{id}") @@ -128,21 +128,21 @@ public void unAssign(@PathVariable long id, @NotBlank @RequestParam String userT } @GetMapping("/{id}/comments") - public List getComments(@PathVariable long id) { + public List getComments(@PathVariable long id) { log.info("get comments for task with id={}", id); - return activityHandler.getMapper().toToList(activityHandler.getRepository().findAllComments(id)); + return activityHandler.getMapper().toDTOList(activityHandler.getRepository().findAllComments(id)); } @PostMapping(value = "/activities", consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.CREATED) - public Activity create(@Valid @RequestBody ActivityTo activityTo) { - return activityService.create(activityTo); + public Activity create(@Valid @RequestBody ActivityDTO activityDTO) { + return activityService.create(activityDTO); } @PutMapping(path = "/activities/{id}", consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.NO_CONTENT) - public void update(@Valid @RequestBody ActivityTo activityTo, @PathVariable long id) { - activityService.update(activityTo, id); + public void update(@Valid @RequestBody ActivityDTO activityDTO, @PathVariable long id) { + activityService.update(activityDTO, id); } @DeleteMapping("/activities/{id}") @@ -151,9 +151,9 @@ public void delete(@PathVariable long id) { activityService.delete(id); } - private record TaskTreeNode(TaskTo taskTo, List subNodes) implements ITreeNode { - public TaskTreeNode(TaskTo taskTo) { - this(taskTo, new LinkedList<>()); + private record TaskTreeNode(TaskDTO taskDTO, List subNodes) implements ITreeNode { + public TaskTreeNode(TaskDTO taskDTO) { + this(taskDTO, new LinkedList<>()); } } } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/TaskService.java b/src/main/java/com/javarush/jira/bugtracking/task/TaskService.java index e6f385548..c98bafa56 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/TaskService.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/TaskService.java @@ -7,8 +7,8 @@ import com.javarush.jira.bugtracking.sprint.SprintRepository; import com.javarush.jira.bugtracking.task.mapper.TaskExtMapper; import com.javarush.jira.bugtracking.task.mapper.TaskFullMapper; -import com.javarush.jira.bugtracking.task.to.TaskToExt; -import com.javarush.jira.bugtracking.task.to.TaskToFull; +import com.javarush.jira.bugtracking.task.to.TaskDTOExt; +import com.javarush.jira.bugtracking.task.to.TaskDTOFull; import com.javarush.jira.common.error.DataConflictException; import com.javarush.jira.common.error.NotFoundException; import com.javarush.jira.common.util.Util; @@ -25,7 +25,7 @@ import static com.javarush.jira.bugtracking.ObjectType.TASK; import static com.javarush.jira.bugtracking.task.TaskUtil.fillExtraFields; import static com.javarush.jira.bugtracking.task.TaskUtil.makeActivity; -import static com.javarush.jira.ref.ReferenceService.getRefTo; +import static com.javarush.jira.ref.ReferenceService.getRefDTO; @Service @RequiredArgsConstructor @@ -49,7 +49,7 @@ public void changeStatus(long taskId, String statusCode) { Activity statusChangedActivity = new Activity(null, taskId, AuthUser.authId()); statusChangedActivity.setStatusCode(statusCode); activityHandler.create(statusChangedActivity); - String userType = getRefTo(RefType.TASK_STATUS, statusCode).getAux(1); + String userType = getRefDTO(RefType.TASK_STATUS, statusCode).getAux(1); if (userType != null) { handler.createUserBelong(taskId, TASK, AuthUser.authId(), userType); } @@ -72,50 +72,50 @@ public void changeSprint(long taskId, Long sprintId) { } @Transactional - public Task create(TaskToExt taskTo) { - Task created = handler.createWithBelong(taskTo, TASK, "task_author"); - activityHandler.create(makeActivity(created.id(), taskTo)); + public Task create(TaskDTOExt taskDTOExt) { + Task created = handler.createWithBelong(taskDTOExt, TASK, "task_author"); + activityHandler.create(makeActivity(created.id(), taskDTOExt)); return created; } @Transactional - public void update(TaskToExt taskTo, long id) { - if (!taskTo.equals(get(taskTo.id()))) { - handler.updateFromTo(taskTo, id); - activityHandler.create(makeActivity(id, taskTo)); + public void update(TaskDTOExt taskDTOExt, long id) { + if (!taskDTOExt.equals(get(taskDTOExt.id()))) { + handler.updateFromDTO(taskDTOExt, id); + activityHandler.create(makeActivity(id, taskDTOExt)); } } - public TaskToFull get(long id) { + public TaskDTOFull get(long id) { Task task = Util.checkExist(id, handler.getRepository().findFullById(id)); - TaskToFull taskToFull = fullMapper.toTo(task); + TaskDTOFull taskDTOFull = fullMapper.toDTO(task); List activities = activityHandler.getRepository().findAllByTaskIdOrderByUpdatedDesc(id); - fillExtraFields(taskToFull, activities); - taskToFull.setActivityTos(activityHandler.getMapper().toToList(activities)); - return taskToFull; + fillExtraFields(taskDTOFull, activities); + taskDTOFull.setActivityDTOs(activityHandler.getMapper().toDTOList(activities)); + return taskDTOFull; } - public TaskToExt getNewWithSprint(long sprintId) { + public TaskDTOExt getNewWithSprint(long sprintId) { Sprint sprint = sprintRepository.getExisted(sprintId); Task newTask = new Task(); newTask.setSprintId(sprintId); newTask.setProjectId(sprint.getProjectId()); - return extMapper.toTo(newTask); + return extMapper.toDTO(newTask); } - public TaskToExt getNewWithProject(long projectId) { + public TaskDTOExt getNewWithProject(long projectId) { Task newTask = new Task(); newTask.setProjectId(projectId); - return extMapper.toTo(newTask); + return extMapper.toDTO(newTask); } - public TaskToExt getNewWithParent(long parentId) { + public TaskDTOExt getNewWithParent(long parentId) { Task parent = handler.getRepository().getExisted(parentId); Task newTask = new Task(); newTask.setParentId(parentId); newTask.setSprintId(parent.getSprintId()); newTask.setProjectId(parent.getProjectId()); - return extMapper.toTo(newTask); + return extMapper.toDTO(newTask); } public void assign(long id, String userType, long userId) { @@ -135,7 +135,7 @@ public void unAssign(long id, String userType, long userId) { private void checkAssignmentActionPossible(long id, String userType, boolean assign) { Assert.notNull(userType, "userType must not be null"); Task task = handler.getRepository().getExisted(id); - String possibleUserType = getRefTo(RefType.TASK_STATUS, task.getStatusCode()).getAux(1); + String possibleUserType = getRefDTO(RefType.TASK_STATUS, task.getStatusCode()).getAux(1); if (!userType.equals(possibleUserType)) { throw new DataConflictException(String.format(assign ? CANNOT_ASSIGN : CANNOT_UN_ASSIGN, userType, task.getStatusCode())); } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/TaskUIController.java b/src/main/java/com/javarush/jira/bugtracking/task/TaskUIController.java index fbcc46aa2..7b1a605af 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/TaskUIController.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/TaskUIController.java @@ -3,10 +3,10 @@ import com.javarush.jira.bugtracking.Handlers; import com.javarush.jira.bugtracking.ObjectType; import com.javarush.jira.bugtracking.attachment.AttachmentRepository; -import com.javarush.jira.bugtracking.task.to.ActivityTo; -import com.javarush.jira.bugtracking.task.to.TaskToExt; -import com.javarush.jira.bugtracking.task.to.TaskToFull; -import com.javarush.jira.ref.RefTo; +import com.javarush.jira.bugtracking.task.to.ActivityDTO; +import com.javarush.jira.bugtracking.task.to.TaskDTOExt; +import com.javarush.jira.bugtracking.task.to.TaskDTOFull; +import com.javarush.jira.ref.RefDTO; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -37,8 +37,8 @@ public class TaskUIController { @GetMapping("/{id}") public String get(@PathVariable long id, @RequestParam(required = false) boolean fragment, Model model) { log.info("get {}", id); - TaskToFull taskTo = service.get(id); - addTaskInfo(model, taskTo); + TaskDTOFull taskDTOFull = service.get(id); + addTaskInfo(model, taskDTOFull); model.addAttribute("fragment", fragment); model.addAttribute("belongs", taskHandler.getAllBelongs(id)); return "task"; @@ -47,16 +47,16 @@ public String get(@PathVariable long id, @RequestParam(required = false) boolean @GetMapping("/edit/{id}") public String showEditForm(@PathVariable long id, Model model) { log.info("show edit form for task {}", id); - TaskToFull taskTo = service.get(id); - addTaskInfo(model, taskTo); - addRefs(model, taskTo.getStatusCode()); + TaskDTOFull taskDTOFull = service.get(id); + addTaskInfo(model, taskDTOFull); + addRefs(model, taskDTOFull.getStatusCode()); return "task-edit"; } @GetMapping(value = "/new", params = "sprintId") public String editFormNew(@RequestParam long sprintId, Model model) { log.info("show edit form for new task with sprint {}", sprintId); - TaskToExt newTask = service.getNewWithSprint(sprintId); + TaskDTOExt newTask = service.getNewWithSprint(sprintId); addNewTaskInfoAndRefs(newTask, model); return "task-edit"; } @@ -64,7 +64,7 @@ public String editFormNew(@RequestParam long sprintId, Model model) { @GetMapping(value = "/new", params = "projectId") public String editFormNewInBacklog(@RequestParam long projectId, Model model) { log.info("show edit form for new task with project {}", projectId); - TaskToExt newTask = service.getNewWithProject(projectId); + TaskDTOExt newTask = service.getNewWithProject(projectId); addNewTaskInfoAndRefs(newTask, model); return "task-edit"; } @@ -72,45 +72,45 @@ public String editFormNewInBacklog(@RequestParam long projectId, Model model) { @GetMapping(value = "/new", params = "parentId") public String editFormNewSubTask(@RequestParam long parentId, Model model) { log.info("show edit form for new subtask of {}", parentId); - TaskToExt newTask = service.getNewWithParent(parentId); + TaskDTOExt newTask = service.getNewWithParent(parentId); addNewTaskInfoAndRefs(newTask, model); return "task-edit"; } @PostMapping - public String createOrUpdate(@Valid @ModelAttribute("task") TaskToExt taskTo, BindingResult result, Model model) { + public String createOrUpdate(@Valid @ModelAttribute("task") TaskDTOExt taskDTOExt, BindingResult result, Model model) { if (result.hasErrors()) { - addRefs(model, taskTo.getStatusCode()); - List activityTos = taskTo.isNew() ? Collections.emptyList() : - activityHandler.getMapper().toToList(activityHandler.getRepository().findAllByTaskIdOrderByUpdatedDesc(taskTo.getId())); - List comments = getComments(activityTos); - activityTos.removeAll(comments); + addRefs(model, taskDTOExt.getStatusCode()); + List activityDTOs = taskDTOExt.isNew() ? Collections.emptyList() : + activityHandler.getMapper().toDTOList(activityHandler.getRepository().findAllByTaskIdOrderByUpdatedDesc(taskDTOExt.getId())); + List comments = getComments(activityDTOs); + activityDTOs.removeAll(comments); model.addAttribute("comments", comments); - model.addAttribute("activities", activityTos); - if (!taskTo.isNew()) { - model.addAttribute("attachs", attachmentHandler.getRepository().getAllForObject(taskTo.id(), ObjectType.TASK)); + model.addAttribute("activities", activityDTOs); + if (!taskDTOExt.isNew()) { + model.addAttribute("attachs", attachmentHandler.getRepository().getAllForObject(taskDTOExt.id(), ObjectType.TASK)); } return "task-edit"; } - Long taskId = taskTo.getId(); - if (taskTo.isNew()) { - log.info("create {}", taskTo); - Task created = service.create(taskTo); + Long taskId = taskDTOExt.getId(); + if (taskDTOExt.isNew()) { + log.info("create {}", taskDTOExt); + Task created = service.create(taskDTOExt); taskId = created.id(); } else { - log.info("update {} with id={}", taskTo, taskTo.id()); - service.update(taskTo, taskTo.id()); + log.info("update {} with id={}", taskDTOExt, taskDTOExt.id()); + service.update(taskDTOExt, taskDTOExt.id()); } return "redirect:/ui/tasks/" + taskId; } - private void addTaskInfo(Model model, TaskToFull taskTo) { - List comments = getComments(taskTo.getActivityTos()); - taskTo.getActivityTos().removeAll(comments); - model.addAttribute("task", taskTo); + private void addTaskInfo(Model model, TaskDTOFull taskDTOFull) { + List comments = getComments(taskDTOFull.getActivityDTOs()); + taskDTOFull.getActivityDTOs().removeAll(comments); + model.addAttribute("task", taskDTOFull); model.addAttribute("comments", comments); - model.addAttribute("attachs", attachmentHandler.getRepository().getAllForObject(taskTo.id(), ObjectType.TASK)); - model.addAttribute("activities", taskTo.getActivityTos()); + model.addAttribute("attachs", attachmentHandler.getRepository().getAllForObject(taskDTOFull.id(), ObjectType.TASK)); + model.addAttribute("activities", taskDTOFull.getActivityDTOs()); } private void addRefs(Model model, String currentStatus) { @@ -119,7 +119,7 @@ private void addRefs(Model model, String currentStatus) { model.addAttribute("priorities", getRefs(PRIORITY)); } - private void addNewTaskInfoAndRefs(TaskToExt newTask, Model model) { + private void addNewTaskInfoAndRefs(TaskDTOExt newTask, Model model) { model.addAttribute("task", newTask); model.addAttribute("types", getRefs(TASK)); model.addAttribute("statuses", getRefs(TASK_STATUS)); @@ -127,10 +127,10 @@ private void addNewTaskInfoAndRefs(TaskToExt newTask, Model model) { } - private Map getPossibleStatusRefs(String currentStatus) { + private Map getPossibleStatusRefs(String currentStatus) { Set possibleStatuses = new HashSet<>(); possibleStatuses.add(currentStatus); - Map taskStatusRefs = getRefs(TASK_STATUS); + Map taskStatusRefs = getRefs(TASK_STATUS); String possibleStatusesAux = taskStatusRefs.get(currentStatus).getAux(0); if (possibleStatusesAux != null) { possibleStatuses.addAll(Set.of(possibleStatusesAux.split(","))); @@ -140,8 +140,8 @@ private Map getPossibleStatusRefs(String currentStatus) { .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (ref1, ref2) -> ref1, LinkedHashMap::new)); } - private List getComments(List activityTos) { - return activityTos.stream() + private List getComments(List activityDTOs) { + return activityDTOs.stream() .filter(activity -> activity.getComment() != null) .toList(); } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/TaskUtil.java b/src/main/java/com/javarush/jira/bugtracking/task/TaskUtil.java index 79e22864b..f04203c81 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/TaskUtil.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/TaskUtil.java @@ -1,10 +1,10 @@ package com.javarush.jira.bugtracking.task; -import com.javarush.jira.bugtracking.task.to.TaskToExt; -import com.javarush.jira.bugtracking.task.to.TaskToFull; +import com.javarush.jira.bugtracking.task.to.TaskDTOExt; +import com.javarush.jira.bugtracking.task.to.TaskDTOFull; import com.javarush.jira.common.error.DataConflictException; import com.javarush.jira.login.AuthUser; -import com.javarush.jira.ref.RefTo; +import com.javarush.jira.ref.RefDTO; import java.util.*; import java.util.function.Function; @@ -15,7 +15,7 @@ public class TaskUtil { - static Map getPossibleStatusRefs(String currentStatus) { + static Map getPossibleStatusRefs(String currentStatus) { Set possibleStatuses = getPossibleStatuses(currentStatus); return getRefs(TASK_STATUS).entrySet().stream() .filter(ref -> possibleStatuses.contains(ref.getKey())) @@ -31,26 +31,26 @@ static void checkStatusChangePossible(String currentStatus, String newStatus) { private static Set getPossibleStatuses(String currentStatus) { Set possibleStatuses = new HashSet<>(); possibleStatuses.add(currentStatus); - Map taskStatusRefs = getRefs(TASK_STATUS); + Map taskStatusRefs = getRefs(TASK_STATUS); String aux = taskStatusRefs.get(currentStatus).getAux(0); possibleStatuses.addAll(aux == null ? Set.of() : Set.of(aux.split(","))); return possibleStatuses; } - static void fillExtraFields(TaskToFull taskToFull, List activities) { + static void fillExtraFields(TaskDTOFull taskDTOFull, List activities) { if (!activities.isEmpty()) { - taskToFull.setUpdated(activities.get(0).getUpdated()); + taskDTOFull.setUpdated(activities.get(0).getUpdated()); for (Activity latest : activities) { - if (taskToFull.getDescription() == null && latest.getDescription() != null) { - taskToFull.setDescription(latest.getDescription()); + if (taskDTOFull.getDescription() == null && latest.getDescription() != null) { + taskDTOFull.setDescription(latest.getDescription()); } - if (taskToFull.getPriorityCode() == null && latest.getPriorityCode() != null) { - taskToFull.setPriorityCode(latest.getPriorityCode()); + if (taskDTOFull.getPriorityCode() == null && latest.getPriorityCode() != null) { + taskDTOFull.setPriorityCode(latest.getPriorityCode()); } - if (taskToFull.getEstimate() == null && latest.getEstimate() != null) { - taskToFull.setEstimate(latest.getEstimate()); + if (taskDTOFull.getEstimate() == null && latest.getEstimate() != null) { + taskDTOFull.setEstimate(latest.getEstimate()); } - if (taskToFull.getDescription() != null && taskToFull.getPriorityCode() != null && taskToFull.getEstimate() != null) + if (taskDTOFull.getDescription() != null && taskDTOFull.getPriorityCode() != null && taskDTOFull.getEstimate() != null) break; } } @@ -66,8 +66,8 @@ static String getLatestValue(List activities, Function { +public interface ActivityMapper extends BaseMapper { static long checkTaskBelong(long taskId, Activity dbActivity) { if (taskId != dbActivity.getTaskId()) throw new DataConflictException("Activity " + dbActivity.id() + " doesn't belong to Task " + taskId); @@ -17,6 +17,6 @@ static long checkTaskBelong(long taskId, Activity dbActivity) { } @Override - @Mapping(target = "taskId", expression = "java(ActivityMapper.checkTaskBelong(activityTo.getTaskId(), activity))") - Activity updateFromTo(ActivityTo activityTo, @MappingTarget Activity activity); + @Mapping(target = "taskId", expression = "java(ActivityMapper.checkTaskBelong(activityDTO.getTaskId(), activity))") + Activity updateFromDTO(ActivityDTO activityDTO, @MappingTarget Activity activity); } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskExtMapper.java b/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskExtMapper.java index 55598caf8..9518d7355 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskExtMapper.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskExtMapper.java @@ -3,7 +3,7 @@ import com.javarush.jira.bugtracking.project.ProjectMapper; import com.javarush.jira.bugtracking.sprint.SprintMapper; import com.javarush.jira.bugtracking.task.Task; -import com.javarush.jira.bugtracking.task.to.TaskToExt; +import com.javarush.jira.bugtracking.task.to.TaskDTOExt; import com.javarush.jira.common.BaseMapper; import com.javarush.jira.common.TimestampMapper; import com.javarush.jira.common.error.DataConflictException; @@ -13,7 +13,7 @@ import org.mapstruct.MappingTarget; @Mapper(config = TimestampMapper.class, uses = {SprintMapper.class, ProjectMapper.class}) -public interface TaskExtMapper extends BaseMapper { +public interface TaskExtMapper extends BaseMapper { static long checkProjectBelong(long projectId, Task dbTask) { if (projectId != dbTask.getProjectId()) @@ -28,10 +28,10 @@ static long checkUserAuthorities(long sprintId, Task dbTask) { } @Override - TaskToExt toTo(Task task); + TaskDTOExt toDTO(Task task); @Override - @Mapping(target = "projectId", expression = "java(TaskExtMapper.checkProjectBelong(taskToExt.getProjectId(), task))") - @Mapping(target = "sprintId", expression = "java(TaskExtMapper.checkUserAuthorities(taskToExt.getSprintId(), task))") - Task updateFromTo(TaskToExt taskToExt, @MappingTarget Task task); + @Mapping(target = "projectId", expression = "java(TaskExtMapper.checkProjectBelong(taskDTOExt.getProjectId(), task))") + @Mapping(target = "sprintId", expression = "java(TaskExtMapper.checkUserAuthorities(taskDTOExt.getSprintId(), task))") + Task updateFromDTO(TaskDTOExt taskDTOExt, @MappingTarget Task task); } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskFullMapper.java b/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskFullMapper.java index dfbd9858e..6e98d19a2 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskFullMapper.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskFullMapper.java @@ -1,14 +1,14 @@ package com.javarush.jira.bugtracking.task.mapper; import com.javarush.jira.bugtracking.task.Task; -import com.javarush.jira.bugtracking.task.to.TaskToFull; +import com.javarush.jira.bugtracking.task.to.TaskDTOFull; import com.javarush.jira.common.BaseMapper; import com.javarush.jira.common.TimestampMapper; import org.mapstruct.Mapper; @Mapper(config = TimestampMapper.class) -public interface TaskFullMapper extends BaseMapper { +public interface TaskFullMapper extends BaseMapper { @Override - TaskToFull toTo(Task task); + TaskDTOFull toDTO(Task task); } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskMapper.java b/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskMapper.java index efcaef587..95d4495ff 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskMapper.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/mapper/TaskMapper.java @@ -1,13 +1,13 @@ package com.javarush.jira.bugtracking.task.mapper; import com.javarush.jira.bugtracking.task.Task; -import com.javarush.jira.bugtracking.task.to.TaskTo; +import com.javarush.jira.bugtracking.task.to.TaskDTO; import com.javarush.jira.common.BaseMapper; import org.mapstruct.Mapper; @Mapper(componentModel = "spring") -public interface TaskMapper extends BaseMapper { +public interface TaskMapper extends BaseMapper { @Override - TaskTo toTo(Task task); + TaskDTO toDTO(Task task); } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/to/ActivityTo.java b/src/main/java/com/javarush/jira/bugtracking/task/to/ActivityDTO.java similarity index 79% rename from src/main/java/com/javarush/jira/bugtracking/task/to/ActivityTo.java rename to src/main/java/com/javarush/jira/bugtracking/task/to/ActivityDTO.java index 5d73ae759..0603bd4bb 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/to/ActivityTo.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/to/ActivityDTO.java @@ -2,9 +2,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.javarush.jira.bugtracking.task.HasAuthorId; -import com.javarush.jira.common.to.BaseTo; +import com.javarush.jira.common.to.BaseDTO; import com.javarush.jira.common.util.validation.NoHtml; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; @@ -16,13 +16,13 @@ @Value @EqualsAndHashCode(callSuper = true) -public class ActivityTo extends BaseTo implements HasAuthorId { +public class ActivityDTO extends BaseDTO implements HasAuthorId { @NotNull Long taskId; @Nullable @JsonProperty(access = JsonProperty.Access.READ_ONLY) - UserTo author; + UserDTO author; @NotNull Long authorId; @@ -65,8 +65,8 @@ public class ActivityTo extends BaseTo implements HasAuthorId { @Nullable Integer estimate; - public ActivityTo(Long id, Long taskId, Long authorId, LocalDateTime updated, String comment, String statusCode, - String priorityCode, String typeCode, String title, String description, Integer estimate, UserTo author) { + public ActivityDTO(Long id, Long taskId, Long authorId, LocalDateTime updated, String comment, String statusCode, + String priorityCode, String typeCode, String title, String description, Integer estimate, UserDTO author) { super(id); this.taskId = taskId; this.authorId = authorId; diff --git a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskTo.java b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTO.java similarity index 72% rename from src/main/java/com/javarush/jira/bugtracking/task/to/TaskTo.java rename to src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTO.java index a284403d8..cd5c79cb4 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskTo.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTO.java @@ -2,14 +2,14 @@ import com.javarush.jira.common.HasCode; import com.javarush.jira.common.HasIdAndParentId; -import com.javarush.jira.common.to.TitleTo; +import com.javarush.jira.common.to.TitleDTO; import com.javarush.jira.common.util.validation.Code; import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @Getter -public class TaskTo extends TitleTo implements HasCode, HasIdAndParentId { +public class TaskDTO extends TitleDTO implements HasCode, HasIdAndParentId { @Code private final String typeCode; Long parentId; @@ -20,7 +20,7 @@ public class TaskTo extends TitleTo implements HasCode, HasIdAndParentId { @Code private String statusCode; - public TaskTo(Long id, String code, String title, String typeCode, String statusCode, Long parentId, Long projectId, Long sprintId) { + public TaskDTO(Long id, String code, String title, String typeCode, String statusCode, Long parentId, Long projectId, Long sprintId) { super(id, code, title); this.typeCode = typeCode; this.statusCode = statusCode; diff --git a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOExt.java b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOExt.java new file mode 100644 index 000000000..e3c6f00b7 --- /dev/null +++ b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOExt.java @@ -0,0 +1,55 @@ +package com.javarush.jira.bugtracking.task.to; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.javarush.jira.common.util.validation.Code; +import com.javarush.jira.common.util.validation.Description; +import jakarta.annotation.Nullable; +import jakarta.validation.constraints.Positive; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.Objects; + +@Getter +@Setter +public class TaskDTOExt extends TaskDTO { + @Description + String description; + + @Code + String priorityCode; + + @Nullable + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + LocalDateTime updated; + + @Nullable + @Positive + Integer estimate; + + public TaskDTOExt(Long id, String code, String title, String description, String typeCode, String statusCode, String priorityCode, + LocalDateTime updated, Integer estimate, Long parentId, long projectId, Long sprintId) { + super(id, code, title, typeCode, statusCode, parentId, projectId, sprintId); + this.description = description; + this.priorityCode = priorityCode; + this.updated = updated; + this.estimate = estimate; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof TaskDTOExt taskDTOExt)) return false; + return Objects.equals(id, taskDTOExt.id) && + Objects.equals(title, taskDTOExt.title) && + Objects.equals(getTypeCode(), taskDTOExt.getTypeCode()) && + Objects.equals(getStatusCode(), taskDTOExt.getStatusCode()) && + Objects.equals(priorityCode, taskDTOExt.priorityCode) && + Objects.equals(description, taskDTOExt.description) && + Objects.equals(estimate, taskDTOExt.estimate) && + Objects.equals(parentId, taskDTOExt.parentId) && + Objects.equals(projectId, taskDTOExt.projectId) && + Objects.equals(sprintId, taskDTOExt.sprintId); + } +} diff --git a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOFull.java b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOFull.java new file mode 100644 index 000000000..e7cc85976 --- /dev/null +++ b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOFull.java @@ -0,0 +1,27 @@ +package com.javarush.jira.bugtracking.task.to; + +import com.javarush.jira.common.to.CodeDTO; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.List; + +@Getter +public class TaskDTOFull extends TaskDTOExt { + CodeDTO parent; + CodeDTO project; + CodeDTO sprint; + @Setter + List activityDTOs; + + public TaskDTOFull(Long id, String code, String title, String description, String typeCode, String statusCode, String priorityCode, + LocalDateTime updated, Integer estimate, CodeDTO parent, CodeDTO project, CodeDTO sprint, List activityDTOs) { + super(id, code, title, description, typeCode, statusCode, priorityCode, updated, estimate, + parent == null ? null : parent.getId(), project.getId(), sprint == null ? null : sprint.getId()); + this.parent = parent; + this.project = project; + this.sprint = sprint; + this.activityDTOs = activityDTOs; + } +} diff --git a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskToExt.java b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskToExt.java deleted file mode 100644 index e49e22dd2..000000000 --- a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskToExt.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.javarush.jira.bugtracking.task.to; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.javarush.jira.common.util.validation.Code; -import com.javarush.jira.common.util.validation.Description; -import jakarta.annotation.Nullable; -import jakarta.validation.constraints.Positive; -import lombok.Getter; -import lombok.Setter; - -import java.time.LocalDateTime; -import java.util.Objects; - -@Getter -@Setter -public class TaskToExt extends TaskTo { - @Description - String description; - - @Code - String priorityCode; - - @Nullable - @JsonProperty(access = JsonProperty.Access.READ_ONLY) - LocalDateTime updated; - - @Nullable - @Positive - Integer estimate; - - public TaskToExt(Long id, String code, String title, String description, String typeCode, String statusCode, String priorityCode, - LocalDateTime updated, Integer estimate, Long parentId, long projectId, Long sprintId) { - super(id, code, title, typeCode, statusCode, parentId, projectId, sprintId); - this.description = description; - this.priorityCode = priorityCode; - this.updated = updated; - this.estimate = estimate; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof TaskToExt taskToExt)) return false; - return Objects.equals(id, taskToExt.id) && - Objects.equals(title, taskToExt.title) && - Objects.equals(getTypeCode(), taskToExt.getTypeCode()) && - Objects.equals(getStatusCode(), taskToExt.getStatusCode()) && - Objects.equals(priorityCode, taskToExt.priorityCode) && - Objects.equals(description, taskToExt.description) && - Objects.equals(estimate, taskToExt.estimate) && - Objects.equals(parentId, taskToExt.parentId) && - Objects.equals(projectId, taskToExt.projectId) && - Objects.equals(sprintId, taskToExt.sprintId); - } -} diff --git a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskToFull.java b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskToFull.java deleted file mode 100644 index 090d48ef0..000000000 --- a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskToFull.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.javarush.jira.bugtracking.task.to; - -import com.javarush.jira.common.to.CodeTo; -import lombok.Getter; -import lombok.Setter; - -import java.time.LocalDateTime; -import java.util.List; - -@Getter -public class TaskToFull extends TaskToExt { - CodeTo parent; - CodeTo project; - CodeTo sprint; - @Setter - List activityTos; - - public TaskToFull(Long id, String code, String title, String description, String typeCode, String statusCode, String priorityCode, - LocalDateTime updated, Integer estimate, CodeTo parent, CodeTo project, CodeTo sprint, List activityTos) { - super(id, code, title, description, typeCode, statusCode, priorityCode, updated, estimate, - parent == null ? null : parent.getId(), project.getId(), sprint == null ? null : sprint.getId()); - this.parent = parent; - this.project = project; - this.sprint = sprint; - this.activityTos = activityTos; - } -} diff --git a/src/main/java/com/javarush/jira/bugtracking/tree/NodeTo.java b/src/main/java/com/javarush/jira/bugtracking/tree/NodeDTO.java similarity index 68% rename from src/main/java/com/javarush/jira/bugtracking/tree/NodeTo.java rename to src/main/java/com/javarush/jira/bugtracking/tree/NodeDTO.java index d2bbe368d..fa661025c 100644 --- a/src/main/java/com/javarush/jira/bugtracking/tree/NodeTo.java +++ b/src/main/java/com/javarush/jira/bugtracking/tree/NodeDTO.java @@ -2,19 +2,19 @@ import com.javarush.jira.bugtracking.ObjectType; import com.javarush.jira.common.HasIdAndParentId; -import com.javarush.jira.common.to.CodeTo; +import com.javarush.jira.common.to.CodeDTO; import lombok.Getter; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; @Getter -public class NodeTo extends CodeTo implements HasIdAndParentId { +public class NodeDTO extends CodeDTO implements HasIdAndParentId { @NonNull protected ObjectType type; @Nullable protected Long parentId; - public NodeTo(long id, @NonNull String code, @NonNull ObjectType type, Long parentId) { + public NodeDTO(long id, @NonNull String code, @NonNull ObjectType type, Long parentId) { super(id, code); this.type = type; this.parentId = parentId; diff --git a/src/main/java/com/javarush/jira/bugtracking/tree/NodeMapper.java b/src/main/java/com/javarush/jira/bugtracking/tree/NodeMapper.java index 619178e34..e8cfede79 100644 --- a/src/main/java/com/javarush/jira/bugtracking/tree/NodeMapper.java +++ b/src/main/java/com/javarush/jira/bugtracking/tree/NodeMapper.java @@ -1,20 +1,20 @@ package com.javarush.jira.bugtracking.tree; -import com.javarush.jira.bugtracking.project.to.ProjectTo; -import com.javarush.jira.bugtracking.sprint.to.SprintTo; -import com.javarush.jira.bugtracking.task.to.TaskTo; +import com.javarush.jira.bugtracking.project.to.ProjectDTO; +import com.javarush.jira.bugtracking.sprint.to.SprintDTO; +import com.javarush.jira.bugtracking.task.to.TaskDTO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @Mapper(componentModel = "spring") public interface NodeMapper { @Mapping(target = "type", expression = "java(ObjectType.PROJECT)") - NodeTo fromProject(ProjectTo project); + NodeDTO fromProject(ProjectDTO project); @Mapping(target = "type", expression = "java(ObjectType.SPRINT)") @Mapping(target = "parentId", expression = "java(null)") - NodeTo fromSprint(SprintTo sprint); + NodeDTO fromSprint(SprintDTO sprint); @Mapping(target = "type", expression = "java(ObjectType.TASK)") - NodeTo fromTask(TaskTo task); + NodeDTO fromTask(TaskDTO task); } diff --git a/src/main/java/com/javarush/jira/bugtracking/tree/TreeNode.java b/src/main/java/com/javarush/jira/bugtracking/tree/TreeNode.java index 1a50afca6..ef76fbf01 100644 --- a/src/main/java/com/javarush/jira/bugtracking/tree/TreeNode.java +++ b/src/main/java/com/javarush/jira/bugtracking/tree/TreeNode.java @@ -8,8 +8,8 @@ import java.util.List; public record TreeNode(@NonNull String code, @NonNull Long id, @NonNull ObjectType nodeType, - List subNodes) implements ITreeNode { - public TreeNode(NodeTo node) { + List subNodes) implements ITreeNode { + public TreeNode(NodeDTO node) { this(node.getCode(), node.getId(), node.getType(), new LinkedList<>()); } diff --git a/src/main/java/com/javarush/jira/bugtracking/tree/TreeRestController.java b/src/main/java/com/javarush/jira/bugtracking/tree/TreeRestController.java index a3a7da4ec..b37f5d337 100644 --- a/src/main/java/com/javarush/jira/bugtracking/tree/TreeRestController.java +++ b/src/main/java/com/javarush/jira/bugtracking/tree/TreeRestController.java @@ -5,7 +5,7 @@ import com.javarush.jira.bugtracking.project.ProjectRepository; import com.javarush.jira.bugtracking.sprint.SprintMapper; import com.javarush.jira.bugtracking.sprint.SprintRepository; -import com.javarush.jira.bugtracking.sprint.to.SprintTo; +import com.javarush.jira.bugtracking.sprint.to.SprintDTO; import com.javarush.jira.bugtracking.task.TaskRepository; import com.javarush.jira.bugtracking.task.mapper.TaskMapper; import com.javarush.jira.common.util.Util; @@ -36,8 +36,8 @@ public class TreeRestController { private final TaskRepository taskRepository; private final TaskMapper taskMapper; - private static List toTree(List list, Function mapper) { - List nodes = list.stream() + private static List toTree(List list, Function mapper) { + List nodes = list.stream() .map(mapper) .toList(); return Util.makeTree(nodes, TreeNode::new); @@ -46,26 +46,26 @@ private static List toTree(List list, Function mappe @GetMapping("/projects") public List getProjects() { log.info("get projects tree"); - return toTree(projectMapper.toToList(projectRepository.getAll()), mapper::fromProject); + return toTree(projectMapper.toDTOList(projectRepository.getAll()), mapper::fromProject); } @GetMapping("/projects/{projectId}/sprints") public List getSprintsAndBacklog(@PathVariable long projectId) { log.info("get project {} sprints", projectId); - List sprintTos = new ArrayList<>(sprintMapper.toToList(sprintRepository.getAllByProject(projectId))); - sprintTos.add(new SprintTo(0L, "Backlog", null, projectId)); - return toTree(sprintTos, mapper::fromSprint); + List sprintDTOS = new ArrayList<>(sprintMapper.toDTOList(sprintRepository.getAllByProject(projectId))); + sprintDTOS.add(new SprintDTO(0L, "Backlog", null, projectId)); + return toTree(sprintDTOS, mapper::fromSprint); } @GetMapping("/sprints/{sprintId}/tasks") public List getSprintTasks(@PathVariable long sprintId) { log.info("get sprint {} tasks", sprintId); - return toTree(taskMapper.toToList(taskRepository.findAllBySprintId(sprintId)), mapper::fromTask); + return toTree(taskMapper.toDTOList(taskRepository.findAllBySprintId(sprintId)), mapper::fromTask); } @GetMapping("/projects/{projectId}/backlog/tasks") public List getBacklogTasks(@PathVariable long projectId) { log.info("get project {} backlog tasks", projectId); - return toTree(taskMapper.toToList(taskRepository.findAllByProjectIdAndSprintIsNull(projectId)), mapper::fromTask); + return toTree(taskMapper.toDTOList(taskRepository.findAllByProjectIdAndSprintIsNull(projectId)), mapper::fromTask); } } diff --git a/src/main/java/com/javarush/jira/common/BaseHandler.java b/src/main/java/com/javarush/jira/common/BaseHandler.java index bc028d295..409737229 100644 --- a/src/main/java/com/javarush/jira/common/BaseHandler.java +++ b/src/main/java/com/javarush/jira/common/BaseHandler.java @@ -1,7 +1,7 @@ package com.javarush.jira.common; import com.javarush.jira.common.model.TimestampEntry; -import com.javarush.jira.common.to.BaseTo; +import com.javarush.jira.common.to.BaseDTO; import lombok.Getter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,7 +18,7 @@ import static com.javarush.jira.common.util.validation.ValidationUtil.assureIdConsistent; import static com.javarush.jira.common.util.validation.ValidationUtil.checkNew; -public class BaseHandler, M extends BaseMapper> { +public class BaseHandler, M extends BaseMapper> { public static final String REST_URL = "/api"; public static final String UI_URL = "/ui"; @@ -52,7 +52,7 @@ public static ResponseEntity createdResponse(String url, T public T getTo(long id) { log.info("get by id={}", id); - return mapper.toTo(repository.getExisted(id)); + return mapper.toDTO(repository.getExisted(id)); } public E get(long id) { @@ -69,17 +69,17 @@ public List getAll(Sort sort) { return repository.findAll(sort); } - public List getAllTos() { - return getAllTos(Sort.unsorted()); + public List getAllDTOs() { + return getAllDTOs(Sort.unsorted()); } - public List getAllTos(Sort sort) { - log.info("get all TOs"); - return mapper.toToList(repository.findAll(sort)); + public List getAllDTOs(Sort sort) { + log.info("get all DTOs"); + return mapper.toDTOList(repository.findAll(sort)); } - public E createFromTo(T to) { - log.info("createFromTo {}", to); + public E createFromDTO(T to) { + log.info("createFromDTO {}", to); checkNew(to); E entity = mapper.toEntity(to); if (prepareForSave != null) entity = prepareForSave.apply(entity); @@ -110,11 +110,11 @@ public E update(E entity, long id) { } @Transactional - public E updateFromTo(T to, long id) { - log.info("updateFromTo {} with id={}", to, id); + public E updateFromDTO(T to, long id) { + log.info("updateFromDTO {} with id={}", to, id); assureIdConsistent(to, id); E dbEntity = repository.getExisted(to.id()); - return repository.save(mapper.updateFromTo(to, dbEntity)); + return repository.save(mapper.updateFromDTO(to, dbEntity)); } @Transactional diff --git a/src/main/java/com/javarush/jira/common/BaseMapper.java b/src/main/java/com/javarush/jira/common/BaseMapper.java index b3ae2c6e7..4600e4b07 100644 --- a/src/main/java/com/javarush/jira/common/BaseMapper.java +++ b/src/main/java/com/javarush/jira/common/BaseMapper.java @@ -1,20 +1,20 @@ package com.javarush.jira.common; -import com.javarush.jira.common.to.BaseTo; +import com.javarush.jira.common.to.BaseDTO; import org.mapstruct.MappingTarget; import java.util.Collection; import java.util.List; -public interface BaseMapper { +public interface BaseMapper { E toEntity(T to); - List toEntityList(Collection tos); + List toEntityList(Collection dtos); - E updateFromTo(T to, @MappingTarget E entity); + E updateFromDTO(T to, @MappingTarget E entity); - T toTo(E entity); + T toDTO(E entity); - List toToList(Collection entities); + List toDTOList(Collection entities); } diff --git a/src/main/java/com/javarush/jira/common/TimestampMapper.java b/src/main/java/com/javarush/jira/common/TimestampMapper.java index cf35a376c..d4b622a1a 100644 --- a/src/main/java/com/javarush/jira/common/TimestampMapper.java +++ b/src/main/java/com/javarush/jira/common/TimestampMapper.java @@ -1,7 +1,7 @@ package com.javarush.jira.common; import com.javarush.jira.common.model.TimestampEntry; -import com.javarush.jira.common.to.CodeTo; +import com.javarush.jira.common.to.CodeDTO; import org.mapstruct.MapperConfig; import org.mapstruct.Mapping; import org.mapstruct.MappingInheritanceStrategy; @@ -9,8 +9,8 @@ // https://stackoverflow.com/questions/57860451/mapstruct-inheritance-more-than-one-configuration-prototype-is-application @MapperConfig(componentModel = "spring", mappingInheritanceStrategy = MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG) -public interface TimestampMapper { +public interface TimestampMapper { @Mapping(target = "enabled", ignore = true) @Mapping(target = "id", ignore = true) - E updateFromTo(T to, @MappingTarget E entity); + E updateFromDTO(T to, @MappingTarget E entity); } diff --git a/src/main/java/com/javarush/jira/common/to/BaseTo.java b/src/main/java/com/javarush/jira/common/to/BaseDTO.java similarity index 85% rename from src/main/java/com/javarush/jira/common/to/BaseTo.java rename to src/main/java/com/javarush/jira/common/to/BaseDTO.java index a9b436893..0aac3b0f7 100644 --- a/src/main/java/com/javarush/jira/common/to/BaseTo.java +++ b/src/main/java/com/javarush/jira/common/to/BaseDTO.java @@ -12,7 +12,7 @@ @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PROTECTED) @Data -public abstract class BaseTo implements HasId { +public abstract class BaseDTO implements HasId { @Schema(hidden = true) protected Long id; @@ -25,8 +25,8 @@ public String toString() { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - BaseTo baseTo = (BaseTo) o; - return id.equals(baseTo.id); + BaseDTO baseDTO = (BaseDTO) o; + return id.equals(baseDTO.id); } @Override diff --git a/src/main/java/com/javarush/jira/common/to/CodeTo.java b/src/main/java/com/javarush/jira/common/to/CodeDTO.java similarity index 84% rename from src/main/java/com/javarush/jira/common/to/CodeTo.java rename to src/main/java/com/javarush/jira/common/to/CodeDTO.java index be06c3e10..543a05eee 100644 --- a/src/main/java/com/javarush/jira/common/to/CodeTo.java +++ b/src/main/java/com/javarush/jira/common/to/CodeDTO.java @@ -8,14 +8,14 @@ import org.springframework.lang.NonNull; @Getter -public class CodeTo extends BaseTo implements HasCode { +public class CodeDTO extends BaseDTO implements HasCode { @JsonProperty(access = JsonProperty.Access.READ_ONLY) @Setter boolean enabled = true; @Code String code; - public CodeTo(Long id, @NonNull String code) { + public CodeDTO(Long id, @NonNull String code) { super(id); this.code = code; } diff --git a/src/main/java/com/javarush/jira/common/to/NamedTo.java b/src/main/java/com/javarush/jira/common/to/NamedDTO.java similarity index 86% rename from src/main/java/com/javarush/jira/common/to/NamedTo.java rename to src/main/java/com/javarush/jira/common/to/NamedDTO.java index 6bafe3c7c..09b5444c3 100644 --- a/src/main/java/com/javarush/jira/common/to/NamedTo.java +++ b/src/main/java/com/javarush/jira/common/to/NamedDTO.java @@ -8,13 +8,13 @@ @Data @EqualsAndHashCode(callSuper = true) -public class NamedTo extends BaseTo { +public class NamedDTO extends BaseDTO { @NotBlank @Size(min = 2, max = 128) @NoHtml protected String name; - public NamedTo(Long id, String name) { + public NamedDTO(Long id, String name) { super(id); this.name = name; } diff --git a/src/main/java/com/javarush/jira/common/to/TitleTo.java b/src/main/java/com/javarush/jira/common/to/TitleDTO.java similarity index 72% rename from src/main/java/com/javarush/jira/common/to/TitleTo.java rename to src/main/java/com/javarush/jira/common/to/TitleDTO.java index 5204ff8ac..bb2503dc6 100644 --- a/src/main/java/com/javarush/jira/common/to/TitleTo.java +++ b/src/main/java/com/javarush/jira/common/to/TitleDTO.java @@ -5,12 +5,12 @@ import lombok.Setter; @Getter -public class TitleTo extends CodeTo { +public class TitleDTO extends CodeDTO { @Title @Setter protected String title; - public TitleTo(Long id, String code, String title) { + public TitleDTO(Long id, String code, String title) { super(id, code); this.title = title; } diff --git a/src/main/java/com/javarush/jira/login/UserTo.java b/src/main/java/com/javarush/jira/login/UserDTO.java similarity index 84% rename from src/main/java/com/javarush/jira/login/UserTo.java rename to src/main/java/com/javarush/jira/login/UserDTO.java index 3c96853a9..72223a0d9 100644 --- a/src/main/java/com/javarush/jira/login/UserTo.java +++ b/src/main/java/com/javarush/jira/login/UserDTO.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonView; import com.javarush.jira.common.HasIdAndEmail; -import com.javarush.jira.common.to.BaseTo; +import com.javarush.jira.common.to.BaseDTO; import com.javarush.jira.common.util.validation.NoHtml; import com.javarush.jira.common.util.validation.View; import io.swagger.v3.oas.annotations.media.Schema; @@ -19,7 +19,7 @@ @Data @EqualsAndHashCode(callSuper = true) @NoArgsConstructor -public class UserTo extends BaseTo implements HasIdAndEmail, Serializable { +public class UserDTO extends BaseDTO implements HasIdAndEmail, Serializable { @Email @NotBlank @@ -47,7 +47,7 @@ public class UserTo extends BaseTo implements HasIdAndEmail, Serializable { @NoHtml private String displayName; - public UserTo(Long id, String email, String password, String firstName, String lastName, String displayName) { + public UserDTO(Long id, String email, String password, String firstName, String lastName, String displayName) { super(id); this.email = email; this.password = password; @@ -58,6 +58,6 @@ public UserTo(Long id, String email, String password, String firstName, String l @Override public String toString() { - return "UserTo:" + id + '[' + email + ']'; + return "UserDTO:" + id + '[' + email + ']'; } } diff --git a/src/main/java/com/javarush/jira/login/internal/UserHandler.java b/src/main/java/com/javarush/jira/login/internal/UserHandler.java index 16446471d..332816efc 100644 --- a/src/main/java/com/javarush/jira/login/internal/UserHandler.java +++ b/src/main/java/com/javarush/jira/login/internal/UserHandler.java @@ -2,13 +2,13 @@ import com.javarush.jira.common.BaseHandler; import com.javarush.jira.login.User; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; import org.springframework.stereotype.Component; import java.util.function.BinaryOperator; @Component -public class UserHandler extends BaseHandler { +public class UserHandler extends BaseHandler { public UserHandler(UserRepository repository, UserMapper mapper) { super(repository, mapper, UsersUtil::prepareForCreate, diff --git a/src/main/java/com/javarush/jira/login/internal/UserMapper.java b/src/main/java/com/javarush/jira/login/internal/UserMapper.java index 0f49932be..45b7b2e13 100644 --- a/src/main/java/com/javarush/jira/login/internal/UserMapper.java +++ b/src/main/java/com/javarush/jira/login/internal/UserMapper.java @@ -3,7 +3,7 @@ import com.javarush.jira.common.BaseMapper; import com.javarush.jira.login.Role; import com.javarush.jira.login.User; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; @@ -11,12 +11,12 @@ import java.util.EnumSet; @Mapper(componentModel = "spring", imports = {EnumSet.class, Role.class}) -public interface UserMapper extends BaseMapper { +public interface UserMapper extends BaseMapper { @Override @Mapping(target = "roles", expression = "java(EnumSet.of(Role.DEV))") - User toEntity(UserTo to); + User toEntity(UserDTO to); @Override @Mapping(target = "password", ignore = true) - User updateFromTo(UserTo to, @MappingTarget User entity); + User updateFromDTO(UserDTO to, @MappingTarget User entity); } diff --git a/src/main/java/com/javarush/jira/login/internal/verification/ConfirmData.java b/src/main/java/com/javarush/jira/login/internal/verification/ConfirmData.java index c457ff3b5..3d59ebe50 100644 --- a/src/main/java/com/javarush/jira/login/internal/verification/ConfirmData.java +++ b/src/main/java/com/javarush/jira/login/internal/verification/ConfirmData.java @@ -1,6 +1,6 @@ package com.javarush.jira.login.internal.verification; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; import lombok.Getter; import lombok.NonNull; import lombok.ToString; @@ -11,11 +11,11 @@ @Getter @ToString public class ConfirmData implements Serializable { - private final UserTo userTo; + private final UserDTO userDTO; private final String token; - public ConfirmData(@NonNull UserTo user) { - this.userTo = user; + public ConfirmData(@NonNull UserDTO user) { + this.userDTO = user; this.token = UUID.randomUUID().toString(); } } diff --git a/src/main/java/com/javarush/jira/login/internal/verification/RegistrationConfirmEvent.java b/src/main/java/com/javarush/jira/login/internal/verification/RegistrationConfirmEvent.java index 1f8dd39b8..2a9f4ac2c 100644 --- a/src/main/java/com/javarush/jira/login/internal/verification/RegistrationConfirmEvent.java +++ b/src/main/java/com/javarush/jira/login/internal/verification/RegistrationConfirmEvent.java @@ -1,7 +1,7 @@ package com.javarush.jira.login.internal.verification; import com.javarush.jira.common.AppEvent; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; -public record RegistrationConfirmEvent(UserTo userto, String token) implements AppEvent { +public record RegistrationConfirmEvent(UserDTO userDTO, String token) implements AppEvent { } diff --git a/src/main/java/com/javarush/jira/login/internal/web/AdminUserController.java b/src/main/java/com/javarush/jira/login/internal/web/AdminUserController.java index c29c17f7b..230f4e358 100644 --- a/src/main/java/com/javarush/jira/login/internal/web/AdminUserController.java +++ b/src/main/java/com/javarush/jira/login/internal/web/AdminUserController.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonView; import com.javarush.jira.common.util.validation.View; import com.javarush.jira.login.User; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; import io.swagger.v3.oas.annotations.Hidden; import jakarta.validation.constraints.Size; import org.springframework.cache.annotation.CacheEvict; @@ -77,11 +77,11 @@ public void changePassword(@RequestParam String oldPassword, @Size(min = 5, max @PostMapping("/form") @ResponseStatus(HttpStatus.NO_CONTENT) @Hidden - public void createOrUpdate(@Validated(View.OnUpdate.class) UserTo userTo) { - if (userTo.isNew()) { - handler.createFromTo(userTo); + public void createOrUpdate(@Validated(View.OnUpdate.class) UserDTO userDTO) { + if (userDTO.isNew()) { + handler.createFromDTO(userDTO); } else { - handler.updateFromTo(userTo, userTo.id()); + handler.updateFromDTO(userDTO, userDTO.id()); } } } diff --git a/src/main/java/com/javarush/jira/login/internal/web/RegisterController.java b/src/main/java/com/javarush/jira/login/internal/web/RegisterController.java index c82c1bdb4..36635cd17 100644 --- a/src/main/java/com/javarush/jira/login/internal/web/RegisterController.java +++ b/src/main/java/com/javarush/jira/login/internal/web/RegisterController.java @@ -2,7 +2,7 @@ import com.javarush.jira.common.error.DataConflictException; import com.javarush.jira.common.util.validation.View; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; import com.javarush.jira.login.internal.verification.ConfirmData; import com.javarush.jira.login.internal.verification.RegistrationConfirmEvent; import jakarta.servlet.http.HttpServletRequest; @@ -30,20 +30,20 @@ public class RegisterController extends AbstractUserController { @GetMapping public String register(Model model) { - model.addAttribute("userTo", new UserTo()); + model.addAttribute("userDTO", new UserDTO()); return "unauth/register"; } @PostMapping - public String register(@Validated(View.OnCreate.class) UserTo userTo, BindingResult result, HttpServletRequest request) { + public String register(@Validated(View.OnCreate.class) UserDTO userDTO, BindingResult result, HttpServletRequest request) { if (result.hasErrors()) { return "unauth/register"; } - log.info("register {}", userTo); - checkNew(userTo); - ConfirmData confirmData = new ConfirmData(userTo); + log.info("register {}", userDTO); + checkNew(userDTO); + ConfirmData confirmData = new ConfirmData(userDTO); request.getSession().setAttribute("token", confirmData); - eventPublisher.publishEvent(new RegistrationConfirmEvent(userTo, confirmData.getToken())); + eventPublisher.publishEvent(new RegistrationConfirmEvent(userDTO, confirmData.getToken())); return "redirect:/view/login"; } @@ -52,7 +52,7 @@ public String confirmRegistration(@RequestParam String token, SessionStatus stat @SessionAttribute("token") ConfirmData confirmData) { log.info("confirm registration {}", confirmData); if (token.equals(confirmData.getToken())) { - handler.createFromTo(confirmData.getUserTo()); + handler.createFromDTO(confirmData.getUserDTO()); session.invalidate(); status.setComplete(); return "login"; diff --git a/src/main/java/com/javarush/jira/login/internal/web/UserController.java b/src/main/java/com/javarush/jira/login/internal/web/UserController.java index 29cb0e1ce..47a6c72b1 100644 --- a/src/main/java/com/javarush/jira/login/internal/web/UserController.java +++ b/src/main/java/com/javarush/jira/login/internal/web/UserController.java @@ -4,7 +4,7 @@ import com.javarush.jira.common.util.validation.View; import com.javarush.jira.login.AuthUser; import com.javarush.jira.login.User; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; import jakarta.validation.constraints.Size; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -26,16 +26,16 @@ public class UserController extends AbstractUserController { @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.CREATED) - public ResponseEntity createWithLocation(@Validated(View.OnCreate.class) @RequestBody UserTo userTo) { - User created = handler.createFromTo(userTo); + public ResponseEntity createWithLocation(@Validated(View.OnCreate.class) @RequestBody UserDTO userDTO) { + User created = handler.createFromDTO(userDTO); return createdResponse(REST_URL, created); } @PutMapping(consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.NO_CONTENT) @JsonView(View.OnUpdate.class) - public void update(@Validated(View.OnUpdate.class) @RequestBody UserTo userTo, @AuthenticationPrincipal AuthUser authUser) { - authUser.setUser(handler.updateFromTo(userTo, authUser.id())); + public void update(@Validated(View.OnUpdate.class) @RequestBody UserDTO userDTO, @AuthenticationPrincipal AuthUser authUser) { + authUser.setUser(handler.updateFromDTO(userDTO, authUser.id())); } @GetMapping diff --git a/src/main/java/com/javarush/jira/login/internal/web/UserUIController.java b/src/main/java/com/javarush/jira/login/internal/web/UserUIController.java index 381222829..26362e5ea 100644 --- a/src/main/java/com/javarush/jira/login/internal/web/UserUIController.java +++ b/src/main/java/com/javarush/jira/login/internal/web/UserUIController.java @@ -3,7 +3,7 @@ import com.javarush.jira.common.error.ErrorMessageHandler; import com.javarush.jira.common.error.IllegalRequestDataException; import com.javarush.jira.login.AuthUser; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; import jakarta.validation.Valid; import jakarta.validation.constraints.Size; import lombok.RequiredArgsConstructor; @@ -26,13 +26,13 @@ public class UserUIController extends AbstractUserController { private final ErrorMessageHandler errorMessageHandler; @PostMapping - public String update(@Valid UserTo user, BindingResult result, @AuthenticationPrincipal AuthUser authUser, + public String update(@Valid UserDTO user, BindingResult result, @AuthenticationPrincipal AuthUser authUser, RedirectAttributes redirectAttrs) { if (result.hasErrors()) { redirectAttrs.addFlashAttribute(USER_ERROR_ATTRIBUTE, errorMessageHandler.getErrorList(result)); return "redirect:" + REDIRECT_PROFILE; } - authUser.setUser(handler.updateFromTo(user, authUser.id())); + authUser.setUser(handler.updateFromDTO(user, authUser.id())); redirectAttrs.addFlashAttribute(USER_SUCCESS_ATTRIBUTE, "Successfully changed"); return "redirect:" + REDIRECT_PROFILE; } diff --git a/src/main/java/com/javarush/jira/mail/internal/MailListeners.java b/src/main/java/com/javarush/jira/mail/internal/MailListeners.java index b7903cb3f..615be6039 100644 --- a/src/main/java/com/javarush/jira/mail/internal/MailListeners.java +++ b/src/main/java/com/javarush/jira/mail/internal/MailListeners.java @@ -22,7 +22,7 @@ public class MailListeners { @EventListener public void confirmRegistration(RegistrationConfirmEvent event) { String confirmationUrl = appProperties.getHostUrl() + "/ui/register/confirm?token=" + event.token(); - User user = userMapper.toEntity(event.userto()); + User user = userMapper.toEntity(event.userDTO()); mailService.sendToUserAsync("email-confirmation.html", user, Map.of("confirmationUrl", confirmationUrl)); } diff --git a/src/main/java/com/javarush/jira/profile/ContactTo.java b/src/main/java/com/javarush/jira/profile/ContactDTO.java similarity index 88% rename from src/main/java/com/javarush/jira/profile/ContactTo.java rename to src/main/java/com/javarush/jira/profile/ContactDTO.java index b44952689..aa31f2639 100644 --- a/src/main/java/com/javarush/jira/profile/ContactTo.java +++ b/src/main/java/com/javarush/jira/profile/ContactDTO.java @@ -1,7 +1,7 @@ package com.javarush.jira.profile; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.javarush.jira.common.to.BaseTo; +import com.javarush.jira.common.to.BaseDTO; import com.javarush.jira.common.util.validation.Code; import com.javarush.jira.common.util.validation.NoHtml; import jakarta.validation.constraints.NotBlank; @@ -16,7 +16,7 @@ @AllArgsConstructor @NoArgsConstructor @JsonIgnoreProperties(value = "id", allowSetters = true) -public class ContactTo extends BaseTo { +public class ContactDTO extends BaseDTO { @Code private String code; @NotBlank diff --git a/src/main/java/com/javarush/jira/profile/ProfileTo.java b/src/main/java/com/javarush/jira/profile/ProfileDTO.java similarity index 77% rename from src/main/java/com/javarush/jira/profile/ProfileTo.java rename to src/main/java/com/javarush/jira/profile/ProfileDTO.java index bc3cb3849..812c4faee 100644 --- a/src/main/java/com/javarush/jira/profile/ProfileTo.java +++ b/src/main/java/com/javarush/jira/profile/ProfileDTO.java @@ -1,7 +1,7 @@ package com.javarush.jira.profile; import com.fasterxml.jackson.annotation.JsonProperty; -import com.javarush.jira.common.to.BaseTo; +import com.javarush.jira.common.to.BaseDTO; import jakarta.annotation.Nullable; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; @@ -15,7 +15,7 @@ @Data @EqualsAndHashCode(callSuper = false) -public class ProfileTo extends BaseTo { +public class ProfileDTO extends BaseDTO { @JsonProperty(access = JsonProperty.Access.READ_ONLY) private LocalDateTime lastLogin; @@ -23,9 +23,9 @@ public class ProfileTo extends BaseTo { private Set<@NotBlank String> mailNotifications; @NotNull - private Set<@Valid ContactTo> contacts; + private Set<@Valid ContactDTO> contacts; - public ProfileTo(Long id, @Nullable Set mailNotifications, @Nullable Set<@Valid ContactTo> contacts) { + public ProfileDTO(Long id, @Nullable Set mailNotifications, @Nullable Set<@Valid ContactDTO> contacts) { super(id); this.mailNotifications = mailNotifications == null ? Collections.emptySet() : Set.copyOf(mailNotifications); this.contacts = contacts == null ? Collections.emptySet() : Set.copyOf(contacts); @@ -34,7 +34,7 @@ public ProfileTo(Long id, @Nullable Set mailNotifications, @Nullable Set public boolean isContactTypePresent(String type) { return contacts.stream() - .map(ContactTo::getCode) + .map(ContactDTO::getCode) .anyMatch(s -> s.equals(type)); } } diff --git a/src/main/java/com/javarush/jira/profile/internal/ProfileMapper.java b/src/main/java/com/javarush/jira/profile/internal/ProfileMapper.java index 8faf0a787..4fe4b61ab 100644 --- a/src/main/java/com/javarush/jira/profile/internal/ProfileMapper.java +++ b/src/main/java/com/javarush/jira/profile/internal/ProfileMapper.java @@ -1,7 +1,7 @@ package com.javarush.jira.profile.internal; -import com.javarush.jira.profile.ContactTo; -import com.javarush.jira.profile.ProfileTo; +import com.javarush.jira.profile.ContactDTO; +import com.javarush.jira.profile.ProfileDTO; import com.javarush.jira.profile.internal.model.Contact; import com.javarush.jira.profile.internal.model.Profile; import com.javarush.jira.profile.internal.web.ProfilePostRequest; @@ -14,14 +14,14 @@ public interface ProfileMapper { @Mapping(target = "mailNotifications", expression = "java(ProfileUtil.maskToNotifications(entity.getMailNotifications()))") - ProfileTo toTo(Profile entity); + ProfileDTO toDTO(Profile entity); @Mapping(target = "lastLogin", ignore = true) - @Mapping(target = "mailNotifications", expression = "java(ProfileUtil.notificationsToMask(to.getMailNotifications()))") - Profile updateFromTo(@MappingTarget Profile entity, ProfileTo to); + @Mapping(target = "mailNotifications", expression = "java(ProfileUtil.notificationsToMask(dto.getMailNotifications()))") + Profile updateFromDTO(@MappingTarget Profile entity, ProfileDTO dto); - Contact toContact(ContactTo contact); + Contact toContact(ContactDTO contact); @Mapping(target = "contacts", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT) - ProfileTo fromPostToTo(ProfilePostRequest profilePostRequest); + ProfileDTO fromPostToDTO(ProfilePostRequest profilePostRequest); } diff --git a/src/main/java/com/javarush/jira/profile/internal/ProfileUtil.java b/src/main/java/com/javarush/jira/profile/internal/ProfileUtil.java index 0bbf4b3e4..952f8c1b3 100644 --- a/src/main/java/com/javarush/jira/profile/internal/ProfileUtil.java +++ b/src/main/java/com/javarush/jira/profile/internal/ProfileUtil.java @@ -1,7 +1,7 @@ package com.javarush.jira.profile.internal; -import com.javarush.jira.profile.ContactTo; -import com.javarush.jira.ref.RefTo; +import com.javarush.jira.profile.ContactDTO; +import com.javarush.jira.ref.RefDTO; import com.javarush.jira.ref.RefType; import com.javarush.jira.ref.ReferenceService; import lombok.experimental.UtilityClass; @@ -15,19 +15,19 @@ public class ProfileUtil { public static Set maskToNotifications(long notifications) { Set notificationsCodes = ReferenceService.getRefs(RefType.MAIL_NOTIFICATION).values().stream() .filter(ref -> (notifications & ref.getLongFromAux()) != 0) - .map(RefTo::getCode) + .map(RefDTO::getCode) .collect(Collectors.toSet()); return notificationsCodes.isEmpty() ? Set.of() : notificationsCodes; } public static long notificationsToMask(Set notifications) { return notifications.stream() - .map(code -> ReferenceService.getRefTo(RefType.MAIL_NOTIFICATION, code)) - .map(RefTo::getLongFromAux) + .map(code -> ReferenceService.getRefDTO(RefType.MAIL_NOTIFICATION, code)) + .map(RefDTO::getLongFromAux) .reduce(0L, (mask1, mask2) -> mask1 | mask2); } - public static void checkContactsExist(Collection contacts) { - contacts.forEach(c -> ReferenceService.getRefTo(RefType.CONTACT, c.getCode())); + public static void checkContactsExist(Collection contacts) { + contacts.forEach(c -> ReferenceService.getRefDTO(RefType.CONTACT, c.getCode())); } } diff --git a/src/main/java/com/javarush/jira/profile/internal/web/AbstractProfileController.java b/src/main/java/com/javarush/jira/profile/internal/web/AbstractProfileController.java index ece739811..5444bf6ef 100644 --- a/src/main/java/com/javarush/jira/profile/internal/web/AbstractProfileController.java +++ b/src/main/java/com/javarush/jira/profile/internal/web/AbstractProfileController.java @@ -1,7 +1,7 @@ package com.javarush.jira.profile.internal.web; import com.javarush.jira.common.util.validation.ValidationUtil; -import com.javarush.jira.profile.ProfileTo; +import com.javarush.jira.profile.ProfileDTO; import com.javarush.jira.profile.internal.ProfileMapper; import com.javarush.jira.profile.internal.ProfileRepository; import com.javarush.jira.profile.internal.ProfileUtil; @@ -16,17 +16,17 @@ public abstract class AbstractProfileController { @Autowired private ProfileRepository profileRepository; - public ProfileTo get(long id) { + public ProfileDTO get(long id) { log.info("get {}", id); - return profileMapper.toTo(profileRepository.getOrCreate(id)); + return profileMapper.toDTO(profileRepository.getOrCreate(id)); } - public void update(ProfileTo profileTo, long id) { - log.info("update {}, user {}", profileTo, id); - ValidationUtil.assureIdConsistent(profileTo, id); - ValidationUtil.assureIdConsistent(profileTo.getContacts(), id); - ProfileUtil.checkContactsExist(profileTo.getContacts()); - Profile profile = profileMapper.updateFromTo(profileRepository.getOrCreate(profileTo.id()), profileTo); + public void update(ProfileDTO profileDTO, long id) { + log.info("update {}, user {}", profileDTO, id); + ValidationUtil.assureIdConsistent(profileDTO, id); + ValidationUtil.assureIdConsistent(profileDTO.getContacts(), id); + ProfileUtil.checkContactsExist(profileDTO.getContacts()); + Profile profile = profileMapper.updateFromDTO(profileRepository.getOrCreate(profileDTO.id()), profileDTO); profileRepository.save(profile); } } diff --git a/src/main/java/com/javarush/jira/profile/internal/web/ProfilePostRequest.java b/src/main/java/com/javarush/jira/profile/internal/web/ProfilePostRequest.java index f75363a2d..1be707ee8 100644 --- a/src/main/java/com/javarush/jira/profile/internal/web/ProfilePostRequest.java +++ b/src/main/java/com/javarush/jira/profile/internal/web/ProfilePostRequest.java @@ -1,6 +1,6 @@ package com.javarush.jira.profile.internal.web; -import com.javarush.jira.profile.ContactTo; +import com.javarush.jira.profile.ContactDTO; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import lombok.Data; @@ -11,5 +11,5 @@ public class ProfilePostRequest { private Set<@NotBlank String> mailNotifications; - private @Valid ContactTo[] contacts; + private @Valid ContactDTO[] contacts; } diff --git a/src/main/java/com/javarush/jira/profile/internal/web/ProfileRestController.java b/src/main/java/com/javarush/jira/profile/internal/web/ProfileRestController.java index ba0fcfcb5..d8bc940a8 100644 --- a/src/main/java/com/javarush/jira/profile/internal/web/ProfileRestController.java +++ b/src/main/java/com/javarush/jira/profile/internal/web/ProfileRestController.java @@ -1,7 +1,7 @@ package com.javarush.jira.profile.internal.web; import com.javarush.jira.login.AuthUser; -import com.javarush.jira.profile.ProfileTo; +import com.javarush.jira.profile.ProfileDTO; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -14,14 +14,14 @@ public class ProfileRestController extends AbstractProfileController { public static final String REST_URL = "/api/profile"; @GetMapping - public ProfileTo get(@AuthenticationPrincipal AuthUser authUser) { + public ProfileDTO get(@AuthenticationPrincipal AuthUser authUser) { return super.get(authUser.id()); } @PutMapping(consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.NO_CONTENT) - public void update(@Valid @RequestBody ProfileTo profileTo, @AuthenticationPrincipal AuthUser authUser) { - super.update(profileTo, authUser.id()); + public void update(@Valid @RequestBody ProfileDTO profileDTO, @AuthenticationPrincipal AuthUser authUser) { + super.update(profileDTO, authUser.id()); } } diff --git a/src/main/java/com/javarush/jira/profile/internal/web/ProfileUIController.java b/src/main/java/com/javarush/jira/profile/internal/web/ProfileUIController.java index 92cfe2c5c..9855780dc 100644 --- a/src/main/java/com/javarush/jira/profile/internal/web/ProfileUIController.java +++ b/src/main/java/com/javarush/jira/profile/internal/web/ProfileUIController.java @@ -41,7 +41,7 @@ public String update(@Valid ProfilePostRequest profile, BindingResult result, return "redirect:" + PROFILE_URL; } redirectAttrs.addFlashAttribute("profileSuccess", "Saved successfully"); - super.update(profileMapper.fromPostToTo(profile), authUser.id()); + super.update(profileMapper.fromPostToDTO(profile), authUser.id()); return "redirect:" + PROFILE_URL; } } diff --git a/src/main/java/com/javarush/jira/ref/RefTo.java b/src/main/java/com/javarush/jira/ref/RefDTO.java similarity index 83% rename from src/main/java/com/javarush/jira/ref/RefTo.java rename to src/main/java/com/javarush/jira/ref/RefDTO.java index 56a3b4803..891f6c695 100644 --- a/src/main/java/com/javarush/jira/ref/RefTo.java +++ b/src/main/java/com/javarush/jira/ref/RefDTO.java @@ -1,7 +1,7 @@ package com.javarush.jira.ref; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.javarush.jira.common.to.TitleTo; +import com.javarush.jira.common.to.TitleDTO; import com.javarush.jira.common.util.Util; import jakarta.validation.constraints.NotNull; import lombok.EqualsAndHashCode; @@ -10,7 +10,7 @@ @Value @EqualsAndHashCode(of = {"refType", "code"}) -public class RefTo extends TitleTo { +public class RefDTO extends TitleDTO { @NotNull RefType refType; @Nullable @@ -19,7 +19,7 @@ public class RefTo extends TitleTo { @JsonIgnore String[] splittedAux; - public RefTo(Long id, RefType refType, String code, String title, @Nullable String aux) { + public RefDTO(Long id, RefType refType, String code, String title, @Nullable String aux) { super(id, code, title); this.refType = refType; this.aux = aux; diff --git a/src/main/java/com/javarush/jira/ref/ReferenceService.java b/src/main/java/com/javarush/jira/ref/ReferenceService.java index 257ab24e9..14601a1f2 100644 --- a/src/main/java/com/javarush/jira/ref/ReferenceService.java +++ b/src/main/java/com/javarush/jira/ref/ReferenceService.java @@ -22,16 +22,16 @@ @RequiredArgsConstructor @Slf4j public class ReferenceService { - static Map> refSelect; + static Map> refSelect; private final ReferenceRepository repository; private final ReferenceMapper mapper; - public static Map getRefs(RefType refType) { + public static Map getRefs(RefType refType) { log.debug("get by type {}", refType); return getExisted(refSelect, refType); } - public static Map getRefsByTypeStartWithObjectType(RefType refType, @NonNull ObjectType objectType) { + public static Map getRefsByTypeStartWithObjectType(RefType refType, @NonNull ObjectType objectType) { log.debug("get by type {} start with objectType {}", refType, objectType); String type = objectType.name().toLowerCase(); return getRefs(refType).entrySet().stream() @@ -39,12 +39,12 @@ public static Map getRefsByTypeStartWithObjectType(RefType refTyp .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } - public static RefTo getRefTo(RefType refType, String code) { + public static RefDTO getRefDTO(RefType refType, String code) { log.debug("get by type {} and code {}", refType, code); return getExisted(getRefs(refType), code); } - public static Map filterEnabled(Map unfilteredRefs) { + public static Map filterEnabled(Map unfilteredRefs) { log.debug("filterEnabled"); return unfilteredRefs.entrySet().stream() .filter(ref -> ref.getValue().isEnabled()) @@ -54,18 +54,18 @@ public static Map filterEnabled(Map unfilteredRefs @PostConstruct void initialize() { log.info("init loading"); - List references = mapper.toToList(repository.findAllByOrderByIdAsc()); + List references = mapper.toDTOList(repository.findAllByOrderByIdAsc()); refSelect = references.stream() - .collect(Collectors.groupingBy(RefTo::getRefType, - Collectors.collectingAndThen(Collectors.toMap(RefTo::getCode, Function.identity(), (ref1, ref2) -> ref1, LinkedHashMap::new), Collections::unmodifiableMap))); + .collect(Collectors.groupingBy(RefDTO::getRefType, + Collectors.collectingAndThen(Collectors.toMap(RefDTO::getCode, Function.identity(), (ref1, ref2) -> ref1, LinkedHashMap::new), Collections::unmodifiableMap))); } public void updateRefs(RefType type) { log.debug("update by type {}", type); - List refTos = mapper.toToList(repository.getByType(type)); - Map refToMap = refTos.stream() - .collect(Collectors.toMap(RefTo::getCode, Function.identity())); - refSelect.put(type, refToMap); + List refDTOs = mapper.toDTOList(repository.getByType(type)); + Map refDTOMap = refDTOs.stream() + .collect(Collectors.toMap(RefDTO::getCode, Function.identity())); + refSelect.put(type, refDTOMap); } } diff --git a/src/main/java/com/javarush/jira/ref/internal/ReferenceMapper.java b/src/main/java/com/javarush/jira/ref/internal/ReferenceMapper.java index be215add4..3b625a9c1 100644 --- a/src/main/java/com/javarush/jira/ref/internal/ReferenceMapper.java +++ b/src/main/java/com/javarush/jira/ref/internal/ReferenceMapper.java @@ -2,9 +2,9 @@ import com.javarush.jira.common.BaseMapper; import com.javarush.jira.common.TimestampMapper; -import com.javarush.jira.ref.RefTo; +import com.javarush.jira.ref.RefDTO; import org.mapstruct.Mapper; @Mapper(config = TimestampMapper.class) -public interface ReferenceMapper extends BaseMapper { +public interface ReferenceMapper extends BaseMapper { } diff --git a/src/main/java/com/javarush/jira/ref/internal/web/ReferenceController.java b/src/main/java/com/javarush/jira/ref/internal/web/ReferenceController.java index 487f8a24b..2515d9f82 100644 --- a/src/main/java/com/javarush/jira/ref/internal/web/ReferenceController.java +++ b/src/main/java/com/javarush/jira/ref/internal/web/ReferenceController.java @@ -1,6 +1,6 @@ package com.javarush.jira.ref.internal.web; -import com.javarush.jira.ref.RefTo; +import com.javarush.jira.ref.RefDTO; import com.javarush.jira.ref.RefType; import com.javarush.jira.ref.ReferenceService; import com.javarush.jira.ref.internal.Reference; @@ -32,33 +32,33 @@ public class ReferenceController { private ReferenceRepository repository; @GetMapping("/{type}") - public Map getRefsByType(@PathVariable RefType type) { + public Map getRefsByType(@PathVariable RefType type) { return ReferenceService.getRefs(type); } @GetMapping("/{type}/{code}") - public RefTo getRefByTypeByCode(@PathVariable RefType type, @PathVariable String code) { - return ReferenceService.getRefTo(type, code); + public RefDTO getRefByTypeByCode(@PathVariable RefType type, @PathVariable String code) { + return ReferenceService.getRefDTO(type, code); } @DeleteMapping("/{type}/{code}") @ResponseStatus(HttpStatus.NO_CONTENT) public void delete(@PathVariable RefType type, @PathVariable String code) { log.debug("delete with type {}, code {}", type, code); - RefTo ref = ReferenceService.getRefTo(type, code); + RefDTO ref = ReferenceService.getRefDTO(type, code); repository.deleteExisted(ref.id()); service.updateRefs(type); } @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity create(@Valid @RequestBody RefTo refTo) { - log.debug("create {}", refTo); - checkNew(refTo); - Reference ref = repository.save(mapper.toEntity(refTo)); - refTo.setId(ref.id()); - RefType refType = refTo.getRefType(); + public ResponseEntity create(@Valid @RequestBody RefDTO refDTO) { + log.debug("create {}", refDTO); + checkNew(refDTO); + Reference ref = repository.save(mapper.toEntity(refDTO)); + refDTO.setId(ref.id()); + RefType refType = refDTO.getRefType(); service.updateRefs(refType); - return createdResponse(REST_URL + "/{type}/{code}", refTo, refType, refTo.getCode()); + return createdResponse(REST_URL + "/{type}/{code}", refDTO, refType, refDTO.getCode()); } @PutMapping("/{type}/{code}") @@ -69,7 +69,7 @@ public void updateTitle(@PathVariable RefType type, @PathVariable String code, @ Reference ref = getExisted(type, code); ref.setTitle(title); repository.save(ref); - ReferenceService.getRefTo(type, code).setTitle(title); + ReferenceService.getRefDTO(type, code).setTitle(title); } @PatchMapping("/{type}/{code}") @@ -80,7 +80,7 @@ public void enable(@PathVariable RefType type, @PathVariable String code, @Reque Reference ref = getExisted(type, code); ref.setEnabled(enabled); repository.save(ref); - ReferenceService.getRefTo(type, code).setEnabled(enabled); + ReferenceService.getRefDTO(type, code).setEnabled(enabled); } private Reference getExisted(RefType type, String code) { diff --git a/src/main/resources/data4dev/data.sql b/src/main/resources/data4dev/data.sql index a7d43cbad..341f502d3 100644 --- a/src/main/resources/data4dev/data.sql +++ b/src/main/resources/data4dev/data.sql @@ -256,9 +256,9 @@ values ('Add role manager and filters in security', 'task', 'done', 1, 1, 1, now() + random() * interval '5 minutes' + random() * interval '20 seconds'), ('Add task, subtask, sprint, subsprint', 'task', 'in_progress', 1, 1, 2, now() + random() * interval '5 minutes' + random() * interval '20 seconds'), - ('Make layout for view TitleTo', 'task', 'in_progress', 1, 1, 3, + ('Make layout for view TitleDTO', 'task', 'in_progress', 1, 1, 3, now() + random() * interval '5 minutes' + random() * interval '20 seconds'), - ('Make layout for edit TitleTo', 'task', 'in_progress', 1, 1, 3, + ('Make layout for edit TitleDTO', 'task', 'in_progress', 1, 1, 3, now() + random() * interval '5 minutes' + random() * interval '20 seconds'), ('Fix header-fragment', 'task', 'ready_for_review', 1, 1, 3, now() + random() * interval '5 minutes' + random() * interval '20 seconds'), diff --git a/src/test/java/com/javarush/jira/bugtracking/sprint/SprintControllerTest.java b/src/test/java/com/javarush/jira/bugtracking/sprint/SprintControllerTest.java index 503e58781..45b314b2e 100644 --- a/src/test/java/com/javarush/jira/bugtracking/sprint/SprintControllerTest.java +++ b/src/test/java/com/javarush/jira/bugtracking/sprint/SprintControllerTest.java @@ -1,7 +1,7 @@ package com.javarush.jira.bugtracking.sprint; import com.javarush.jira.AbstractControllerTest; -import com.javarush.jira.bugtracking.sprint.to.SprintTo; +import com.javarush.jira.bugtracking.sprint.to.SprintDTO; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; @@ -40,7 +40,7 @@ void get() throws Exception { .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(SPRINT_TO_MATCHER.contentJson(sprintTo1)) + .andExpect(SPRINT_TO_MATCHER.contentJson(SPRINT_DTO_1)) .andExpect(jsonPath("$.enabled", is(false))); } @@ -65,7 +65,7 @@ void getAllByProject() throws Exception { .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(SPRINT_TO_MATCHER.contentJson(sprintTo4, sprintTo3, sprintTo2, sprintTo1)); + .andExpect(SPRINT_TO_MATCHER.contentJson(SPRINT_DTO_4, SPRINT_DTO_3, SPRINT_DTO_2, SPRINT_DTO_1)); } @Test @@ -77,7 +77,7 @@ void getAllByProjectEnabled() throws Exception { .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(SPRINT_TO_MATCHER.contentJson(sprintTo4, sprintTo3, sprintTo2)); + .andExpect(SPRINT_TO_MATCHER.contentJson(SPRINT_DTO_4, SPRINT_DTO_3, SPRINT_DTO_2)); } @Test @@ -104,7 +104,7 @@ void getAllByProjectAndStatus() throws Exception { .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(SPRINT_TO_MATCHER.contentJson(sprintTo3, sprintTo2)); + .andExpect(SPRINT_TO_MATCHER.contentJson(SPRINT_DTO_3, SPRINT_DTO_2)); } @Test @@ -137,7 +137,7 @@ void createWithLocationWhenManager() throws Exception { } private void createWithLocation() throws Exception { - SprintTo newTo = getNewTo(); + SprintDTO newTo = getNewTo(); ResultActions action = perform(MockMvcRequestBuilders.post(MNGR_SPRINTS_REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(newTo))) @@ -171,7 +171,7 @@ void createUnauthorized() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void createInvalid() throws Exception { - SprintTo invalidTo = new SprintTo(null, "", null, PROJECT1_ID); + SprintDTO invalidTo = new SprintDTO(null, "", null, PROJECT1_ID); perform(MockMvcRequestBuilders.post(MNGR_SPRINTS_REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(invalidTo))) @@ -182,7 +182,7 @@ void createInvalid() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void createDuplicateCode() throws Exception { - SprintTo duplicateCodeTo = new SprintTo(null, sprintTo1.getCode(), ACTIVE, PROJECT1_ID); + SprintDTO duplicateCodeTo = new SprintDTO(null, SPRINT_DTO_1.getCode(), ACTIVE, PROJECT1_ID); perform(MockMvcRequestBuilders.post(MNGR_SPRINTS_REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(duplicateCodeTo))) @@ -193,7 +193,7 @@ void createDuplicateCode() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void createWhenProjectNotExists() throws Exception { - SprintTo notExistsProjectTo = new SprintTo(null, "new code", ACTIVE, NOT_FOUND); + SprintDTO notExistsProjectTo = new SprintDTO(null, "new code", ACTIVE, NOT_FOUND); perform(MockMvcRequestBuilders.post(MNGR_SPRINTS_REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(notExistsProjectTo))) @@ -214,7 +214,7 @@ void updateWhenManager() throws Exception { } private void update() throws Exception { - SprintTo updatedTo = getUpdatedTo(); + SprintDTO updatedTo = getUpdatedTo(); perform(MockMvcRequestBuilders.put(MNGR_SPRINTS_REST_URL_SLASH + SPRINT1_ID) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(updatedTo))) @@ -245,7 +245,7 @@ void updateUnauthorized() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void updateWhenProjectNotExists() throws Exception { - SprintTo notExistsProjectTo = new SprintTo(SPRINT1_ID, "updated code", ACTIVE, NOT_FOUND); + SprintDTO notExistsProjectTo = new SprintDTO(SPRINT1_ID, "updated code", ACTIVE, NOT_FOUND); perform(MockMvcRequestBuilders.put(MNGR_SPRINTS_REST_URL_SLASH + SPRINT1_ID) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(notExistsProjectTo))) @@ -256,7 +256,7 @@ void updateWhenProjectNotExists() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void updateInvalid() throws Exception { - SprintTo invalidTo = new SprintTo(SPRINT1_ID, "", null, PROJECT1_ID); + SprintDTO invalidTo = new SprintDTO(SPRINT1_ID, "", null, PROJECT1_ID); perform(MockMvcRequestBuilders.put(MNGR_SPRINTS_REST_URL_SLASH + SPRINT1_ID) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(invalidTo))) @@ -277,7 +277,7 @@ void updateIdNotConsistent() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void updateDuplicateCode() throws Exception { - SprintTo duplicateCodeTo = new SprintTo(SPRINT1_ID, sprintTo2.getCode(), ACTIVE, PROJECT1_ID); + SprintDTO duplicateCodeTo = new SprintDTO(SPRINT1_ID, SPRINT_DTO_2.getCode(), ACTIVE, PROJECT1_ID); perform(MockMvcRequestBuilders.put(MNGR_SPRINTS_REST_URL_SLASH + SPRINT1_ID) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(duplicateCodeTo))) @@ -288,7 +288,7 @@ void updateDuplicateCode() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void updateWhenChangeProject() throws Exception { - SprintTo changedProjectTo = new SprintTo(SPRINT1_ID, "updated code", ACTIVE, PROJECT1_ID + 1); + SprintDTO changedProjectTo = new SprintDTO(SPRINT1_ID, "updated code", ACTIVE, PROJECT1_ID + 1); perform(MockMvcRequestBuilders.put(MNGR_SPRINTS_REST_URL_SLASH + SPRINT1_ID) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(changedProjectTo))) @@ -391,6 +391,6 @@ void enableNotFound() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void disable() throws Exception { - assertFalse(enable(sprintTo2.getId(), false)); + assertFalse(enable(SPRINT_DTO_2.getId(), false)); } } diff --git a/src/test/java/com/javarush/jira/bugtracking/sprint/SprintTestData.java b/src/test/java/com/javarush/jira/bugtracking/sprint/SprintTestData.java index e11c796a2..5127b3a7a 100644 --- a/src/test/java/com/javarush/jira/bugtracking/sprint/SprintTestData.java +++ b/src/test/java/com/javarush/jira/bugtracking/sprint/SprintTestData.java @@ -1,11 +1,11 @@ package com.javarush.jira.bugtracking.sprint; import com.javarush.jira.MatcherFactory; -import com.javarush.jira.bugtracking.sprint.to.SprintTo; +import com.javarush.jira.bugtracking.sprint.to.SprintDTO; public class SprintTestData { - public static final MatcherFactory.Matcher SPRINT_TO_MATCHER = MatcherFactory.usingIgnoringFieldsComparator( - SprintTo.class, "enabled"); + public static final MatcherFactory.Matcher SPRINT_TO_MATCHER = MatcherFactory.usingIgnoringFieldsComparator( + SprintDTO.class, "enabled"); public static final MatcherFactory.Matcher SPRINT_MATCHER = MatcherFactory.usingIgnoringFieldsComparator( Sprint.class, "startpoint", "endpoint", "project"); @@ -14,20 +14,20 @@ public class SprintTestData { public static final long NOT_FOUND = 100; public static final String ACTIVE = "active"; - public static final SprintTo sprintTo1 = new SprintTo(SPRINT1_ID, "SP-1.001", "finished", PROJECT1_ID); - public static final SprintTo sprintTo2 = new SprintTo(SPRINT1_ID + 1, "SP-1.002", "active", PROJECT1_ID); - public static final SprintTo sprintTo3 = new SprintTo(SPRINT1_ID + 2, "SP-1.003", "active", PROJECT1_ID); - public static final SprintTo sprintTo4 = new SprintTo(SPRINT1_ID + 3, "SP-1.004", "planning", PROJECT1_ID); + public static final SprintDTO SPRINT_DTO_1 = new SprintDTO(SPRINT1_ID, "SP-1.001", "finished", PROJECT1_ID); + public static final SprintDTO SPRINT_DTO_2 = new SprintDTO(SPRINT1_ID + 1, "SP-1.002", "active", PROJECT1_ID); + public static final SprintDTO SPRINT_DTO_3 = new SprintDTO(SPRINT1_ID + 2, "SP-1.003", "active", PROJECT1_ID); + public static final SprintDTO SPRINT_DTO_4 = new SprintDTO(SPRINT1_ID + 3, "SP-1.004", "planning", PROJECT1_ID); static { - sprintTo1.setEnabled(false); + SPRINT_DTO_1.setEnabled(false); } - public static SprintTo getNewTo() { - return new SprintTo(null, "SP.1-005", "planning", PROJECT1_ID); + public static SprintDTO getNewTo() { + return new SprintDTO(null, "SP.1-005", "planning", PROJECT1_ID); } - public static SprintTo getUpdatedTo() { - return new SprintTo(SPRINT1_ID, "SP-1.001 updated", "active", PROJECT1_ID); + public static SprintDTO getUpdatedTo() { + return new SprintDTO(SPRINT1_ID, "SP-1.001 updated", "active", PROJECT1_ID); } } diff --git a/src/test/java/com/javarush/jira/bugtracking/task/TaskControllerTest.java b/src/test/java/com/javarush/jira/bugtracking/task/TaskControllerTest.java index b5c25e992..3e919a0f5 100644 --- a/src/test/java/com/javarush/jira/bugtracking/task/TaskControllerTest.java +++ b/src/test/java/com/javarush/jira/bugtracking/task/TaskControllerTest.java @@ -2,9 +2,9 @@ import com.javarush.jira.AbstractControllerTest; import com.javarush.jira.bugtracking.UserBelongRepository; -import com.javarush.jira.bugtracking.task.to.ActivityTo; -import com.javarush.jira.bugtracking.task.to.TaskToExt; -import com.javarush.jira.bugtracking.task.to.TaskToFull; +import com.javarush.jira.bugtracking.task.to.ActivityDTO; +import com.javarush.jira.bugtracking.task.to.TaskDTOExt; +import com.javarush.jira.bugtracking.task.to.TaskDTOFull; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; @@ -49,15 +49,15 @@ class TaskControllerTest extends AbstractControllerTest { @Test @WithUserDetails(value = USER_MAIL) void get() throws Exception { - get(TASK1_ID, taskToFull1); + get(TASK1_ID, taskDTOFull1); } - private void get(long taskId, TaskToFull taskToFull) throws Exception { + private void get(long taskId, TaskDTOFull taskDTOFull) throws Exception { perform(MockMvcRequestBuilders.get(TASKS_REST_URL_SLASH + taskId)) .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(TASK_TO_FULL_MATCHER.contentJson(taskToFull)); + .andExpect(TASK_TO_FULL_MATCHER.contentJson(taskDTOFull)); } @Test @@ -81,7 +81,7 @@ void getAllBySprint() throws Exception { .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(TASK_TO_MATCHER.contentJson(taskTo2, taskTo1)); + .andExpect(TASK_TO_MATCHER.contentJson(TASK_DTO_2, TASK_DTO_1)); } @Test @@ -92,7 +92,7 @@ void getAllByProject() throws Exception { .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(TASK_TO_MATCHER.contentJson(taskTo2, taskTo1)); + .andExpect(TASK_TO_MATCHER.contentJson(TASK_DTO_2, TASK_DTO_1)); } @Test @@ -105,7 +105,7 @@ void getAllByProjectUnauthorized() throws Exception { @Test @WithUserDetails(value = USER_MAIL) void updateTask() throws Exception { - TaskToExt updatedTo = TaskTestData.getUpdatedTaskTo(); + TaskDTOExt updatedTo = TaskTestData.getUpdatedTaskDTO(); perform(MockMvcRequestBuilders.put(TASKS_REST_URL_SLASH + TASK2_ID) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(updatedTo))) @@ -114,15 +114,15 @@ void updateTask() throws Exception { Task updated = new Task(updatedTo.getId(), updatedTo.getTitle(), updatedTo.getTypeCode(), updatedTo.getStatusCode(), updatedTo.getParentId(), updatedTo.getProjectId(), updatedTo.getSprintId()); TASK_MATCHER.assertMatch(taskRepository.getExisted(TASK2_ID), updated); - get(TASK2_ID, taskToFull2); + get(TASK2_ID, taskDTOFull2); } @Test @WithUserDetails(value = USER_MAIL) void updateTaskWhenStateNotChanged() throws Exception { int activitiesCount = activityRepository.findAllByTaskIdOrderByUpdatedDesc(TASK2_ID).size(); - TaskToExt sameStateTo = new TaskToExt(TASK2_ID, taskTo2.getCode(), taskTo2.getTitle(), "Trees desc", taskTo2.getTypeCode(), - taskTo2.getStatusCode(), "normal", null, 4, taskTo2.getParentId(), taskTo2.getProjectId(), taskTo2.getSprintId()); + TaskDTOExt sameStateTo = new TaskDTOExt(TASK2_ID, TASK_DTO_2.getCode(), TASK_DTO_2.getTitle(), "Trees desc", TASK_DTO_2.getTypeCode(), + TASK_DTO_2.getStatusCode(), "normal", null, 4, TASK_DTO_2.getParentId(), TASK_DTO_2.getProjectId(), TASK_DTO_2.getSprintId()); perform(MockMvcRequestBuilders.put(TASKS_REST_URL_SLASH + TASK2_ID) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(sameStateTo))) @@ -135,14 +135,14 @@ void updateTaskWhenStateNotChanged() throws Exception { void updateTaskUnauthorized() throws Exception { perform(MockMvcRequestBuilders.put(TASKS_REST_URL_SLASH + TASK2_ID) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(getUpdatedTaskTo()))) + .content(writeValue(getUpdatedTaskDTO()))) .andExpect(status().isUnauthorized()); } @Test @WithUserDetails(value = ADMIN_MAIL) void updateTaskWhenProjectNotExists() throws Exception { - TaskToExt notExistsProjectTo = new TaskToExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "in_progress", "high", null, 4, null, NOT_FOUND, SPRINT1_ID); + TaskDTOExt notExistsProjectTo = new TaskDTOExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "in_progress", "high", null, 4, null, NOT_FOUND, SPRINT1_ID); perform(MockMvcRequestBuilders.put(TASKS_REST_URL_SLASH + TASK2_ID) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(notExistsProjectTo))) @@ -155,7 +155,7 @@ void updateTaskWhenProjectNotExists() throws Exception { void updateTaskIdNotConsistent() throws Exception { perform(MockMvcRequestBuilders.put(TASKS_REST_URL_SLASH + (TASK2_ID + 1)) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(getUpdatedTaskTo()))) + .content(writeValue(getUpdatedTaskDTO()))) .andDo(print()) .andExpect(status().isUnprocessableEntity()); } @@ -163,7 +163,7 @@ void updateTaskIdNotConsistent() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void updateTaskWhenChangeProject() throws Exception { - TaskToExt changedProjectTo = new TaskToExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "in_progress", "high", null, 4, null, PROJECT1_ID + 1, SPRINT1_ID); + TaskDTOExt changedProjectTo = new TaskDTOExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "in_progress", "high", null, 4, null, PROJECT1_ID + 1, SPRINT1_ID); perform(MockMvcRequestBuilders.put(TASKS_REST_URL_SLASH + TASK2_ID) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(changedProjectTo))) @@ -174,10 +174,10 @@ void updateTaskWhenChangeProject() throws Exception { @Test @WithUserDetails(value = USER_MAIL) void updateSprintIdWhenDev() throws Exception { - TaskToExt changedSprintTo = new TaskToExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "in_progress", "high", null, 4, null, PROJECT1_ID, SPRINT1_ID + 1); + TaskDTOExt changedSprintDTO = new TaskDTOExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "in_progress", "high", null, 4, null, PROJECT1_ID, SPRINT1_ID + 1); perform(MockMvcRequestBuilders.put(TASKS_REST_URL_SLASH + TASK2_ID) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(changedSprintTo))) + .content(writeValue(changedSprintDTO))) .andDo(print()) .andExpect(status().isConflict()); } @@ -185,10 +185,10 @@ void updateSprintIdWhenDev() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void updateSprintIdWhenAdmin() throws Exception { - TaskToExt changedSprintTo = new TaskToExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "in_progress", "high", null, 4, null, PROJECT1_ID, SPRINT1_ID + 1); + TaskDTOExt changedSprintDTO = new TaskDTOExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "in_progress", "high", null, 4, null, PROJECT1_ID, SPRINT1_ID + 1); perform(MockMvcRequestBuilders.put(TASKS_REST_URL_SLASH + TASK2_ID) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(changedSprintTo))) + .content(writeValue(changedSprintDTO))) .andDo(print()) .andExpect(status().isNoContent()); assertEquals(SPRINT1_ID + 1, taskRepository.getExisted(TASK2_ID).getSprintId()); @@ -197,10 +197,10 @@ void updateSprintIdWhenAdmin() throws Exception { @Test @WithUserDetails(value = MANAGER_MAIL) void updateSprintIdWhenManager() throws Exception { - TaskToExt changedSprintTo = new TaskToExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "in_progress", "high", null, 4, null, PROJECT1_ID, SPRINT1_ID + 1); + TaskDTOExt changedSprintDTO = new TaskDTOExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "in_progress", "high", null, 4, null, PROJECT1_ID, SPRINT1_ID + 1); perform(MockMvcRequestBuilders.put(TASKS_REST_URL_SLASH + TASK2_ID) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(changedSprintTo))) + .content(writeValue(changedSprintDTO))) .andDo(print()) .andExpect(status().isNoContent()); assertEquals(SPRINT1_ID + 1, taskRepository.getExisted(TASK2_ID).getSprintId()); @@ -209,7 +209,7 @@ void updateSprintIdWhenManager() throws Exception { @Test @WithUserDetails(value = USER_MAIL) void updateActivity() throws Exception { - ActivityTo updatedTo = getUpdatedActivityTo(); + ActivityDTO updatedTo = getUpdatedActivityDTO(); perform(MockMvcRequestBuilders.put(ACTIVITIES_REST_URL_SLASH + ACTIVITY1_ID) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(updatedTo))) @@ -235,18 +235,18 @@ private void updateTaskIfRequired(long taskId, String activityStatus, String act void updateActivityUnauthorized() throws Exception { perform(MockMvcRequestBuilders.put(ACTIVITIES_REST_URL_SLASH + ACTIVITY1_ID) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(getUpdatedTaskTo()))) + .content(writeValue(getUpdatedTaskDTO()))) .andExpect(status().isUnauthorized()); } @Test @WithUserDetails(value = ADMIN_MAIL) void updateWhenTaskNotExists() throws Exception { - ActivityTo notExistsActivityTo = new ActivityTo(ACTIVITY1_ID, NOT_FOUND, USER_ID, null, null, + ActivityDTO notExistsActivityDTO = new ActivityDTO(ACTIVITY1_ID, NOT_FOUND, USER_ID, null, null, "in_progress", "low", "epic", null, null, 3, null); perform(MockMvcRequestBuilders.put(ACTIVITIES_REST_URL_SLASH + ACTIVITY1_ID) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(notExistsActivityTo))) + .content(writeValue(notExistsActivityDTO))) .andDo(print()) .andExpect(status().isConflict()); } @@ -256,7 +256,7 @@ void updateWhenTaskNotExists() throws Exception { void updateActivityIdNotConsistent() throws Exception { perform(MockMvcRequestBuilders.put(ACTIVITIES_REST_URL_SLASH + (ACTIVITY1_ID + 1)) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(getUpdatedActivityTo()))) + .content(writeValue(getUpdatedActivityDTO()))) .andDo(print()) .andExpect(status().isUnprocessableEntity()); } @@ -264,11 +264,11 @@ void updateActivityIdNotConsistent() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void updateActivityWhenChangeTask() throws Exception { - ActivityTo changedTaskTo = new ActivityTo(ACTIVITY1_ID, TASK1_ID + 1, USER_ID, null, null, + ActivityDTO changedTaskDTO = new ActivityDTO(ACTIVITY1_ID, TASK1_ID + 1, USER_ID, null, null, "in_progress", "low", "epic", null, null, 3, null); perform(MockMvcRequestBuilders.put(ACTIVITIES_REST_URL_SLASH + ACTIVITY1_ID) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(changedTaskTo))) + .content(writeValue(changedTaskDTO))) .andDo(print()) .andExpect(status().isConflict()); } @@ -297,7 +297,7 @@ private boolean enable(long id, boolean enabled) throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void disable() throws Exception { - assertFalse(enable(taskTo2.getId(), false)); + assertFalse(enable(TASK_DTO_2.getId(), false)); } @Test @@ -352,7 +352,7 @@ void changeTaskStatusUnauthorized() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void createTaskWithLocation() throws Exception { - TaskToExt newTo = getNewTaskTo(); + TaskDTOExt newTo = getNewTaskDTO(); ResultActions action = perform(MockMvcRequestBuilders.post(REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(newTo))) @@ -369,14 +369,14 @@ void createTaskWithLocation() throws Exception { void createTaskUnauthorized() throws Exception { perform(MockMvcRequestBuilders.post(REST_URL) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(getNewTaskTo()))) + .content(writeValue(getNewTaskDTO()))) .andExpect(status().isUnauthorized()); } @Test @WithUserDetails(value = ADMIN_MAIL) void createTaskInvalid() throws Exception { - TaskToExt invalidTo = new TaskToExt(null, "", null, null, "epic", null, null, null, 3, null, PROJECT1_ID, SPRINT1_ID); + TaskDTOExt invalidTo = new TaskDTOExt(null, "", null, null, "epic", null, null, null, 3, null, PROJECT1_ID, SPRINT1_ID); perform(MockMvcRequestBuilders.post(REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(invalidTo))) @@ -387,7 +387,7 @@ void createTaskInvalid() throws Exception { @Test @WithUserDetails(value = ADMIN_MAIL) void createTaskWhenProjectNotExists() throws Exception { - TaskToExt notExistsProjectTo = new TaskToExt(null, "epic-1", "Data New", "task NEW", "epic", "in_progress", "low", null, 3, null, NOT_FOUND, SPRINT1_ID); + TaskDTOExt notExistsProjectTo = new TaskDTOExt(null, "epic-1", "Data New", "task NEW", "epic", "in_progress", "low", null, 3, null, NOT_FOUND, SPRINT1_ID); perform(MockMvcRequestBuilders.post(REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(notExistsProjectTo))) @@ -398,7 +398,7 @@ void createTaskWhenProjectNotExists() throws Exception { @Test @WithUserDetails(value = USER_MAIL) void createActivityWithLocation() throws Exception { - ActivityTo newTo = getNewActivityTo(); + ActivityDTO newTo = getNewActivityDTO(); ResultActions action = perform(MockMvcRequestBuilders.post(ACTIVITIES_REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(writeValue(newTo))) @@ -417,18 +417,18 @@ void createActivityWithLocation() throws Exception { void createActivityUnauthorized() throws Exception { perform(MockMvcRequestBuilders.post(ACTIVITIES_REST_URL) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(getNewTaskTo()))) + .content(writeValue(getNewTaskDTO()))) .andExpect(status().isUnauthorized()); } @Test @WithUserDetails(value = ADMIN_MAIL) void createActivityWhenTaskNotExists() throws Exception { - ActivityTo notExistsTaskTo = new ActivityTo(null, NOT_FOUND, ADMIN_ID, null, null, null, + ActivityDTO notExistsTaskDTO = new ActivityDTO(null, NOT_FOUND, ADMIN_ID, null, null, null, null, "epic", null, null, 4, null); perform(MockMvcRequestBuilders.post(ACTIVITIES_REST_URL) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(notExistsTaskTo))) + .content(writeValue(notExistsTaskDTO))) .andDo(print()) .andExpect(status().isNotFound()); } diff --git a/src/test/java/com/javarush/jira/bugtracking/task/TaskTestData.java b/src/test/java/com/javarush/jira/bugtracking/task/TaskTestData.java index 060449017..a1584e98f 100644 --- a/src/test/java/com/javarush/jira/bugtracking/task/TaskTestData.java +++ b/src/test/java/com/javarush/jira/bugtracking/task/TaskTestData.java @@ -2,11 +2,11 @@ import com.javarush.jira.MatcherFactory; import com.javarush.jira.bugtracking.UserBelong; -import com.javarush.jira.bugtracking.task.to.ActivityTo; -import com.javarush.jira.bugtracking.task.to.TaskTo; -import com.javarush.jira.bugtracking.task.to.TaskToExt; -import com.javarush.jira.bugtracking.task.to.TaskToFull; -import com.javarush.jira.common.to.CodeTo; +import com.javarush.jira.bugtracking.task.to.ActivityDTO; +import com.javarush.jira.bugtracking.task.to.TaskDTO; +import com.javarush.jira.bugtracking.task.to.TaskDTOExt; +import com.javarush.jira.bugtracking.task.to.TaskDTOFull; +import com.javarush.jira.common.to.CodeDTO; import java.util.List; @@ -16,8 +16,8 @@ public class TaskTestData { public static final MatcherFactory.Matcher TASK_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(Task.class, "id", "startpoint", "endpoint", "activities", "project", "sprint", "parent", "tags"); - public static final MatcherFactory.Matcher TASK_TO_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(TaskTo.class, "id", "startpoint", "endpoint"); - public static final MatcherFactory.Matcher TASK_TO_FULL_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(TaskToFull.class, "id", "updated", "activityTos.id"); + public static final MatcherFactory.Matcher TASK_TO_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(TaskDTO.class, "id", "startpoint", "endpoint"); + public static final MatcherFactory.Matcher TASK_TO_FULL_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(TaskDTOFull.class, "id", "updated", "activityDTOs.id"); public static final MatcherFactory.Matcher ACTIVITY_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(Activity.class, "title", "updated", "author"); public static final MatcherFactory.Matcher USER_BELONG_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(UserBelong.class, "id", "startpoint", "endpoint"); @@ -42,17 +42,17 @@ public class TaskTestData { public static final String TASK_DEVELOPER = "task_developer"; public static final String TASK_REVIEWER = "task_reviewer"; - public static final TaskTo taskTo1 = new TaskTo(TASK1_ID, "epic-" + TASK1_ID, "Data", "epic", "in_progress", null, PROJECT1_ID, SPRINT1_ID); - public static final TaskTo taskTo2 = new TaskTo(TASK2_ID, "epic-" + TASK2_ID, "Trees", "epic", "in_progress", null, PROJECT1_ID, SPRINT1_ID); - public static final TaskToFull taskToFull1 = new TaskToFull(TASK1_ID, "epic-1", "Data", null, "epic", "in_progress", "normal", null, 4, null, new CodeTo(PROJECT1_ID, "PR1"), new CodeTo(SPRINT1_ID, "SP-1.001"), null); - public static final TaskToFull taskToFull2 = new TaskToFull(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "ready_for_review", "high", null, 4, null, new CodeTo(PROJECT1_ID, "PR1"), new CodeTo(SPRINT1_ID, "SP-1.001"), null); - public static final ActivityTo activityTo1ForTask1 = new ActivityTo(ACTIVITY1_ID, TASK1_ID, USER_ID, null, null, "in_progress", "low", "epic", "Data", null, 3, null); - public static final ActivityTo activityTo2ForTask1 = new ActivityTo(ACTIVITY1_ID + 1, TASK1_ID, ADMIN_ID, null, null, null, "normal", null, "Data", null, null, null); - public static final ActivityTo activityTo3ForTask1 = new ActivityTo(ACTIVITY1_ID + 2, TASK1_ID, USER_ID, null, null, null, null, null, "Data", null, 4, null); - public static final List activityTosForTask1 = List.of(activityTo3ForTask1, activityTo2ForTask1, activityTo1ForTask1); - public static final ActivityTo activityTo1ForTask2 = new ActivityTo(ACTIVITY1_ID + 3, TASK2_ID, USER_ID, null, null, "in_progress", "normal", "epic", "Trees", "Trees desc", 4, null); - public static final ActivityTo updatePriorityCode = new ActivityTo(ACTIVITY1_ID + 4, TASK2_ID, USER_ID, null, null, "ready_for_review", "high", "epic", "Trees UPD", "task UPD", 4, null); - public static final List activityTosForTask2 = List.of(updatePriorityCode, activityTo1ForTask2); + public static final TaskDTO TASK_DTO_1 = new TaskDTO(TASK1_ID, "epic-" + TASK1_ID, "Data", "epic", "in_progress", null, PROJECT1_ID, SPRINT1_ID); + public static final TaskDTO TASK_DTO_2 = new TaskDTO(TASK2_ID, "epic-" + TASK2_ID, "Trees", "epic", "in_progress", null, PROJECT1_ID, SPRINT1_ID); + public static final TaskDTOFull taskDTOFull1 = new TaskDTOFull(TASK1_ID, "epic-1", "Data", null, "epic", "in_progress", "normal", null, 4, null, new CodeDTO(PROJECT1_ID, "PR1"), new CodeDTO(SPRINT1_ID, "SP-1.001"), null); + public static final TaskDTOFull taskDTOFull2 = new TaskDTOFull(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "ready_for_review", "high", null, 4, null, new CodeDTO(PROJECT1_ID, "PR1"), new CodeDTO(SPRINT1_ID, "SP-1.001"), null); + public static final ActivityDTO ACTIVITY_DTO_1_FOR_TASK_1 = new ActivityDTO(ACTIVITY1_ID, TASK1_ID, USER_ID, null, null, "in_progress", "low", "epic", "Data", null, 3, null); + public static final ActivityDTO ACTIVITY_DTO_2_FOR_TASK_1 = new ActivityDTO(ACTIVITY1_ID + 1, TASK1_ID, ADMIN_ID, null, null, null, "normal", null, "Data", null, null, null); + public static final ActivityDTO ACTIVITY_DTO_3_FOR_TASK_1 = new ActivityDTO(ACTIVITY1_ID + 2, TASK1_ID, USER_ID, null, null, null, null, null, "Data", null, 4, null); + public static final List activityDTOsForTask1 = List.of(ACTIVITY_DTO_3_FOR_TASK_1, ACTIVITY_DTO_2_FOR_TASK_1, ACTIVITY_DTO_1_FOR_TASK_1); + public static final ActivityDTO ACTIVITY_DTO_1_FOR_TASK_2 = new ActivityDTO(ACTIVITY1_ID + 3, TASK2_ID, USER_ID, null, null, "in_progress", "normal", "epic", "Trees", "Trees desc", 4, null); + public static final ActivityDTO updatePriorityCode = new ActivityDTO(ACTIVITY1_ID + 4, TASK2_ID, USER_ID, null, null, "ready_for_review", "high", "epic", "Trees UPD", "task UPD", 4, null); + public static final List activityDTOsForTask2 = List.of(updatePriorityCode, ACTIVITY_DTO_1_FOR_TASK_2); public static final UserBelong userTask1Assignment1 = new UserBelong(1L, TASK, USER_ID, "task_developer"); public static final UserBelong userTask1Assignment2 = new UserBelong(1L, TASK, USER_ID, "task_tester"); @@ -60,23 +60,23 @@ public class TaskTestData { public static final UserBelong userTask2Assignment2 = new UserBelong(2L, TASK, USER_ID, "task_tester"); static { - taskToFull1.setActivityTos(activityTosForTask1); - taskToFull2.setActivityTos(activityTosForTask2); + taskDTOFull1.setActivityDTOs(activityDTOsForTask1); + taskDTOFull2.setActivityDTOs(activityDTOsForTask2); } - public static TaskToExt getNewTaskTo() { - return new TaskToExt(null, "epic-1", "Data New", "task NEW", "epic", "in_progress", "low", null, 3, null, PROJECT1_ID, SPRINT1_ID); + public static TaskDTOExt getNewTaskDTO() { + return new TaskDTOExt(null, "epic-1", "Data New", "task NEW", "epic", "in_progress", "low", null, 3, null, PROJECT1_ID, SPRINT1_ID); } - public static ActivityTo getNewActivityTo() { - return new ActivityTo(null, TASK1_ID, USER_ID, null, null, "ready_for_review", null, "epic", null, null, 4, null); + public static ActivityDTO getNewActivityDTO() { + return new ActivityDTO(null, TASK1_ID, USER_ID, null, null, "ready_for_review", null, "epic", null, null, 4, null); } - public static TaskToExt getUpdatedTaskTo() { - return new TaskToExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "ready_for_review", "high", null, 4, null, PROJECT1_ID, SPRINT1_ID); + public static TaskDTOExt getUpdatedTaskDTO() { + return new TaskDTOExt(TASK2_ID, "epic-2", "Trees UPD", "task UPD", "epic", "ready_for_review", "high", null, 4, null, PROJECT1_ID, SPRINT1_ID); } - public static ActivityTo getUpdatedActivityTo() { - return new ActivityTo(ACTIVITY1_ID, TASK1_ID, USER_ID, null, null, "in_progress", "low", "epic", null, null, 3, null); + public static ActivityDTO getUpdatedActivityDTO() { + return new ActivityDTO(ACTIVITY1_ID, TASK1_ID, USER_ID, null, null, "in_progress", "low", "epic", null, null, 3, null); } } diff --git a/src/test/java/com/javarush/jira/common/util/UtilTest.java b/src/test/java/com/javarush/jira/common/util/UtilTest.java index da398427a..0b50c3df1 100644 --- a/src/test/java/com/javarush/jira/common/util/UtilTest.java +++ b/src/test/java/com/javarush/jira/common/util/UtilTest.java @@ -8,12 +8,12 @@ class UtilTest { @Test void makeTree() { /* - NodeTo a = new NodeTo(1L, "A", true, "A", "A", "A", null); - NodeTo b = new NodeTo(1L, "B", true, "B", "B", "B", a); - NodeTo c = new NodeTo(1L, "C", true, "C", "C", "C", a); - NodeTo d = new NodeTo(1L, "D", true, "D", "D", "D", b); - NodeTo e = new NodeTo(1L, "E", true, "E", "E", "E", d); - List projects = List.of(e, b, c, d, a); + NodeDTO a = new NodeDTO(1L, "A", true, "A", "A", "A", null); + NodeDTO b = new NodeDTO(1L, "B", true, "B", "B", "B", a); + NodeDTO c = new NodeDTO(1L, "C", true, "C", "C", "C", a); + NodeDTO d = new NodeDTO(1L, "D", true, "D", "D", "D", b); + NodeDTO e = new NodeDTO(1L, "E", true, "E", "E", "E", d); + List projects = List.of(e, b, c, d, a); List nodes = Util.makeTree(projects); for (TreeNode treeNode : nodes) { diff --git a/src/test/java/com/javarush/jira/login/internal/web/RegisterControllerTest.java b/src/test/java/com/javarush/jira/login/internal/web/RegisterControllerTest.java index 6d1e1d55f..d93f8bded 100644 --- a/src/test/java/com/javarush/jira/login/internal/web/RegisterControllerTest.java +++ b/src/test/java/com/javarush/jira/login/internal/web/RegisterControllerTest.java @@ -1,7 +1,7 @@ package com.javarush.jira.login.internal.web; import com.javarush.jira.AbstractControllerTest; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; import com.javarush.jira.login.internal.verification.ConfirmData; import org.junit.jupiter.api.Test; import org.springframework.security.test.context.support.WithUserDetails; @@ -35,7 +35,7 @@ void showRegisterPageWhenAuthorized() throws Exception { @Test void register() throws Exception { - UserTo newTo = new UserTo(null, "newemail@gmail.com", "newPassword", "newName", "newLastName", "newDisplayName"); + UserDTO newTo = new UserDTO(null, "newemail@gmail.com", "newPassword", "newName", "newLastName", "newDisplayName"); Object sessionToken = Objects.requireNonNull(perform(MockMvcRequestBuilders.post(REGISTER_URL) .param("email", "newemail@gmail.com") @@ -53,7 +53,7 @@ void register() throws Exception { assertNotNull(sessionToken); assertInstanceOf(ConfirmData.class, sessionToken); - UserTo sessionTo = ((ConfirmData) sessionToken).getUserTo(); + UserDTO sessionTo = ((ConfirmData) sessionToken).getUserDTO(); TO_MATCHER.assertMatch(sessionTo, newTo); } @@ -77,7 +77,7 @@ void registerInvalid() throws Exception { .param("firstName", "newName") .param("lastName", "newLastName") .with(csrf())) - .andExpect(model().attributeHasFieldErrors("userTo", "email", "password")) + .andExpect(model().attributeHasFieldErrors("userDTO", "email", "password")) .andExpect(status().isOk()) .andExpect(view().name("unauth/register")); } @@ -90,7 +90,7 @@ void registerDuplicateEmail() throws Exception { .param("firstName", "newName") .param("lastName", "newLastName") .with(csrf())) - .andExpect(model().attributeHasFieldErrorCode("userTo", "email", "Duplicate")) + .andExpect(model().attributeHasFieldErrorCode("userDTO", "email", "Duplicate")) .andExpect(status().isOk()) .andExpect(view().name("unauth/register")); } diff --git a/src/test/java/com/javarush/jira/login/internal/web/UserControllerTest.java b/src/test/java/com/javarush/jira/login/internal/web/UserControllerTest.java index d6790ff3b..db5a08591 100644 --- a/src/test/java/com/javarush/jira/login/internal/web/UserControllerTest.java +++ b/src/test/java/com/javarush/jira/login/internal/web/UserControllerTest.java @@ -2,7 +2,7 @@ import com.javarush.jira.AbstractControllerTest; import com.javarush.jira.login.User; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; import com.javarush.jira.login.internal.UserMapper; import com.javarush.jira.login.internal.UserRepository; import org.junit.jupiter.api.Test; @@ -58,7 +58,7 @@ void getUnauthorized() throws Exception { @Test void createWithLocation() throws Exception { - UserTo newTo = mapper.toTo(getNew()); + UserDTO newTo = mapper.toDTO(getNew()); ResultActions action = perform(MockMvcRequestBuilders.post(REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(jsonWithPassword(newTo, newTo.getPassword()))) @@ -74,7 +74,7 @@ void createWithLocation() throws Exception { @Test void createInvalid() throws Exception { - UserTo invalid = new UserTo(null, "", null, "Aa", "", ""); + UserDTO invalid = new UserDTO(null, "", null, "Aa", "", ""); perform(MockMvcRequestBuilders.post(REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(jsonWithPassword(invalid, invalid.getPassword()))) @@ -84,7 +84,7 @@ void createInvalid() throws Exception { @Test void createDuplicateEmail() throws Exception { - UserTo expected = new UserTo(null, USER_MAIL, "newPass", "duplicateFirstName", "duplicateLastName", "duplicateDisplayName"); + UserDTO expected = new UserDTO(null, USER_MAIL, "newPass", "duplicateFirstName", "duplicateLastName", "duplicateDisplayName"); perform(MockMvcRequestBuilders.post(REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(jsonWithPassword(expected, expected.getPassword()))) @@ -97,7 +97,7 @@ void createDuplicateEmail() throws Exception { @WithUserDetails(value = USER_MAIL) void update() throws Exception { User dbUserBefore = repository.getExistedByEmail(USER_MAIL); - UserTo updatedTo = mapper.toTo(getUpdated()); + UserDTO updatedTo = mapper.toDTO(getUpdated()); updatedTo.setPassword(null); perform(MockMvcRequestBuilders.put(REST_URL) .contentType(MediaType.APPLICATION_JSON) @@ -115,7 +115,7 @@ void update() throws Exception { @Test @WithUserDetails(value = USER_MAIL) void updateDuplicate() throws Exception { - UserTo updatedTo = mapper.toTo(getUpdated()); + UserDTO updatedTo = mapper.toDTO(getUpdated()); updatedTo.setEmail(ADMIN_MAIL); perform(MockMvcRequestBuilders.put(REST_URL) .contentType(MediaType.APPLICATION_JSON) @@ -128,7 +128,7 @@ void updateDuplicate() throws Exception { @Test @WithUserDetails(value = USER_MAIL) void updateInvalid() throws Exception { - UserTo invalid = mapper.toTo(getUpdated()); + UserDTO invalid = mapper.toDTO(getUpdated()); invalid.setFirstName(""); perform(MockMvcRequestBuilders.put(REST_URL) .contentType(MediaType.APPLICATION_JSON) diff --git a/src/test/java/com/javarush/jira/login/internal/web/UserTestData.java b/src/test/java/com/javarush/jira/login/internal/web/UserTestData.java index f0ce55378..b0c94dbaf 100644 --- a/src/test/java/com/javarush/jira/login/internal/web/UserTestData.java +++ b/src/test/java/com/javarush/jira/login/internal/web/UserTestData.java @@ -4,13 +4,13 @@ import com.javarush.jira.common.util.JsonUtil; import com.javarush.jira.login.Role; import com.javarush.jira.login.User; -import com.javarush.jira.login.UserTo; +import com.javarush.jira.login.UserDTO; public class UserTestData { public static final MatcherFactory.Matcher USER_MATCHER = MatcherFactory.usingIgnoringFieldsComparator( User.class, "startpoint", "endpoint", "password"); - public static final MatcherFactory.Matcher TO_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(UserTo.class); + public static final MatcherFactory.Matcher TO_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(UserDTO.class); public static final long USER_ID = 1; public static final long ADMIN_ID = 2; diff --git a/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java b/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java index 9e58be4a8..7a7d07588 100644 --- a/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java +++ b/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java @@ -3,7 +3,7 @@ import com.javarush.jira.AbstractControllerTest; import com.javarush.jira.common.util.JsonUtil; -import com.javarush.jira.profile.ProfileTo; +import com.javarush.jira.profile.ProfileDTO; import com.javarush.jira.profile.internal.ProfileMapper; import com.javarush.jira.profile.internal.ProfileRepository; import com.javarush.jira.profile.internal.model.Profile; @@ -65,7 +65,7 @@ void shouldFail_WhenUnauthorized() throws Exception { @WithUserDetails(value = USER_MAIL) void shouldSucceeded_WhenUpdateWithUserProfile() throws Exception { Profile userProfileToUpdate = profileRepository.getExisted(USER_ID); - ProfileTo userProfileDTOtoUpdate = profileMapper.toTo(userProfileToUpdate); + ProfileDTO userProfileDTOtoUpdate = profileMapper.toDTO(userProfileToUpdate); userProfileDTOtoUpdate.setMailNotifications(USER_NOTIFICATIONS_UPDATED); userProfileDTOtoUpdate.setContacts(USER_CONTACTS_UPDATED); @@ -78,7 +78,7 @@ void shouldSucceeded_WhenUpdateWithUserProfile() throws Exception { .andExpect(status().isNoContent()); Profile userDbProfileAfterUpdate = profileRepository.getExisted(USER_ID); - ProfileTo userDbProfileDTOAfterUpdate = profileMapper.toTo(userDbProfileAfterUpdate); + ProfileDTO userDbProfileDTOAfterUpdate = profileMapper.toDTO(userDbProfileAfterUpdate); assertEquals(userProfileDTOtoUpdate, userDbProfileDTOAfterUpdate); } @@ -88,7 +88,7 @@ void shouldSucceeded_WhenUpdateWithUserProfile() throws Exception { @Transactional @WithUserDetails(value = ADMIN_MAIL) void shouldSucceeded_WhenUpdateWithAdminProfile() throws Exception { - ProfileTo adminProfileDTOtoUpdate = ProfileTestData.getUpdatedAdminDTO(); + ProfileDTO adminProfileDTOtoUpdate = ProfileTestData.getUpdatedAdminDTO(); perform(MockMvcRequestBuilders.put(REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(JsonUtil.writeValue(adminProfileDTOtoUpdate))) @@ -106,7 +106,7 @@ void shouldSucceeded_WhenUpdateWithAdminProfile() throws Exception { @Transactional @WithUserDetails(value = ADMIN_MAIL) void shouldFail_WhenUpdateWithInvalidDTO() throws Exception { - ProfileTo invalidDTO = getInvalidDTO(); + ProfileDTO invalidDTO = getInvalidDTO(); perform(MockMvcRequestBuilders.put(REST_URL) .contentType(MediaType.APPLICATION_JSON) .content(JsonUtil.writeValue(invalidDTO))) @@ -118,10 +118,10 @@ void shouldFail_WhenUpdateWithInvalidDTO() throws Exception { @Transactional @WithUserDetails(value = ADMIN_MAIL) void shouldFail_WhenUpdateWithUnknownNotificationDTO() throws Exception { - ProfileTo unknownNotificationTo = getWithUnknownNotificationDTO(); + ProfileDTO unknownNotificationDTO = getWithUnknownNotificationDTO(); perform(MockMvcRequestBuilders.put(REST_URL) .contentType(MediaType.APPLICATION_JSON) - .content(JsonUtil.writeValue(unknownNotificationTo))) + .content(JsonUtil.writeValue(unknownNotificationDTO))) .andDo(print()) .andExpect(status().isUnprocessableEntity()); } @@ -130,10 +130,10 @@ void shouldFail_WhenUpdateWithUnknownNotificationDTO() throws Exception { @Transactional @WithUserDetails(value = ADMIN_MAIL) void shouldFail_WhenUpdateWithUnknownContactDTO() throws Exception { - ProfileTo unknownContactTo = getWithUnknownContactDTO(); + ProfileDTO unknownContactDTO = getWithUnknownContactDTO(); perform(MockMvcRequestBuilders.put(REST_URL) .contentType(MediaType.APPLICATION_JSON) - .content(JsonUtil.writeValue(unknownContactTo))) + .content(JsonUtil.writeValue(unknownContactDTO))) .andDo(print()) .andExpect(status().isUnprocessableEntity()); } @@ -142,10 +142,10 @@ void shouldFail_WhenUpdateWithUnknownContactDTO() throws Exception { @WithUserDetails(value = ADMIN_MAIL) @Transactional void shouldFail_WhenUpdateWithContactHtmlUnsafeDTO() throws Exception { - ProfileTo contactHtmlUnsafeTo = getWithContactHtmlUnsafeDTO(); + ProfileDTO contactHtmlUnsafeDTO = getWithContactHtmlUnsafeDTO(); perform(MockMvcRequestBuilders.put(REST_URL) .contentType(MediaType.APPLICATION_JSON) - .content(JsonUtil.writeValue(contactHtmlUnsafeTo))) + .content(JsonUtil.writeValue(contactHtmlUnsafeDTO))) .andDo(print()) .andExpect(status().isUnprocessableEntity()); } diff --git a/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java b/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java index 6f06344b6..8ee35ad0e 100644 --- a/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java +++ b/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java @@ -1,16 +1,16 @@ package com.javarush.jira.profile.internal.web; import com.javarush.jira.MatcherFactory; -import com.javarush.jira.profile.ContactTo; -import com.javarush.jira.profile.ProfileTo; +import com.javarush.jira.profile.ContactDTO; +import com.javarush.jira.profile.ProfileDTO; import java.util.Collections; import java.util.Set; public class ProfileTestData { - public static MatcherFactory.Matcher PROFILE_DTO_MATCHER = - MatcherFactory.usingIgnoringFieldsComparator(ProfileTo.class, "user"); + public static MatcherFactory.Matcher PROFILE_DTO_MATCHER = + MatcherFactory.usingIgnoringFieldsComparator(ProfileDTO.class, "user"); public static final Long ADMIN_ID = 2L; public static final Long USER_ID = 1L; @@ -22,29 +22,29 @@ public class ProfileTestData { private static final String DEADLINE = "deadline"; private static final String OVERDUE = "overdue"; - private static final ContactTo USER_CONTACT_SKYPE = new ContactTo("skype", "userSkype"); - private static final ContactTo USER_CONTACT_MOBILE = new ContactTo("mobile", "+01234567890"); - private static final ContactTo USER_CONTACT_WEBSITE = new ContactTo("website", "user.com"); - - private static final ContactTo USER_CONTACT_SKYPE_UPDATED = new ContactTo("skype", "newSkype"); - private static final ContactTo USER_CONTACT_MOBILE_UPDATED = new ContactTo("mobile", "+380987654321"); - private static final ContactTo USER_CONTACT_WEBSITE_UPDATED = new ContactTo("website", "new.com"); - private static final ContactTo USER_CONTACT_GITHUB_UPDATED = new ContactTo("github", "newGitHub"); - private static final ContactTo USER_CONTACT_TG_UPDATED = new ContactTo("tg", "newTg"); - private static final ContactTo USER_CONTACT_VK_UPDATED = new ContactTo("vk", "newVk"); - private static final ContactTo USER_CONTACT_LINKEDIN_UPDATED = new ContactTo("linkedin", "newLinkedin"); - - private static final ContactTo ADMIN_CONTACT_GITHUB = new ContactTo("github", "adminGitHub"); - private static final ContactTo ADMIN_CONTACT_TG = new ContactTo("tg", "adminTg"); - private static final ContactTo ADMIN_CONTACT_VK = new ContactTo("vk", "adminVk"); - - private static final ContactTo ADMIN_CONTACT_GITHUB_UPDATED = new ContactTo("github", "newAdminGitHub"); - private static final ContactTo ADMIN_CONTACT_TG_UPDATED = new ContactTo("tg", "newAdminTg"); - private static final ContactTo ADMIN_CONTACT_VK_UPDATED = new ContactTo("vk", "newAdminVk"); - private static final ContactTo ADMIN_CONTACT_SKYPE_UPDATED = new ContactTo("skype", "newAdminSkype"); - private static final ContactTo ADMIN_CONTACT_MOBILE_UPDATED = new ContactTo("mobile", "newAdminMobile"); - private static final ContactTo ADMIN_CONTACT_WEBSITE_UPDATED = new ContactTo("website", "newAdminWebsite"); - private static final ContactTo ADMIN_CONTACT_LINKEDIN_UPDATED = new ContactTo("linkedin", "newAdminLinkedin"); + private static final ContactDTO USER_CONTACT_SKYPE = new ContactDTO("skype", "userSkype"); + private static final ContactDTO USER_CONTACT_MOBILE = new ContactDTO("mobile", "+01234567890"); + private static final ContactDTO USER_CONTACT_WEBSITE = new ContactDTO("website", "user.com"); + + private static final ContactDTO USER_CONTACT_SKYPE_UPDATED = new ContactDTO("skype", "newSkype"); + private static final ContactDTO USER_CONTACT_MOBILE_UPDATED = new ContactDTO("mobile", "+380987654321"); + private static final ContactDTO USER_CONTACT_WEBSITE_UPDATED = new ContactDTO("website", "new.com"); + private static final ContactDTO USER_CONTACT_GITHUB_UPDATED = new ContactDTO("github", "newGitHub"); + private static final ContactDTO USER_CONTACT_TG_UPDATED = new ContactDTO("tg", "newTg"); + private static final ContactDTO USER_CONTACT_VK_UPDATED = new ContactDTO("vk", "newVk"); + private static final ContactDTO USER_CONTACT_LINKEDIN_UPDATED = new ContactDTO("linkedin", "newLinkedin"); + + private static final ContactDTO ADMIN_CONTACT_GITHUB = new ContactDTO("github", "adminGitHub"); + private static final ContactDTO ADMIN_CONTACT_TG = new ContactDTO("tg", "adminTg"); + private static final ContactDTO ADMIN_CONTACT_VK = new ContactDTO("vk", "adminVk"); + + private static final ContactDTO ADMIN_CONTACT_GITHUB_UPDATED = new ContactDTO("github", "newAdminGitHub"); + private static final ContactDTO ADMIN_CONTACT_TG_UPDATED = new ContactDTO("tg", "newAdminTg"); + private static final ContactDTO ADMIN_CONTACT_VK_UPDATED = new ContactDTO("vk", "newAdminVk"); + private static final ContactDTO ADMIN_CONTACT_SKYPE_UPDATED = new ContactDTO("skype", "newAdminSkype"); + private static final ContactDTO ADMIN_CONTACT_MOBILE_UPDATED = new ContactDTO("mobile", "newAdminMobile"); + private static final ContactDTO ADMIN_CONTACT_WEBSITE_UPDATED = new ContactDTO("website", "newAdminWebsite"); + private static final ContactDTO ADMIN_CONTACT_LINKEDIN_UPDATED = new ContactDTO("linkedin", "newAdminLinkedin"); public static final Set USER_NOTIFICATIONS = Set.of( ASSIGNED, @@ -52,7 +52,7 @@ public class ProfileTestData { DEADLINE ); - public static final Set USER_CONTACTS = Set.of( + public static final Set USER_CONTACTS = Set.of( USER_CONTACT_SKYPE, USER_CONTACT_MOBILE, USER_CONTACT_WEBSITE @@ -67,7 +67,7 @@ public class ProfileTestData { OVERDUE ); - public static final Set USER_CONTACTS_UPDATED = Set.of( + public static final Set USER_CONTACTS_UPDATED = Set.of( USER_CONTACT_SKYPE_UPDATED, USER_CONTACT_MOBILE_UPDATED, USER_CONTACT_WEBSITE_UPDATED, @@ -83,7 +83,7 @@ public class ProfileTestData { THREE_DAYS_BEFORE_DEADLINE ); - public static final Set ADMIN_CONTACTS = Set.of( + public static final Set ADMIN_CONTACTS = Set.of( ADMIN_CONTACT_GITHUB, ADMIN_CONTACT_TG, ADMIN_CONTACT_VK @@ -96,7 +96,7 @@ public class ProfileTestData { DEADLINE ); - public static final Set ADMIN_CONTACTS_UPDATED = Set.of( + public static final Set ADMIN_CONTACTS_UPDATED = Set.of( ADMIN_CONTACT_GITHUB_UPDATED, ADMIN_CONTACT_TG_UPDATED, ADMIN_CONTACT_VK_UPDATED, @@ -106,55 +106,55 @@ public class ProfileTestData { ADMIN_CONTACT_LINKEDIN_UPDATED ); - public static ProfileTo ADMIN_PROFILE_DTO = new ProfileTo( + public static ProfileDTO ADMIN_PROFILE_DTO = new ProfileDTO( ADMIN_ID, ADMIN_NOTIFICATIONS, ADMIN_CONTACTS ); - public static ProfileTo USER_PROFILE_DTO = new ProfileTo( + public static ProfileDTO USER_PROFILE_DTO = new ProfileDTO( USER_ID, USER_NOTIFICATIONS, USER_CONTACTS ); - public static ProfileTo getUpdatedUserDTO() { - return new ProfileTo( + public static ProfileDTO getUpdatedUserDTO() { + return new ProfileDTO( USER_ID, USER_NOTIFICATIONS_UPDATED, USER_CONTACTS_UPDATED ); } - public static ProfileTo getUpdatedAdminDTO() { - return new ProfileTo( + public static ProfileDTO getUpdatedAdminDTO() { + return new ProfileDTO( ADMIN_ID, ADMIN_NOTIFICATIONS_UPDATED, ADMIN_CONTACTS_UPDATED ); } - public static ProfileTo getInvalidDTO() { - return new ProfileTo(null, + public static ProfileDTO getInvalidDTO() { + return new ProfileDTO(null, Set.of(""), - Set.of(new ContactTo("skype", ""))); + Set.of(new ContactDTO("skype", ""))); } - public static ProfileTo getWithUnknownNotificationDTO() { - return new ProfileTo(null, + public static ProfileDTO getWithUnknownNotificationDTO() { + return new ProfileDTO(null, Set.of("WrongNotification"), Collections.emptySet()); } - public static ProfileTo getWithUnknownContactDTO() { - return new ProfileTo(null, + public static ProfileDTO getWithUnknownContactDTO() { + return new ProfileDTO(null, Collections.emptySet(), - Set.of(new ContactTo("WrongContactCode", "contact"))); + Set.of(new ContactDTO("WrongContactCode", "contact"))); } - public static ProfileTo getWithContactHtmlUnsafeDTO() { - return new ProfileTo(null, + public static ProfileDTO getWithContactHtmlUnsafeDTO() { + return new ProfileDTO(null, Collections.emptySet(), - Set.of(new ContactTo("tg", ""))); + Set.of(new ContactDTO("tg", ""))); } } \ No newline at end of file diff --git a/src/test/java/com/javarush/jira/project/internal/web/ProjectControllerTest.java b/src/test/java/com/javarush/jira/project/internal/web/ProjectControllerTest.java index 4e49e9beb..2c1a6bb28 100644 --- a/src/test/java/com/javarush/jira/project/internal/web/ProjectControllerTest.java +++ b/src/test/java/com/javarush/jira/project/internal/web/ProjectControllerTest.java @@ -33,7 +33,7 @@ void get() throws Exception { .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(PROJECT_TO_MATCHER.contentJson(projectTo1)); + .andExpect(PROJECT_TO_MATCHER.contentJson(PROJECT_DTO_1)); } @Test @@ -45,13 +45,13 @@ void getUnAuth() throws Exception { @Test @WithUserDetails(value = MANAGER_MAIL) void update() throws Exception { - projectTo2.setTitle("PROJECT-2 UPD"); + PROJECT_DTO_2.setTitle("PROJECT-2 UPD"); perform(MockMvcRequestBuilders.put(REST_URL_MNGR_PROJECT + "/" + PROJECT_ID) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(projectTo2))) + .content(writeValue(PROJECT_DTO_2))) .andDo(print()) .andExpect(status().isNoContent()); - PROJECT_TO_MATCHER.assertMatch(projectTo2, ProjectTestData.getUpdated()); + PROJECT_TO_MATCHER.assertMatch(PROJECT_DTO_2, ProjectTestData.getUpdated()); } @Test @@ -79,13 +79,13 @@ void create() throws Exception { @Test @WithUserDetails(value = MANAGER_MAIL) void disable() throws Exception { - projectTo2.setEnabled(false); + PROJECT_DTO_2.setEnabled(false); perform(MockMvcRequestBuilders.put(REST_URL_MNGR_PROJECT + "/" + PROJECT_ID) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(projectTo2))) + .content(writeValue(PROJECT_DTO_2))) .andDo(print()) .andExpect(status().isNoContent()); - PROJECT_TO_MATCHER.assertMatch(projectTo2, ProjectTestData.getDisabled()); + PROJECT_TO_MATCHER.assertMatch(PROJECT_DTO_2, ProjectTestData.getDisabled()); } } diff --git a/src/test/java/com/javarush/jira/project/internal/web/ProjectTestData.java b/src/test/java/com/javarush/jira/project/internal/web/ProjectTestData.java index b7fe58165..02ef4f9cc 100644 --- a/src/test/java/com/javarush/jira/project/internal/web/ProjectTestData.java +++ b/src/test/java/com/javarush/jira/project/internal/web/ProjectTestData.java @@ -2,29 +2,29 @@ import com.javarush.jira.MatcherFactory; import com.javarush.jira.bugtracking.project.Project; -import com.javarush.jira.bugtracking.project.to.ProjectTo; +import com.javarush.jira.bugtracking.project.to.ProjectDTO; public class ProjectTestData { public static final MatcherFactory.Matcher PROJECT_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(Project.class, "id", "startpoint", "endpoint"); - public static final MatcherFactory.Matcher PROJECT_TO_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(ProjectTo.class, "id"); + public static final MatcherFactory.Matcher PROJECT_TO_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(ProjectDTO.class, "id"); public static final Long PARENT_PROJECT_ID = 1L; public static final Long PROJECT_ID = 2L; - public static final ProjectTo projectTo1 = new ProjectTo(PARENT_PROJECT_ID, "PR1", "PROJECT-1", "test project 1", "task_tracker", null); + public static final ProjectDTO PROJECT_DTO_1 = new ProjectDTO(PARENT_PROJECT_ID, "PR1", "PROJECT-1", "test project 1", "task_tracker", null); - public static final ProjectTo projectTo2 = new ProjectTo(PROJECT_ID, "PR2", "PROJECT-2", "test project 2", "task_tracker", PARENT_PROJECT_ID); + public static final ProjectDTO PROJECT_DTO_2 = new ProjectDTO(PROJECT_ID, "PR2", "PROJECT-2", "test project 2", "task_tracker", PARENT_PROJECT_ID); public static Project getNew() { return new Project(null, "PR3", "PROJECT-3", "task_tracker", "test project 3", null); } - public static ProjectTo getUpdated() { - return new ProjectTo(PROJECT_ID, "PR2", "PROJECT-2 UPD", "test project 2", "task_tracker", PARENT_PROJECT_ID); + public static ProjectDTO getUpdated() { + return new ProjectDTO(PROJECT_ID, "PR2", "PROJECT-2 UPD", "test project 2", "task_tracker", PARENT_PROJECT_ID); } - public static ProjectTo getDisabled() { - ProjectTo projectTo = new ProjectTo(PROJECT_ID, "PR2", "PROJECT-2 UPD", "test project 2", "task_tracker", PARENT_PROJECT_ID); - projectTo.setEnabled(false); - return projectTo; + public static ProjectDTO getDisabled() { + ProjectDTO projectDTO = new ProjectDTO(PROJECT_ID, "PR2", "PROJECT-2 UPD", "test project 2", "task_tracker", PARENT_PROJECT_ID); + projectDTO.setEnabled(false); + return projectDTO; } } diff --git a/src/test/java/com/javarush/jira/ref/internal/web/ReferenceControllerTest.java b/src/test/java/com/javarush/jira/ref/internal/web/ReferenceControllerTest.java index 7164e6435..5cc6fb695 100644 --- a/src/test/java/com/javarush/jira/ref/internal/web/ReferenceControllerTest.java +++ b/src/test/java/com/javarush/jira/ref/internal/web/ReferenceControllerTest.java @@ -1,7 +1,7 @@ package com.javarush.jira.ref.internal.web; import com.javarush.jira.AbstractControllerTest; -import com.javarush.jira.ref.RefTo; +import com.javarush.jira.ref.RefDTO; import com.javarush.jira.ref.RefType; import com.javarush.jira.ref.ReferenceService; import com.javarush.jira.ref.internal.Reference; @@ -53,7 +53,7 @@ void getByTypeByCode() throws Exception { .andExpect(status().isOk()) .andDo(print()) .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(REFTO_MATCHER.contentJson(refTo)); + .andExpect(REF_DTO_MATCHER.contentJson(REF_DTO)); } @Test @@ -62,7 +62,7 @@ void delete() throws Exception { perform(MockMvcRequestBuilders.delete(REST_URL + RefType.TASK + "/" + TASK_CODE)) .andDo(print()) .andExpect(status().isNoContent()); - assertThrows(IllegalArgumentException.class, this::getRefTo); + assertThrows(IllegalArgumentException.class, this::getRefDTO); assertFalse(referenceRepository.getByTypeAndCode(RefType.TASK, TASK_CODE).isPresent()); } @@ -89,7 +89,7 @@ void create() throws Exception { Reference newRef = getNew(); ResultActions action = perform(MockMvcRequestBuilders.post(ReferenceController.REST_URL) .contentType(MediaType.APPLICATION_JSON) - .content(writeValue(new RefTo(null, RefType.TASK, "enhancement", "Enhancement", null)))) + .content(writeValue(new RefDTO(null, RefType.TASK, "enhancement", "Enhancement", null)))) .andExpect(status().isCreated()); Reference created = REFERENCE_MATCHER.readFromJson(action); REFERENCE_MATCHER.assertMatch(created, newRef); @@ -114,7 +114,7 @@ void enable() throws Exception { .andDo(print()) .andExpect(status().isNoContent()); assertFalse(getRef().isEnabled()); - assertFalse(getRefTo().isEnabled()); + assertFalse(getRefDTO().isEnabled()); perform(MockMvcRequestBuilders.patch(REST_URL + RefType.TASK + "/" + TASK_CODE) .param("enabled", "true") @@ -122,12 +122,12 @@ void enable() throws Exception { .andDo(print()) .andExpect(status().isNoContent()); assertTrue(getRef().isEnabled()); - assertTrue(getRefTo().isEnabled()); + assertTrue(getRefDTO().isEnabled()); } @NonNull - private RefTo getRefTo() { - return ReferenceService.getRefTo(RefType.TASK, TASK_CODE); + private RefDTO getRefDTO() { + return ReferenceService.getRefDTO(RefType.TASK, TASK_CODE); } @NonNull diff --git a/src/test/java/com/javarush/jira/ref/internal/web/ReferenceTestData.java b/src/test/java/com/javarush/jira/ref/internal/web/ReferenceTestData.java index 7a690a1b4..121f95d83 100644 --- a/src/test/java/com/javarush/jira/ref/internal/web/ReferenceTestData.java +++ b/src/test/java/com/javarush/jira/ref/internal/web/ReferenceTestData.java @@ -1,16 +1,16 @@ package com.javarush.jira.ref.internal.web; import com.javarush.jira.MatcherFactory; -import com.javarush.jira.ref.RefTo; +import com.javarush.jira.ref.RefDTO; import com.javarush.jira.ref.RefType; import com.javarush.jira.ref.internal.Reference; public class ReferenceTestData { public static final MatcherFactory.Matcher REFERENCE_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(Reference.class, "id", "startpoint", "endpoint"); - public static final MatcherFactory.Matcher REFTO_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(RefTo.class, "id"); + public static final MatcherFactory.Matcher REF_DTO_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(RefDTO.class, "id"); public static final String TASK_CODE = "task"; public static final Reference ref = new Reference(1L, RefType.TASK, TASK_CODE, "Task"); - public static final RefTo refTo = new RefTo(null, RefType.TASK, TASK_CODE, "Task", null); + public static final RefDTO REF_DTO = new RefDTO(null, RefType.TASK, TASK_CODE, "Task", null); static { ref.setEnabled(false); From 8e4d10ed67f4e38690e6a05ffd276b538cd404a8 Mon Sep 17 00:00:00 2001 From: ganka-xn Date: Fri, 6 Dec 2024 20:05:41 +0300 Subject: [PATCH 06/12] Task 7 completed. Added REST tags functionality with some tests. --- README.md | 4 +- .../jira/bugtracking/task/TagController.java | 107 ++++++++++++++++-- .../jira/bugtracking/task/TagService.java | 103 +++++++++++++++++ .../jira/bugtracking/task/TaskRepository.java | 15 ++- .../jira/bugtracking/task/to/TaskDTO.java | 4 + .../jira/bugtracking/task/to/TaskDTOExt.java | 4 + .../bugtracking/task/TagControllerTest.java | 105 +++++++++++++++++ .../jira/bugtracking/task/TaskTestData.java | 11 ++ src/test/resources/data.sql | 4 + 9 files changed, 342 insertions(+), 15 deletions(-) create mode 100644 src/test/java/com/javarush/jira/bugtracking/task/TagControllerTest.java diff --git a/README.md b/README.md index ef46660ee..fb976d3d7 100644 --- a/README.md +++ b/README.md @@ -38,4 +38,6 @@ 5. Написать тесты для всех публичных методов контроллера ProfileRestController. Хоть методов только 2, но тестовых методов должно быть больше, т.к. нужно проверить success and unsuccess path. 6. Рефакторинг метода com.javarush.jira.bugtracking.attachment.FileUtil#upload, -чтобы он использовал современный подход для работы с файловой системмой. \ No newline at end of file +чтобы он использовал современный подход для работы с файловой системмой. +7. Добавить новый функционал: добавления тегов к задаче (REST API + реализация на сервисе). + Вместе с тестами. +8. \ No newline at end of file diff --git a/src/main/java/com/javarush/jira/bugtracking/task/TagController.java b/src/main/java/com/javarush/jira/bugtracking/task/TagController.java index 67f4fe27c..690ddb45f 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/TagController.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/TagController.java @@ -1,22 +1,111 @@ package com.javarush.jira.bugtracking.task; -import lombok.Data; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; -//todo задача 7 -// Добавить новый функционал: добавления тегов к задаче (REST API + реализация на сервисе). -// Фронт делать необязательно. Таблица task_tag уже создана. +import java.util.Set; +/* + task 7 - completed + Добавить новый функционал: добавления тегов к задаче (REST API + реализация на сервисе). + Фронт делать необязательно. Таблица task_tag уже создана. +*/ +@Slf4j +@Tag(name = "Tags", description = "API для работы с тегами") @RestController -@RequestMapping +@RequestMapping(TaskController.REST_URL + "/{id}") +@RequiredArgsConstructor public class TagController { private final TagService tagService; + @GetMapping("/get-tags") + @Operation( + summary = "Получить теги по ID задачи", + description = "Возвращает набор тегов для указанной задачи.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Теги успешно получены"), + @ApiResponse(responseCode = "404", description = "Задача не найдена") + }) + public Set getTagsByTaskId( + @Parameter(description = "Task id") @PathVariable long id + ) { + return tagService.getTags(id); + } + + @PutMapping("/add-tags") + @Operation( + summary = "Добавить теги к задаче", + description = "Добавляет новый набор тегов к указанной задаче.") + @ApiResponses(value = { + @ApiResponse(responseCode = "201", description = "Теги успешно добавлены"), + @ApiResponse(responseCode = "404", description = "Задача не найдена"), + @ApiResponse(responseCode = "400", description = "Некорректный запрос") + }) + public ResponseEntity addTags( + @Parameter(description = "Task id") @PathVariable long id, + @RequestBody @NotBlank Set tags + ) { + var taskWithTags = tagService.addTags(id, tags); + return ResponseEntity.status(HttpStatus.CREATED).body(taskWithTags); + } + + @PostMapping("/replace-tags") + @Operation( + summary = "Обновить теги задачи", + description = "Обновляет набор тегов для указанной задачи.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Теги успешно обновлены"), + @ApiResponse(responseCode = "404", description = "Задача не найдена"), + @ApiResponse(responseCode = "400", description = "Некорректный запрос") + }) + public ResponseEntity replaceTags( + @Parameter(description = "Task id") @PathVariable long id, + @RequestBody @NotBlank Set tags + ) { + var updatedTask = tagService.replaceTags(id, tags); + return ResponseEntity.ok(updatedTask); + } + + @DeleteMapping("/delete-tags") + @Operation( + summary = "Удалить теги у задачи", + description = "Удаляет все теги у указанной задачи.") + @ApiResponses(value = { + @ApiResponse(responseCode = "204", description = "Теги успешно удалены"), + @ApiResponse(responseCode = "404", description = "Задача не найдена") + }) + public ResponseEntity deleteTags( + @Parameter(description = "Task id") @PathVariable long id + ) { + tagService.removeAllTags(id); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } - public TagController(TagService tagService) { - this.tagService = tagService; + @DeleteMapping("/delete-single-tag") + @Operation( + summary = "Удалить тег у задачи", + description = "Удаляет одиночный тег у указанной задачи.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Тег успешно удален"), + @ApiResponse(responseCode = "404", description = "Задача не найдена") + }) + public ResponseEntity deleteSingleTag( + @Parameter(description = "Task id") @PathVariable long id, + @RequestBody @NotBlank String tag + ) { + tagService.removeSingleTag(id, tag); + return ResponseEntity.status(HttpStatus.OK).build(); } + } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/TagService.java b/src/main/java/com/javarush/jira/bugtracking/task/TagService.java index b9c840bc4..066a3dbe4 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/TagService.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/TagService.java @@ -1,10 +1,113 @@ package com.javarush.jira.bugtracking.task; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.Optional; +import java.util.Set; + +@Slf4j @Service @RequiredArgsConstructor public class TagService { + private final TaskRepository taskRepository; + + @Transactional + public Set getTags(long id) { + log.info("Getting existed tags for task id {}", id); + Task task = taskRepository.getTaskByIdWithTags(id); + + Set tags = task.getTags(); + log.info("Retrieved {} tags for task id: {}", tags.size(), id); + + return tags; + } + + @Transactional + public Task addTags(long id, Set tags) { + log.info("Adding tags for task id {}", id); + Optional optionalTask = taskRepository.findFullById(id); + + Task task = getTask(id, optionalTask); + + try { + task.getTags().addAll(tags); + taskRepository.save(task); + log.info("Tags for task id {} have been added", id); + + return task; + } catch (Exception e) { + log.error("Error adding tags for task id {}: {}", id, e.getMessage()); + throw new RuntimeException(e); + } + } + + @Transactional + public Task replaceTags(long id, Set tags) { + log.info("Replacing existed tags for task id {}", id); + Optional optionalTask = taskRepository.findFullById(id); + + Task task = getTask(id, optionalTask); + + try { + task.setTags(tags); + taskRepository.save(task); + log.info("Tags for task id {} successfully replaced with new tags", id); + + return task; + } catch (Exception e) { + log.error("Error replacing tags for task id {}: {}", id, e.getMessage()); + throw new RuntimeException(e); + } + } + + @Transactional + public void removeAllTags(long id) { + log.info("Removing tags for task id {}", id); + Optional optionalTask = taskRepository.findFullById(id); + Task task = getTask(id, optionalTask); + + try { + + task.getTags().clear(); + taskRepository.save(task); + log.info("Tags for task id {} successfully removed", id); + } catch (Exception e) { + log.error("Error removing tags for task id {}: {}", id, e.getMessage()); + throw new RuntimeException(e); + } + } + + @Transactional + public void removeSingleTag(long id, String tag) { + log.info("Removing single tag for task id {}", id); + Optional optionalTask = taskRepository.findFullById(id); + Task task = getTask(id, optionalTask); + + try { + boolean tagRemoved = task.getTags().remove(tag); + + if (tagRemoved) { + taskRepository.save(task); + log.info("Tag {} for task id {} successfully removed", tag, id); + } else { + log.warn("Tag '{}' not found in task id {}", tag, id); + } + + } catch (Exception e) { + log.error("Error removing tag {} for task id {}: {}", tag, id, e.getMessage()); + throw new RuntimeException(e); + } + } + + private static Task getTask(long id, Optional optionalTask) { + return optionalTask.orElseThrow(() -> { + log.error("Task with id {} not found", id); + return new RuntimeException("Task with id " + id + " not found"); + } + ); + } } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/TaskRepository.java b/src/main/java/com/javarush/jira/bugtracking/task/TaskRepository.java index 982c4be8b..9724de161 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/TaskRepository.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/TaskRepository.java @@ -3,6 +3,7 @@ import com.javarush.jira.common.BaseRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -11,16 +12,16 @@ @Transactional(readOnly = true) public interface TaskRepository extends BaseRepository { @Query("SELECT t FROM Task t WHERE t.sprintId =:sprintId ORDER BY t.startpoint DESC") - List findAllBySprintId(long sprintId); + List findAllBySprintId(@Param("sprintId") long sprintId); @Query("SELECT t FROM Task t WHERE t.projectId =:projectId AND t.sprintId IS NULL") - List findAllByProjectIdAndSprintIsNull(long projectId); + List findAllByProjectIdAndSprintIsNull(@Param("projectId") long projectId); @Query("SELECT t FROM Task t WHERE t.projectId =:projectId ORDER BY t.startpoint DESC") - List findAllByProjectId(long projectId); + List findAllByProjectId(@Param("projectId") long projectId); - @Query("SELECT t FROM Task t JOIN FETCH t.project LEFT JOIN FETCH t.sprint LEFT JOIN FETCH t.parent WHERE t.id =:id") - Optional findFullById(long id); + @Query("SELECT t FROM Task t JOIN FETCH t.project LEFT JOIN FETCH t.sprint LEFT JOIN FETCH t.parent LEFT JOIN FETCH t.tags WHERE t.id =:id") + Optional findFullById(@Param("id") long id); @Modifying @Query(value = """ @@ -37,4 +38,8 @@ WITH RECURSIVE task_with_subtasks AS ( WHERE id IN (SELECT child FROM task_with_subtasks) """, nativeQuery = true) void setTaskAndSubTasksSprint(long taskId, Long sprintId); + + @Query(value = "SELECT t FROM Task t LEFT JOIN FETCH t.tags WHERE t.id = :id") + Task getTaskByIdWithTags(@Param("id") long id); + } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTO.java b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTO.java index cd5c79cb4..6f490e431 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTO.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTO.java @@ -12,10 +12,14 @@ public class TaskDTO extends TitleDTO implements HasCode, HasIdAndParentId { @Code private final String typeCode; + Long parentId; + @NotNull Long projectId; + Long sprintId; + @Setter @Code private String statusCode; diff --git a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOExt.java b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOExt.java index e3c6f00b7..cc26b6692 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOExt.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskDTOExt.java @@ -5,11 +5,13 @@ import com.javarush.jira.common.util.validation.Description; import jakarta.annotation.Nullable; import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.Size; import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; import java.util.Objects; +import java.util.Set; @Getter @Setter @@ -28,6 +30,8 @@ public class TaskDTOExt extends TaskDTO { @Positive Integer estimate; + Set<@Size(min = 2, max = 32) String> tags = Set.of(); + public TaskDTOExt(Long id, String code, String title, String description, String typeCode, String statusCode, String priorityCode, LocalDateTime updated, Integer estimate, Long parentId, long projectId, Long sprintId) { super(id, code, title, typeCode, statusCode, parentId, projectId, sprintId); diff --git a/src/test/java/com/javarush/jira/bugtracking/task/TagControllerTest.java b/src/test/java/com/javarush/jira/bugtracking/task/TagControllerTest.java new file mode 100644 index 000000000..dd2d5edd8 --- /dev/null +++ b/src/test/java/com/javarush/jira/bugtracking/task/TagControllerTest.java @@ -0,0 +1,105 @@ +package com.javarush.jira.bugtracking.task; + +import com.javarush.jira.AbstractControllerTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.transaction.annotation.Transactional; + +import static com.javarush.jira.bugtracking.task.TaskTestData.*; +import static com.javarush.jira.common.util.JsonUtil.writeValue; +import static com.javarush.jira.login.internal.web.UserTestData.ADMIN_MAIL; +import static com.javarush.jira.bugtracking.task.TaskController.REST_URL; +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +class TagControllerTest extends AbstractControllerTest { + + @Autowired + private TaskRepository taskRepository; + + private static final String TASKS_REST_URL_SLASH_WITH_ID = REST_URL + "/" + TASK1_ID; + + private static final String TASK_TAGS_GET = TASKS_REST_URL_SLASH_WITH_ID + "/get-tags"; + private static final String TASK_TAGS_ADD = TASKS_REST_URL_SLASH_WITH_ID + "/add-tags"; + private static final String TASK_TAGS_REPLACE = TASKS_REST_URL_SLASH_WITH_ID + "/replace-tags"; + private static final String TASK_TAGS_DELETE = TASKS_REST_URL_SLASH_WITH_ID + "/delete-tags"; + private static final String TASK_TAGS_DELETE_SINGLE = TASKS_REST_URL_SLASH_WITH_ID + "/delete-single-tag"; + + @Test + @WithUserDetails(value = ADMIN_MAIL) + void shouldSucceeded_WhenGetTagsByTaskId() throws Exception { + perform(MockMvcRequestBuilders.get(TASK_TAGS_GET)) + .andExpect(status().isOk()) + .andDo(print()) + .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)); + + Task task = taskRepository.getTaskByIdWithTags(TASK1_ID); + assertEquals(tags_data, task.getTags()); + } + + @Test + @WithUserDetails(value = ADMIN_MAIL) + @Transactional + void shouldSucceeded_WhenAddTagsToTask() throws Exception { + perform(MockMvcRequestBuilders.put(TASK_TAGS_ADD) + .contentType(MediaType.APPLICATION_JSON) + .content(writeValue(tags_data_to_add))) + .andDo(print()) + .andExpect(status().isCreated()); + + Task task_after_add = taskRepository.getTaskByIdWithTags(TASK1_ID); + assertEquals(tags_data_after_add, task_after_add.getTags()); + } + + @Test + @WithUserDetails(value = ADMIN_MAIL) + @Transactional + void shouldSucceeded_WhenReplaceTags() throws Exception { + perform(MockMvcRequestBuilders.post(TASK_TAGS_REPLACE) + .contentType(MediaType.APPLICATION_JSON) + .content(writeValue(tags_for_replace))) + .andDo(print()) + .andExpect(status().is2xxSuccessful()); + + Task task_after_update = taskRepository.getTaskByIdWithTags(TASK1_ID); + assertEquals(tags_for_replace,task_after_update.getTags()); + } + + @Test + @WithUserDetails(value = ADMIN_MAIL) + @Transactional + void shouldSucceeded_WhenDeleteTags() throws Exception { + Task task_before_delete = taskRepository.getTaskByIdWithTags(TASK1_ID); + assertFalse(task_before_delete.getTags().isEmpty()); + + + perform(MockMvcRequestBuilders.delete(TASK_TAGS_DELETE)) + .andDo(print()) + .andExpect(status().isNoContent()); + + Task task_after_delete = taskRepository.getTaskByIdWithTags(TASK1_ID); + assertTrue(task_after_delete.getTags().isEmpty()); + } + + @Test + @WithUserDetails(value = ADMIN_MAIL) + @Transactional + void deleteSingleTag() throws Exception { + Task task_before_delete_single = taskRepository.getTaskByIdWithTags(TASK1_ID); + assertFalse(task_before_delete_single.getTags().isEmpty()); + + perform(MockMvcRequestBuilders.delete(TASK_TAGS_DELETE_SINGLE) + .content(tag_for_single_delete) + .contentType(MediaType.TEXT_PLAIN)) + .andDo(print()) + .andExpect(status().isOk()); + + Task task_after_delete_single = taskRepository.getTaskByIdWithTags(TASK1_ID); + assertEquals(tags_after_single_delete, task_after_delete_single.getTags()); + } +} \ No newline at end of file diff --git a/src/test/java/com/javarush/jira/bugtracking/task/TaskTestData.java b/src/test/java/com/javarush/jira/bugtracking/task/TaskTestData.java index a1584e98f..6d6a36915 100644 --- a/src/test/java/com/javarush/jira/bugtracking/task/TaskTestData.java +++ b/src/test/java/com/javarush/jira/bugtracking/task/TaskTestData.java @@ -9,6 +9,7 @@ import com.javarush.jira.common.to.CodeDTO; import java.util.List; +import java.util.Set; import static com.javarush.jira.bugtracking.ObjectType.TASK; import static com.javarush.jira.login.internal.web.UserTestData.ADMIN_ID; @@ -59,9 +60,19 @@ public class TaskTestData { public static final UserBelong userTask2Assignment1 = new UserBelong(2L, TASK, USER_ID, "task_developer"); public static final UserBelong userTask2Assignment2 = new UserBelong(2L, TASK, USER_ID, "task_tester"); + // data for test tags + public static final Set tags_data = Set.of("tag1", "tag2", "tag3"); + public static final Set tags_data_to_add = Set.of("tag4", "tag5"); + public static final Set tags_data_after_add = Set.of("tag1", "tag2", "tag3", "tag4", "tag5"); + public static final Set tags_for_replace = Set.of("tag6", "tag7"); + public static final String tag_for_single_delete = "tag2"; + public static final Set tags_after_single_delete = Set.of("tag1", "tag3"); + + static { taskDTOFull1.setActivityDTOs(activityDTOsForTask1); taskDTOFull2.setActivityDTOs(activityDTOsForTask2); + taskDTOFull1.setTags(tags_data); } public static TaskDTOExt getNewTaskDTO() { diff --git a/src/test/resources/data.sql b/src/test/resources/data.sql index 5087dbddc..81188110c 100644 --- a/src/test/resources/data.sql +++ b/src/test/resources/data.sql @@ -79,6 +79,10 @@ values ('Data', 'epic', 'in_progress', 1, 1, '2023-05-15 09:05:10'), ('task-6', 'task', 'done', 2, 5, '2023-06-14 09:28:10'), ('task-7', 'task', 'canceled', 2, 5, '2023-06-14 09:28:10'); +insert into TASK_TAG (TASK_ID, TAG) +values (1, 'tag1'), + (1, 'tag2'), + (1, 'tag3'); insert into ACTIVITY(AUTHOR_ID, TASK_ID, UPDATED, COMMENT, TITLE, DESCRIPTION, ESTIMATE, TYPE_CODE, STATUS_CODE, PRIORITY_CODE) From 81ab86574edbf4b9d3ede4bd6a9ab1ef247db230 Mon Sep 17 00:00:00 2001 From: ganka-xn Date: Mon, 9 Dec 2024 17:36:42 +0300 Subject: [PATCH 07/12] Task 2.1. Use of .env for environment variables added --- .gitignore | 2 + src/main/resources/application.yaml | 49 +++++++++++++++++++++++- src/main/resources/environment-vars.yaml | 5 ++- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 67702562f..7d28ad795 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,6 @@ target logs attachments *.patch + +properties.env #src/main/resources/environment-vars.yaml \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 5df77ed2f..c3600010c 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,14 +1,15 @@ # https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html app: host-url: http://localhost:8080 + test-mail: jira4jr@gmail.com templates-update-cache: 5s mail-sending-props: core-pool-size: 8 max-pool-size: 100 spring: - config: - import: classpath:environment-vars.yaml +# config: +# import: classpath:environment-vars.yaml init: mode: never jpa: @@ -27,6 +28,11 @@ spring: # https://stackoverflow.com/questions/21257819/what-is-the-difference-between-hibernate-jdbc-fetch-size-and-hibernate-jdbc-batc jdbc.batch_size: 20 + datasource: + url: ${POSTGRES_DB} + username: ${POSTGRES_USER} + password: ${POSTGRES_PASSWORD} + liquibase: changeLog: "classpath:db/changelog.sql" @@ -43,10 +49,49 @@ spring: cache-names: users caffeine.spec: maximumSize=10000,expireAfterAccess=5m + security: + oauth2: + client: + registration: + github: + client-id: ${GITHUB_CLIENT_ID} + client-secret: ${GITHUB_CLIENT_SECRET} + scope: + - ${GITHUB_SCOPE} + google: + client-id: ${GOOGLE_CLIENT_ID} + client-secret: ${GOOGLE_CLIENT_SECRET} + scope: ${GOOGLE_SCOPE} + gitlab: + client-id: ${GITLAB_CLIENT_ID} + client-secret: ${GITLAB_CLIENT_SECRET} + client-name: ${GITLAB_CLIENT_NAME} + redirect-uri: ${GITLAB_REDIRECT_URL} + authorization-grant-type: ${GITLAB_AUTH_GRANT_TYPE} + scope: ${GITLAB_SCOPE} + provider: + gitlab: + authorization-uri: ${GITLAB_AUTH_URI} + token-uri: ${GITLAB_TOKEN_URI} + user-info-uri: ${GITLAB_USER_INFO_URI} + user-name-attribute: ${GITLAB_USER_NAME_ATTR} + sql: init: mode: always + mail: + properties: + mail: + smtp: + starttls: + enable: true + auth: true + host: smtp.gmail.com + port: 587 + username: jira4jr@gmail.com + password: ${EMAIL_PASSWORD} + thymeleaf.check-template-location: false mvc.throw-exception-if-no-handler-found: true diff --git a/src/main/resources/environment-vars.yaml b/src/main/resources/environment-vars.yaml index 60a892897..37bbea936 100644 --- a/src/main/resources/environment-vars.yaml +++ b/src/main/resources/environment-vars.yaml @@ -1,3 +1,5 @@ +# alternative config + app: test-mail: jira4jr@gmail.com @@ -29,6 +31,7 @@ spring: redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" authorization-grant-type: authorization_code scope: read_user + provider: gitlab: authorization-uri: https://gitlab.com/oauth/authorize @@ -46,4 +49,4 @@ spring: host: smtp.gmail.com username: jira4jr@gmail.com password: zdfzsrqvgimldzyj - port: 587 \ No newline at end of file + port: 587 From 95f79afcc8b3ac74e77aee8250178fa85894b809 Mon Sep 17 00:00:00 2001 From: ganka-xn Date: Mon, 9 Dec 2024 20:19:29 +0300 Subject: [PATCH 08/12] Task 4. Testcontainers --- pom.xml | 14 ++++++++ src/main/resources/application.yaml | 2 +- .../java/com/javarush/jira/BaseTests.java | 33 ++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f6c152c68..736dccc30 100644 --- a/pom.xml +++ b/pom.xml @@ -142,6 +142,20 @@ junit-platform-launcher test + + + + org.testcontainers + postgresql + 1.20.4 + test + + + org.testcontainers + junit-jupiter + 1.20.4 + test + diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index c3600010c..deb34443c 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -11,7 +11,7 @@ spring: # config: # import: classpath:environment-vars.yaml init: - mode: never + mode: always jpa: show-sql: true open-in-view: false diff --git a/src/test/java/com/javarush/jira/BaseTests.java b/src/test/java/com/javarush/jira/BaseTests.java index b6ed2d1aa..164185400 100644 --- a/src/test/java/com/javarush/jira/BaseTests.java +++ b/src/test/java/com/javarush/jira/BaseTests.java @@ -1,9 +1,40 @@ package com.javarush.jira; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; -@SpringBootTest +@Testcontainers +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @ActiveProfiles("test") abstract class BaseTests { + + @Container + static final PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer<>("postgres") + .withPassword("inmemory") + .withUsername("inmemory"); + + static { + try { + postgreSQLContainer.start(); + } catch (Exception e) { + throw new IllegalStateException("Cannot start PostgreSQL container", e); + } + postgreSQLContainer.waitingFor(Wait.forListeningPort()); + } + + @DynamicPropertySource + static void setProperties(DynamicPropertyRegistry registry) { + registry.add("spring.datasource.url", postgreSQLContainer::getJdbcUrl); + registry.add("spring.datasource.password", postgreSQLContainer::getPassword); + registry.add("spring.datasource.username", postgreSQLContainer::getUsername); + } + } From a06c6ba309878c327544add3dcdbf6e60f1c2759 Mon Sep 17 00:00:00 2001 From: ganka-xn Date: Thu, 12 Dec 2024 20:36:53 +0300 Subject: [PATCH 09/12] Task 11. Localization --- .gitignore | 3 +- README.md | 3 +- properties.env | 36 ++++ resources/mails/email-confirmation.html | 21 +- resources/mails/password-reset.html | 10 +- resources/static/css/main.css | 5 + resources/view/404.html | 64 +++--- resources/view/admin/users.html | 47 +++-- resources/view/dashboard.html | 20 +- resources/view/exception.html | 2 +- resources/view/index.html | 7 +- resources/view/layout/bugtrackLayout.html | 30 +-- resources/view/layout/footer.html | 46 ++--- resources/view/layout/header.html | 25 ++- resources/view/layout/lang.html | 8 + resources/view/layout/main.html | 2 +- resources/view/layout/sidebar.html | 22 +- resources/view/login.html | 23 +-- resources/view/profile.html | 40 ++-- resources/view/project-edit.html | 4 +- resources/view/project.html | 4 +- resources/view/references.html | 28 ++- resources/view/report.html | 22 +- resources/view/sprint-edit.html | 4 +- resources/view/sprint.html | 6 +- resources/view/task-edit.html | 16 +- resources/view/task.html | 37 ++-- resources/view/tree.html | 6 +- resources/view/unauth/change-password.html | 11 +- resources/view/unauth/forgot-password.html | 18 +- resources/view/unauth/register.html | 24 ++- .../common/internal/config/LocaleConfig.java | 35 ++++ src/main/resources/application.yaml | 8 +- src/main/resources/messages.properties | 194 ++++++++++++++++++ src/main/resources/messages_en.properties | 194 ++++++++++++++++++ src/main/resources/messages_ru.properties | 190 +++++++++++++++++ 36 files changed, 941 insertions(+), 274 deletions(-) create mode 100644 properties.env create mode 100644 resources/view/layout/lang.html create mode 100644 src/main/java/com/javarush/jira/common/internal/config/LocaleConfig.java create mode 100644 src/main/resources/messages.properties create mode 100644 src/main/resources/messages_en.properties create mode 100644 src/main/resources/messages_ru.properties diff --git a/.gitignore b/.gitignore index 7d28ad795..08516de94 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,6 @@ logs attachments *.patch -properties.env +#properties.env + #src/main/resources/environment-vars.yaml \ No newline at end of file diff --git a/README.md b/README.md index fb976d3d7..f6af4788d 100644 --- a/README.md +++ b/README.md @@ -40,4 +40,5 @@ 6. Рефакторинг метода com.javarush.jira.bugtracking.attachment.FileUtil#upload, чтобы он использовал современный подход для работы с файловой системмой. 7. Добавить новый функционал: добавления тегов к задаче (REST API + реализация на сервисе). + Вместе с тестами. -8. \ No newline at end of file +11. Добавить локализацию минимум на двух языках для шаблонов писем (mails) и стартовой страницы index.html. +. \ No newline at end of file diff --git a/properties.env b/properties.env new file mode 100644 index 000000000..b240ee2bd --- /dev/null +++ b/properties.env @@ -0,0 +1,36 @@ +# Database env +SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/jira +SPRING_DATASOURCE_USER=jira +SPRING_DATASOURCE_PASSWORD=JiraRush + +# OAuth2 env +# GITHUB +GITHUB_CLIENT_ID=3d0d8738e65881fff266 +GITHUB_CLIENT_SECRET=0f97031ce6178b7dfb67a6af587f37e222a16120 +GITHUB_SCOPE=email + +# Google +GOOGLE_CLIENT_ID=329113642700-f8if6pu68j2repq3ef6umd5jgiliup60.apps.googleusercontent.com +GOOGLE_CLIENT_SECRET=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 +GOOGLE_SCOPE=email,profile + +# GitLab +GITLAB_CLIENT_ID=b8520a3266089063c0d8261cce36971defa513f5ffd9f9b7a3d16728fc83a494 +GITLAB_CLIENT_SECRET=e72c65320cf9d6495984a37b0f9cc03ec46be0bb6f071feaebbfe75168117004 +GITLAB_CLIENT_NAME=GitLab +GITLAB_REDIRECT_URL="{baseUrl}/login/oauth2/code/{registrationId}" +GITLAB_AUTH_GRANT_TYPE=authorization_code +GITLAB_SCOPE=read_user + +GITLAB_AUTH_URI=https://gitlab.com/oauth/authoriz +GITLAB_TOKEN_URI=https://gitlab.com/oauth/token +GITLAB_USER_INFO_URI=https://gitlab.com/api/v4/user +GITLAB_USER_NAME_ATTR=email + +# Email env +EMAIL_SMTP_AUTH=true +EMAIL_STARTTLS_ENABLE=true +EMAIL_HOST=smtp.gmail.com +EMAIL_PORT=587 +EMAIL_USERNAME=jira4jr@gmail.com +EMAIL_PASSWORD=zdfzsrqvgimldzyj diff --git a/resources/mails/email-confirmation.html b/resources/mails/email-confirmation.html index 106e6129a..d44e10cda 100644 --- a/resources/mails/email-confirmation.html +++ b/resources/mails/email-confirmation.html @@ -1,13 +1,12 @@ - - - JiraRush - подтверждение почты - - - -

-

Чтобы завершить настройку учетной записи и начать пользоваться JiraRush, подтвердите, что вы правильно указали вашу - электронную почту.

-Подтвердить почту - + + + JiraRush - confirm email + + + +

+

Before using JiraRush and complete account setup please confirm your email.

+ Confirm email + \ No newline at end of file diff --git a/resources/mails/password-reset.html b/resources/mails/password-reset.html index b37a49007..810a2fbdc 100644 --- a/resources/mails/password-reset.html +++ b/resources/mails/password-reset.html @@ -1,12 +1,12 @@ - + - JiraRush - установить новый пароль + JiraRush - setup new password -

-

-Установить пароль +

+

+Setup password \ No newline at end of file diff --git a/resources/static/css/main.css b/resources/static/css/main.css index 9aeb0c406..300338f40 100644 --- a/resources/static/css/main.css +++ b/resources/static/css/main.css @@ -72,6 +72,11 @@ } } +/*.nav-link {*/ +/* padding: 0.1rem 1rem;*/ +/* font-size: 1rem;*/ +/*}*/ + .sidebar-nav, .accordion-body, .accordion-button, .accordion-button:not(.collapsed) { background-color: var(--nav); color: darkgray; diff --git a/resources/view/404.html b/resources/view/404.html index 734f45370..bb37e329a 100644 --- a/resources/view/404.html +++ b/resources/view/404.html @@ -1,26 +1,23 @@ - + - Application Error + Application Error -

- -
-
-

-

404 NOT_FOUND

-

No page here

+

404 NOT_FOUND

+

No page here

-
diff --git a/resources/view/admin/users.html b/resources/view/admin/users.html index 5b772a33a..6365c8bfc 100644 --- a/resources/view/admin/users.html +++ b/resources/view/admin/users.html @@ -1,21 +1,21 @@ - +
-

Users

- +

Users

+ - - - - - - - + + + + + + + @@ -23,7 +23,6 @@

Users

First nameLast nameDisplay nameEmailRolesRegisteredActiveFirst nameLast nameDisplay nameEmailRolesRegisteredActive
-
-

- New here? Create account +

+ New here? Create account

@@ -63,4 +63,3 @@

Sign in

- diff --git a/resources/view/profile.html b/resources/view/profile.html index 989b23d93..85d4b4c3d 100644 --- a/resources/view/profile.html +++ b/resources/view/profile.html @@ -1,5 +1,5 @@ - + @@ -12,12 +12,12 @@