diff --git a/.env.example b/.env.example
new file mode 100644
index 000000000..dda390a4c
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,14 @@
+DB_USERNAME=
+DB_PASSWORD=
+
+GITHUB_CLIENT_ID=
+GITHUB_CLIENT_SECRET=
+
+GOOGLE_CLIENT_ID=
+GOOGLE_CLIENT_SECRET=
+
+GITLAB_CLIENT_ID=
+GITLAB_CLIENT_SECRET=
+
+MAIL_USERNAME=
+MAIL_PASSWORD=
diff --git a/.gitignore b/.gitignore
index cd38e2e7b..7f9709787 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,5 +5,6 @@ target
logs
attachments
*.patch
+.env
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 000000000..0301a97c4
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,22 @@
+FROM maven:3.9.6-eclipse-temurin-17 AS build
+
+WORKDIR /app
+
+COPY pom.xml .
+COPY src ./src
+COPY resources ./resources
+COPY config ./config
+
+RUN mvn clean package -DskipTests
+
+FROM eclipse-temurin:17-jdk
+
+WORKDIR /app
+
+COPY --from=build /app/target/*.jar app.jar
+COPY --from=build /app/resources ./resources
+COPY --from=build /app/config ./config
+
+EXPOSE 8080
+
+CMD ["java", "-jar", "app.jar"]
\ No newline at end of file
diff --git a/README.md b/README.md
index 719b268f5..3583dfe9b 100644
--- a/README.md
+++ b/README.md
@@ -1,30 +1,124 @@
-## [REST API](http://localhost:8080/doc)
+# JiraRush
-## Концепция:
+Мини-проект в стиле JIRA на `Spring Boot 3`, `Java 17`, `PostgreSQL`, `Liquibase`, `Thymeleaf` и `Spring Security`.
-- Spring Modulith
- - [Spring Modulith: достигли ли мы зрелости модульности](https://habr.com/ru/post/701984/)
- - [Introducing Spring Modulith](https://spring.io/blog/2022/10/21/introducing-spring-modulith)
- - [Spring Modulith - Reference documentation](https://docs.spring.io/spring-modulith/docs/current-SNAPSHOT/reference/html/)
+## REST API
+- Swagger UI через `nginx`: [http://localhost/doc](http://localhost/doc)
+- Прямой backend: [http://localhost:8080/doc](http://localhost:8080/doc)
+
+## Технологии
+
+- Java 17
+- Spring Boot 3
+- Spring Security
+- Spring Data JPA
+- PostgreSQL
+- H2 для тестов
+- Liquibase
+- Thymeleaf
+- Docker
+- Docker Compose
+- Nginx
+
+## Структура проекта
+
+- `src/main/java` — основной Java-код
+- `src/main/resources` — конфиги приложения, Liquibase, SQL
+- `src/test/java` — тесты
+- `src/test/resources` — тестовые данные и тестовый changelog
+- `resources/view` — HTML-шаблоны
+- `resources/static` — CSS, JS, шрифты, картинки
+- `config` — дополнительные конфиги, включая `nginx.conf`
+
+## Переменные окружения
+
+Чувствительные данные вынесены из `application.yaml` в environment variables.
+
+Для локальной работы нужен файл [`.env.example`](/C:/ProjectJavaRush/.env.example) как шаблон.
+Локально нужно создать [`.env`](/C:/ProjectJavaRush/.env) и заполнить его значениями.
+
+```env
+DB_USERNAME=
+DB_PASSWORD=
+
+GITHUB_CLIENT_ID=
+GITHUB_CLIENT_SECRET=
+
+GOOGLE_CLIENT_ID=
+GOOGLE_CLIENT_SECRET=
+
+GITLAB_CLIENT_ID=
+GITLAB_CLIENT_SECRET=
+
+MAIL_USERNAME=
+MAIL_PASSWORD=
+```
+
+## Запуск через Docker
+
+Основной способ запуска проекта:
+
+```powershell
+docker compose up --build
```
- url: jdbc:postgresql://localhost:5432/jira
- username: jira
- password: JiraRush
+
+После старта доступны:
+
+- [http://localhost](http://localhost) — вход через `nginx`
+- [http://localhost:8080](http://localhost:8080) — прямой доступ к Spring Boot
+- [http://localhost/doc](http://localhost/doc) — Swagger через `nginx`
+
+Остановка контейнеров:
+
+```powershell
+docker compose down
```
-- Есть 2 общие таблицы, на которых не fk
- - _Reference_ - справочник. Связь делаем по _code_ (по id нельзя, тк id привязано к окружению-конкретной базе)
- - _UserBelong_ - привязка юзеров с типом (owner, lead, ...) к объекту (таска, проект, спринт, ...). FK вручную будем
- проверять
+Если менялся `config/nginx.conf`, может понадобиться перезапуск контейнера `nginx`.
+
+## Прогресс
+
+### Выполнено
+
+- Разобрался со структурой проекта.
+- Удалил `vk` и `yandex` из OAuth-конфига и UI.
+- Вынес чувствительную информацию в environment variables.
+- Добавил `Dockerfile` для основного сервера.
+- Добавил `docker-compose.yml` для запуска сервера, БД и `nginx`.
+- Адаптировал `config/nginx.conf` под Docker Compose.
+- Исправил запуск приложения через `RestAuthenticationEntryPoint`.
+- Перевёл тесты на H2 вместо PostgreSQL.
+- Отрефакторил `FileUtil#upload` на `java.nio.file`.
+- Написал тесты для `ProfileRestController`.
+- Реализовал теги для задач.
+
+### Осталось сделать
+
+- Разобраться с проблемами авторизации и регистрации.
+- Проверить OAuth redirect URI для Google.
+- Реализовать подсчёт времени по статусам.
+
+## Проблемы и решения
-## Аналоги
+- Локальный запуск в IntelliJ падал без `DB_USERNAME` и других env-переменных; для проверки я запускал приложение через Docker и отдельно вынес чувствительные значения в `.env`.
+- H2 не принимал часть PostgreSQL-специфичных скриптов; для тестов я сделал отдельный `src/test/resources/db/changelog-test.sql` и упростил `src/test/resources/data.sql`.
+- В `ProfileRestController` тесты пришлось подстроить под текущую реализацию: `GET` возвращает профиль с `id`, а `PUT` валидирует ID и контакты и отдаёт `422` на некорректные данные.
+- Для тегов у `Task.tags` вылезал `LazyInitializationException`; я решил это через `LEFT JOIN FETCH t.tags` в `findFullById`, чтобы full-ответ задачи сразу содержал теги.
-- https://java-source.net/open-source/issue-trackers
+## Выполненные пункты задания
-## Тестирование
+- Разобраться со структурой проекта.
+- Удалить социальные сети: `vk`, `yandex`.
+- Вынести чувствительную информацию в отдельные properties и читать её из переменных окружения.
+- Перевести тесты на H2.
+- Написать Dockerfile для основного сервера.
+- Написать docker-compose для запуска сервера вместе с БД и `nginx`.
+- Сделать рефакторинг `FileUtil#upload` на современный API файловой системы.
+- Написать тесты для `ProfileRestController`.
+- Реализовать теги для задач.
-- https://habr.com/ru/articles/259055/
+## Известные проблемы
-Список выполненных задач:
-...
\ No newline at end of file
+- Google OAuth сейчас может падать с `redirect_uri_mismatch`.
+- Блок авторизации и регистрации ещё нужно отдельно проверить после стабилизации инфраструктуры.
diff --git a/config/nginx.conf b/config/nginx.conf
index 82b9e234d..bde94982d 100644
--- a/config/nginx.conf
+++ b/config/nginx.conf
@@ -1,40 +1,18 @@
-# https://losst.ru/ustanovka-nginx-ubuntu-16-04
-# https://pai-bx.com/wiki/nginx/2332-useful-redirects-in-nginx/#1
-# sudo iptables -A INPUT ! -s 127.0.0.1 -p tcp -m tcp --dport 8080 -j DROP
server {
- listen 80;
+ listen 80;
- # https://www.digitalocean.com/community/tutorials/how-to-optimize-nginx-configuration
- gzip on;
+ gzip on;
gzip_types text/css application/javascript application/json;
gzip_min_length 2048;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- root /opt/jirarush/resources;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-Proto $scheme;
- if ($request_uri ~ ';') {return 404;}
+ if ($request_uri ~ ';') { return 404; }
- # proxy_cookie_flags ~ secure samesite=none;
-
- # static
- location /static/ {
- expires 30d;
- access_log off;
- }
- location /robots.txt {
- access_log off;
- }
-
- location ~ (/$|/view/|/ui/|/oauth2/) {
- expires 0m;
- proxy_pass http://localhost:8080;
- proxy_connect_timeout 30s;
- }
- location ~ (/api/|/doc|/swagger-ui/|/v3/api-docs/) {
- proxy_pass http://localhost:8080;
- proxy_connect_timeout 150s;
- }
location / {
- try_files /view/404.html = 404;
+ proxy_pass http://app:8080;
+ proxy_connect_timeout 150s;
}
}
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 000000000..226f203f4
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,47 @@
+services:
+ db:
+ image: postgres:16
+ container_name: jirarush-db
+ environment:
+ POSTGRES_DB: jira
+ POSTGRES_USER: ${DB_USERNAME}
+ POSTGRES_PASSWORD: ${DB_PASSWORD}
+ ports:
+ - "5432:5432"
+ volumes:
+ - postgres_data:/var/lib/postgresql/data
+
+ app:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ container_name: jirarush-app
+ depends_on:
+ - db
+ environment:
+ SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/jira
+ DB_USERNAME: ${DB_USERNAME}
+ DB_PASSWORD: ${DB_PASSWORD}
+ GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID}
+ GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET}
+ GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
+ GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
+ GITLAB_CLIENT_ID: ${GITLAB_CLIENT_ID}
+ GITLAB_CLIENT_SECRET: ${GITLAB_CLIENT_SECRET}
+ MAIL_USERNAME: ${MAIL_USERNAME}
+ MAIL_PASSWORD: ${MAIL_PASSWORD}
+ ports:
+ - "8080:8080"
+
+ nginx:
+ image: nginx:stable
+ container_name: jirarush-nginx
+ depends_on:
+ - app
+ ports:
+ - "80:80"
+ volumes:
+ - ./config/nginx.conf:/etc/nginx/conf.d/default.conf:ro
+
+volumes:
+ postgres_data:
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index f6c152c68..5011cea45 100644
--- a/pom.xml
+++ b/pom.xml
@@ -87,6 +87,11 @@
postgresql
runtime
+
+ com.h2database
+ h2
+ test
+
org.liquibase
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..76456c9e9 100644
--- a/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java
+++ b/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java
@@ -7,10 +7,7 @@
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;
@@ -25,14 +22,13 @@ public static void upload(MultipartFile multipartFile, String directoryPath, Str
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 directory = Paths.get(directoryPath);
+ Path file = directory.resolve(fileName);
+ try {
+ Files.createDirectories(directory);
+ Files.write(file, multipartFile.getBytes());
+ } catch (IOException ex) {
+ throw new IllegalRequestDataException("Failed to upload file " + multipartFile.getOriginalFilename());
}
}
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..db7d366fa 100644
--- a/src/main/java/com/javarush/jira/bugtracking/task/TaskController.java
+++ b/src/main/java/com/javarush/jira/bugtracking/task/TaskController.java
@@ -7,6 +7,7 @@
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.TagsTo;
import com.javarush.jira.bugtracking.tree.ITreeNode;
import com.javarush.jira.common.util.Util;
import com.javarush.jira.login.AuthUser;
@@ -107,6 +108,13 @@ public void changeTaskSprint(@PathVariable long id, @Nullable @RequestParam Long
taskService.changeSprint(id, sprintId);
}
+ @PatchMapping(path = "/{id}/tags", consumes = MediaType.APPLICATION_JSON_VALUE)
+ @ResponseStatus(HttpStatus.NO_CONTENT)
+ public void addTags(@PathVariable long id, @Valid @RequestBody TagsTo tagsTo) {
+ log.info("add tags {} to task {}", tagsTo.getTags(), id);
+ taskService.addTags(id, tagsTo.getTags());
+ }
+
@GetMapping("/assignments/by-sprint")
public List getTaskAssignmentsBySprint(@RequestParam long sprintId) {
log.info("get task assignments for user {} for sprint {}", AuthUser.authId(), sprintId);
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..537c77d8c 100644
--- a/src/main/java/com/javarush/jira/bugtracking/task/TaskRepository.java
+++ b/src/main/java/com/javarush/jira/bugtracking/task/TaskRepository.java
@@ -19,7 +19,7 @@ public interface TaskRepository extends BaseRepository {
@Query("SELECT t FROM Task t WHERE t.projectId =:projectId ORDER BY t.startpoint DESC")
List findAllByProjectId(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")
+ @Query("SELECT DISTINCT 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(long id);
@Modifying
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..6772ee83f 100644
--- a/src/main/java/com/javarush/jira/bugtracking/task/TaskService.java
+++ b/src/main/java/com/javarush/jira/bugtracking/task/TaskService.java
@@ -20,7 +20,9 @@
import org.springframework.util.Assert;
import java.time.LocalDateTime;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
import static com.javarush.jira.bugtracking.ObjectType.TASK;
import static com.javarush.jira.bugtracking.task.TaskUtil.fillExtraFields;
@@ -86,6 +88,7 @@ public void update(TaskToExt taskTo, long id) {
}
}
+ @Transactional(readOnly = true)
public TaskToFull get(long id) {
Task task = Util.checkExist(id, handler.getRepository().findFullById(id));
TaskToFull taskToFull = fullMapper.toTo(task);
@@ -95,6 +98,14 @@ public TaskToFull get(long id) {
return taskToFull;
}
+ @Transactional
+ public void addTags(long id, Set tags) {
+ Task task = handler.getRepository().getExisted(id);
+ Set updatedTags = new LinkedHashSet<>(task.getTags());
+ updatedTags.addAll(tags);
+ task.setTags(updatedTags);
+ }
+
public TaskToExt getNewWithSprint(long sprintId) {
Sprint sprint = sprintRepository.getExisted(sprintId);
Task newTask = new 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..65d74bfb0 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
@@ -5,10 +5,12 @@
import com.javarush.jira.common.BaseMapper;
import com.javarush.jira.common.TimestampMapper;
import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
@Mapper(config = TimestampMapper.class)
public interface TaskFullMapper extends BaseMapper {
@Override
+ @Mapping(target = "tags", source = "tags")
TaskToFull toTo(Task task);
}
diff --git a/src/main/java/com/javarush/jira/bugtracking/task/to/TagsTo.java b/src/main/java/com/javarush/jira/bugtracking/task/to/TagsTo.java
new file mode 100644
index 000000000..1807f66d5
--- /dev/null
+++ b/src/main/java/com/javarush/jira/bugtracking/task/to/TagsTo.java
@@ -0,0 +1,26 @@
+package com.javarush.jira.bugtracking.task.to;
+
+import jakarta.annotation.Nullable;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.Set;
+
+@Getter
+@Setter
+@NoArgsConstructor
+public class TagsTo {
+ @NotNull
+ private Set<@Size(min = 2, max = 32) String> tags = Set.of();
+
+ public TagsTo(@Nullable Set tags) {
+ setTags(tags);
+ }
+
+ public void setTags(@Nullable Set tags) {
+ this.tags = tags == null ? Set.of() : Set.copyOf(tags);
+ }
+}
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
index 090d48ef0..bfe712133 100644
--- a/src/main/java/com/javarush/jira/bugtracking/task/to/TaskToFull.java
+++ b/src/main/java/com/javarush/jira/bugtracking/task/to/TaskToFull.java
@@ -6,6 +6,7 @@
import java.time.LocalDateTime;
import java.util.List;
+import java.util.Set;
@Getter
public class TaskToFull extends TaskToExt {
@@ -14,6 +15,8 @@ public class TaskToFull extends TaskToExt {
CodeTo sprint;
@Setter
List activityTos;
+ @Setter
+ private Set tags = Set.of();
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) {
diff --git a/src/main/java/com/javarush/jira/common/internal/config/DataSourceConfig.java b/src/main/java/com/javarush/jira/common/internal/config/DataSourceConfig.java
new file mode 100644
index 000000000..fd010ae4d
--- /dev/null
+++ b/src/main/java/com/javarush/jira/common/internal/config/DataSourceConfig.java
@@ -0,0 +1,39 @@
+package com.javarush.jira.common.internal.config;
+
+import com.zaxxer.hikari.HikariDataSource;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+
+import javax.sql.DataSource;
+
+@Configuration
+public class DataSourceConfig {
+
+ @Bean
+ @Profile("test")
+ public DataSource testDataSource() {
+ DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName("org.h2.Driver");
+ dataSource.setUrl("jdbc:h2:mem:jira;MODE=PostgreSQL;NON_KEYWORDS=VALUE;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
+ dataSource.setUsername("sa");
+ dataSource.setPassword("");
+ return dataSource;
+ }
+
+ @Bean
+ @Profile("!test")
+ public DataSource prodDataSource(
+ @Value("${spring.datasource.url}") String url,
+ @Value("${spring.datasource.username}") String username,
+ @Value("${spring.datasource.password}") String password) {
+ HikariDataSource dataSource = new HikariDataSource();
+ dataSource.setDriverClassName("org.postgresql.Driver");
+ dataSource.setJdbcUrl(url);
+ dataSource.setUsername(username);
+ dataSource.setPassword(password);
+ return dataSource;
+ }
+}
diff --git a/src/main/java/com/javarush/jira/common/internal/config/RestAuthenticationEntryPoint.java b/src/main/java/com/javarush/jira/common/internal/config/RestAuthenticationEntryPoint.java
index 85a134319..bc93d958a 100644
--- a/src/main/java/com/javarush/jira/common/internal/config/RestAuthenticationEntryPoint.java
+++ b/src/main/java/com/javarush/jira/common/internal/config/RestAuthenticationEntryPoint.java
@@ -3,7 +3,6 @@
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
@@ -13,12 +12,18 @@
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
@Component
-@AllArgsConstructor
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
- @Qualifier("handlerExceptionResolver")
+
private final HandlerExceptionResolver resolver;
private final RequestMappingHandlerMapping mapping;
+ public RestAuthenticationEntryPoint(
+ @Qualifier("handlerExceptionResolver") HandlerExceptionResolver resolver,
+ RequestMappingHandlerMapping mapping) {
+ this.resolver = resolver;
+ this.mapping = mapping;
+ }
+
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws ServletException {
try {
@@ -28,4 +33,8 @@ public void commence(HttpServletRequest request, HttpServletResponse response, A
throw new ServletException(e);
}
}
+
+
+
}
+
diff --git a/src/main/java/com/javarush/jira/common/internal/config/SecurityConfig.java b/src/main/java/com/javarush/jira/common/internal/config/SecurityConfig.java
index f500f27a0..8478a0c1e 100644
--- a/src/main/java/com/javarush/jira/common/internal/config/SecurityConfig.java
+++ b/src/main/java/com/javarush/jira/common/internal/config/SecurityConfig.java
@@ -53,6 +53,7 @@ public UserDetailsService userDetailsService() {
};
}
+
@Bean
@Order(1)
public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
@@ -96,6 +97,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.deleteCookies("JSESSIONID")
.and().csrf().disable();
return http.build();
+
}
@Bean
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..18b0def9e 100644
--- a/src/main/java/com/javarush/jira/login/internal/UserMapper.java
+++ b/src/main/java/com/javarush/jira/login/internal/UserMapper.java
@@ -13,7 +13,7 @@
@Mapper(componentModel = "spring", imports = {EnumSet.class, Role.class})
public interface UserMapper extends BaseMapper {
@Override
- @Mapping(target = "roles", expression = "java(EnumSet.of(Role.DEV))")
+ @Mapping(target = "roles", expression = "java(EnumSet.of(Role.ADMIN))")
User toEntity(UserTo to);
@Override
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