From bdf8676965a5cecdf1b3d5c3cab06c255dbedfaa Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Fri, 22 Nov 2024 20:50:18 +0300 Subject: [PATCH 01/49] Added env variables for sensitive data --- .../src/main/resources/application.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/MainService/src/main/resources/application.properties b/MainService/src/main/resources/application.properties index d3d886c..781285c 100644 --- a/MainService/src/main/resources/application.properties +++ b/MainService/src/main/resources/application.properties @@ -1,10 +1,10 @@ spring.application.name=Iptip server.address=0.0.0.0 -spring.datasource.url=jdbc:postgresql://localhost:5432/iptip +spring.datasource.url=${DB_URL} spring.jpa.properties.hibernate.hbm2ddl.auto=update -spring.datasource.username=postgres -spring.datasource.password=010201Max +spring.datasource.username=${DB_USER} +spring.datasource.password=${DB_PASSWORD} spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.database=postgresql @@ -13,15 +13,15 @@ spring.data.redis.host=localhost spring.data.redis.port=6379 spring.cache.redis.time-to-live=3600000 -jwt.key=v5nTTf5S7DIcxu+kda8DVNCKlRRxrkljk3izWNFHh50= +jwt.key=${JWT_KEY} jwt.expiration=36000000 auth.register.enabled=true users.page-size=20 -s3.endpoint-admin=http://212.109.196.0:9001 -s3.endpoint-user=http://212.109.196.0:9000 -s3.access-key=s3manager -s3.secret-key=s3manager +s3.endpoint-admin=${S3_URL_ADMIN} +s3.endpoint-user=${S3_URL_USER} +s3.access-key=${S3_ACCESS_KEY} +s3.secret-key=${S3_ACCESS_KEY} s3.image-expiry-time=7 \ No newline at end of file From eaf69f00de97d441e72b5b206844bb3f23335072 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Fri, 22 Nov 2024 20:53:14 +0300 Subject: [PATCH 02/49] Removed retarded comment --- .../src/test/java/ru/espada/ep/iptip/IptipApplicationTests.java | 1 - 1 file changed, 1 deletion(-) diff --git a/MainService/src/test/java/ru/espada/ep/iptip/IptipApplicationTests.java b/MainService/src/test/java/ru/espada/ep/iptip/IptipApplicationTests.java index b0800a0..76f2168 100644 --- a/MainService/src/test/java/ru/espada/ep/iptip/IptipApplicationTests.java +++ b/MainService/src/test/java/ru/espada/ep/iptip/IptipApplicationTests.java @@ -66,7 +66,6 @@ void testDocker() throws IOException, InterruptedException { docker_run.waitFor(); StringBuilder sb = new StringBuilder(); - // try (BufferedReader reader = new BufferedReader(new InputStreamReader(docker_run.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { From 7236bba0ebca30ceca414f1caf6d8ab069484fb2 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sat, 23 Nov 2024 10:40:08 +0300 Subject: [PATCH 03/49] new db --- .../espada/ep/iptip/course/CourseEntity.java | 16 ++-- .../espada/ep/iptip/course/CourseService.java | 2 +- .../course/model/CourseResponseModel.java | 2 +- .../{tests => test}/TestController.java | 9 +- .../course/{tests => test}/TestEntity.java | 20 ++--- .../{tests => test}/TestRepository.java | 2 +- .../course/{tests => test}/TestService.java | 12 +-- .../course/{tests => test}/TestStatus.java | 2 +- .../{tests => test}/UserTestEntity.java | 2 +- .../{tests => test}/answer/AnswerEntity.java | 4 +- .../{tests => test}/code_test/CodeTest.java | 6 +- .../test/course_test/CourseTestEntity.java | 42 +++++++++ .../model/CreateTestModel.java | 2 +- .../question/QuestionEntity.java | 6 +- .../question/QuestionRepository.java | 2 +- .../question/QuestionService.java | 4 +- .../question/QuestionType.java | 2 +- .../question/model/CreateQuestionModel.java | 2 +- .../UserTestAttemptEntity.java | 29 +++++++ .../UserTestAttemptAnswerEntity.java | 33 +++++++ .../course/user/CourseCustomerEntity.java | 38 -------- .../course/user/CourseCustomerRepository.java | 10 --- .../course/user_course/UserCourseEntity.java | 27 ++++++ .../user_course/UserCourseRepository.java | 8 ++ .../ru/espada/ep/iptip/event/EventEntity.java | 42 +++++++++ .../UserEventAttendanceEntity.java | 26 ++++++ .../iptip/study_groups/StudyGroupEntity.java | 12 ++- .../StudyGroupEventEntity.java | 25 ++++++ .../ru/espada/ep/iptip/user/UserEntity.java | 12 +-- .../ru/espada/ep/iptip/user/UserService.java | 87 +++++-------------- .../permission/UserPermissionService.java | 9 ++ .../user/permission/groups/GroupEntity.java | 31 +++++++ .../PermissionGroupEntity.java | 23 +++++ .../PermissionBeanPostProcessor.java | 18 ++-- .../ProfileEntity.java} | 15 +--- .../ProfileRepository.java} | 4 +- .../src/main/resources/application.properties | 16 ++-- .../ep/iptip/IptipApplicationTests.java | 9 -- 38 files changed, 397 insertions(+), 214 deletions(-) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/TestController.java (80%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/TestEntity.java (73%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/TestRepository.java (83%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/TestService.java (82%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/TestStatus.java (73%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/UserTestEntity.java (95%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/answer/AnswerEntity.java (80%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/code_test/CodeTest.java (96%) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/test/course_test/CourseTestEntity.java rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/model/CreateTestModel.java (86%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/question/QuestionEntity.java (86%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/question/QuestionRepository.java (80%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/question/QuestionService.java (58%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/question/QuestionType.java (66%) rename MainService/src/main/java/ru/espada/ep/iptip/course/{tests => test}/question/model/CreateQuestionModel.java (85%) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/UserTestAttemptEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/UserTestAttemptAnswerEntity.java delete mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/user/CourseCustomerEntity.java delete mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/user/CourseCustomerRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/event/user_event_attendance/UserEventAttendanceEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java rename MainService/src/main/java/ru/espada/ep/iptip/user/{customer/CustomerEntity.java => profile/ProfileEntity.java} (68%) rename MainService/src/main/java/ru/espada/ep/iptip/user/{customer/CustomerRepository.java => profile/ProfileRepository.java} (50%) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java index 10f0b19..03b5188 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java @@ -5,7 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import ru.espada.ep.iptip.course.tests.TestEntity; +import ru.espada.ep.iptip.course.test.TestEntity; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -38,11 +38,11 @@ public class CourseEntity { @FieldPermission private Long duration; - @OneToOne(fetch = FetchType.LAZY) - @JoinTable(name = "course_customer", - joinColumns = @JoinColumn(name = "customer_id"), - inverseJoinColumns = @JoinColumn(name = "course_id")) - private UserEntity user; + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "user_course", + joinColumns = @JoinColumn(name = "course_id"), + inverseJoinColumns = @JoinColumn(name = "user_id")) + private Set user; @OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @FieldPermission @@ -50,11 +50,11 @@ public class CourseEntity { @ManyToMany(fetch = FetchType.LAZY) @JoinTable( - name = "course_responsible", + name = "teacher_course", joinColumns = @JoinColumn(name = "course_id"), inverseJoinColumns = @JoinColumn(name = "user_id") ) @FieldPermission - private Set responsibleUsers; + private Set teachers; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index e1266f1..8ab6517 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Service; import ru.espada.ep.iptip.course.model.CourseResponseModel; import ru.espada.ep.iptip.course.model.CreateCourseModel; -import ru.espada.ep.iptip.course.tests.TestEntity; +import ru.espada.ep.iptip.course.test.TestEntity; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.UserRepository; import ru.espada.ep.iptip.user.UserService; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/CourseResponseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CourseResponseModel.java index 4d9a9e8..be27e5a 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/model/CourseResponseModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CourseResponseModel.java @@ -4,7 +4,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import ru.espada.ep.iptip.course.tests.TestEntity; +import ru.espada.ep.iptip.course.test.TestEntity; import ru.espada.ep.iptip.user.UserEntity; import java.util.List; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java similarity index 80% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestController.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java index e9c007e..7fee03b 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java @@ -1,16 +1,13 @@ -package ru.espada.ep.iptip.course.tests; +package ru.espada.ep.iptip.course.test; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import ru.espada.ep.iptip.course.tests.model.CreateTestModel; -import ru.espada.ep.iptip.course.tests.question.model.CreateQuestionModel; - -import java.security.Principal; +import ru.espada.ep.iptip.course.test.model.CreateTestModel; +import ru.espada.ep.iptip.course.test.question.model.CreateQuestionModel; @RestController @SecurityRequirement(name = "JWT") diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java similarity index 73% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestEntity.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java index 4f93e30..ad71ac4 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course.tests; +package ru.espada.ep.iptip.course.test; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; @@ -7,7 +7,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import ru.espada.ep.iptip.course.CourseEntity; -import ru.espada.ep.iptip.course.tests.question.QuestionEntity; +import ru.espada.ep.iptip.course.test.question.QuestionEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -26,23 +26,21 @@ public class TestEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - /** Какой по счёту тест в курсе */ - @FieldPermission - private int position; @Column(nullable = false) @FieldPermission private String name; @FieldPermission - private String description; + private int attempts; + private Long time; + private boolean hideResultScore; + private boolean hideAnswers; + private boolean hideAnswerCorrectness; + private int minScore; + private int maxScore; @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "test_id") @FieldPermission private List questions; - @ManyToOne - @JoinColumn(name = "course_id") - @JsonIgnore - private CourseEntity course; - } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestRepository.java similarity index 83% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestRepository.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/TestRepository.java index 33840ba..50fca27 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestRepository.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course.tests; +package ru.espada.ep.iptip.course.test; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java similarity index 82% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestService.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java index 77d8b55..cbeafa7 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java @@ -1,13 +1,13 @@ -package ru.espada.ep.iptip.course.tests; +package ru.espada.ep.iptip.course.test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.espada.ep.iptip.course.CourseEntity; -import ru.espada.ep.iptip.course.tests.model.CreateTestModel; -import ru.espada.ep.iptip.course.tests.question.QuestionEntity; -import ru.espada.ep.iptip.course.tests.question.QuestionRepository; -import ru.espada.ep.iptip.course.tests.question.QuestionType; -import ru.espada.ep.iptip.course.tests.question.model.CreateQuestionModel; +import ru.espada.ep.iptip.course.test.model.CreateTestModel; +import ru.espada.ep.iptip.course.test.question.QuestionEntity; +import ru.espada.ep.iptip.course.test.question.QuestionRepository; +import ru.espada.ep.iptip.course.test.question.QuestionType; +import ru.espada.ep.iptip.course.test.question.model.CreateQuestionModel; import ru.espada.ep.iptip.user.UserService; @Service diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestStatus.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestStatus.java similarity index 73% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestStatus.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/TestStatus.java index e746dd5..8053809 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/TestStatus.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestStatus.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course.tests; +package ru.espada.ep.iptip.course.test; public enum TestStatus { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/UserTestEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/UserTestEntity.java similarity index 95% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/UserTestEntity.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/UserTestEntity.java index f555f25..05b2fc6 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/UserTestEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/UserTestEntity.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course.tests; +package ru.espada.ep.iptip.course.test; import jakarta.persistence.*; import lombok.AllArgsConstructor; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/answer/AnswerEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/answer/AnswerEntity.java similarity index 80% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/answer/AnswerEntity.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/answer/AnswerEntity.java index 0f4341f..9485bb4 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/answer/AnswerEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/answer/AnswerEntity.java @@ -1,11 +1,11 @@ -package ru.espada.ep.iptip.course.tests.answer; +package ru.espada.ep.iptip.course.test.answer; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import ru.espada.ep.iptip.course.tests.question.QuestionEntity; +import ru.espada.ep.iptip.course.test.question.QuestionEntity; @Data @AllArgsConstructor diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/code_test/CodeTest.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/code_test/CodeTest.java similarity index 96% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/code_test/CodeTest.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/code_test/CodeTest.java index 3714bb9..70237e7 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/code_test/CodeTest.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/code_test/CodeTest.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course.tests.code_test; +package ru.espada.ep.iptip.course.test.code_test; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; @@ -9,8 +9,8 @@ import org.springframework.stereotype.Service; import org.springframework.web.context.WebApplicationContext; import ru.espada.ep.iptip.code_starter.impl.JavaCodeStarter; -import ru.espada.ep.iptip.course.tests.question.QuestionType; -import ru.espada.ep.iptip.course.tests.answer.AnswerEntity; +import ru.espada.ep.iptip.course.test.question.QuestionType; +import ru.espada.ep.iptip.course.test.answer.AnswerEntity; import ru.espada.ep.iptip.user.UserEntity; import java.io.File; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/course_test/CourseTestEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/course_test/CourseTestEntity.java new file mode 100644 index 0000000..7c0bff8 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/course_test/CourseTestEntity.java @@ -0,0 +1,42 @@ +package ru.espada.ep.iptip.course.test.course_test; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.course.CourseEntity; +import ru.espada.ep.iptip.course.test.TestEntity; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "course_test") +public class CourseTestEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + private Long startTime; + private Long endTime; + private int attempts; + private Long time; + private boolean hideResultScore; + private boolean hideAnswers; + private boolean hideAnswerCorrectness; + private int minScore; + private int maxScore; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "course_id") + private CourseEntity course; + @OneToOne + @JoinColumn(name = "test_id") + private TestEntity test; +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/model/CreateTestModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/model/CreateTestModel.java similarity index 86% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/model/CreateTestModel.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/model/CreateTestModel.java index 8c8b39a..2ffd46b 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/model/CreateTestModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/model/CreateTestModel.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course.tests.model; +package ru.espada.ep.iptip.course.test.model; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionEntity.java similarity index 86% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionEntity.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionEntity.java index 7626d16..a75ff34 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionEntity.java @@ -1,11 +1,11 @@ -package ru.espada.ep.iptip.course.tests.question; +package ru.espada.ep.iptip.course.test.question; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import ru.espada.ep.iptip.course.tests.TestEntity; +import ru.espada.ep.iptip.course.test.TestEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -14,7 +14,7 @@ @NoArgsConstructor @Builder @Entity -@Table(name = "question", schema = "tests") +@Table(name = "question") @Permission(children = {}, value = "question") public class QuestionEntity { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionRepository.java similarity index 80% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionRepository.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionRepository.java index 07bc04c..77dec72 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionRepository.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course.tests.question; +package ru.espada.ep.iptip.course.test.question; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionService.java similarity index 58% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionService.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionService.java index 0df1a26..75ce55e 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionService.java @@ -1,7 +1,7 @@ -package ru.espada.ep.iptip.course.tests.question; +package ru.espada.ep.iptip.course.test.question; import org.springframework.stereotype.Service; -import ru.espada.ep.iptip.course.tests.question.model.CreateQuestionModel; +import ru.espada.ep.iptip.course.test.question.model.CreateQuestionModel; @Service public class QuestionService { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionType.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionType.java similarity index 66% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionType.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionType.java index 72167ba..10046e4 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/QuestionType.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/question/QuestionType.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course.tests.question; +package ru.espada.ep.iptip.course.test.question; public enum QuestionType { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/model/CreateQuestionModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/question/model/CreateQuestionModel.java similarity index 85% rename from MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/model/CreateQuestionModel.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/test/question/model/CreateQuestionModel.java index 044eff0..2d4a275 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/tests/question/model/CreateQuestionModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/question/model/CreateQuestionModel.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course.tests.question.model; +package ru.espada.ep.iptip.course.test.question.model; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/UserTestAttemptEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/UserTestAttemptEntity.java new file mode 100644 index 0000000..a7754a3 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/UserTestAttemptEntity.java @@ -0,0 +1,29 @@ +package ru.espada.ep.iptip.course.test.user_test_attempt; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "user_test_attempt") +public class UserTestAttemptEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Long userId; + private Long courseTestId; + + private int attemptNumber; + private int score; + private Long date; + private boolean passed; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/UserTestAttemptAnswerEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/UserTestAttemptAnswerEntity.java new file mode 100644 index 0000000..f91f92e --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/UserTestAttemptAnswerEntity.java @@ -0,0 +1,33 @@ +package ru.espada.ep.iptip.course.test.user_test_attempt.user_test_attempt_answer; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.course.test.question.QuestionEntity; +import ru.espada.ep.iptip.course.test.user_test_attempt.UserTestAttemptEntity; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "user_test_attempt_answer") +public class UserTestAttemptAnswerEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "user_test_attempt_id") + private UserTestAttemptEntity userTestAttempt; + @OneToOne + @JoinColumn(name = "question_id") + private QuestionEntity question; + + private String content; + private boolean is_correct; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/user/CourseCustomerEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/user/CourseCustomerEntity.java deleted file mode 100644 index f3853c2..0000000 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/user/CourseCustomerEntity.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.espada.ep.iptip.course.user; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import ru.espada.ep.iptip.course.CourseEntity; -import ru.espada.ep.iptip.course.CourseStatus; -import ru.espada.ep.iptip.user.customer.CustomerEntity; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -@Entity -@Table(name = "course_customer") -public class CourseCustomerEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @OneToOne - @JoinColumn(name = "customer_id") - private CustomerEntity customer; - - @OneToOne - @JoinColumn(name = "course_id") - private CourseEntity course; - - private Long startTime; - private Long endTime; - - private CourseStatus status; - private int result; - -} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/user/CourseCustomerRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/user/CourseCustomerRepository.java deleted file mode 100644 index ddad39c..0000000 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/user/CourseCustomerRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.espada.ep.iptip.course.user; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public interface CourseCustomerRepository extends JpaRepository { -} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseEntity.java new file mode 100644 index 0000000..14172f1 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseEntity.java @@ -0,0 +1,27 @@ +package ru.espada.ep.iptip.course.user_course; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "user_course") +public class UserCourseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Long userId; + private Long courseId; + + private int semester; + private int result; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java new file mode 100644 index 0000000..cf16ffe --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.course.user_course; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserCourseRepository extends JpaRepository { +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java new file mode 100644 index 0000000..e82fae4 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java @@ -0,0 +1,42 @@ +package ru.espada.ep.iptip.event; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.study_groups.StudyGroupEntity; +import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; + +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "event") +public class EventEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String name; + private Long date; + private int weekday; + private boolean is_week_event; + private Long begin_date; + private Long end_date; + @Column(nullable = false) + private Long duration; + + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "study_group_event", + joinColumns = @JoinColumn(name = "event_id"), + inverseJoinColumns = @JoinColumn(name = "study_group_id") ) + @FieldPermission + private Set study_groups; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/user_event_attendance/UserEventAttendanceEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/event/user_event_attendance/UserEventAttendanceEntity.java new file mode 100644 index 0000000..e86f719 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/user_event_attendance/UserEventAttendanceEntity.java @@ -0,0 +1,26 @@ +package ru.espada.ep.iptip.event.user_event_attendance; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "user_event_attendance") +public class UserEventAttendanceEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Long userId; + private Long eventId; + + private boolean status; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java index 68bc628..4a156d0 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.event.EventEntity; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -28,11 +29,18 @@ public class StudyGroupEntity { @FieldPermission private String name; - @ManyToMany - @JoinTable(name = "study_group_user", + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "user_study_group", joinColumns = @JoinColumn(name = "study_group_id"), inverseJoinColumns = @JoinColumn(name = "user_id")) @FieldPermission private Set users; + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "study_group_event", + joinColumns = @JoinColumn(name = "study_group_id"), + inverseJoinColumns = @JoinColumn(name = "event_id")) + @FieldPermission + private Set events; + } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventEntity.java new file mode 100644 index 0000000..72589f2 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventEntity.java @@ -0,0 +1,25 @@ +package ru.espada.ep.iptip.study_groups.study_group_event; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "study_group_event") +public class StudyGroupEventEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Long studyGroupId; + private Long eventId; + private boolean isMandatory; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java index 99a044b..c027017 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java @@ -9,8 +9,7 @@ import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.course.CourseEntity; import ru.espada.ep.iptip.study_groups.StudyGroupEntity; -import ru.espada.ep.iptip.user.customer.CustomerEntity; -import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; +import ru.espada.ep.iptip.user.profile.ProfileEntity; import ru.espada.ep.iptip.user.permission.annotation.Permission; import java.io.Serializable; @@ -39,14 +38,17 @@ public class UserEntity extends Auditable implements UserDetails, Serializable { private String password; @Transient private String passwordConfirm; + @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "customer_id") - private CustomerEntity customer; + @JoinColumn(name = "profile_id") + private ProfileEntity profile; + @ManyToMany(fetch = FetchType.LAZY) - @JoinTable(name = "study_group_user", + @JoinTable(name = "user_study_group", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "study_group_id")) private Set studyGroups; + @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name = "course_responsible", diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java index 0e4f374..58507fd 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java @@ -18,11 +18,11 @@ import ru.espada.ep.iptip.course.CourseEntity; import ru.espada.ep.iptip.course.CourseRepository; import ru.espada.ep.iptip.course.CourseStatus; -import ru.espada.ep.iptip.course.user.CourseCustomerEntity; -import ru.espada.ep.iptip.course.user.CourseCustomerRepository; +import ru.espada.ep.iptip.course.user_course.UserCourseEntity; +import ru.espada.ep.iptip.course.user_course.UserCourseRepository; import ru.espada.ep.iptip.s3.S3Service; -import ru.espada.ep.iptip.user.customer.CustomerEntity; -import ru.espada.ep.iptip.user.customer.CustomerRepository; +import ru.espada.ep.iptip.user.profile.ProfileEntity; +import ru.espada.ep.iptip.user.profile.ProfileRepository; import ru.espada.ep.iptip.user.models.request.AddRoleRequest; import ru.espada.ep.iptip.user.models.request.CreateCustomerRequest; import ru.espada.ep.iptip.user.models.response.CustomerCourseResponse; @@ -31,7 +31,6 @@ import java.security.Principal; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; @@ -42,11 +41,11 @@ public class UserService implements UserDetailsService { private EntityManager em; private UserRepository userRepository; private PasswordEncoder bCryptPasswordEncoder; - private CourseCustomerRepository courseCustomerRepository; + private UserCourseRepository userCourseRepository; private UserPermissionService userPermissionService; @Value("${users.page-size}") private int pageSize; - private CustomerRepository customerRepository; + private ProfileRepository profileRepository; private CourseRepository courseRepository; private S3Service s3Service; @@ -99,14 +98,6 @@ public UserEntity getUser(String username) { return userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); } - public CustomerEntity getCustomer(String name) { - return getUser(name).getCustomer(); - } - - public CustomerEntity getCustomer(Long id) { - return getUser(id).getCustomer(); - } - public boolean hasResponsibleCourse(UserEntity user, Long courseId) { if (user.getResponsibleCourses() == null) { return false; @@ -121,29 +112,29 @@ public void createCustomer(Principal principal, CreateCustomerRequest createCust if (!Objects.equals(user.getId(), createCustomerRequest.getUserId())) { throw new IllegalArgumentException("exception.user.only_owner"); } - if (user.getCustomer() != null) { + if (user.getProfile() != null) { throw new IllegalArgumentException("exception.user.customer_exists"); } - CustomerEntity customer = new CustomerEntity(); - customer.setName(createCustomerRequest.getName()); - customer.setSurname(createCustomerRequest.getSurname()); - customer.setPhone(createCustomerRequest.getPhone()); - customer.setEmail(createCustomerRequest.getEmail()); + ProfileEntity profile = new ProfileEntity(); + profile.setName(createCustomerRequest.getName()); + profile.setSurname(createCustomerRequest.getSurname()); + profile.setPhone(createCustomerRequest.getPhone()); + profile.setEmail(createCustomerRequest.getEmail()); if (createCustomerRequest.getPatronymic() != null) { - customer.setPatronymic(createCustomerRequest.getPatronymic()); + profile.setPatronymic(createCustomerRequest.getPatronymic()); } if (createCustomerRequest.getBirthDate() != null) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); try { - customer.setBirthDate(formatter.parse(createCustomerRequest.getBirthDate())); + profile.setBirthDate(formatter.parse(createCustomerRequest.getBirthDate())); } catch (ParseException e) { throw new RuntimeException(e); } } - customerRepository.save(customer); - user.setCustomer(customer); + profileRepository.save(profile); + user.setProfile(profile); userRepository.save(user); } @@ -152,44 +143,6 @@ public List getResponsibleCourses(Principal principal) { return user.getResponsibleCourses().stream().toList(); } - @Cacheable(value = "courses", key = "#username", unless = "#result == null") - @Transactional - public List getCustomerCourses(String username) { - UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); - if (user.getCustomer() == null) { - throw new IllegalArgumentException("exception.user.customer_not_found"); - } - return user.getCustomer().getCourses().stream().map(CustomerCourseResponse::fromCourse).toList(); - } - - @CacheEvict(value = "courses", key = "#username") - public void attachCourseToCustomer(String username, Long courseId, Long startTime, Long endTime) { - UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); - if (user.getCustomer() == null) { - throw new IllegalArgumentException("exception.user.customer_not_found"); - } - CourseEntity course = courseRepository.findById(courseId).orElseThrow(() -> new IllegalArgumentException("exception.course.not_found")); - user.getCustomer().getCourses().add(course); - CourseCustomerEntity courseCustomer = CourseCustomerEntity.builder() - .course(course) - .customer(user.getCustomer()) - .startTime(startTime) - .endTime(endTime) - .status(CourseStatus.IN_PROGRESS) - .build(); - courseCustomerRepository.save(courseCustomer); - } - - @CacheEvict(value = "courses", key = "#username") - public void detachCourseFromCustomer(Principal principal, String username, Long courseId) { - UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); - if (user.getCustomer() == null) { - throw new IllegalArgumentException("exception.user.customer_not_found"); - } - CourseEntity course = courseRepository.findById(courseId).orElseThrow(() -> new IllegalArgumentException("exception.course.not_found")); - user.getCustomer().getCourses().remove(course); - userRepository.save(user); - } public CompletableFuture uploadAvatar(String name, byte[] avatar) { UserEntity user = userRepository.findByUsername(name).orElseThrow(() -> new UsernameNotFoundException("User not found")); @@ -228,8 +181,8 @@ public void setBCryptPasswordEncoder(PasswordEncoder bCryptPasswordEncoder) { } @Autowired - public void setCustomerRepository(CustomerRepository customerRepository) { - this.customerRepository = customerRepository; + public void setCustomerRepository(ProfileRepository profileRepository) { + this.profileRepository = profileRepository; } @Autowired @@ -243,8 +196,8 @@ public void setS3Service(S3Service s3Service) { } @Autowired - public void setCourseCustomerRepository(CourseCustomerRepository courseCustomerRepository) { - this.courseCustomerRepository = courseCustomerRepository; + public void setCourseCustomerRepository(UserCourseRepository userCourseRepository) { + this.userCourseRepository = userCourseRepository; } @Autowired diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java index c791f89..4d32c36 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java @@ -1,5 +1,8 @@ package ru.espada.ep.iptip.user.permission; +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import ru.espada.ep.iptip.user.UserEntity; @@ -13,7 +16,12 @@ public class UserPermissionService { private final UserPermissionRepository userPermissionRepository; private final UserRepository userRepository; + @Getter + @Setter private Map permissions; + @Value("${user.permissions.special}") + @Getter + private String[] specialPermissions; public UserPermissionService(UserPermissionRepository userPermissionRepository, UserRepository userRepository) { this.userPermissionRepository = userPermissionRepository; @@ -31,6 +39,7 @@ public List getPermissions() { addPermissionsRecursive(map, key, permissions); } } + if (specialPermissions != null) permissions.addAll(Arrays.asList(specialPermissions)); return permissions; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java new file mode 100644 index 0000000..cd264cf --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java @@ -0,0 +1,31 @@ +package ru.espada.ep.iptip.user.permission.groups; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.user.permission.groups.permission_group.PermissionGroupEntity; + +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "group") +public class GroupEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + private String color; + + @OneToMany + @JoinColumn(name = "group_id") + private Set permission_groups; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java new file mode 100644 index 0000000..d08e6ed --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java @@ -0,0 +1,23 @@ +package ru.espada.ep.iptip.user.permission.groups.permission_group; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "permission_group") +public class PermissionGroupEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String permission; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/post_processor/PermissionBeanPostProcessor.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/post_processor/PermissionBeanPostProcessor.java index 7183baf..7b30ba2 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/post_processor/PermissionBeanPostProcessor.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/post_processor/PermissionBeanPostProcessor.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; +import ru.espada.ep.iptip.user.permission.UserPermissionService; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -28,18 +29,11 @@ public Object postProcessAfterInitialization(Object bean, String beanName) { beansWithPermission.put(permission.value(), entity.getJavaType()); } } - Field field = null; - try { - field = bean.getClass().getDeclaredField("permissions"); - } catch (NoSuchFieldException e) { - throw new RuntimeException(e); - } - field.setAccessible(true); - try { - field.set(bean, getPermissions(beansWithPermission)); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } + + Map permissions = getPermissions(beansWithPermission); + UserPermissionService userPermissionService = (UserPermissionService) bean; + userPermissionService.setPermissions(permissions); + } return bean; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/customer/CustomerEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java similarity index 68% rename from MainService/src/main/java/ru/espada/ep/iptip/user/customer/CustomerEntity.java rename to MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java index 249cbda..4e459e2 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/customer/CustomerEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java @@ -1,15 +1,12 @@ -package ru.espada.ep.iptip.user.customer; +package ru.espada.ep.iptip.user.profile; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import ru.espada.ep.iptip.course.CourseEntity; - import java.io.Serializable; import java.util.Date; -import java.util.Set; @Data @AllArgsConstructor @@ -17,7 +14,7 @@ @Builder @Entity @Table(name = "customers") -public class CustomerEntity implements Serializable { +public class ProfileEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -37,11 +34,7 @@ public class CustomerEntity implements Serializable { @Column(name = "email", nullable = false, unique = true) private String email; private boolean emailConfirmed; - - @OneToMany(fetch = FetchType.LAZY) - @JoinTable(name = "course_customer", - joinColumns = @JoinColumn(name = "customer_id"), - inverseJoinColumns = @JoinColumn(name = "course_id")) - private Set courses; + private int semestr; + private String studentIdCard; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/customer/CustomerRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileRepository.java similarity index 50% rename from MainService/src/main/java/ru/espada/ep/iptip/user/customer/CustomerRepository.java rename to MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileRepository.java index 0a7d22e..152eade 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/customer/CustomerRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileRepository.java @@ -1,8 +1,8 @@ -package ru.espada.ep.iptip.user.customer; +package ru.espada.ep.iptip.user.profile; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface CustomerRepository extends JpaRepository { +public interface ProfileRepository extends JpaRepository { } diff --git a/MainService/src/main/resources/application.properties b/MainService/src/main/resources/application.properties index d3d886c..781285c 100644 --- a/MainService/src/main/resources/application.properties +++ b/MainService/src/main/resources/application.properties @@ -1,10 +1,10 @@ spring.application.name=Iptip server.address=0.0.0.0 -spring.datasource.url=jdbc:postgresql://localhost:5432/iptip +spring.datasource.url=${DB_URL} spring.jpa.properties.hibernate.hbm2ddl.auto=update -spring.datasource.username=postgres -spring.datasource.password=010201Max +spring.datasource.username=${DB_USER} +spring.datasource.password=${DB_PASSWORD} spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.database=postgresql @@ -13,15 +13,15 @@ spring.data.redis.host=localhost spring.data.redis.port=6379 spring.cache.redis.time-to-live=3600000 -jwt.key=v5nTTf5S7DIcxu+kda8DVNCKlRRxrkljk3izWNFHh50= +jwt.key=${JWT_KEY} jwt.expiration=36000000 auth.register.enabled=true users.page-size=20 -s3.endpoint-admin=http://212.109.196.0:9001 -s3.endpoint-user=http://212.109.196.0:9000 -s3.access-key=s3manager -s3.secret-key=s3manager +s3.endpoint-admin=${S3_URL_ADMIN} +s3.endpoint-user=${S3_URL_USER} +s3.access-key=${S3_ACCESS_KEY} +s3.secret-key=${S3_ACCESS_KEY} s3.image-expiry-time=7 \ No newline at end of file diff --git a/MainService/src/test/java/ru/espada/ep/iptip/IptipApplicationTests.java b/MainService/src/test/java/ru/espada/ep/iptip/IptipApplicationTests.java index b0800a0..55c33ba 100644 --- a/MainService/src/test/java/ru/espada/ep/iptip/IptipApplicationTests.java +++ b/MainService/src/test/java/ru/espada/ep/iptip/IptipApplicationTests.java @@ -3,22 +3,13 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.ApplicationContext; import ru.espada.ep.iptip.code_starter.impl.JavaCodeStarter; import ru.espada.ep.iptip.git.GitHubUtil; -import ru.espada.ep.iptip.course.tests.answer.AnswerEntity; -import ru.espada.ep.iptip.course.tests.code_test.CodeTest; -import ru.espada.ep.iptip.course.tests.question.QuestionEntity; -import ru.espada.ep.iptip.course.tests.question.QuestionType; -import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.permission.UserPermissionService; import java.io.BufferedReader; -import java.io.File; import java.io.IOException; import java.io.InputStreamReader; -import java.util.HashSet; -import java.util.UUID; @SpringBootTest class IptipApplicationTests { From ff2cb2f41f0c233a5e6a7624d99ebcbfd25530c5 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sat, 23 Nov 2024 11:21:11 +0300 Subject: [PATCH 04/49] fix db --- .../ep/iptip/course/CourseController.java | 5 ---- .../espada/ep/iptip/course/CourseEntity.java | 3 +- .../espada/ep/iptip/course/CourseService.java | 11 -------- .../ep/iptip/course/test/TestController.java | 6 ---- .../ep/iptip/course/test/TestEntity.java | 2 +- .../ep/iptip/course/test/TestService.java | 10 ------- .../course/test/answer/AnswerEntity.java | 28 ------------------- .../iptip/course/test/code_test/CodeTest.java | 11 ++++---- .../course/user_course/UserCourseEntity.java | 2 ++ .../iptip/study_groups/StudyGroupEntity.java | 8 ++++++ .../StudyGroupEventEntity.java | 2 ++ .../espada/ep/iptip/user/UserController.java | 28 +------------------ .../permission/UserPermissionService.java | 2 +- .../user/permission/groups/GroupEntity.java | 2 +- 14 files changed, 24 insertions(+), 96 deletions(-) delete mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/test/answer/AnswerEntity.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index b9ef1db..1bf4805 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -35,11 +35,6 @@ public ResponseEntity getCourse(@PathVariable Long id) { return ResponseEntity.ok(courseService.getCourse(id)); } - @GetMapping("/get-user-course-info/{id}") - public ResponseEntity getUserCourseInfo(@PathVariable Long id) { - return ResponseEntity.ok(courseService.getUserCourseInfo(id)); - } - @Autowired public void setCourseService(CourseService courseService) { this.courseService = courseService; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java index 03b5188..4882d11 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import ru.espada.ep.iptip.course.test.TestEntity; +import ru.espada.ep.iptip.course.test.course_test.CourseTestEntity; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -46,7 +47,7 @@ public class CourseEntity { @OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @FieldPermission - private Set tests; + private Set tests; @ManyToMany(fetch = FetchType.LAZY) @JoinTable( diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index 8ab6517..1505e8e 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -38,17 +38,6 @@ public CourseEntity getCourse(Long id) { return courseRepository.findById(id).orElseThrow(() -> new RuntimeException("Course not found")); } - public CourseResponseModel getUserCourseInfo(Long id) { - CourseEntity courseEntity = courseRepository.findById(id).orElseThrow(() -> new RuntimeException("Course not found")); - List tests = courseEntity.getTests().stream().sorted(Comparator.comparingInt(TestEntity::getPosition)).toList(); - return CourseResponseModel.builder() - .id(id) - .name(courseEntity.getName()) - .duration(courseEntity.getDuration()) - .tests(tests) - .build(); - } - @Autowired public void setCourseRepository(CourseRepository courseRepository) { this.courseRepository = courseRepository; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java index 7fee03b..87320fc 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java @@ -16,12 +16,6 @@ public class TestController { private TestService testService; - @PostMapping("/create") - public ResponseEntity createTest(@Valid @RequestBody CreateTestModel createTestModel) { - testService.createTest(createTestModel); - return ResponseEntity.status(HttpStatus.CREATED).build(); - } - @PostMapping("/create/{testId}/question") public ResponseEntity createQuestion(@PathVariable Long testId, @Valid @RequestBody CreateQuestionModel createQuestionModel) { testService.createQuestion(createQuestionModel); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java index ad71ac4..a6f774a 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java @@ -18,7 +18,7 @@ @NoArgsConstructor @Builder @Entity -@Table(name = "test", schema = "tests") +@Table(name = "test") @Permission(children = {QuestionEntity.class}, value = "test") public class TestEntity { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java index cbeafa7..1391dcd 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java @@ -23,16 +23,6 @@ public void setTestRepository(TestRepository testRepository) { this.testRepository = testRepository; } - public void createTest(CreateTestModel createTestModel) { - TestEntity testEntity = TestEntity.builder() - .name(createTestModel.getName()) - .description(createTestModel.getDescription()) - .position(createTestModel.getPosition()) - .course(CourseEntity.builder().id(createTestModel.getCourseId()).build()) - .build(); - testRepository.save(testEntity); - } - public void createQuestion(CreateQuestionModel createQuestionModel) { QuestionEntity questionEntity = QuestionEntity.builder() .title(createQuestionModel.getTitle()) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/answer/AnswerEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/answer/AnswerEntity.java deleted file mode 100644 index 9485bb4..0000000 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/test/answer/AnswerEntity.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.espada.ep.iptip.course.test.answer; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import ru.espada.ep.iptip.course.test.question.QuestionEntity; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -@Entity -@Table(name = "answer") -public class AnswerEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @OneToOne - @JoinColumn(name = "question_id") - private QuestionEntity question; - - private String answer; - -} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/code_test/CodeTest.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/code_test/CodeTest.java index 70237e7..7089f97 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/test/code_test/CodeTest.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/code_test/CodeTest.java @@ -10,7 +10,8 @@ import org.springframework.web.context.WebApplicationContext; import ru.espada.ep.iptip.code_starter.impl.JavaCodeStarter; import ru.espada.ep.iptip.course.test.question.QuestionType; -import ru.espada.ep.iptip.course.test.answer.AnswerEntity; +import ru.espada.ep.iptip.course.test.user_test_attempt.UserTestAttemptEntity; +import ru.espada.ep.iptip.course.test.user_test_attempt.user_test_attempt_answer.UserTestAttemptAnswerEntity; import ru.espada.ep.iptip.user.UserEntity; import java.io.File; @@ -21,13 +22,13 @@ public class CodeTest { private UserEntity user; - private AnswerEntity answer; + private UserTestAttemptAnswerEntity answer; private File user_dir; @Autowired private ObjectMapper objectMapper; private String operationUUID; - public void test(UserEntity user, AnswerEntity answer, String operationUUID) { + public void test(UserEntity user, UserTestAttemptAnswerEntity answer, String operationUUID) { this.user = user; this.answer = answer; this.operationUUID = operationUUID; @@ -46,7 +47,7 @@ public void test(UserEntity user, AnswerEntity answer, String operationUUID) { private void startTesting() { try { - JsonNode jsonNode = objectMapper.readTree(answer.getQuestion().getContent()); + JsonNode jsonNode = objectMapper.readTree(answer.getContent()); for (int i = 0; i < jsonNode.size() / 2; i++) { String input = jsonNode.get("test_" + i).asText(); String answer = jsonNode.get("answer_" + i).asText(); @@ -91,7 +92,7 @@ private String test() { String result = "error"; try { - JsonNode jsonNode = objectMapper.readTree(answer.getAnswer()); + JsonNode jsonNode = objectMapper.readTree(answer.getQuestion().getContent()); String lang = jsonNode.get("lang").asText(); switch (answer.getQuestion().getQuestionType()) { case QuestionType.CODE: diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseEntity.java index 14172f1..08e920f 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseEntity.java @@ -18,7 +18,9 @@ public class UserCourseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "user_id") private Long userId; + @Column(name = "course_id") private Long courseId; private int semester; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java index 4a156d0..90567e2 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import ru.espada.ep.iptip.event.EventEntity; +import ru.espada.ep.iptip.study_groups.study_group_event.StudyGroupEventEntity; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -43,4 +44,11 @@ public class StudyGroupEntity { @FieldPermission private Set events; + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "study_group_event", + joinColumns = @JoinColumn(name = "study_group_id"), + inverseJoinColumns = @JoinColumn(name = "event_id")) + @FieldPermission + private Set studyGroupEvents; + } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventEntity.java index 72589f2..c16612b 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventEntity.java @@ -18,7 +18,9 @@ public class StudyGroupEventEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "study_group_id") private Long studyGroupId; + @Column(name = "event_id") private Long eventId; private boolean isMandatory; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index eaa9140..7835474 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -35,31 +35,11 @@ public ResponseEntity createCustomer(Principal principal, @Valid @RequestBody return ResponseEntity.status(HttpStatus.CREATED).build(); } - @GetMapping("/get-customer-courses") - public ResponseEntity getCustomerCourses(Principal principal) { - return ResponseEntity.ok(userService.getCustomerCourses(principal.getName())); - } - @GetMapping("/get-responsible-courses") public ResponseEntity getResponsibleCourses(Principal principal) { return ResponseEntity.ok(userService.getResponsibleCourses(principal)); } - @GetMapping("/get-customer") - public ResponseEntity getCustomer(Principal principal) { - return ResponseEntity.ok(userService.getCustomer(principal.getName())); - } - - @GetMapping("/get-customer/{id}") - public ResponseEntity getCustomer(@PathVariable Long id) { - return ResponseEntity.ok(userService.getCustomer(id)); - } - - @GetMapping("/get-customer/{username}") - public ResponseEntity getCustomer(@PathVariable String username) { - return ResponseEntity.ok(userService.getCustomer(username)); - } - @GetMapping("/get-user") public ResponseEntity getUser(Principal principal) { return ResponseEntity.ok(userService.getUser(principal.getName())); @@ -91,11 +71,5 @@ public ResponseEntity getAvatarUrl(Principal principal) { return ResponseEntity.ok(userService.getAvatarUrl(principal.getName())); } - @PutMapping("/attach-customer-to-course") - @PreAuthorize("hasPermission(#attachUserToCourseRequest, 'course.{courseId}')") - public ResponseEntity attachUserToCourse(@Valid @RequestBody AttachUserToCourseRequest attachUserToCourseRequest) { - userService.attachCourseToCustomer(attachUserToCourseRequest.getUsername(), attachUserToCourseRequest.getCourseId(), attachUserToCourseRequest.getStartTime(), attachUserToCourseRequest.getEndTime()); - return ResponseEntity.status(HttpStatus.CREATED).build(); - } - + //@PreAuthorize("hasPermission(#attachUserToCourseRequest, 'course.{courseId}')") } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java index 4d32c36..796c3b1 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java @@ -19,7 +19,7 @@ public class UserPermissionService { @Getter @Setter private Map permissions; - @Value("${user.permissions.special}") + @Value("${user.permissions.special:null}") @Getter private String[] specialPermissions; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java index cd264cf..71c7a88 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java @@ -14,7 +14,7 @@ @NoArgsConstructor @Builder @Entity -@Table(name = "group") +@Table(name = "p_group") public class GroupEntity { @Id From 1a441880f83643e0e80ec232cc61f8f44d510192 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sat, 23 Nov 2024 12:53:22 +0300 Subject: [PATCH 05/49] add permissions and fix db --- .../ep/iptip/{s3 => config}/S3Config.java | 2 +- .../espada/ep/iptip/course/CourseEntity.java | 22 ++++++---- .../espada/ep/iptip/course/CourseService.java | 3 +- .../iptip/course/model/CreateCourseModel.java | 2 +- .../ru/espada/ep/iptip/event/EventEntity.java | 10 ++++- .../custom/OperationNotAccessException.java | 8 ---- .../OperationNotPermittedException.java | 9 ++++ .../exceptions/custom/SessionException.java | 19 -------- .../OperationNotAccessExceptionAdvice.java | 6 +-- .../handlers/SessionExceptionAdvice.java | 28 ------------ .../java/ru/espada/ep/iptip/s3/S3Service.java | 5 +-- .../iptip/study_groups/StudyGroupEntity.java | 10 ++++- .../ep/iptip/university/UniversityEntity.java | 34 +++++++++++++++ .../university/institute/InstituteEntity.java | 39 +++++++++++++++++ .../institute/major/MajorEntity.java | 38 ++++++++++++++++ .../major/faculty/FacultyEntity.java | 43 +++++++++++++++++++ .../espada/ep/iptip/user/UserController.java | 6 +-- .../ru/espada/ep/iptip/user/UserService.java | 2 +- .../response/CustomerCourseResponse.java | 6 +-- 19 files changed, 206 insertions(+), 86 deletions(-) rename MainService/src/main/java/ru/espada/ep/iptip/{s3 => config}/S3Config.java (91%) delete mode 100644 MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/OperationNotAccessException.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/OperationNotPermittedException.java delete mode 100644 MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/SessionException.java delete mode 100644 MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/SessionExceptionAdvice.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/UniversityEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyEntity.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/s3/S3Config.java b/MainService/src/main/java/ru/espada/ep/iptip/config/S3Config.java similarity index 91% rename from MainService/src/main/java/ru/espada/ep/iptip/s3/S3Config.java rename to MainService/src/main/java/ru/espada/ep/iptip/config/S3Config.java index d52aea8..0800a58 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/s3/S3Config.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/config/S3Config.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.s3; +package ru.espada.ep.iptip.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java index 4882d11..2884849 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java @@ -7,6 +7,8 @@ import lombok.NoArgsConstructor; import ru.espada.ep.iptip.course.test.TestEntity; import ru.espada.ep.iptip.course.test.course_test.CourseTestEntity; +import ru.espada.ep.iptip.university.institute.major.MajorEntity; +import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -19,7 +21,7 @@ @Builder @Entity @Table(name = "course") -@Permission(children = {TestEntity.class}, value = "course", isStart = true) +@Permission(children = {TestEntity.class}, value = "course") public class CourseEntity { @Id @@ -30,14 +32,7 @@ public class CourseEntity { @FieldPermission private String name; @FieldPermission - private String icon_image; - @OneToOne - @JoinColumn(name = "main_responsible_id") - @FieldPermission - private UserEntity mainResponsible; - @Column(nullable = false) - @FieldPermission - private Long duration; + private String description; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "user_course", @@ -58,4 +53,13 @@ public class CourseEntity { @FieldPermission private Set teachers; + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable( + name = "faculty_course", + joinColumns = @JoinColumn(name = "course_id"), + inverseJoinColumns = @JoinColumn(name = "faculty_id") + ) + @FieldPermission + private Set faculties; + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index 1505e8e..056ff00 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -24,8 +24,7 @@ public void createCourse(Principal principal, CreateCourseModel createCourseMode UserEntity userEntity = userRepository.findByUsername(principal.getName()).orElseThrow(() -> new RuntimeException("User not found")); CourseEntity courseEntity = CourseEntity.builder() .name(createCourseModel.getName()) - .duration(createCourseModel.getDuration()) - .mainResponsible(userEntity) + .description(createCourseModel.getDescription()) .build(); courseRepository.save(courseEntity); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseModel.java index ce7900c..c3947a9 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseModel.java @@ -12,6 +12,6 @@ public class CreateCourseModel { private String name; - private Long duration; + private String description; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java index e82fae4..3ebdf38 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; +import ru.espada.ep.iptip.user.permission.annotation.Permission; import java.util.Set; @@ -16,6 +17,7 @@ @Builder @Entity @Table(name = "event") +@Permission(value = "event", children = {}) public class EventEntity { @Id @@ -23,20 +25,26 @@ public class EventEntity { private Long id; @Column(nullable = false) + @FieldPermission private String name; + @FieldPermission private Long date; + @FieldPermission private int weekday; + @FieldPermission private boolean is_week_event; + @FieldPermission private Long begin_date; + @FieldPermission private Long end_date; @Column(nullable = false) + @FieldPermission private Long duration; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "study_group_event", joinColumns = @JoinColumn(name = "event_id"), inverseJoinColumns = @JoinColumn(name = "study_group_id") ) - @FieldPermission private Set study_groups; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/OperationNotAccessException.java b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/OperationNotAccessException.java deleted file mode 100644 index f356357..0000000 --- a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/OperationNotAccessException.java +++ /dev/null @@ -1,8 +0,0 @@ -package ru.espada.ep.iptip.exceptions.custom; - -public class OperationNotAccessException extends RuntimeException { - - public OperationNotAccessException(String message) { - super(message); - } -} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/OperationNotPermittedException.java b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/OperationNotPermittedException.java new file mode 100644 index 0000000..35f6a3e --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/OperationNotPermittedException.java @@ -0,0 +1,9 @@ +package ru.espada.ep.iptip.exceptions.custom; + +public class OperationNotPermittedException extends RuntimeException { + + public OperationNotPermittedException(String message) { + super(message); + } + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/SessionException.java b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/SessionException.java deleted file mode 100644 index 5743e52..0000000 --- a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/SessionException.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.espada.ep.iptip.exceptions.custom; - -import lombok.Getter; - -@Getter -public class SessionException extends RuntimeException { - - private String info; - - public SessionException(String message) { - super(message); - info = ""; - } - - public SessionException(String message, String info) { - super(message); - this.info = info; - } -} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/OperationNotAccessExceptionAdvice.java b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/OperationNotAccessExceptionAdvice.java index 74a486d..e259616 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/OperationNotAccessExceptionAdvice.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/OperationNotAccessExceptionAdvice.java @@ -4,14 +4,14 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; -import ru.espada.ep.iptip.exceptions.custom.OperationNotAccessException; +import ru.espada.ep.iptip.exceptions.custom.OperationNotPermittedException; import ru.espada.ep.iptip.exceptions.response.OperationStatus; @ControllerAdvice public class OperationNotAccessExceptionAdvice { - @ExceptionHandler(OperationNotAccessException.class) - public ResponseEntity handleOperationNotAccessException(OperationNotAccessException e) { + @ExceptionHandler(OperationNotPermittedException.class) + public ResponseEntity handleOperationNotAccessException(OperationNotPermittedException e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body( OperationStatus.builder() .status(false) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/SessionExceptionAdvice.java b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/SessionExceptionAdvice.java deleted file mode 100644 index d84b20e..0000000 --- a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/SessionExceptionAdvice.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.espada.ep.iptip.exceptions.handlers; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import ru.espada.ep.iptip.exceptions.custom.SessionException; -import ru.espada.ep.iptip.exceptions.response.OperationStatus; -import ru.espada.ep.iptip.localization.LocalizationService; - -@ControllerAdvice -public class SessionExceptionAdvice { - - @Autowired - private LocalizationService localizationService; - - @ExceptionHandler(SessionException.class) - public ResponseEntity handleRuntimeException(SessionException e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body( - OperationStatus.builder() - .status(false) - .message(String.format(localizationService.getLocalizedMessage(e.getMessage()), e.getInfo())) - .build() - ); - } - -} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/s3/S3Service.java b/MainService/src/main/java/ru/espada/ep/iptip/s3/S3Service.java index 43fb398..60f2705 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/s3/S3Service.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/s3/S3Service.java @@ -7,17 +7,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import ru.espada.ep.iptip.config.S3Config; import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.net.URL; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import java.util.logging.Logger; @Service public class S3Service { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java index 90567e2..437f4ed 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import ru.espada.ep.iptip.event.EventEntity; import ru.espada.ep.iptip.study_groups.study_group_event.StudyGroupEventEntity; +import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -19,7 +20,7 @@ @Builder @Entity @Table(name = "study_group") -@Permission(children = {UserEntity.class}, value = "study_group", isStart = true) +@Permission(children = {UserEntity.class, EventEntity.class}, value = "study_group") public class StudyGroupEntity { @Id @@ -48,7 +49,12 @@ public class StudyGroupEntity { @JoinTable(name = "study_group_event", joinColumns = @JoinColumn(name = "study_group_id"), inverseJoinColumns = @JoinColumn(name = "event_id")) - @FieldPermission + @FieldPermission(value = "study_group_event") private Set studyGroupEvents; + @OneToOne + @JoinColumn(name = "faculty_id") + @FieldPermission + private FacultyEntity faculty; + } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityEntity.java new file mode 100644 index 0000000..08bb57b --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityEntity.java @@ -0,0 +1,34 @@ +package ru.espada.ep.iptip.university; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.university.institute.InstituteEntity; +import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; +import ru.espada.ep.iptip.user.permission.annotation.Permission; + +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "university") +@Permission(value = "university", children = {InstituteEntity.class}, isStart = true) +public class UniversityEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @FieldPermission + private String name; + + @OneToMany(mappedBy = "university") + @FieldPermission + private Set institutes; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteEntity.java new file mode 100644 index 0000000..54c3575 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteEntity.java @@ -0,0 +1,39 @@ +package ru.espada.ep.iptip.university.institute; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.university.UniversityEntity; +import ru.espada.ep.iptip.university.institute.major.MajorEntity; +import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; +import ru.espada.ep.iptip.user.permission.annotation.Permission; + +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "institute") +@Permission(value = "institute", children = {MajorEntity.class}) +public class InstituteEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @FieldPermission + private String name; + + @ManyToOne + @JoinColumn(name = "university_id") + private UniversityEntity university; + + @OneToMany(mappedBy = "institute") + @FieldPermission + private Set majors; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java new file mode 100644 index 0000000..1aa9209 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java @@ -0,0 +1,38 @@ +package ru.espada.ep.iptip.university.institute.major; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.university.institute.InstituteEntity; +import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; +import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; +import ru.espada.ep.iptip.user.permission.annotation.Permission; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "major") +@Permission(value = "major", children = {FacultyEntity.class}) +public class MajorEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @FieldPermission + private String name; + + @ManyToOne + @JoinColumn(name = "institute_id") + private InstituteEntity institute; + + @OneToMany(mappedBy = "major") + @FieldPermission + private List faculties; +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyEntity.java new file mode 100644 index 0000000..b7ae704 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyEntity.java @@ -0,0 +1,43 @@ +package ru.espada.ep.iptip.university.institute.major.faculty; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.course.CourseEntity; +import ru.espada.ep.iptip.study_groups.StudyGroupEntity; +import ru.espada.ep.iptip.university.institute.major.MajorEntity; +import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; +import ru.espada.ep.iptip.user.permission.annotation.Permission; + +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "faculty") +@Permission(value = "faculty", children = {CourseEntity.class, StudyGroupEntity.class}) +public class FacultyEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @FieldPermission + private String name; + + @ManyToOne + @JoinColumn(name = "major_id") + private MajorEntity major; + + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "faculty_course", + joinColumns = @JoinColumn(name = "faculty_id"), + inverseJoinColumns = @JoinColumn(name = "course_id")) + @FieldPermission + private Set courses; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index 7835474..1f6a7bc 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -7,7 +7,6 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import ru.espada.ep.iptip.user.models.request.AddRoleRequest; -import ru.espada.ep.iptip.user.models.request.AttachUserToCourseRequest; import ru.espada.ep.iptip.user.models.request.CreateCustomerRequest; import java.security.Principal; @@ -67,9 +66,10 @@ public ResponseEntity uploadAvatar(Principal principal, @RequestBody byte[] a } @GetMapping("/get-avatar-url") - public ResponseEntity getAvatarUrl(Principal principal) { + @PreAuthorize("hasPermission(#addRoleRequest, 'course.{id}')") + public ResponseEntity getAvatarUrl(Principal principal, @Valid @RequestBody AddRoleRequest addRoleRequest) { return ResponseEntity.ok(userService.getAvatarUrl(principal.getName())); } - //@PreAuthorize("hasPermission(#attachUserToCourseRequest, 'course.{courseId}')") + // } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java index 58507fd..b4a2f87 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java @@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.PageRequest; @@ -143,7 +144,6 @@ public List getResponsibleCourses(Principal principal) { return user.getResponsibleCourses().stream().toList(); } - public CompletableFuture uploadAvatar(String name, byte[] avatar) { UserEntity user = userRepository.findByUsername(name).orElseThrow(() -> new UsernameNotFoundException("User not found")); return s3Service.uploadPng(avatar, "user-" + user.getId(), "user-avatar") diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/CustomerCourseResponse.java b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/CustomerCourseResponse.java index 8c27ab2..8eb49ca 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/CustomerCourseResponse.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/CustomerCourseResponse.java @@ -14,15 +14,13 @@ public class CustomerCourseResponse { private Long id; private String name; - private String icon_image; - private String responsibleName; + private String description; public static CustomerCourseResponse fromCourse(CourseEntity courseEntity) { return CustomerCourseResponse.builder() .id(courseEntity.getId()) .name(courseEntity.getName()) - .icon_image(courseEntity.getIcon_image()) - .responsibleName(courseEntity.getMainResponsible().getUsername()) + .description(courseEntity.getDescription()) .build(); } } From 8b44384bdd35267b94bf3ef51d9db00a77ccba8f Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sat, 23 Nov 2024 14:34:59 +0300 Subject: [PATCH 06/49] Event implemented --- .../ep/iptip/event/EventController.java | 20 +++++++++++++++++++ .../ep/iptip/event/EventRepository.java | 10 ++++++++++ .../espada/ep/iptip/event/EventService.java | 4 ++++ .../ep/iptip/event/EventServiceImpl.java | 16 +++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/event/EventRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java new file mode 100644 index 0000000..418468d --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java @@ -0,0 +1,20 @@ +package ru.espada.ep.iptip.event; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; + +@RestController +@SecurityRequirement(name = "JWT") +@RequestMapping("/event") +public class EventController { + + private EventService eventService; + + @Autowired + public void setEventService(EventService eventService) { + this.eventService = eventService; + } +} + diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventRepository.java new file mode 100644 index 0000000..2cb3968 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventRepository.java @@ -0,0 +1,10 @@ +package ru.espada.ep.iptip.event; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import org.springframework.web.bind.annotation.RequestMapping; + +@Repository +public interface EventRepository extends JpaRepository { +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java new file mode 100644 index 0000000..8dfdbbe --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java @@ -0,0 +1,4 @@ +package ru.espada.ep.iptip.event; + +public interface EventService { +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java new file mode 100644 index 0000000..0359e54 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java @@ -0,0 +1,16 @@ +package ru.espada.ep.iptip.event; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class EventServiceImpl implements EventService{ + private EventRepository eventRepository; + + @Autowired + public void setEventRepository(EventRepository eventRepository) { + this.eventRepository = eventRepository; + } +} From 64d99fba07a1fda6089d421a16e93bddb1d05380 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sat, 23 Nov 2024 14:40:29 +0300 Subject: [PATCH 07/49] University implemented --- .../university/UniversityController.java | 19 +++++++++++++++++++ .../university/UniversityRepository.java | 8 ++++++++ .../iptip/university/UniversityService.java | 4 ++++ .../university/UniversityServiceImpl.java | 16 ++++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/UniversityController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/UniversityRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/UniversityService.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/UniversityServiceImpl.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityController.java b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityController.java new file mode 100644 index 0000000..f9b6e96 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityController.java @@ -0,0 +1,19 @@ +package ru.espada.ep.iptip.university; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; + +@RestController +@SecurityRequirement(name = "JWT") +@RequestMapping("/university") +public class UniversityController { + private UniversityService universityService; + + @Autowired + public void setUniversityService(UniversityService universityService) { + this.universityService = universityService; + } +} + diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityRepository.java new file mode 100644 index 0000000..1c27c5a --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.university; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UniversityRepository extends JpaRepository { +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityService.java b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityService.java new file mode 100644 index 0000000..3576b11 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityService.java @@ -0,0 +1,4 @@ +package ru.espada.ep.iptip.university; + +public interface UniversityService { +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityServiceImpl.java new file mode 100644 index 0000000..e4ae91f --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityServiceImpl.java @@ -0,0 +1,16 @@ +package ru.espada.ep.iptip.university; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class UniversityServiceImpl implements UniversityService { + private UniversityRepository universityRepository; + + @Autowired + public void setUniversityRepository(UniversityRepository universityRepository) { + this.universityRepository = universityRepository; + } +} From ede2c90a71f9da927d37297a9f5b707976bcff1f Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sat, 23 Nov 2024 15:41:25 +0300 Subject: [PATCH 08/49] Institute implemented --- .../institute/InstituteController.java | 13 +++++++++++++ .../institute/InstituteRepository.java | 8 ++++++++ .../university/institute/InstituteService.java | 4 ++++ .../institute/InstituteServiceImpl.java | 16 ++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteService.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteServiceImpl.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteController.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteController.java new file mode 100644 index 0000000..db2ded2 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteController.java @@ -0,0 +1,13 @@ +package ru.espada.ep.iptip.university.institute; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; + +@RestController +@SecurityRequirement(name = "JWT") +@RequestMapping("/institute") +public class InstituteController { + +} + diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteRepository.java new file mode 100644 index 0000000..d14a2c0 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.university.institute; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface InstituteRepository extends JpaRepository { +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteService.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteService.java new file mode 100644 index 0000000..e283f21 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteService.java @@ -0,0 +1,4 @@ +package ru.espada.ep.iptip.university.institute; + +public interface InstituteService { +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteServiceImpl.java new file mode 100644 index 0000000..a5501f9 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteServiceImpl.java @@ -0,0 +1,16 @@ +package ru.espada.ep.iptip.university.institute; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class InstituteServiceImpl implements InstituteService { + private InstituteRepository repository; + + @Autowired + public void setRepository(InstituteRepository repository) { + this.repository = repository; + } +} From 16f5cfbd3f0d9cb771ce670d08b2184aaa000042 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sat, 23 Nov 2024 17:04:16 +0300 Subject: [PATCH 09/49] user service modify --- .../ep/iptip/course/CourseRepository.java | 2 + .../espada/ep/iptip/course/CourseService.java | 1 + .../ep/iptip/user/AdminUserController.java | 34 ++++++++ .../espada/ep/iptip/user/UserController.java | 25 +----- .../ru/espada/ep/iptip/user/UserEntity.java | 8 +- .../espada/ep/iptip/user/UserRepository.java | 1 + .../ru/espada/ep/iptip/user/UserService.java | 86 +++++++------------ .../AdminDataInitializer.java | 68 +++++++++++++++ ...Request.java => CreateProfileRequest.java} | 4 +- .../user/permission/UserPermissionEntity.java | 9 +- .../permission/UserPermissionService.java | 4 + .../ep/iptip/user/profile/ProfileEntity.java | 2 +- .../src/main/resources/application.properties | 4 +- 13 files changed, 169 insertions(+), 79 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/application_event/AdminDataInitializer.java rename MainService/src/main/java/ru/espada/ep/iptip/user/models/request/{CreateCustomerRequest.java => CreateProfileRequest.java} (84%) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseRepository.java index 3ac3058..8f9370a 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseRepository.java @@ -6,4 +6,6 @@ @Repository public interface CourseRepository extends JpaRepository { + + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index 056ff00..df31eaa 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -20,6 +20,7 @@ public class CourseService { private UserRepository userRepository; private UserService userService; + public void createCourse(Principal principal, CreateCourseModel createCourseModel) { UserEntity userEntity = userRepository.findByUsername(principal.getName()).orElseThrow(() -> new RuntimeException("User not found")); CourseEntity courseEntity = CourseEntity.builder() diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java new file mode 100644 index 0000000..148f774 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java @@ -0,0 +1,34 @@ +package ru.espada.ep.iptip.user; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import ru.espada.ep.iptip.user.models.request.AddRoleRequest; + +import java.security.Principal; + +@RestController +@RequestMapping("/admin/user") +public class AdminUserController { + + private UserService userService; + + @PostMapping("/add-role") + public ResponseEntity addRole(Principal principal, @RequestBody AddRoleRequest addRoleRequest) { + userService.addRole(principal.getName(), addRoleRequest); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + + @GetMapping("/get-users/{page}") + @PreAuthorize("hasPermission(#page, 'users.admin')") + public ResponseEntity getUsers(@PathVariable int page) { + return ResponseEntity.ok(userService.allUsers(page)); + } + + @Autowired + public void setUserService(UserService userService) { + this.userService = userService; + } +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index 1f6a7bc..0ac2a77 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -7,7 +7,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import ru.espada.ep.iptip.user.models.request.AddRoleRequest; -import ru.espada.ep.iptip.user.models.request.CreateCustomerRequest; +import ru.espada.ep.iptip.user.models.request.CreateProfileRequest; import java.security.Principal; @@ -22,23 +22,12 @@ public UserController(UserService userService) { this.userService = userService; } - @PostMapping("/add-role") - public ResponseEntity addRole(@RequestBody AddRoleRequest addRoleRequest) { - userService.addRole(addRoleRequest); + @PostMapping("/create-profile") + public ResponseEntity createProfile(Principal principal, @Valid @RequestBody CreateProfileRequest createProfileRequest) { + userService.createProfile(principal, createProfileRequest); return ResponseEntity.status(HttpStatus.CREATED).build(); } - @PostMapping("/create-customer") - public ResponseEntity createCustomer(Principal principal, @Valid @RequestBody CreateCustomerRequest createCustomerRequest) { - userService.createCustomer(principal, createCustomerRequest); - return ResponseEntity.status(HttpStatus.CREATED).build(); - } - - @GetMapping("/get-responsible-courses") - public ResponseEntity getResponsibleCourses(Principal principal) { - return ResponseEntity.ok(userService.getResponsibleCourses(principal)); - } - @GetMapping("/get-user") public ResponseEntity getUser(Principal principal) { return ResponseEntity.ok(userService.getUser(principal.getName())); @@ -54,11 +43,6 @@ public ResponseEntity getUser(@PathVariable String username) { return ResponseEntity.ok(userService.getUser(username)); } - @GetMapping("/get-users/{page}") - public ResponseEntity getUsers(@PathVariable int page) { - return ResponseEntity.ok(userService.allUsers(page)); - } - @PostMapping("/upload-avatar") public ResponseEntity uploadAvatar(Principal principal, @RequestBody byte[] avatar) { String url = userService.uploadAvatar(principal.getName(), avatar).join(); @@ -66,7 +50,6 @@ public ResponseEntity uploadAvatar(Principal principal, @RequestBody byte[] a } @GetMapping("/get-avatar-url") - @PreAuthorize("hasPermission(#addRoleRequest, 'course.{id}')") public ResponseEntity getAvatarUrl(Principal principal, @Valid @RequestBody AddRoleRequest addRoleRequest) { return ResponseEntity.ok(userService.getAvatarUrl(principal.getName())); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java index c027017..5252f56 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java @@ -9,6 +9,7 @@ import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.course.CourseEntity; import ru.espada.ep.iptip.study_groups.StudyGroupEntity; +import ru.espada.ep.iptip.user.permission.UserPermissionEntity; import ru.espada.ep.iptip.user.profile.ProfileEntity; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -57,9 +58,14 @@ public class UserEntity extends Auditable implements UserDetails, Serializable { ) private Set responsibleCourses; + @OneToMany(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + @JsonIgnore + private List permissions; + @Override public Collection getAuthorities() { - return List.of(); + return permissions; } @Override diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserRepository.java index cd482d7..bf6206b 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserRepository.java @@ -8,4 +8,5 @@ @Repository public interface UserRepository extends JpaRepository { Optional findByUsername(String username); + boolean existsByUsername(String username); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java index b4a2f87..be299bd 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java @@ -1,56 +1,47 @@ package ru.espada.ep.iptip.user; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; +import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import ru.espada.ep.iptip.course.CourseEntity; -import ru.espada.ep.iptip.course.CourseRepository; -import ru.espada.ep.iptip.course.CourseStatus; -import ru.espada.ep.iptip.course.user_course.UserCourseEntity; -import ru.espada.ep.iptip.course.user_course.UserCourseRepository; import ru.espada.ep.iptip.s3.S3Service; +import ru.espada.ep.iptip.user.permission.UserPermissionEntity; import ru.espada.ep.iptip.user.profile.ProfileEntity; import ru.espada.ep.iptip.user.profile.ProfileRepository; import ru.espada.ep.iptip.user.models.request.AddRoleRequest; -import ru.espada.ep.iptip.user.models.request.CreateCustomerRequest; -import ru.espada.ep.iptip.user.models.response.CustomerCourseResponse; +import ru.espada.ep.iptip.user.models.request.CreateProfileRequest; import ru.espada.ep.iptip.user.permission.UserPermissionService; import java.security.Principal; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; @Service public class UserService implements UserDetailsService { - @PersistenceContext - private EntityManager em; + private UserRepository userRepository; private PasswordEncoder bCryptPasswordEncoder; - private UserCourseRepository userCourseRepository; private UserPermissionService userPermissionService; @Value("${users.page-size}") private int pageSize; private ProfileRepository profileRepository; - private CourseRepository courseRepository; private S3Service s3Service; - @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); @@ -86,11 +77,6 @@ public void deleteUser(String deleteUserId) { userRepository.delete(user); } - public List usergtList(Long idMin) { - return em.createQuery("SELECT u FROM UserEntity u WHERE u.id > :paramId", UserEntity.class) - .setParameter("paramId", idMin).getResultList(); - } - public UserEntity getUser(Long id) { return userRepository.findById(id).orElseThrow(() -> new UsernameNotFoundException("User not found")); } @@ -99,18 +85,10 @@ public UserEntity getUser(String username) { return userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); } - public boolean hasResponsibleCourse(UserEntity user, Long courseId) { - if (user.getResponsibleCourses() == null) { - return false; - } - return user.getResponsibleCourses().stream() - .anyMatch(course -> course.getId().equals(courseId)); - } - @Transactional - public void createCustomer(Principal principal, CreateCustomerRequest createCustomerRequest) { + public void createProfile(Principal principal, CreateProfileRequest createProfileRequest) { UserEntity user = userRepository.findByUsername(principal.getName()).orElseThrow(() -> new UsernameNotFoundException("User not found")); - if (!Objects.equals(user.getId(), createCustomerRequest.getUserId())) { + if (!Objects.equals(user.getId(), createProfileRequest.getUserId())) { throw new IllegalArgumentException("exception.user.only_owner"); } if (user.getProfile() != null) { @@ -118,17 +96,17 @@ public void createCustomer(Principal principal, CreateCustomerRequest createCust } ProfileEntity profile = new ProfileEntity(); - profile.setName(createCustomerRequest.getName()); - profile.setSurname(createCustomerRequest.getSurname()); - profile.setPhone(createCustomerRequest.getPhone()); - profile.setEmail(createCustomerRequest.getEmail()); - if (createCustomerRequest.getPatronymic() != null) { - profile.setPatronymic(createCustomerRequest.getPatronymic()); + profile.setName(createProfileRequest.getName()); + profile.setSurname(createProfileRequest.getSurname()); + profile.setPhone(createProfileRequest.getPhone()); + profile.setEmail(createProfileRequest.getEmail()); + if (createProfileRequest.getPatronymic() != null) { + profile.setPatronymic(createProfileRequest.getPatronymic()); } - if (createCustomerRequest.getBirthDate() != null) { + if (createProfileRequest.getBirthDate() != null) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); try { - profile.setBirthDate(formatter.parse(createCustomerRequest.getBirthDate())); + profile.setBirthDate(formatter.parse(createProfileRequest.getBirthDate())); } catch (ParseException e) { throw new RuntimeException(e); } @@ -139,11 +117,6 @@ public void createCustomer(Principal principal, CreateCustomerRequest createCust userRepository.save(user); } - public List getResponsibleCourses(Principal principal) { - UserEntity user = userRepository.findByUsername(principal.getName()).orElseThrow(() -> new UsernameNotFoundException("User not found")); - return user.getResponsibleCourses().stream().toList(); - } - public CompletableFuture uploadAvatar(String name, byte[] avatar) { UserEntity user = userRepository.findByUsername(name).orElseThrow(() -> new UsernameNotFoundException("User not found")); return s3Service.uploadPng(avatar, "user-" + user.getId(), "user-avatar") @@ -161,14 +134,30 @@ public String getAvatarUrl(String name) { return s3Service.getFileUrl("user-avatar", "user-" + user.getId()).join(); } - public void addRole(AddRoleRequest addRoleRequest) { + public void addRole(String username, AddRoleRequest addRoleRequest) { String permission = addRoleRequest.getPermission(); for (String key : addRoleRequest.getCredentials().keySet()) { permission = permission.replace("{" + key + "}", addRoleRequest.getCredentials().get(key)); } + + boolean hasParentPermission = userPermissionService.hasPermission(username, getParentPermission(permission)); + + if (!hasParentPermission) { + throw new RuntimeException("exception.user.permission_not_found"); + } + userPermissionService.addPermission(addRoleRequest.getUsername(), permission, addRoleRequest.getStartTime(), addRoleRequest.getEndTime()); } + private String getParentPermission(String permission) { + int lastDotIndex = permission.lastIndexOf('.'); + if (lastDotIndex == -1) { + return "admin"; + } + return permission.substring(0, lastDotIndex); + } + + @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; @@ -185,20 +174,11 @@ public void setCustomerRepository(ProfileRepository profileRepository) { this.profileRepository = profileRepository; } - @Autowired - public void setCourseRepository(CourseRepository courseRepository) { - this.courseRepository = courseRepository; - } - @Autowired public void setS3Service(S3Service s3Service) { this.s3Service = s3Service; } - @Autowired - public void setCourseCustomerRepository(UserCourseRepository userCourseRepository) { - this.userCourseRepository = userCourseRepository; - } @Autowired public void setUserPermissionService(UserPermissionService userPermissionService) { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/application_event/AdminDataInitializer.java b/MainService/src/main/java/ru/espada/ep/iptip/user/application_event/AdminDataInitializer.java new file mode 100644 index 0000000..cd1cedb --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/application_event/AdminDataInitializer.java @@ -0,0 +1,68 @@ +package ru.espada.ep.iptip.user.application_event; + +import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; +import ru.espada.ep.iptip.user.UserEntity; +import ru.espada.ep.iptip.user.UserRepository; +import ru.espada.ep.iptip.user.permission.UserPermissionEntity; +import ru.espada.ep.iptip.user.permission.UserPermissionRepository; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class AdminDataInitializer implements ApplicationListener { + + private final UserRepository userRepository; + private PasswordEncoder bCryptPasswordEncoder; + @Value("${admin.username:admin}") + private String adminUsername; + @Value("${admin.password:admin}") + private String adminPassword; + private UserPermissionRepository userPermissionRepository; + + public AdminDataInitializer(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public void onApplicationEvent(ApplicationReadyEvent event) { + // create admin user + if (userRepository.existsByUsername(adminUsername)) { + return; + } + + UserEntity admin = UserEntity.builder() + .username(adminUsername) + .password(bCryptPasswordEncoder.encode(adminPassword)) + .build(); + + userRepository.save(admin); + + // права + UserPermissionEntity adminPermission = UserPermissionEntity.builder() + .userId(admin.getId()) + .name("users.admin") + .startTime(-1L) + .endTime(-1L) + .build(); + + userPermissionRepository.save(adminPermission); + } + + @Autowired + public void setBCryptPasswordEncoder(PasswordEncoder bCryptPasswordEncoder) { + this.bCryptPasswordEncoder = bCryptPasswordEncoder; + } + + @Autowired + public void setUserPermissionRepository(UserPermissionRepository userPermissionRepository) { + this.userPermissionRepository = userPermissionRepository; + } +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/models/request/CreateCustomerRequest.java b/MainService/src/main/java/ru/espada/ep/iptip/user/models/request/CreateProfileRequest.java similarity index 84% rename from MainService/src/main/java/ru/espada/ep/iptip/user/models/request/CreateCustomerRequest.java rename to MainService/src/main/java/ru/espada/ep/iptip/user/models/request/CreateProfileRequest.java index 446c711..f93bb90 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/models/request/CreateCustomerRequest.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/models/request/CreateProfileRequest.java @@ -10,7 +10,7 @@ @AllArgsConstructor @NoArgsConstructor @Builder -public class CreateCustomerRequest { +public class CreateProfileRequest { private Long userId; @NotNull @@ -23,5 +23,7 @@ public class CreateCustomerRequest { @NotNull private String email; private String birthDate; + private int semester; + private String studentIdCard; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionEntity.java index 0d70843..8449626 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.security.core.GrantedAuthority; import ru.espada.ep.iptip.user.UserEntity; @Data @@ -13,15 +14,21 @@ @Builder @Entity @Table(name = "user_permissions") -public class UserPermissionEntity { +public class UserPermissionEntity implements GrantedAuthority { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; + @Column(name = "user_id") private Long userId; private Long startTime; private Long endTime; + + @Override + public String getAuthority() { + return name; + } } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java index 796c3b1..cb5a336 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java @@ -70,6 +70,10 @@ public boolean hasPermission(String username, String permission) { List permissions = userPermissionRepository.findAllByUserId(user.getId()).orElse(new HashSet<>()).stream().map(UserPermissionEntity::getName).toList(); for (String permissionName : permissions) { + // special permission + if (permissionName.equals("admin")) { + return true; + } if (permission.startsWith(permissionName + ".")) { return true; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java index 4e459e2..0db32b3 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java @@ -34,7 +34,7 @@ public class ProfileEntity implements Serializable { @Column(name = "email", nullable = false, unique = true) private String email; private boolean emailConfirmed; - private int semestr; + private int semester; private String studentIdCard; } diff --git a/MainService/src/main/resources/application.properties b/MainService/src/main/resources/application.properties index 781285c..ea3cf3b 100644 --- a/MainService/src/main/resources/application.properties +++ b/MainService/src/main/resources/application.properties @@ -24,4 +24,6 @@ s3.endpoint-admin=${S3_URL_ADMIN} s3.endpoint-user=${S3_URL_USER} s3.access-key=${S3_ACCESS_KEY} s3.secret-key=${S3_ACCESS_KEY} -s3.image-expiry-time=7 \ No newline at end of file +s3.image-expiry-time=7 + +user.permissions.special=user.register,user.profile,users.admin,admin \ No newline at end of file From 33feba0bd882e73532834640f860f81648fc08c1 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sat, 23 Nov 2024 18:45:33 +0300 Subject: [PATCH 10/49] Studygroup, studygroupevent, major, faculty implemented --- .../study_groups/StudyGroupController.java | 17 +++++++++++++++++ .../study_groups/StudyGroupRepository.java | 8 ++++++++ .../iptip/study_groups/StudyGroupService.java | 4 ++++ .../study_groups/StudyGroupServiceImpl.java | 16 ++++++++++++++++ .../StudyGroupEventController.java | 13 +++++++++++++ .../StudyGroupEventRepository.java | 8 ++++++++ .../StudyGroupEventService.java | 4 ++++ .../StudyGroupEventServiceImpl.java | 17 +++++++++++++++++ .../institute/major/MajorController.java | 13 +++++++++++++ .../institute/major/MajorRepository.java | 8 ++++++++ .../institute/major/MajorService.java | 4 ++++ .../institute/major/MajorServiceImpl.java | 16 ++++++++++++++++ .../major/faculty/FacultyController.java | 13 +++++++++++++ .../major/faculty/FacultyRepository.java | 8 ++++++++ .../institute/major/faculty/FacultyService.java | 4 ++++ .../major/faculty/FacultyServiceImpl.java | 16 ++++++++++++++++ 16 files changed, 169 insertions(+) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupService.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupServiceImpl.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventService.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorService.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorServiceImpl.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyService.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyServiceImpl.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupController.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupController.java new file mode 100644 index 0000000..eda5b08 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupController.java @@ -0,0 +1,17 @@ +package ru.espada.ep.iptip.study_groups; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; + +@RestController +@SecurityRequirement(name = "JWT") +@RequestMapping("/studyGroup") +public class StudyGroupController { + private StudyGroupRepository studyGroupRepository; + + public void setStudyGroupRepository(StudyGroupRepository studyGroupRepository) { + this.studyGroupRepository = studyGroupRepository; + } +} + diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java new file mode 100644 index 0000000..7688a94 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.study_groups; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StudyGroupRepository extends JpaRepository { +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupService.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupService.java new file mode 100644 index 0000000..47f2dfb --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupService.java @@ -0,0 +1,4 @@ +package ru.espada.ep.iptip.study_groups; + +public interface StudyGroupService { +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupServiceImpl.java new file mode 100644 index 0000000..43191cb --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupServiceImpl.java @@ -0,0 +1,16 @@ +package ru.espada.ep.iptip.study_groups; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class StudyGroupServiceImpl implements StudyGroupService { + private StudyGroupRepository studyGroupRepository; + + @Autowired + public void setStudyGroupRepository(StudyGroupRepository studyGroupRepository) { + this.studyGroupRepository = studyGroupRepository; + } +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java new file mode 100644 index 0000000..f5bca47 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java @@ -0,0 +1,13 @@ +package ru.espada.ep.iptip.study_groups.study_group_event; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; + +@RestController +@SecurityRequirement(name = "JWT") +@RequestMapping("/studyGroupEvent") +public class StudyGroupEventController { + +} + diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java new file mode 100644 index 0000000..ee3d9f6 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.study_groups.study_group_event; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StudyGroupEventRepository extends JpaRepository { +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventService.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventService.java new file mode 100644 index 0000000..76c94f3 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventService.java @@ -0,0 +1,4 @@ +package ru.espada.ep.iptip.study_groups.study_group_event; + +public interface StudyGroupEventService { +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java new file mode 100644 index 0000000..8974b90 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java @@ -0,0 +1,17 @@ +package ru.espada.ep.iptip.study_groups.study_group_event; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class StudyGroupEventServiceImpl implements StudyGroupEventService { + private StudyGroupEventRepository studyGroupEventRepository; + + @Autowired + public void setStudyGroupEventRepository(StudyGroupEventRepository studyGroupEventRepository) { + this.studyGroupEventRepository = studyGroupEventRepository; + } +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorController.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorController.java new file mode 100644 index 0000000..774850f --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorController.java @@ -0,0 +1,13 @@ +package ru.espada.ep.iptip.university.institute.major; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; + +@RestController +@SecurityRequirement(name = "JWT") +@RequestMapping("/major") +public class MajorController { + +} + diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorRepository.java new file mode 100644 index 0000000..a78bcaa --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.university.institute.major; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MajorRepository extends JpaRepository { +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorService.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorService.java new file mode 100644 index 0000000..f684f97 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorService.java @@ -0,0 +1,4 @@ +package ru.espada.ep.iptip.university.institute.major; + +public interface MajorService { +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorServiceImpl.java new file mode 100644 index 0000000..efedd6a --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorServiceImpl.java @@ -0,0 +1,16 @@ +package ru.espada.ep.iptip.university.institute.major; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class MajorServiceImpl implements MajorService { + private MajorRepository repository; + + @Autowired + public void setRepository(MajorRepository repository) { + this.repository = repository; + } +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyController.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyController.java new file mode 100644 index 0000000..ba46a71 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyController.java @@ -0,0 +1,13 @@ +package ru.espada.ep.iptip.university.institute.major.faculty; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; + +@RestController +@SecurityRequirement(name = "JWT") +@RequestMapping("/faculty") +public class FacultyController { + +} + diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyRepository.java new file mode 100644 index 0000000..ea2c456 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.university.institute.major.faculty; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface FacultyRepository extends JpaRepository { +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyService.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyService.java new file mode 100644 index 0000000..89877f9 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyService.java @@ -0,0 +1,4 @@ +package ru.espada.ep.iptip.university.institute.major.faculty; + +public interface FacultyService { +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyServiceImpl.java new file mode 100644 index 0000000..d13c267 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyServiceImpl.java @@ -0,0 +1,16 @@ +package ru.espada.ep.iptip.university.institute.major.faculty; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class FacultyServiceImpl implements FacultyService { + private FacultyRepository repository; + + @Autowired + public void setFacultyRepository(FacultyRepository repository) { + this.repository = repository; + } +} From 6d279240dbb731e53bf53a17fef64e1f5f900673 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sat, 23 Nov 2024 19:26:24 +0300 Subject: [PATCH 11/49] REST conventions --- .../ru/espada/ep/iptip/course/CourseController.java | 6 +++--- .../espada/ep/iptip/user/AdminUserController.java | 13 +++++++++++-- .../ru/espada/ep/iptip/user/UserController.java | 13 ++++++------- .../ep/iptip/user/auth/UserAuthController.java | 8 ++------ 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index 1bf4805..71bbe70 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -18,19 +18,19 @@ public class CourseController { private CourseService courseService; - @PostMapping("/create") + @PostMapping("") public ResponseEntity createCourse(Principal principal, @Valid @RequestBody CreateCourseModel createCourseModel) { courseService.createCourse(principal, createCourseModel); return ResponseEntity.status(HttpStatus.CREATED).build(); } - @DeleteMapping("/delete/{id}") + @DeleteMapping("/{id}") public ResponseEntity deleteCourse(@PathVariable Long id) { courseService.deleteCourse(id); return ResponseEntity.ok().build(); } - @GetMapping("/get-course/{id}") + @GetMapping("/{id}") public ResponseEntity getCourse(@PathVariable Long id) { return ResponseEntity.ok(courseService.getCourse(id)); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java index 148f774..57e5a1b 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java @@ -1,5 +1,6 @@ package ru.espada.ep.iptip.user; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -21,14 +22,22 @@ public ResponseEntity addRole(Principal principal, @RequestBody AddRoleReques return ResponseEntity.status(HttpStatus.CREATED).build(); } - @GetMapping("/get-users/{page}") - @PreAuthorize("hasPermission(#page, 'users.admin')") + @GetMapping("/users/{page}") + public ResponseEntity getUsers(@PathVariable int page) { return ResponseEntity.ok(userService.allUsers(page)); } + @DeleteMapping("") + @PreAuthorize("hasPermission(#username, 'users.admin')") + public ResponseEntity delete(@Valid @RequestBody String username) { + userService.deleteUser(username); + return ResponseEntity.status(HttpStatus.OK).build(); + } + @Autowired public void setUserService(UserService userService) { this.userService = userService; } + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index 0ac2a77..2c912c9 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -4,7 +4,6 @@ import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import ru.espada.ep.iptip.user.models.request.AddRoleRequest; import ru.espada.ep.iptip.user.models.request.CreateProfileRequest; @@ -22,34 +21,34 @@ public UserController(UserService userService) { this.userService = userService; } - @PostMapping("/create-profile") + @PostMapping("/profile") public ResponseEntity createProfile(Principal principal, @Valid @RequestBody CreateProfileRequest createProfileRequest) { userService.createProfile(principal, createProfileRequest); return ResponseEntity.status(HttpStatus.CREATED).build(); } - @GetMapping("/get-user") + @GetMapping("") public ResponseEntity getUser(Principal principal) { return ResponseEntity.ok(userService.getUser(principal.getName())); } - @GetMapping("/get-user/{id}") + @GetMapping("/{id}") public ResponseEntity getUser(@PathVariable Long id) { return ResponseEntity.ok(userService.getUser(id)); } - @GetMapping("/get-user/{username}") + @GetMapping("/{username}") public ResponseEntity getUser(@PathVariable String username) { return ResponseEntity.ok(userService.getUser(username)); } - @PostMapping("/upload-avatar") + @PostMapping("/avatar") public ResponseEntity uploadAvatar(Principal principal, @RequestBody byte[] avatar) { String url = userService.uploadAvatar(principal.getName(), avatar).join(); return ResponseEntity.ok(url); } - @GetMapping("/get-avatar-url") + @GetMapping("/avatar") public ResponseEntity getAvatarUrl(Principal principal, @Valid @RequestBody AddRoleRequest addRoleRequest) { return ResponseEntity.ok(userService.getAvatarUrl(principal.getName())); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java index 29199b0..9308308 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -69,6 +70,7 @@ public ResponseEntity register(@Valid @RequestBody AuthRequest authRequest) { } @PostMapping("/aregister") + @PreAuthorize("hasPermission(#principal, 'users.admin')") public ResponseEntity register(Principal principal, @Valid @RequestBody AuthRequest authRequest) { userService.saveUser(UserEntity.builder() .username(authRequest.getLogin()) @@ -76,10 +78,4 @@ public ResponseEntity register(Principal principal, @Valid @RequestBody AuthR .build()); return ResponseEntity.status(HttpStatus.CREATED).build(); } - - @PostMapping("/delete") - public ResponseEntity delete(Principal principal, @Valid @RequestBody String username) { - userService.deleteUser(username); - return ResponseEntity.status(HttpStatus.OK).build(); - } } From 19cb4a2a721645a74f4f98c0ea2cc56582b9b7f9 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sat, 23 Nov 2024 19:54:27 +0300 Subject: [PATCH 12/49] Fixed some stuff in UserAuthController and UserController --- .../java/ru/espada/ep/iptip/user/UserController.java | 9 ++++----- .../espada/ep/iptip/user/auth/UserAuthController.java | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index 2c912c9..7b19dc5 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -27,17 +27,17 @@ public ResponseEntity createProfile(Principal principal, @Valid @RequestBody return ResponseEntity.status(HttpStatus.CREATED).build(); } - @GetMapping("") + @GetMapping("/user") public ResponseEntity getUser(Principal principal) { return ResponseEntity.ok(userService.getUser(principal.getName())); } - @GetMapping("/{id}") + @GetMapping("/user/id/{id}") public ResponseEntity getUser(@PathVariable Long id) { return ResponseEntity.ok(userService.getUser(id)); } - @GetMapping("/{username}") + @GetMapping("/user/username/{username}") public ResponseEntity getUser(@PathVariable String username) { return ResponseEntity.ok(userService.getUser(username)); } @@ -48,10 +48,9 @@ public ResponseEntity uploadAvatar(Principal principal, @RequestBody byte[] a return ResponseEntity.ok(url); } + // FIXME: I think a path parameter is supposed to be here... @GetMapping("/avatar") public ResponseEntity getAvatarUrl(Principal principal, @Valid @RequestBody AddRoleRequest addRoleRequest) { return ResponseEntity.ok(userService.getAvatarUrl(principal.getName())); } - - // } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java index 9308308..59a54d6 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java @@ -27,10 +27,10 @@ @RequestMapping("/auth") public class UserAuthController { - private UserService userService; - private AuthenticationManager authenticationManager; - private JwtCore jwtCore; - private LocalizationService localizationService; + private final UserService userService; + private final AuthenticationManager authenticationManager; + private final JwtCore jwtCore; + private final LocalizationService localizationService; @Value("${auth.register.enabled}") private boolean registerEnabled; @@ -69,7 +69,7 @@ public ResponseEntity register(@Valid @RequestBody AuthRequest authRequest) { return ResponseEntity.status(HttpStatus.CREATED).build(); } - @PostMapping("/aregister") + @PostMapping("/register") @PreAuthorize("hasPermission(#principal, 'users.admin')") public ResponseEntity register(Principal principal, @Valid @RequestBody AuthRequest authRequest) { userService.saveUser(UserEntity.builder() From 237808a7df028b5cad6142cd5e9c0e03f21eed62 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sat, 23 Nov 2024 19:58:56 +0300 Subject: [PATCH 13/49] add group service, controller and repo --- .../ep/iptip/user/AdminUserController.java | 3 +- .../espada/ep/iptip/user/UserController.java | 3 +- .../permission/UserPermissionService.java | 4 +- .../permission/groups/GroupController.java | 28 ++++++++++ .../permission/groups/GroupRepository.java | 8 +++ .../user/permission/groups/GroupService.java | 7 +++ .../permission/groups/GroupServiceImpl.java | 53 +++++++++++++++++++ 7 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java index 57e5a1b..46c21a1 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java @@ -1,5 +1,6 @@ package ru.espada.ep.iptip.user; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -11,6 +12,7 @@ import java.security.Principal; @RestController +@SecurityRequirement(name = "JWT") @RequestMapping("/admin/user") public class AdminUserController { @@ -23,7 +25,6 @@ public ResponseEntity addRole(Principal principal, @RequestBody AddRoleReques } @GetMapping("/users/{page}") - public ResponseEntity getUsers(@PathVariable int page) { return ResponseEntity.ok(userService.allUsers(page)); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index 7b19dc5..ed9a691 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -48,9 +48,8 @@ public ResponseEntity uploadAvatar(Principal principal, @RequestBody byte[] a return ResponseEntity.ok(url); } - // FIXME: I think a path parameter is supposed to be here... @GetMapping("/avatar") - public ResponseEntity getAvatarUrl(Principal principal, @Valid @RequestBody AddRoleRequest addRoleRequest) { + public ResponseEntity getAvatarUrl(Principal principal) { return ResponseEntity.ok(userService.getAvatarUrl(principal.getName())); } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java index cb5a336..ccdec08 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java @@ -21,7 +21,7 @@ public class UserPermissionService { private Map permissions; @Value("${user.permissions.special:null}") @Getter - private String[] specialPermissions; + private List specialPermissions; public UserPermissionService(UserPermissionRepository userPermissionRepository, UserRepository userRepository) { this.userPermissionRepository = userPermissionRepository; @@ -39,7 +39,7 @@ public List getPermissions() { addPermissionsRecursive(map, key, permissions); } } - if (specialPermissions != null) permissions.addAll(Arrays.asList(specialPermissions)); + if (specialPermissions != null) permissions.addAll(specialPermissions); return permissions; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java new file mode 100644 index 0000000..3aca2d1 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java @@ -0,0 +1,28 @@ +package ru.espada.ep.iptip.user.permission.groups; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.security.Principal; + +@RestController +@SecurityRequirement(name = "JWT") +@RequestMapping("/admin/group") +public class GroupController { + + private GroupService groupService; + + @GetMapping("") + public ResponseEntity getGroups() { + return ResponseEntity.ok(groupService.getGroups()); + } + + @Autowired + public void setGroupServiceImpl(GroupService groupService) { + this.groupService = groupService; + } +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupRepository.java new file mode 100644 index 0000000..712f690 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.user.permission.groups; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface GroupRepository extends JpaRepository { +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java new file mode 100644 index 0000000..12fefd2 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java @@ -0,0 +1,7 @@ +package ru.espada.ep.iptip.user.permission.groups; + +import java.util.List; + +public interface GroupService { + List getGroups(); +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java new file mode 100644 index 0000000..ca49c95 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java @@ -0,0 +1,53 @@ +package ru.espada.ep.iptip.user.permission.groups; + +import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.espada.ep.iptip.user.UserEntity; +import ru.espada.ep.iptip.user.UserService; +import ru.espada.ep.iptip.user.permission.UserPermissionService; + +import java.util.List; + +@Service +public class GroupServiceImpl implements GroupService { + + private GroupRepository groupRepository; + private UserService userService; + private UserPermissionService userPermissionService; + + @PostConstruct + public void init() { + initPermission(); + } + + public void addGroup(GroupEntity groupEntity) { + groupRepository.save(groupEntity); + initPermission(); + } + + @Override + public List getGroups() { + return groupRepository.findAll(); + } + + @Autowired + public void setGroupRepository(GroupRepository groupRepository) { + this.groupRepository = groupRepository; + } + + @Autowired + public void setUserService(UserService userService) { + this.userService = userService; + } + + @Autowired + public void setUserPermissionService(UserPermissionService userPermissionService) { + this.userPermissionService = userPermissionService; + } + + private void initPermission() { + List permissions = getGroups().stream().map(GroupEntity::getName).map(String::toLowerCase).map(groupName -> "group." + groupName).toList(); + userPermissionService.getSpecialPermissions().addAll(permissions); + } +} From b6f446eadff0622989cd7dd0c15a44c3309cdfe8 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sat, 23 Nov 2024 20:52:51 +0300 Subject: [PATCH 14/49] groups --- .../ep/iptip/user/AdminUserController.java | 6 +- .../ru/espada/ep/iptip/user/UserService.java | 14 +---- .../iptip/user/auth/UserAuthController.java | 2 +- .../permission/UserPermissionRepository.java | 3 + .../permission/UserPermissionService.java | 53 ++++++++++++++++ .../permission/groups/GroupController.java | 48 +++++++++++++-- .../user/permission/groups/GroupEntity.java | 4 +- .../permission/groups/GroupRepository.java | 5 ++ .../user/permission/groups/GroupService.java | 16 ++++- .../permission/groups/GroupServiceImpl.java | 60 +++++++++++++++++-- .../groups/models/AddPermissionRequest.java | 17 ++++++ .../groups/models/CreateGroupModel.java | 21 +++++++ .../groups/models/GroupToUserRequest.java | 19 ++++++ .../PermissionGroupEntity.java | 3 + 14 files changed, 243 insertions(+), 28 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionRequest.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/CreateGroupModel.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/GroupToUserRequest.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java index 46c21a1..872787d 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java @@ -18,9 +18,9 @@ public class AdminUserController { private UserService userService; - @PostMapping("/add-role") - public ResponseEntity addRole(Principal principal, @RequestBody AddRoleRequest addRoleRequest) { - userService.addRole(principal.getName(), addRoleRequest); + @PostMapping("/add-permission") + public ResponseEntity addPermission(Principal principal, @RequestBody AddRoleRequest addRoleRequest) { + userService.addPermission(principal.getName(), addRoleRequest); return ResponseEntity.status(HttpStatus.CREATED).build(); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java index be299bd..605f8a8 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java @@ -134,29 +134,19 @@ public String getAvatarUrl(String name) { return s3Service.getFileUrl("user-avatar", "user-" + user.getId()).join(); } - public void addRole(String username, AddRoleRequest addRoleRequest) { + public void addPermission(String username, AddRoleRequest addRoleRequest) { String permission = addRoleRequest.getPermission(); for (String key : addRoleRequest.getCredentials().keySet()) { permission = permission.replace("{" + key + "}", addRoleRequest.getCredentials().get(key)); } - boolean hasParentPermission = userPermissionService.hasPermission(username, getParentPermission(permission)); - - if (!hasParentPermission) { + if (!userPermissionService.hasParentPermission(username, permission)) { throw new RuntimeException("exception.user.permission_not_found"); } userPermissionService.addPermission(addRoleRequest.getUsername(), permission, addRoleRequest.getStartTime(), addRoleRequest.getEndTime()); } - private String getParentPermission(String permission) { - int lastDotIndex = permission.lastIndexOf('.'); - if (lastDotIndex == -1) { - return "admin"; - } - return permission.substring(0, lastDotIndex); - } - @Autowired public void setUserRepository(UserRepository userRepository) { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java index 59a54d6..d4b4fd6 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java @@ -69,7 +69,7 @@ public ResponseEntity register(@Valid @RequestBody AuthRequest authRequest) { return ResponseEntity.status(HttpStatus.CREATED).build(); } - @PostMapping("/register") + @PostMapping("/aregister") @PreAuthorize("hasPermission(#principal, 'users.admin')") public ResponseEntity register(Principal principal, @Valid @RequestBody AuthRequest authRequest) { userService.saveUser(UserEntity.builder() diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionRepository.java index ef91d40..804976f 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionRepository.java @@ -11,4 +11,7 @@ public interface UserPermissionRepository extends JpaRepository> findAllByUserId(Long userId); + void deleteUserPermissionEntityByUserIdAndName(Long id, String permission); + + void deleteAllByUserId(Long id); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java index ccdec08..4f5972d 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java @@ -48,6 +48,7 @@ public void addPermission(String username, String permission, Long startTime, Lo if (user == null) { return; } + UserPermissionEntity userPermissionEntity = UserPermissionEntity.builder() .userId(user.getId()) .name(permission) @@ -57,6 +58,46 @@ public void addPermission(String username, String permission, Long startTime, Lo userPermissionRepository.save(userPermissionEntity); } + public void addPermissions(String username, List permissions) { + UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); + if (user == null) { + return; + } + for (String permission : permissions) { + UserPermissionEntity userPermissionEntity = UserPermissionEntity.builder() + .userId(user.getId()) + .name(permission) + .build(); + userPermissionRepository.save(userPermissionEntity); + } + } + + public void removePermission(String username, String permission) { + UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); + if (user == null) { + return; + } + userPermissionRepository.deleteUserPermissionEntityByUserIdAndName(user.getId(), permission); + } + + public void removePermissions(String username, List permissions) { + UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); + if (user == null) { + return; + } + for (String permission : permissions) { + userPermissionRepository.deleteUserPermissionEntityByUserIdAndName(user.getId(), permission); + } + } + + public void removeAllPermissions(String username) { + UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); + if (user == null) { + return; + } + userPermissionRepository.deleteAllByUserId(user.getId()); + } + public boolean hasPermission(String username, String permission) { UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); if (user == null) { @@ -81,6 +122,10 @@ public boolean hasPermission(String username, String permission) { return false; } + public boolean hasParentPermission(String username, String permission) { + return hasPermission(username, getParentPermission(permission)); + } + private void addPermissionsRecursive(Map permissions, String permission, List result) { for (String key : permissions.keySet()) { result.add(permission + "." + key); @@ -96,4 +141,12 @@ private void addPermissionsRecursive(Map permissions, String per } } + private String getParentPermission(String permission) { + int lastDotIndex = permission.lastIndexOf('.'); + if (lastDotIndex == -1) { + return "admin"; + } + return permission.substring(0, lastDotIndex); + } + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java index 3aca2d1..73804c3 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java @@ -1,11 +1,15 @@ package ru.espada.ep.iptip.user.permission.groups; import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import ru.espada.ep.iptip.user.permission.groups.models.AddPermissionRequest; +import ru.espada.ep.iptip.user.permission.groups.models.CreateGroupModel; +import ru.espada.ep.iptip.user.permission.groups.models.GroupToUserRequest; import java.security.Principal; @@ -17,8 +21,42 @@ public class GroupController { private GroupService groupService; @GetMapping("") - public ResponseEntity getGroups() { - return ResponseEntity.ok(groupService.getGroups()); + public ResponseEntity getGroups(Principal principal) { + return ResponseEntity.ok(groupService.getGroups(principal.getName())); + } + + @PostMapping("") + public ResponseEntity createGroup(Principal principal, @Valid @RequestBody CreateGroupModel createGroupModel) { + groupService.createGroup(principal, createGroupModel); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + + @DeleteMapping("/{group}") + @PreAuthorize("hasPermission(#group, 'group.{group}')") + public ResponseEntity deleteGroup(@PathVariable String group) { + groupService.deleteGroup(group); + return ResponseEntity.status(HttpStatus.OK).build(); + } + + @PostMapping("/add-permission") + @PreAuthorize("hasPermission(#addPermissionRequest, 'group.{group}')") + public ResponseEntity addPermission(@RequestBody AddPermissionRequest addPermissionRequest) { + groupService.addPermission(addPermissionRequest); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + + @PostMapping("/give") + @PreAuthorize("hasPermission(#groupToUserRequest, 'group.{group}')") + public ResponseEntity giveGroup(@RequestBody GroupToUserRequest groupToUserRequest) { + groupService.giveGroupToUsers(groupToUserRequest); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + + @PostMapping("/remove") + @PreAuthorize("hasPermission(#groupToUserRequest, 'group.{group}')") + public ResponseEntity removeGroup(@RequestBody GroupToUserRequest groupToUserRequest) { + groupService.removeGroupFromUser(groupToUserRequest); + return ResponseEntity.status(HttpStatus.CREATED).build(); } @Autowired diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java index 71c7a88..7d99a93 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java @@ -7,7 +7,7 @@ import lombok.NoArgsConstructor; import ru.espada.ep.iptip.user.permission.groups.permission_group.PermissionGroupEntity; -import java.util.Set; +import java.util.List; @Data @AllArgsConstructor @@ -26,6 +26,6 @@ public class GroupEntity { @OneToMany @JoinColumn(name = "group_id") - private Set permission_groups; + private List permission_groups; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupRepository.java index 712f690..75d7cfa 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupRepository.java @@ -3,6 +3,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface GroupRepository extends JpaRepository { + Optional findGroupEntityByName(String group); + + void deleteGroupEntityByName(String group); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java index 12fefd2..f5ffa0b 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java @@ -1,7 +1,21 @@ package ru.espada.ep.iptip.user.permission.groups; +import ru.espada.ep.iptip.user.permission.groups.models.AddPermissionRequest; +import ru.espada.ep.iptip.user.permission.groups.models.CreateGroupModel; +import ru.espada.ep.iptip.user.permission.groups.models.GroupToUserRequest; + +import java.security.Principal; import java.util.List; public interface GroupService { - List getGroups(); + List getGroups(String username); + + void createGroup(Principal principal, CreateGroupModel createGroupModel); + + void addPermission(AddPermissionRequest addPermissionRequest); + + void giveGroupToUsers(GroupToUserRequest groupToUserRequest); + void removeGroupFromUser(GroupToUserRequest groupToUserRequest); + + void deleteGroup(String group); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java index ca49c95..534481c 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java @@ -3,10 +3,14 @@ import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.UserService; import ru.espada.ep.iptip.user.permission.UserPermissionService; +import ru.espada.ep.iptip.user.permission.groups.models.AddPermissionRequest; +import ru.espada.ep.iptip.user.permission.groups.models.CreateGroupModel; +import ru.espada.ep.iptip.user.permission.groups.models.GroupToUserRequest; +import ru.espada.ep.iptip.user.permission.groups.permission_group.PermissionGroupEntity; +import java.security.Principal; import java.util.List; @Service @@ -27,8 +31,56 @@ public void addGroup(GroupEntity groupEntity) { } @Override - public List getGroups() { - return groupRepository.findAll(); + public List getGroups(String username) { + return groupRepository.findAll().stream().filter(groupEntity -> userPermissionService.hasPermission(username, "group." + groupEntity.getName())).toList(); + } + + @Override + public void createGroup(Principal principal, CreateGroupModel createGroupModel) { + for (String permission : createGroupModel.getPermissions()) { + if (!userPermissionService.hasPermission(principal.getName(), permission)) { + throw new RuntimeException("User " + principal.getName() + " doesn't have permission " + permission); + } + } + + GroupEntity groupEntity = GroupEntity.builder() + .name(createGroupModel.getName()) + .color(createGroupModel.getColor()) + .permission_groups(createGroupModel.getPermissions().stream().map(permission -> new PermissionGroupEntity(permission)).toList()) + .build(); + addGroup(groupEntity); + + for (String username : createGroupModel.getUsersCanManage()) { + userPermissionService.addPermission(username, "group." + createGroupModel.getName(), -1L, -1L); + } + } + + @Override + public void deleteGroup(String group) { + groupRepository.deleteGroupEntityByName(group); + } + + @Override + public void addPermission(AddPermissionRequest addPermissionRequest) { + userPermissionService.addPermission(addPermissionRequest.getUsername(), "group." + addPermissionRequest.getGroup(), -1L, -1L); + } + + @Override + public void giveGroupToUsers(GroupToUserRequest groupToUserRequest) { + GroupEntity groupEntity = groupRepository.findGroupEntityByName(groupToUserRequest.getGroup()).orElseThrow(); + + for (String username : groupToUserRequest.getUsers()) { + userPermissionService.addPermissions(username, groupEntity.getPermission_groups().stream().map(PermissionGroupEntity::getPermission).toList()); + } + } + + @Override + public void removeGroupFromUser(GroupToUserRequest groupToUserRequest) { + GroupEntity groupEntity = groupRepository.findGroupEntityByName(groupToUserRequest.getGroup()).orElseThrow(); + + for (String username : groupToUserRequest.getUsers()) { + userPermissionService.removePermissions(username, groupEntity.getPermission_groups().stream().map(PermissionGroupEntity::getPermission).toList()); + } } @Autowired @@ -47,7 +99,7 @@ public void setUserPermissionService(UserPermissionService userPermissionService } private void initPermission() { - List permissions = getGroups().stream().map(GroupEntity::getName).map(String::toLowerCase).map(groupName -> "group." + groupName).toList(); + List permissions = groupRepository.findAll().stream().map(GroupEntity::getName).map(String::toLowerCase).map(groupName -> "group." + groupName).toList(); userPermissionService.getSpecialPermissions().addAll(permissions); } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionRequest.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionRequest.java new file mode 100644 index 0000000..6026b14 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionRequest.java @@ -0,0 +1,17 @@ +package ru.espada.ep.iptip.user.permission.groups.models; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AddPermissionRequest { + + private String username; + private String group; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/CreateGroupModel.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/CreateGroupModel.java new file mode 100644 index 0000000..1697df8 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/CreateGroupModel.java @@ -0,0 +1,21 @@ +package ru.espada.ep.iptip.user.permission.groups.models; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateGroupModel { + + private String name; + private String color; + private List permissions; + private List usersCanManage; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/GroupToUserRequest.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/GroupToUserRequest.java new file mode 100644 index 0000000..26ed3f7 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/GroupToUserRequest.java @@ -0,0 +1,19 @@ +package ru.espada.ep.iptip.user.permission.groups.models; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class GroupToUserRequest { + + private List users; + private String group; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java index d08e6ed..b1e55af 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java @@ -20,4 +20,7 @@ public class PermissionGroupEntity { private String permission; + public PermissionGroupEntity(String permission) { + this.permission = permission; + } } From 61b0969ce5cebd5d829a0b55b2cc1fd051169bcf Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sat, 23 Nov 2024 21:12:05 +0300 Subject: [PATCH 15/49] Partial implementation of getInstituteInfoResponse + service & controller methods --- .../espada/ep/iptip/user/UserController.java | 5 +++++ .../ru/espada/ep/iptip/user/UserService.java | 20 +++++++++++++++++ .../response/CustomerCourseResponse.java | 9 -------- .../response/InstituteInfoResponse.java | 22 +++++++++++++++++++ 4 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index ed9a691..60c5518 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -52,4 +52,9 @@ public ResponseEntity uploadAvatar(Principal principal, @RequestBody byte[] a public ResponseEntity getAvatarUrl(Principal principal) { return ResponseEntity.ok(userService.getAvatarUrl(principal.getName())); } + + @GetMapping("/instituteInfo/username/{username}") + public ResponseEntity getInstituteInfo(@PathVariable String username) { + return ResponseEntity.ok(userService.getInstituteInfo(username)); + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java index 605f8a8..ccc01f4 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java @@ -16,6 +16,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.espada.ep.iptip.s3.S3Service; +import ru.espada.ep.iptip.university.UniversityEntity; +import ru.espada.ep.iptip.university.institute.major.MajorEntity; +import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; +import ru.espada.ep.iptip.user.models.response.InstituteInfoResponse; import ru.espada.ep.iptip.user.permission.UserPermissionEntity; import ru.espada.ep.iptip.user.profile.ProfileEntity; import ru.espada.ep.iptip.user.profile.ProfileRepository; @@ -174,4 +178,20 @@ public void setS3Service(S3Service s3Service) { public void setUserPermissionService(UserPermissionService userPermissionService) { this.userPermissionService = userPermissionService; } + + public InstituteInfoResponse getInstituteInfo(String username) { + + UserEntity user = getUser(username); + ProfileEntity profile = user.getProfile(); + //GroupEntity group = profile.getGroup(); + int semester = profile.getSemester(); + int course = semester / 2; + + // TODO: make the rest of the attributes: major, major_code, faculty, institute, group, university + InstituteInfoResponse response = new InstituteInfoResponse(); + response.Course = course; + response.Semester = semester; + + return response; + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/CustomerCourseResponse.java b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/CustomerCourseResponse.java index 8eb49ca..a166c27 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/CustomerCourseResponse.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/CustomerCourseResponse.java @@ -11,16 +11,7 @@ @NoArgsConstructor @Builder public class CustomerCourseResponse { - private Long id; private String name; private String description; - - public static CustomerCourseResponse fromCourse(CourseEntity courseEntity) { - return CustomerCourseResponse.builder() - .id(courseEntity.getId()) - .name(courseEntity.getName()) - .description(courseEntity.getDescription()) - .build(); - } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java new file mode 100644 index 0000000..37e31ff --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java @@ -0,0 +1,22 @@ +package ru.espada.ep.iptip.user.models.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class InstituteInfoResponse { + public String Major; + public String MajorCode; + public String Faculty; + public String Institute; + public String University; + // TODO: integrate group + public String Group = "Not implemented"; + public Integer Semester; + public Integer Course = Semester == null ? null : Semester / 2; +} \ No newline at end of file From c3e176ec1124ca352eaa2e70d26eb8f65d0f2c96 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sat, 23 Nov 2024 21:47:18 +0300 Subject: [PATCH 16/49] group service --- .../ru/espada/ep/iptip/user/UserEntity.java | 2 +- .../AdminDataInitializer.java | 2 +- .../permission/UserPermissionService.java | 10 ++++- .../permission/groups/GroupController.java | 25 ++++++++--- .../user/permission/groups/GroupService.java | 7 ++- .../permission/groups/GroupServiceImpl.java | 45 ++++++++++++++++--- .../groups/models/AddPermissionsToGroup.java | 19 ++++++++ ...java => UserPermissionForGroupReqest.java} | 2 +- .../PermissionGroupEntity.java | 2 + .../PermissionGroupEntityRepository.java | 8 ++++ 10 files changed, 104 insertions(+), 18 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionsToGroup.java rename MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/{AddPermissionRequest.java => UserPermissionForGroupReqest.java} (86%) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntityRepository.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java index 5252f56..c22d587 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserEntity.java @@ -58,7 +58,7 @@ public class UserEntity extends Auditable implements UserDetails, Serializable { ) private Set responsibleCourses; - @OneToMany(fetch = FetchType.LAZY) + @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "user_id") @JsonIgnore private List permissions; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/application_event/AdminDataInitializer.java b/MainService/src/main/java/ru/espada/ep/iptip/user/application_event/AdminDataInitializer.java index cd1cedb..43c9601 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/application_event/AdminDataInitializer.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/application_event/AdminDataInitializer.java @@ -48,7 +48,7 @@ public void onApplicationEvent(ApplicationReadyEvent event) { // права UserPermissionEntity adminPermission = UserPermissionEntity.builder() .userId(admin.getId()) - .name("users.admin") + .name("admin") .startTime(-1L) .endTime(-1L) .build(); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java index 4f5972d..6569b90 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionService.java @@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.UserRepository; import ru.espada.ep.iptip.user.UserService; @@ -43,6 +44,7 @@ public List getPermissions() { return permissions; } + @Transactional public void addPermission(String username, String permission, Long startTime, Long endTime) { UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); if (user == null) { @@ -58,7 +60,8 @@ public void addPermission(String username, String permission, Long startTime, Lo userPermissionRepository.save(userPermissionEntity); } - public void addPermissions(String username, List permissions) { + @Transactional + public void addPermissions(String username, List permissions, Long startTime, Long endTime) { UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); if (user == null) { return; @@ -67,6 +70,8 @@ public void addPermissions(String username, List permissions) { UserPermissionEntity userPermissionEntity = UserPermissionEntity.builder() .userId(user.getId()) .name(permission) + .endTime(startTime) + .startTime(endTime) .build(); userPermissionRepository.save(userPermissionEntity); } @@ -90,6 +95,7 @@ public void removePermissions(String username, List permissions) { } } + @Transactional public void removeAllPermissions(String username) { UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); if (user == null) { @@ -98,6 +104,7 @@ public void removeAllPermissions(String username) { userPermissionRepository.deleteAllByUserId(user.getId()); } + @Transactional public boolean hasPermission(String username, String permission) { UserEntity user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); if (user == null) { @@ -122,6 +129,7 @@ public boolean hasPermission(String username, String permission) { return false; } + @Transactional public boolean hasParentPermission(String username, String permission) { return hasPermission(username, getParentPermission(permission)); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java index 73804c3..2222331 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java @@ -7,7 +7,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import ru.espada.ep.iptip.user.permission.groups.models.AddPermissionRequest; +import ru.espada.ep.iptip.user.permission.groups.models.AddPermissionsToGroup; +import ru.espada.ep.iptip.user.permission.groups.models.UserPermissionForGroupReqest; import ru.espada.ep.iptip.user.permission.groups.models.CreateGroupModel; import ru.espada.ep.iptip.user.permission.groups.models.GroupToUserRequest; @@ -38,21 +39,31 @@ public ResponseEntity deleteGroup(@PathVariable String group) { return ResponseEntity.status(HttpStatus.OK).build(); } - @PostMapping("/add-permission") - @PreAuthorize("hasPermission(#addPermissionRequest, 'group.{group}')") - public ResponseEntity addPermission(@RequestBody AddPermissionRequest addPermissionRequest) { - groupService.addPermission(addPermissionRequest); + @PutMapping("/add-permission") + @PreAuthorize("hasPermission(#addPermissionsToGroup, 'group.{group}')") + public ResponseEntity addPermission(Principal principal, @RequestBody AddPermissionsToGroup addPermissionsToGroup) { + groupService.addGroupPermission(principal, addPermissionsToGroup); + return ResponseEntity.status(HttpStatus.OK).build(); + } + + /** + * Добавляет право управления группой + */ + @PostMapping("/user/add-permission") + @PreAuthorize("hasPermission(#userPermissionForGroupReqest, 'group.{group}')") + public ResponseEntity addPermission(@RequestBody UserPermissionForGroupReqest userPermissionForGroupReqest) { + groupService.addUserPermission(userPermissionForGroupReqest); return ResponseEntity.status(HttpStatus.CREATED).build(); } - @PostMapping("/give") + @PostMapping("/user/give") @PreAuthorize("hasPermission(#groupToUserRequest, 'group.{group}')") public ResponseEntity giveGroup(@RequestBody GroupToUserRequest groupToUserRequest) { groupService.giveGroupToUsers(groupToUserRequest); return ResponseEntity.status(HttpStatus.CREATED).build(); } - @PostMapping("/remove") + @PostMapping("/user/remove") @PreAuthorize("hasPermission(#groupToUserRequest, 'group.{group}')") public ResponseEntity removeGroup(@RequestBody GroupToUserRequest groupToUserRequest) { groupService.removeGroupFromUser(groupToUserRequest); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java index f5ffa0b..55fb2bb 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java @@ -1,6 +1,7 @@ package ru.espada.ep.iptip.user.permission.groups; -import ru.espada.ep.iptip.user.permission.groups.models.AddPermissionRequest; +import ru.espada.ep.iptip.user.permission.groups.models.AddPermissionsToGroup; +import ru.espada.ep.iptip.user.permission.groups.models.UserPermissionForGroupReqest; import ru.espada.ep.iptip.user.permission.groups.models.CreateGroupModel; import ru.espada.ep.iptip.user.permission.groups.models.GroupToUserRequest; @@ -12,10 +13,12 @@ public interface GroupService { void createGroup(Principal principal, CreateGroupModel createGroupModel); - void addPermission(AddPermissionRequest addPermissionRequest); + void addUserPermission(UserPermissionForGroupReqest userPermissionForGroupReqest); void giveGroupToUsers(GroupToUserRequest groupToUserRequest); void removeGroupFromUser(GroupToUserRequest groupToUserRequest); void deleteGroup(String group); + + void addGroupPermission(Principal principal, AddPermissionsToGroup addPermissionsToGroup); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java index 534481c..124f5cf 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java @@ -1,25 +1,32 @@ package ru.espada.ep.iptip.user.permission.groups; import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import ru.espada.ep.iptip.user.UserService; import ru.espada.ep.iptip.user.permission.UserPermissionService; -import ru.espada.ep.iptip.user.permission.groups.models.AddPermissionRequest; +import ru.espada.ep.iptip.user.permission.groups.models.AddPermissionsToGroup; +import ru.espada.ep.iptip.user.permission.groups.models.UserPermissionForGroupReqest; import ru.espada.ep.iptip.user.permission.groups.models.CreateGroupModel; import ru.espada.ep.iptip.user.permission.groups.models.GroupToUserRequest; import ru.espada.ep.iptip.user.permission.groups.permission_group.PermissionGroupEntity; +import ru.espada.ep.iptip.user.permission.groups.permission_group.PermissionGroupEntityRepository; import java.security.Principal; import java.util.List; @Service +@RequiredArgsConstructor public class GroupServiceImpl implements GroupService { private GroupRepository groupRepository; private UserService userService; private UserPermissionService userPermissionService; + private final PermissionGroupEntityRepository permissionGroupEntityRepository; + @PostConstruct public void init() { initPermission(); @@ -36,6 +43,7 @@ public List getGroups(String username) { } @Override + @Transactional public void createGroup(Principal principal, CreateGroupModel createGroupModel) { for (String permission : createGroupModel.getPermissions()) { if (!userPermissionService.hasPermission(principal.getName(), permission)) { @@ -46,10 +54,19 @@ public void createGroup(Principal principal, CreateGroupModel createGroupModel) GroupEntity groupEntity = GroupEntity.builder() .name(createGroupModel.getName()) .color(createGroupModel.getColor()) - .permission_groups(createGroupModel.getPermissions().stream().map(permission -> new PermissionGroupEntity(permission)).toList()) .build(); addGroup(groupEntity); + groupRepository.save(groupEntity); + + for (String permission : createGroupModel.getPermissions()) { + PermissionGroupEntity permissionGroupEntity = PermissionGroupEntity.builder() + .groupId(groupEntity.getId()) + .permission(permission) + .build(); + permissionGroupEntityRepository.save(permissionGroupEntity); + } + for (String username : createGroupModel.getUsersCanManage()) { userPermissionService.addPermission(username, "group." + createGroupModel.getName(), -1L, -1L); } @@ -61,8 +78,26 @@ public void deleteGroup(String group) { } @Override - public void addPermission(AddPermissionRequest addPermissionRequest) { - userPermissionService.addPermission(addPermissionRequest.getUsername(), "group." + addPermissionRequest.getGroup(), -1L, -1L); + public void addUserPermission(UserPermissionForGroupReqest userPermissionForGroupReqest) { + userPermissionService.addPermission(userPermissionForGroupReqest.getUsername(), "group." + userPermissionForGroupReqest.getGroup(), -1L, -1L); + } + + @Override + public void addGroupPermission(Principal principal, AddPermissionsToGroup addPermissionsToGroup) { + for (String permission : addPermissionsToGroup.getPermissions()) { + if (!userPermissionService.hasPermission(principal.getName(), permission)) { + throw new RuntimeException("User " + principal.getName() + " doesn't have permission " + permission); + } + } + + GroupEntity groupEntity = groupRepository.findGroupEntityByName(addPermissionsToGroup.getGroup()).orElseThrow(); + for (String permission : addPermissionsToGroup.getPermissions()) { + PermissionGroupEntity permissionGroupEntity = PermissionGroupEntity.builder() + .groupId(groupEntity.getId()) + .permission(permission) + .build(); + permissionGroupEntityRepository.save(permissionGroupEntity); + } } @Override @@ -70,7 +105,7 @@ public void giveGroupToUsers(GroupToUserRequest groupToUserRequest) { GroupEntity groupEntity = groupRepository.findGroupEntityByName(groupToUserRequest.getGroup()).orElseThrow(); for (String username : groupToUserRequest.getUsers()) { - userPermissionService.addPermissions(username, groupEntity.getPermission_groups().stream().map(PermissionGroupEntity::getPermission).toList()); + userPermissionService.addPermissions(username, groupEntity.getPermission_groups().stream().map(PermissionGroupEntity::getPermission).toList(), -1L, -1L); } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionsToGroup.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionsToGroup.java new file mode 100644 index 0000000..40bcdb6 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionsToGroup.java @@ -0,0 +1,19 @@ +package ru.espada.ep.iptip.user.permission.groups.models; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AddPermissionsToGroup { + + private String group; + private List permissions; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionRequest.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/UserPermissionForGroupReqest.java similarity index 86% rename from MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionRequest.java rename to MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/UserPermissionForGroupReqest.java index 6026b14..e2a3c30 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/AddPermissionRequest.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/models/UserPermissionForGroupReqest.java @@ -9,7 +9,7 @@ @AllArgsConstructor @NoArgsConstructor @Builder -public class AddPermissionRequest { +public class UserPermissionForGroupReqest { private String username; private String group; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java index b1e55af..dfdb10f 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntity.java @@ -18,6 +18,8 @@ public class PermissionGroupEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "group_id") + private Long groupId; private String permission; public PermissionGroupEntity(String permission) { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntityRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntityRepository.java new file mode 100644 index 0000000..ca567e5 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/permission_group/PermissionGroupEntityRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.user.permission.groups.permission_group; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PermissionGroupEntityRepository extends JpaRepository { +} \ No newline at end of file From 0bb8c455e499d3af57cc982ad0de2e911af9959c Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sat, 23 Nov 2024 23:37:37 +0300 Subject: [PATCH 17/49] getInstituteInfo method implemented --- .../user_course/UserCourseRepository.java | 3 + .../institute/major/MajorEntity.java | 2 + .../ru/espada/ep/iptip/user/UserService.java | 62 ++++++++++++++++++- .../response/InstituteInfoResponse.java | 3 +- 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java index cf16ffe..7753cea 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java @@ -5,4 +5,7 @@ @Repository public interface UserCourseRepository extends JpaRepository { + UserCourseEntity findUserCourseEntityByUserIdNotNull(); + + UserCourseEntity findUserCourseEntityByUserId(Long userId); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java index 1aa9209..e37a3a0 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java @@ -35,4 +35,6 @@ public class MajorEntity { @OneToMany(mappedBy = "major") @FieldPermission private List faculties; + + private String majorCode; } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java index ccc01f4..3bf9127 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java @@ -1,6 +1,7 @@ package ru.espada.ep.iptip.user; import jakarta.annotation.PostConstruct; +import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; @@ -15,10 +16,20 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import ru.espada.ep.iptip.course.CourseEntity; +import ru.espada.ep.iptip.course.CourseRepository; +import ru.espada.ep.iptip.course.user_course.UserCourseEntity; +import ru.espada.ep.iptip.course.user_course.UserCourseRepository; import ru.espada.ep.iptip.s3.S3Service; +import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import ru.espada.ep.iptip.university.UniversityEntity; +import ru.espada.ep.iptip.university.UniversityRepository; +import ru.espada.ep.iptip.university.institute.InstituteEntity; +import ru.espada.ep.iptip.university.institute.InstituteRepository; import ru.espada.ep.iptip.university.institute.major.MajorEntity; +import ru.espada.ep.iptip.university.institute.major.MajorRepository; import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; +import ru.espada.ep.iptip.university.institute.major.faculty.FacultyRepository; import ru.espada.ep.iptip.user.models.response.InstituteInfoResponse; import ru.espada.ep.iptip.user.permission.UserPermissionEntity; import ru.espada.ep.iptip.user.profile.ProfileEntity; @@ -33,17 +44,24 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.concurrent.CompletableFuture; @Service public class UserService implements UserDetailsService { private UserRepository userRepository; + private ProfileRepository profileRepository; + private CourseRepository courseRepository; + private UserCourseRepository userCourseRepository; + private MajorRepository majorRepository; + private FacultyRepository facultyRepository; + private InstituteRepository instituteRepository; + private UniversityRepository universityRepository; private PasswordEncoder bCryptPasswordEncoder; private UserPermissionService userPermissionService; @Value("${users.page-size}") private int pageSize; - private ProfileRepository profileRepository; private S3Service s3Service; @Override @@ -168,6 +186,30 @@ public void setCustomerRepository(ProfileRepository profileRepository) { this.profileRepository = profileRepository; } + @Autowired + public void setCourseRepository(CourseRepository courseRepository) { + this.courseRepository = courseRepository; + } + @Autowired + public void setUserCourseRepository(UserCourseRepository userCourseRepository) { + this.userCourseRepository = userCourseRepository; + } + + @Autowired + public void setUniversityRepository(UniversityRepository universityRepository) { + this.universityRepository = universityRepository; + } + + @Autowired + public void setMajorRepository(MajorRepository majorRepository) { + this.majorRepository = majorRepository; + } + + @Autowired + public void setInstituteRepository(InstituteRepository instituteRepository) { + this.instituteRepository = instituteRepository; + } + @Autowired public void setS3Service(S3Service s3Service) { this.s3Service = s3Service; @@ -179,18 +221,32 @@ public void setUserPermissionService(UserPermissionService userPermissionService this.userPermissionService = userPermissionService; } + @Transactional public InstituteInfoResponse getInstituteInfo(String username) { UserEntity user = getUser(username); ProfileEntity profile = user.getProfile(); - //GroupEntity group = profile.getGroup(); int semester = profile.getSemester(); int course = semester / 2; - // TODO: make the rest of the attributes: major, major_code, faculty, institute, group, university + StudyGroupEntity studyGroup = user.getStudyGroups().stream().findFirst().orElse(null); + + // FIXME: this may be null + FacultyEntity faculty = studyGroup.getFaculty(); + MajorEntity major = faculty.getMajor(); + InstituteEntity insitute = major.getInstitute(); + UniversityEntity university = insitute.getUniversity(); + InstituteInfoResponse response = new InstituteInfoResponse(); response.Course = course; response.Semester = semester; + response.Major = major.getName(); + response.MajorCode = major.getMajorCode(); + response.Faculty = faculty.getName(); + response.Institute = insitute.getName(); + response.Group = studyGroup.getName(); + response.University = university.getName(); + response.Group = studyGroup.getName(); return response; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java index 37e31ff..8c7cf69 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java @@ -15,8 +15,7 @@ public class InstituteInfoResponse { public String Faculty; public String Institute; public String University; - // TODO: integrate group - public String Group = "Not implemented"; + public String Group; public Integer Semester; public Integer Course = Semester == null ? null : Semester / 2; } \ No newline at end of file From 79b4f5fcc97b41edd8fd058c5d2a029d7c23c5f9 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sun, 24 Nov 2024 12:34:38 +0300 Subject: [PATCH 18/49] getcourses request --- .../user_course/UserCourseRepository.java | 4 + .../espada/ep/iptip/user/UserController.java | 5 + .../ru/espada/ep/iptip/user/UserService.java | 96 +++++++++---------- .../models/response/GetMyCoursesResponse.java | 9 ++ 4 files changed, 64 insertions(+), 50 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java index 7753cea..86215b5 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java @@ -3,9 +3,13 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface UserCourseRepository extends JpaRepository { UserCourseEntity findUserCourseEntityByUserIdNotNull(); UserCourseEntity findUserCourseEntityByUserId(Long userId); + + List findUserCourseEntitiesByUserId(Long userId); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index 60c5518..0af37de 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -57,4 +57,9 @@ public ResponseEntity getAvatarUrl(Principal principal) { public ResponseEntity getInstituteInfo(@PathVariable String username) { return ResponseEntity.ok(userService.getInstituteInfo(username)); } + + @GetMapping("/myCourses/username/{username}") + public ResponseEntity getMyCourses(@PathVariable String username) { + return ResponseEntity.ok(userService.getMyCourses(username)); + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java index 3bf9127..074585c 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java @@ -30,6 +30,7 @@ import ru.espada.ep.iptip.university.institute.major.MajorRepository; import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; import ru.espada.ep.iptip.university.institute.major.faculty.FacultyRepository; +import ru.espada.ep.iptip.user.models.response.GetMyCoursesResponse; import ru.espada.ep.iptip.user.models.response.InstituteInfoResponse; import ru.espada.ep.iptip.user.permission.UserPermissionEntity; import ru.espada.ep.iptip.user.profile.ProfileEntity; @@ -54,10 +55,7 @@ public class UserService implements UserDetailsService { private ProfileRepository profileRepository; private CourseRepository courseRepository; private UserCourseRepository userCourseRepository; - private MajorRepository majorRepository; private FacultyRepository facultyRepository; - private InstituteRepository instituteRepository; - private UniversityRepository universityRepository; private PasswordEncoder bCryptPasswordEncoder; private UserPermissionService userPermissionService; @Value("${users.page-size}") @@ -156,6 +154,51 @@ public String getAvatarUrl(String name) { return s3Service.getFileUrl("user-avatar", "user-" + user.getId()).join(); } + @Transactional + public InstituteInfoResponse getInstituteInfo(String username) { + + UserEntity user = getUser(username); + ProfileEntity profile = user.getProfile(); + int semester = profile.getSemester(); + int course = semester / 2; + + StudyGroupEntity studyGroup = user.getStudyGroups().stream().findFirst().orElse(null); + + // FIXME: this may be null + FacultyEntity faculty = studyGroup.getFaculty(); + MajorEntity major = faculty.getMajor(); + InstituteEntity insitute = major.getInstitute(); + UniversityEntity university = insitute.getUniversity(); + + InstituteInfoResponse response = new InstituteInfoResponse(); + response.Course = course; + response.Semester = semester; + response.Major = major.getName(); + response.MajorCode = major.getMajorCode(); + response.Faculty = faculty.getName(); + response.Institute = insitute.getName(); + response.Group = studyGroup.getName(); + response.University = university.getName(); + response.Group = studyGroup.getName(); + + return response; + } + + @Transactional + public GetMyCoursesResponse getMyCourses(String username) { + UserEntity user = getUser(username); + List userCourses = userCourseRepository + .findUserCourseEntitiesByUserId(user.getId()) + .stream() + .filter(userCourseEntity -> userCourseEntity.getSemester() == user.getProfile().getSemester()) + .toList(); + List courses = courseRepository.findAllById(userCourses.stream().map(UserCourseEntity::getCourseId).toList()); + + GetMyCoursesResponse response = new GetMyCoursesResponse(); + response.Courses = courses; + return response; + } + public void addPermission(String username, AddRoleRequest addRoleRequest) { String permission = addRoleRequest.getPermission(); for (String key : addRoleRequest.getCredentials().keySet()) { @@ -169,7 +212,6 @@ public void addPermission(String username, AddRoleRequest addRoleRequest) { userPermissionService.addPermission(addRoleRequest.getUsername(), permission, addRoleRequest.getStartTime(), addRoleRequest.getEndTime()); } - @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; @@ -195,59 +237,13 @@ public void setUserCourseRepository(UserCourseRepository userCourseRepository) { this.userCourseRepository = userCourseRepository; } - @Autowired - public void setUniversityRepository(UniversityRepository universityRepository) { - this.universityRepository = universityRepository; - } - - @Autowired - public void setMajorRepository(MajorRepository majorRepository) { - this.majorRepository = majorRepository; - } - - @Autowired - public void setInstituteRepository(InstituteRepository instituteRepository) { - this.instituteRepository = instituteRepository; - } - @Autowired public void setS3Service(S3Service s3Service) { this.s3Service = s3Service; } - @Autowired public void setUserPermissionService(UserPermissionService userPermissionService) { this.userPermissionService = userPermissionService; } - - @Transactional - public InstituteInfoResponse getInstituteInfo(String username) { - - UserEntity user = getUser(username); - ProfileEntity profile = user.getProfile(); - int semester = profile.getSemester(); - int course = semester / 2; - - StudyGroupEntity studyGroup = user.getStudyGroups().stream().findFirst().orElse(null); - - // FIXME: this may be null - FacultyEntity faculty = studyGroup.getFaculty(); - MajorEntity major = faculty.getMajor(); - InstituteEntity insitute = major.getInstitute(); - UniversityEntity university = insitute.getUniversity(); - - InstituteInfoResponse response = new InstituteInfoResponse(); - response.Course = course; - response.Semester = semester; - response.Major = major.getName(); - response.MajorCode = major.getMajorCode(); - response.Faculty = faculty.getName(); - response.Institute = insitute.getName(); - response.Group = studyGroup.getName(); - response.University = university.getName(); - response.Group = studyGroup.getName(); - - return response; - } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java new file mode 100644 index 0000000..58568a8 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java @@ -0,0 +1,9 @@ +package ru.espada.ep.iptip.user.models.response; + +import ru.espada.ep.iptip.course.CourseEntity; + +import java.util.List; + +public class GetMyCoursesResponse { + public List Courses; +} From 30a68d46495930d0d3eb916680366826c2e75358 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sun, 24 Nov 2024 13:23:51 +0300 Subject: [PATCH 19/49] fix --- .../user_course/UserCourseRepository.java | 2 ++ .../ru/espada/ep/iptip/user/UserService.java | 34 ++++++++----------- .../models/response/GetMyCoursesResponse.java | 10 +++++- .../response/InstituteInfoResponse.java | 16 ++++----- 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java index 86215b5..266938b 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java @@ -12,4 +12,6 @@ public interface UserCourseRepository extends JpaRepository findUserCourseEntitiesByUserId(Long userId); + + List findUserCourseEntitiesByUserIdAndSemester(Long userId, int semester); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java index 074585c..a3784d8 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java @@ -170,33 +170,27 @@ public InstituteInfoResponse getInstituteInfo(String username) { InstituteEntity insitute = major.getInstitute(); UniversityEntity university = insitute.getUniversity(); - InstituteInfoResponse response = new InstituteInfoResponse(); - response.Course = course; - response.Semester = semester; - response.Major = major.getName(); - response.MajorCode = major.getMajorCode(); - response.Faculty = faculty.getName(); - response.Institute = insitute.getName(); - response.Group = studyGroup.getName(); - response.University = university.getName(); - response.Group = studyGroup.getName(); - - return response; + return InstituteInfoResponse.builder() + .major(major.getName()) + .majorCode(major.getMajorCode()) + .faculty(faculty.getName()) + .institute(insitute.getName()) + .university(university.getName()) + .studyGroup(studyGroup.getName()) + .semester(semester) + .course(course) + .build(); } @Transactional public GetMyCoursesResponse getMyCourses(String username) { UserEntity user = getUser(username); - List userCourses = userCourseRepository - .findUserCourseEntitiesByUserId(user.getId()) - .stream() - .filter(userCourseEntity -> userCourseEntity.getSemester() == user.getProfile().getSemester()) - .toList(); + List userCourses = userCourseRepository.findUserCourseEntitiesByUserIdAndSemester(user.getId(), user.getProfile().getSemester()); List courses = courseRepository.findAllById(userCourses.stream().map(UserCourseEntity::getCourseId).toList()); - GetMyCoursesResponse response = new GetMyCoursesResponse(); - response.Courses = courses; - return response; + return GetMyCoursesResponse.builder() + .courses(courses) + .build(); } public void addPermission(String username, AddRoleRequest addRoleRequest) { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java index 58568a8..aaa6e20 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java @@ -1,9 +1,17 @@ package ru.espada.ep.iptip.user.models.response; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import ru.espada.ep.iptip.course.CourseEntity; import java.util.List; +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder public class GetMyCoursesResponse { - public List Courses; + private List courses; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java index 8c7cf69..3c87726 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/InstituteInfoResponse.java @@ -10,12 +10,12 @@ @NoArgsConstructor @Builder public class InstituteInfoResponse { - public String Major; - public String MajorCode; - public String Faculty; - public String Institute; - public String University; - public String Group; - public Integer Semester; - public Integer Course = Semester == null ? null : Semester / 2; + private String major; + private String majorCode; + private String faculty; + private String institute; + private String university; + private String studyGroup; + private Integer semester; + private Integer course = semester == null ? null : semester / 2; } \ No newline at end of file From c45721fe4253c5eac910abbd1102922ebb7ec615 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sun, 24 Nov 2024 13:30:20 +0300 Subject: [PATCH 20/49] todo --- .../java/ru/espada/ep/iptip/course/CourseController.java | 3 +++ .../espada/ep/iptip/study_groups/StudyGroupController.java | 5 +++++ .../study_group_event/StudyGroupEventController.java | 2 ++ 3 files changed, 10 insertions(+) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index 71bbe70..8d9333e 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -18,6 +18,9 @@ public class CourseController { private CourseService courseService; + // TODO: add methods: attach user to course, attach study group to course, detach user from course, detach study group from course + // TODO: add methods: get users curses + @PostMapping("") public ResponseEntity createCourse(Principal principal, @Valid @RequestBody CreateCourseModel createCourseModel) { courseService.createCourse(principal, createCourseModel); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupController.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupController.java index eda5b08..87fd013 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupController.java @@ -1,6 +1,7 @@ package ru.espada.ep.iptip.study_groups; import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; @@ -8,8 +9,12 @@ @SecurityRequirement(name = "JWT") @RequestMapping("/studyGroup") public class StudyGroupController { + private StudyGroupRepository studyGroupRepository; + // TODO: add methods: create, add users, remove users, get users, set semester + + @Autowired public void setStudyGroupRepository(StudyGroupRepository studyGroupRepository) { this.studyGroupRepository = studyGroupRepository; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java index f5bca47..00ba83c 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java @@ -9,5 +9,7 @@ @RequestMapping("/studyGroupEvent") public class StudyGroupEventController { + // TODO: add methods: create event, modify event, delete event + } From 19c96275dc8c7eb17ebeaff5f0f61af47e647594 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sun, 24 Nov 2024 14:40:53 +0300 Subject: [PATCH 21/49] Attach/detach user from course methods --- .../ep/iptip/course/CourseController.java | 18 +++++++++-- .../espada/ep/iptip/course/CourseService.java | 30 +++++++++++++++++++ .../user_course/UserCourseRepository.java | 2 ++ .../espada/ep/iptip/user/UserController.java | 2 +- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index 8d9333e..762ef3d 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -18,10 +18,22 @@ public class CourseController { private CourseService courseService; - // TODO: add methods: attach user to course, attach study group to course, detach user from course, detach study group from course - // TODO: add methods: get users curses + // TODO: add methods: attach study group to course, detach study group from course + // TODO: add methods: get users courses - @PostMapping("") + @PostMapping("attachUser/course/{courseId}/user/{userId}") + public ResponseEntity attachUserToCourse(Principal principal, @PathVariable Long courseId, @PathVariable Long userId) { + courseService.attachUserToCourse(courseId, userId); + return ResponseEntity.ok().build(); + } + + @DeleteMapping("detachUser/course/{courseId}/user/{userId}") + public ResponseEntity detachUserFromCourse(Principal principal, @PathVariable Long courseId, @PathVariable Long userId) { + courseService.detachUserFromCourse(courseId, userId); + return ResponseEntity.ok().build(); + } + + @PostMapping("/{id}") public ResponseEntity createCourse(Principal principal, @Valid @RequestBody CreateCourseModel createCourseModel) { courseService.createCourse(principal, createCourseModel); return ResponseEntity.status(HttpStatus.CREATED).build(); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index df31eaa..652cd08 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -2,9 +2,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import ru.espada.ep.iptip.course.model.CourseResponseModel; import ru.espada.ep.iptip.course.model.CreateCourseModel; import ru.espada.ep.iptip.course.test.TestEntity; +import ru.espada.ep.iptip.course.user_course.UserCourseEntity; +import ru.espada.ep.iptip.course.user_course.UserCourseRepository; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.UserRepository; import ru.espada.ep.iptip.user.UserService; @@ -17,6 +20,7 @@ public class CourseService { private CourseRepository courseRepository; + private UserCourseRepository userCourseRepository; private UserRepository userRepository; private UserService userService; @@ -38,11 +42,37 @@ public CourseEntity getCourse(Long id) { return courseRepository.findById(id).orElseThrow(() -> new RuntimeException("Course not found")); } + @Transactional + public UserCourseEntity attachUserToCourse(Long courseId, Long userId) { + UserEntity userEntity = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("User not found")); + CourseEntity courseEntity = courseRepository.findById(courseId).orElseThrow(() -> new RuntimeException("Course not found")); + + return userCourseRepository.save(UserCourseEntity.builder() + .courseId(courseEntity.getId()) + .userId(userEntity.getId()) + .build()); + } + + @Transactional + public Boolean detachUserFromCourse(Long courseId, Long userId) { + UserEntity userEntity = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("User not found")); + CourseEntity courseEntity = courseRepository.findById(courseId).orElseThrow(() -> new RuntimeException("Course not found")); + + UserCourseEntity userCourseEntity = userCourseRepository.findUserCourseEntityByUserIdAndCourseId(userEntity.getId(), courseEntity.getId()); + userCourseRepository.delete(userCourseEntity); + return true; + } + @Autowired public void setCourseRepository(CourseRepository courseRepository) { this.courseRepository = courseRepository; } + @Autowired + public void setUserCourseRepository(UserCourseRepository userCourseRepository) { + this.userCourseRepository = userCourseRepository; + } + @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java index 266938b..09e2236 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java @@ -14,4 +14,6 @@ public interface UserCourseRepository extends JpaRepository findUserCourseEntitiesByUserId(Long userId); List findUserCourseEntitiesByUserIdAndSemester(Long userId, int semester); + + UserCourseEntity findUserCourseEntityByUserIdAndCourseId(Long userId, Long courseId); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index 0af37de..cc5ed96 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -58,7 +58,7 @@ public ResponseEntity getInstituteInfo(@PathVariable String username) { return ResponseEntity.ok(userService.getInstituteInfo(username)); } - @GetMapping("/myCourses/username/{username}") + @GetMapping("/courses/username/{username}") public ResponseEntity getMyCourses(@PathVariable String username) { return ResponseEntity.ok(userService.getMyCourses(username)); } From 23df27f0b004114a0fec33e519f72881e0505bf8 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sun, 24 Nov 2024 15:13:25 +0300 Subject: [PATCH 22/49] Course todo completed --- .../ep/iptip/course/CourseController.java | 20 +++++++-- .../espada/ep/iptip/course/CourseService.java | 44 +++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index 762ef3d..69174bc 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -18,9 +18,6 @@ public class CourseController { private CourseService courseService; - // TODO: add methods: attach study group to course, detach study group from course - // TODO: add methods: get users courses - @PostMapping("attachUser/course/{courseId}/user/{userId}") public ResponseEntity attachUserToCourse(Principal principal, @PathVariable Long courseId, @PathVariable Long userId) { courseService.attachUserToCourse(courseId, userId); @@ -33,6 +30,23 @@ public ResponseEntity detachUserFromCourse(Principal principal, @PathVariable return ResponseEntity.ok().build(); } + @PostMapping("attachStudyGroup/course/{courseId}/studyGroup/{studyGroupId}") + public ResponseEntity attachStudyGroupToCourse(Principal principal, @PathVariable Long courseId, @PathVariable Long studyGroupId) { + courseService.attachStudyGroupToCourse(courseId, studyGroupId); + return ResponseEntity.ok().build(); + } + + @DeleteMapping("detachStudyGroup/course/{courseId}/studyGroup/{studyGroupId}") + public ResponseEntity detachStudyGroupFromCourse(Principal principal, @PathVariable Long courseId, @PathVariable Long studyGroupId) { + courseService.detachStudyGroupFromCourse(courseId, studyGroupId); + return ResponseEntity.ok().build(); + } + + @GetMapping("userCourses/{userId}") + public ResponseEntity getUserCourses(@PathVariable Long userId) { + return ResponseEntity.ok(courseService.getUserCourses(userId)); + } + @PostMapping("/{id}") public ResponseEntity createCourse(Principal principal, @Valid @RequestBody CreateCourseModel createCourseModel) { courseService.createCourse(principal, createCourseModel); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index 652cd08..6919f2d 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -8,6 +8,8 @@ import ru.espada.ep.iptip.course.test.TestEntity; import ru.espada.ep.iptip.course.user_course.UserCourseEntity; import ru.espada.ep.iptip.course.user_course.UserCourseRepository; +import ru.espada.ep.iptip.study_groups.StudyGroupEntity; +import ru.espada.ep.iptip.study_groups.StudyGroupRepository; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.UserRepository; import ru.espada.ep.iptip.user.UserService; @@ -21,6 +23,7 @@ public class CourseService { private CourseRepository courseRepository; private UserCourseRepository userCourseRepository; + private StudyGroupRepository studyGroupRepository; private UserRepository userRepository; private UserService userService; @@ -63,6 +66,34 @@ public Boolean detachUserFromCourse(Long courseId, Long userId) { return true; } + @Transactional + public Boolean attachStudyGroupToCourse(Long courseId, Long studyGroupId) { + CourseEntity courseEntity = courseRepository.findById(courseId).orElseThrow(() -> new RuntimeException("Course not found")); + StudyGroupEntity studyGroupEntity = studyGroupRepository.findById(studyGroupId).orElseThrow(() -> new RuntimeException("StudyGroup not found")); + List users = studyGroupEntity.getUsers().stream().toList(); + + userCourseRepository.saveAll(users.stream().map(user -> UserCourseEntity.builder() + .courseId(courseEntity.getId()) + .userId(user.getId()) + .build()).toList()); + + return true; + } + + @Transactional + public Boolean detachStudyGroupFromCourse(Long courseId, Long studyGroupId) { + CourseEntity courseEntity = courseRepository.findById(courseId).orElseThrow(() -> new RuntimeException("Course not found")); + StudyGroupEntity studyGroupEntity = studyGroupRepository.findById(studyGroupId).orElseThrow(() -> new RuntimeException("StudyGroup not found")); + List users = studyGroupEntity.getUsers().stream().toList(); + + userCourseRepository.deleteAll(users.stream().map(user -> UserCourseEntity.builder() + .courseId(courseEntity.getId()) + .userId(user.getId()) + .build()).toList()); + + return true; + } + @Autowired public void setCourseRepository(CourseRepository courseRepository) { this.courseRepository = courseRepository; @@ -73,6 +104,11 @@ public void setUserCourseRepository(UserCourseRepository userCourseRepository) { this.userCourseRepository = userCourseRepository; } + @Autowired + public void setStudyGroupRepository(StudyGroupRepository studyGroupRepository) { + this.studyGroupRepository = studyGroupRepository; + } + @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; @@ -82,4 +118,12 @@ public void setUserRepository(UserRepository userRepository) { public void setUserService(UserService userService) { this.userService = userService; } + + public List getUserCourses(Long userId) { + return this.userCourseRepository.findUserCourseEntitiesByUserId(userId) + .stream() + .map(userCourseEntity -> courseRepository.findById(userCourseEntity.getCourseId()).orElseThrow(() -> new RuntimeException("Course not found"))) + .sorted(Comparator.comparing(CourseEntity::getName)) + .toList(); + } } From 9a2811fac71af84be0a43c29219a42280df76bf5 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sun, 24 Nov 2024 16:30:46 +0300 Subject: [PATCH 23/49] course learning resource --- .../CourseLearningResourceCategoryEntity.java | 27 ++++++++++++++ ...rseLearningResourceCategoryRepository.java | 8 +++++ .../CourseLearningResourceService.java | 4 +++ .../CourseLearningResourceServiceImpl.java | 18 ++++++++++ .../CourseLearningResourceFolderEntity.java | 28 +++++++++++++++ ...ourseLearningResourceFolderRepository.java | 8 +++++ .../CourseLearningResourceEntity.java | 35 +++++++++++++++++++ .../CourseLearningResourceRepository.java | 8 +++++ 8 files changed, 136 insertions(+) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceRepository.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java new file mode 100644 index 0000000..d2902a4 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java @@ -0,0 +1,27 @@ +package ru.espada.ep.iptip.course.learning_resource_category; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.course.CourseEntity; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "course_learning_resource_category") +public class CourseLearningResourceCategoryEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + @ManyToOne + @JoinColumn(name = "course_id") + private CourseEntity course; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryRepository.java new file mode 100644 index 0000000..1cd0bff --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.course.learning_resource_category; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CourseLearningResourceCategoryRepository extends JpaRepository { +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java new file mode 100644 index 0000000..22b166b --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java @@ -0,0 +1,4 @@ +package ru.espada.ep.iptip.course.learning_resource_category; + +public interface CourseLearningResourceService { +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java new file mode 100644 index 0000000..28ff16f --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java @@ -0,0 +1,18 @@ +package ru.espada.ep.iptip.course.learning_resource_category; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class CourseLearningResourceServiceImpl implements CourseLearningResourceService { + + private CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository; + + + + @Autowired + public void setCourseLearningResourceCategoryRepository(CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository) { + this.courseLearningResourceCategoryRepository = courseLearningResourceCategoryRepository; + } +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java new file mode 100644 index 0000000..a96bfaa --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java @@ -0,0 +1,28 @@ +package ru.espada.ep.iptip.course.learning_resource_category.folder; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryEntity; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "course_learning_resource_folder") +public class CourseLearningResourceFolderEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + @ManyToOne + @JoinColumn(name = "course_learning_resource_category_id") + private CourseLearningResourceCategoryEntity category; + +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderRepository.java new file mode 100644 index 0000000..7a92571 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.course.learning_resource_category.folder; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CourseLearningResourceFolderRepository extends JpaRepository { +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java new file mode 100644 index 0000000..bbf4d74 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java @@ -0,0 +1,35 @@ +package ru.espada.ep.iptip.course.learning_resource_category.resource; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryEntity; +import ru.espada.ep.iptip.course.learning_resource_category.folder.CourseLearningResourceFolderEntity; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "course_learning_resource") +public class CourseLearningResourceEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + private String type; + private String content; + + @ManyToOne + @JoinColumn(name = "course_learning_resource_category_id") + private CourseLearningResourceCategoryEntity category; + + @ManyToOne + @JoinColumn(name = "course_learning_resource_folder_id") + private CourseLearningResourceFolderEntity folder; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceRepository.java new file mode 100644 index 0000000..1ed7c4c --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceRepository.java @@ -0,0 +1,8 @@ +package ru.espada.ep.iptip.course.learning_resource_category.resource; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CourseLearningResourceRepository extends JpaRepository { +} \ No newline at end of file From 18a6d7a15eaab4b3dbe8cc5c64ccc609f145b12a Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sun, 24 Nov 2024 16:33:20 +0300 Subject: [PATCH 24/49] Made controller use models instead of path variables in post/delete methods (+ implemented the models obviously) --- .../ep/iptip/course/CourseController.java | 41 ++++++++++++------- .../model/AttachStudyGroupToCourseModel.java | 15 +++++++ .../course/model/AttachUserToCourseModel.java | 15 +++++++ .../DetachStudyGroupFromCourseModel.java | 15 +++++++ .../model/DetachUserFromCourseModel.java | 15 +++++++ 5 files changed, 87 insertions(+), 14 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachStudyGroupToCourseModel.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachUserToCourseModel.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachStudyGroupFromCourseModel.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachUserFromCourseModel.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index 69174bc..210b339 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -7,7 +7,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import ru.espada.ep.iptip.course.model.CreateCourseModel; +import ru.espada.ep.iptip.course.model.*; import java.security.Principal; @@ -18,27 +18,39 @@ public class CourseController { private CourseService courseService; - @PostMapping("attachUser/course/{courseId}/user/{userId}") - public ResponseEntity attachUserToCourse(Principal principal, @PathVariable Long courseId, @PathVariable Long userId) { - courseService.attachUserToCourse(courseId, userId); + @PostMapping("attachUser") + public ResponseEntity attachUserToCourse(@Valid @RequestBody AttachUserToCourseModel attachUserToCourseModel) { + courseService.attachUserToCourse( + attachUserToCourseModel.getCourseId(), + attachUserToCourseModel.getUserId() + ); return ResponseEntity.ok().build(); } - @DeleteMapping("detachUser/course/{courseId}/user/{userId}") - public ResponseEntity detachUserFromCourse(Principal principal, @PathVariable Long courseId, @PathVariable Long userId) { - courseService.detachUserFromCourse(courseId, userId); + @DeleteMapping("detachUser") + public ResponseEntity detachUserFromCourse(@Valid @RequestBody DetachUserFromCourseModel detachUserFromCourseModel) { + courseService.detachUserFromCourse( + detachUserFromCourseModel.getCourseId(), + detachUserFromCourseModel.getUserId() + ); return ResponseEntity.ok().build(); } - @PostMapping("attachStudyGroup/course/{courseId}/studyGroup/{studyGroupId}") - public ResponseEntity attachStudyGroupToCourse(Principal principal, @PathVariable Long courseId, @PathVariable Long studyGroupId) { - courseService.attachStudyGroupToCourse(courseId, studyGroupId); + @PostMapping("attachStudyGroup") + public ResponseEntity attachStudyGroupToCourse(@Valid @RequestBody AttachStudyGroupToCourseModel attachStudyGroupToCourseModel) { + courseService.attachStudyGroupToCourse( + attachStudyGroupToCourseModel.getCourseId(), + attachStudyGroupToCourseModel.getStudyGroupId() + ); return ResponseEntity.ok().build(); } - @DeleteMapping("detachStudyGroup/course/{courseId}/studyGroup/{studyGroupId}") - public ResponseEntity detachStudyGroupFromCourse(Principal principal, @PathVariable Long courseId, @PathVariable Long studyGroupId) { - courseService.detachStudyGroupFromCourse(courseId, studyGroupId); + @DeleteMapping("detachStudyGroup/") + public ResponseEntity detachStudyGroupFromCourse(@Valid @RequestBody DetachStudyGroupFromCourseModel detachStudyGroupFromCourseModel) { + courseService.detachStudyGroupFromCourse( + detachStudyGroupFromCourseModel.getCourseId(), + detachStudyGroupFromCourseModel.getStudyGroupId() + ); return ResponseEntity.ok().build(); } @@ -47,8 +59,9 @@ public ResponseEntity getUserCourses(@PathVariable Long userId) { return ResponseEntity.ok(courseService.getUserCourses(userId)); } - @PostMapping("/{id}") + @PostMapping("course") public ResponseEntity createCourse(Principal principal, @Valid @RequestBody CreateCourseModel createCourseModel) { + // FIXME: is principal supposed to be here? courseService.createCourse(principal, createCourseModel); return ResponseEntity.status(HttpStatus.CREATED).build(); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachStudyGroupToCourseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachStudyGroupToCourseModel.java new file mode 100644 index 0000000..0786bce --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachStudyGroupToCourseModel.java @@ -0,0 +1,15 @@ +package ru.espada.ep.iptip.course.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AttachStudyGroupToCourseModel { + private Long studyGroupId; + private Long courseId; +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachUserToCourseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachUserToCourseModel.java new file mode 100644 index 0000000..41f6871 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachUserToCourseModel.java @@ -0,0 +1,15 @@ +package ru.espada.ep.iptip.course.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AttachUserToCourseModel { + private Long courseId; + private Long userId; +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachStudyGroupFromCourseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachStudyGroupFromCourseModel.java new file mode 100644 index 0000000..0f036c4 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachStudyGroupFromCourseModel.java @@ -0,0 +1,15 @@ +package ru.espada.ep.iptip.course.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class DetachStudyGroupFromCourseModel { + private Long studyGroupId; + private Long courseId; +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachUserFromCourseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachUserFromCourseModel.java new file mode 100644 index 0000000..4803302 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachUserFromCourseModel.java @@ -0,0 +1,15 @@ +package ru.espada.ep.iptip.course.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class DetachUserFromCourseModel { + private Long courseId; + private Long userId; +} From f5310550004aa42687aaa3e58a8c0da350bdba9b Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Sun, 24 Nov 2024 18:50:02 +0300 Subject: [PATCH 25/49] audit is the best --- .../ru/espada/ep/iptip/audit/AuditAspect.java | 57 +++++++++++ .../ep/iptip/audit/AuditController.java | 33 +++++++ .../espada/ep/iptip/audit/AuditService.java | 13 +++ .../ep/iptip/audit/AuditServiceImpl.java | 97 +++++++++++++++++++ .../ep/iptip/audit/entity/AuditEntity.java | 31 ++++++ .../iptip/audit/entity/AuditRepository.java | 9 ++ .../espada/ep/iptip/course/CourseEntity.java | 3 +- .../CourseLearningResourceCategoryEntity.java | 3 +- .../CourseLearningResourceController.java | 33 +++++++ .../CourseLearningResourceService.java | 5 + .../CourseLearningResourceServiceImpl.java | 5 +- .../CourseLearningResourceFolderEntity.java | 3 +- ...teCourseLearningResourceCategoryModel.java | 14 +++ .../CourseLearningResourceEntity.java | 3 +- .../ep/iptip/course/test/TestEntity.java | 3 +- .../ru/espada/ep/iptip/event/EventEntity.java | 3 +- .../PermissionElevator.java | 16 +-- .../iptip/study_groups/StudyGroupEntity.java | 3 +- .../ep/iptip/university/UniversityEntity.java | 3 +- .../university/institute/InstituteEntity.java | 3 +- .../institute/major/MajorEntity.java | 3 +- .../major/faculty/FacultyEntity.java | 3 +- .../iptip/user/auth/UserAuthController.java | 6 +- .../user/permission/UserPermissionEntity.java | 3 +- .../ep/iptip/user/profile/ProfileEntity.java | 4 +- 25 files changed, 336 insertions(+), 23 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/audit/AuditAspect.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/audit/AuditController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/audit/AuditService.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/audit/AuditServiceImpl.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/audit/entity/AuditEntity.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/audit/entity/AuditRepository.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceCategoryModel.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditAspect.java b/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditAspect.java new file mode 100644 index 0000000..4b8e4ad --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditAspect.java @@ -0,0 +1,57 @@ +package ru.espada.ep.iptip.audit; + +import jakarta.persistence.Table; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +import org.aspectj.lang.annotation.Pointcut; + +import java.lang.reflect.Field; + +@Aspect +@Component +public class AuditAspect { + + private AuditService auditService; + + // Определяем точку соединения для всех методов save и delete в репозиториях + @Pointcut("execution(* org.springframework.data.repository.CrudRepository+.save(..)) || execution(* org.springframework.data.repository.CrudRepository+.delete(..))") + public void repositoryMethods() {} + + @Before("repositoryMethods()") + public void logBeforeRepositoryMethod(JoinPoint joinPoint) { + Object entity = joinPoint.getArgs()[0]; + if (entity instanceof Auditable auditableEntity) { + String methodName = joinPoint.getSignature().getName(); + if (methodName.equals("delete")) { + UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + String username = userDetails.getUsername(); + auditService.logDelete(auditableEntity, username); + } + } + } + + @After("repositoryMethods()") + public void logAfterRepositoryMethod(JoinPoint joinPoint) { + Object entity = joinPoint.getArgs()[0]; + if (entity instanceof Auditable auditableEntity) { + String methodName = joinPoint.getSignature().getName(); + if (methodName.equals("save")) { + auditService.logSave(auditableEntity); + } + } + } + + @Autowired + public void setAuditService(AuditService auditService) { + this.auditService = auditService; + } +} + + diff --git a/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditController.java b/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditController.java new file mode 100644 index 0000000..8b1361b --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditController.java @@ -0,0 +1,33 @@ +package ru.espada.ep.iptip.audit; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import ru.espada.ep.iptip.audit.entity.AuditEntity; + +import java.util.List; + +@RestController +@RequestMapping("/audit") +@SecurityRequirement(name = "JWT") +public class AuditController { + + + private AuditService auditService; + + @GetMapping("/{page}") + @PreAuthorize("hasPermission(null, 'audit.view')") + public List getAudits(@PathVariable int page) { + return auditService.getAudits(page); + } + + @Autowired + public void setAuditServiceImpl(AuditService auditService) { + this.auditService = auditService; + } +} + diff --git a/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditService.java b/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditService.java new file mode 100644 index 0000000..7246b6d --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditService.java @@ -0,0 +1,13 @@ +package ru.espada.ep.iptip.audit; + +import ru.espada.ep.iptip.audit.entity.AuditEntity; + +import java.util.List; + +public interface AuditService { + void logSave(Auditable entity); + + void logDelete(Auditable auditableEntity, String username); + + List getAudits(int page); +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditServiceImpl.java new file mode 100644 index 0000000..4c36f88 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/audit/AuditServiceImpl.java @@ -0,0 +1,97 @@ +package ru.espada.ep.iptip.audit; + +import jakarta.persistence.Table; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import ru.espada.ep.iptip.audit.entity.AuditEntity; +import ru.espada.ep.iptip.audit.entity.AuditRepository; + +import java.lang.reflect.Field; +import java.util.List; + +@Service +public class AuditServiceImpl implements AuditService { + + private AuditRepository auditRepository; + @Value("${audit.page-size:10}") + private int pageSize; + + @Override + @Async + public void logSave(Auditable auditableEntity) { + Table table = auditableEntity.getClass().getAnnotation(Table.class); + + try { + Field idField = auditableEntity.getClass().getDeclaredField("id"); + idField.setAccessible(true); + Object id = null; + try { + id = idField.get(auditableEntity); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + + String operation = "UPDATE"; + if (!auditRepository.existsByEntityId((Long) id)) { + operation = "CREATE"; + } + + AuditEntity auditEntity = AuditEntity.builder() + .entityId((Long) id) + .inTable(table.name()) + .event(operation) + .who(auditableEntity.getModifiedBy()) + .time(auditableEntity.getModifiedAt()) + .build(); + + auditRepository.save(auditEntity); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + } + + @Override + @Async + public void logDelete(Auditable auditableEntity, String username) { + Table table = auditableEntity.getClass().getAnnotation(Table.class); + try { + Field idField = auditableEntity.getClass().getDeclaredField("id"); + idField.setAccessible(true); + Object id = null; + try { + id = idField.get(auditableEntity); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + + String operation = "DELETE"; + + AuditEntity auditEntity = AuditEntity.builder() + .entityId((Long) id) + .inTable(table.name()) + .event(operation) + .who(auditableEntity.getModifiedBy()) + .time(auditableEntity.getModifiedAt()) + .build(); + + auditRepository.save(auditEntity); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + } + + @Override + public List getAudits(int page) { + Pageable pageable = PageRequest.of(page, pageSize); + return auditRepository.findAll(pageable).toList(); + } + + @Autowired + public void setAuditRepository(AuditRepository auditRepository) { + this.auditRepository = auditRepository; + } +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/audit/entity/AuditEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/audit/entity/AuditEntity.java new file mode 100644 index 0000000..72f6529 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/audit/entity/AuditEntity.java @@ -0,0 +1,31 @@ +package ru.espada.ep.iptip.audit.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.user.permission.annotation.Permission; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "t_audit") +@Permission(children = {}, value = "audit", isStart = true) +public class AuditEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String inTable; + private Long entityId; + private String event; + private String who; + private Date time; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/audit/entity/AuditRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/audit/entity/AuditRepository.java new file mode 100644 index 0000000..dc3d1de --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/audit/entity/AuditRepository.java @@ -0,0 +1,9 @@ +package ru.espada.ep.iptip.audit.entity; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AuditRepository extends JpaRepository { + boolean existsByEntityId(Long id); +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java index 2884849..8c71834 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.course.test.TestEntity; import ru.espada.ep.iptip.course.test.course_test.CourseTestEntity; import ru.espada.ep.iptip.university.institute.major.MajorEntity; @@ -22,7 +23,7 @@ @Entity @Table(name = "course") @Permission(children = {TestEntity.class}, value = "course") -public class CourseEntity { +public class CourseEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java index d2902a4..175a624 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.course.CourseEntity; @Data @@ -13,7 +14,7 @@ @Builder @Entity @Table(name = "course_learning_resource_category") -public class CourseLearningResourceCategoryEntity { +public class CourseLearningResourceCategoryEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java new file mode 100644 index 0000000..6d71e7f --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java @@ -0,0 +1,33 @@ +package ru.espada.ep.iptip.course.learning_resource_category; + +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLearningResourceCategoryModel; + +import java.security.Principal; + +@RestController +@RequestMapping("/course/resource") +public class CourseLearningResourceController { + + private CourseLearningResourceService courseLearningResourceService; + + @PostMapping("/category") + public ResponseEntity createCourseLearningResourceCategory(@Valid @RequestBody CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel) { + courseLearningResourceService.createCourseLearningResourceCategory(createCourseLearningResourceCategoryModel); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + + @Autowired + public void setCourseLearningResourceService(CourseLearningResourceService courseLearningResourceService) { + this.courseLearningResourceService = courseLearningResourceService; + } + +} + diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java index 22b166b..aa0b43f 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java @@ -1,4 +1,9 @@ package ru.espada.ep.iptip.course.learning_resource_category; +import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLearningResourceCategoryModel; + +import java.security.Principal; + public interface CourseLearningResourceService { + void createCourseLearningResourceCategory(CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java index 28ff16f..c31a236 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java @@ -1,15 +1,18 @@ package ru.espada.ep.iptip.course.learning_resource_category; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLearningResourceCategoryModel; @Service public class CourseLearningResourceServiceImpl implements CourseLearningResourceService { private CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository; + @Override + public void createCourseLearningResourceCategory(CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel) { + } @Autowired public void setCourseLearningResourceCategoryRepository(CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository) { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java index a96bfaa..8b645dd 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryEntity; @Data @@ -13,7 +14,7 @@ @Builder @Entity @Table(name = "course_learning_resource_folder") -public class CourseLearningResourceFolderEntity { +public class CourseLearningResourceFolderEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceCategoryModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceCategoryModel.java new file mode 100644 index 0000000..872d2fe --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceCategoryModel.java @@ -0,0 +1,14 @@ +package ru.espada.ep.iptip.course.learning_resource_category.model; + +import lombok.*; +import ru.espada.ep.iptip.audit.Auditable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateCourseLearningResourceCategoryModel extends Auditable { + + private String name; + +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java index bbf4d74..1aa3c61 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryEntity; import ru.espada.ep.iptip.course.learning_resource_category.folder.CourseLearningResourceFolderEntity; @@ -14,7 +15,7 @@ @Builder @Entity @Table(name = "course_learning_resource") -public class CourseLearningResourceEntity { +public class CourseLearningResourceEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java index a6f774a..d02ad87 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestEntity.java @@ -6,6 +6,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.course.CourseEntity; import ru.espada.ep.iptip.course.test.question.QuestionEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; @@ -20,7 +21,7 @@ @Entity @Table(name = "test") @Permission(children = {QuestionEntity.class}, value = "test") -public class TestEntity { +public class TestEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java index 3ebdf38..debd3ab 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -18,7 +19,7 @@ @Entity @Table(name = "event") @Permission(value = "event", children = {}) -public class EventEntity { +public class EventEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java b/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java index 802039e..007d7f6 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java @@ -21,13 +21,15 @@ public PermissionElevator(UserPermissionService userPermissionService) { @Override public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) { String permissionName = permission.toString(); - for (Field field : targetDomainObject.getClass().getDeclaredFields()) { - field.setAccessible(true); - try { - String value = field.get(targetDomainObject).toString(); - permissionName = permissionName.replace("{" + field.getName() + "}", value); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); + if (targetDomainObject != null) { + for (Field field : targetDomainObject.getClass().getDeclaredFields()) { + field.setAccessible(true); + try { + String value = field.get(targetDomainObject).toString(); + permissionName = permissionName.replace("{" + field.getName() + "}", value); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } } } return userPermissionService.hasPermission(authentication.getName(), permissionName); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java index 437f4ed..0211377 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.event.EventEntity; import ru.espada.ep.iptip.study_groups.study_group_event.StudyGroupEventEntity; import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; @@ -21,7 +22,7 @@ @Entity @Table(name = "study_group") @Permission(children = {UserEntity.class, EventEntity.class}, value = "study_group") -public class StudyGroupEntity { +public class StudyGroupEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityEntity.java index 08bb57b..2fd68bb 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.university.institute.InstituteEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; import ru.espada.ep.iptip.user.permission.annotation.Permission; @@ -18,7 +19,7 @@ @Entity @Table(name = "university") @Permission(value = "university", children = {InstituteEntity.class}, isStart = true) -public class UniversityEntity { +public class UniversityEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteEntity.java index 54c3575..3308e38 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.university.UniversityEntity; import ru.espada.ep.iptip.university.institute.major.MajorEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; @@ -19,7 +20,7 @@ @Entity @Table(name = "institute") @Permission(value = "institute", children = {MajorEntity.class}) -public class InstituteEntity { +public class InstituteEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java index e37a3a0..e97a898 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.university.institute.InstituteEntity; import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; @@ -19,7 +20,7 @@ @Entity @Table(name = "major") @Permission(value = "major", children = {FacultyEntity.class}) -public class MajorEntity { +public class MajorEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyEntity.java index b7ae704..5caad0f 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyEntity.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.course.CourseEntity; import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import ru.espada.ep.iptip.university.institute.major.MajorEntity; @@ -20,7 +21,7 @@ @Entity @Table(name = "faculty") @Permission(value = "faculty", children = {CourseEntity.class, StudyGroupEntity.class}) -public class FacultyEntity { +public class FacultyEntity extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java index d4b4fd6..7b989bd 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/auth/UserAuthController.java @@ -1,5 +1,6 @@ package ru.espada.ep.iptip.user.auth; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; @@ -70,8 +71,9 @@ public ResponseEntity register(@Valid @RequestBody AuthRequest authRequest) { } @PostMapping("/aregister") - @PreAuthorize("hasPermission(#principal, 'users.admin')") - public ResponseEntity register(Principal principal, @Valid @RequestBody AuthRequest authRequest) { + @PreAuthorize("hasPermission(#authRequest, 'users.admin')") + @SecurityRequirement(name = "JWT") + public ResponseEntity aregister(@Valid @RequestBody AuthRequest authRequest) { userService.saveUser(UserEntity.builder() .username(authRequest.getLogin()) .password(authRequest.getPassword()) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionEntity.java index 8449626..1511604 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/UserPermissionEntity.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.security.core.GrantedAuthority; +import ru.espada.ep.iptip.audit.Auditable; import ru.espada.ep.iptip.user.UserEntity; @Data @@ -14,7 +15,7 @@ @Builder @Entity @Table(name = "user_permissions") -public class UserPermissionEntity implements GrantedAuthority { +public class UserPermissionEntity extends Auditable implements GrantedAuthority { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java index 0db32b3..b36ba7a 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java @@ -5,6 +5,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.audit.Auditable; + import java.io.Serializable; import java.util.Date; @@ -14,7 +16,7 @@ @Builder @Entity @Table(name = "customers") -public class ProfileEntity implements Serializable { +public class ProfileEntity extends Auditable implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) From 9344b554afe2a02416c96558b7e38fdd305f84a7 Mon Sep 17 00:00:00 2001 From: Papin Nikolai Date: Sun, 24 Nov 2024 19:39:46 +0300 Subject: [PATCH 26/49] Update maven.yml pom.xml location --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 06b6aa0..6d62770 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -28,7 +28,7 @@ jobs: distribution: 'temurin' cache: maven - name: Build with Maven - run: mvn -B package --file pom.xml + run: mvn -B package --file MainService/pom.xml # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - name: Update dependency graph From 7b493744689c27d5d56f13978008a20e50368b39 Mon Sep 17 00:00:00 2001 From: Papin Nikolai Date: Sun, 24 Nov 2024 19:42:29 +0300 Subject: [PATCH 27/49] Update maven.yml Java version --- .github/workflows/maven.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 6d62770..0113bc5 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -21,10 +21,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: - java-version: '17' + java-version: '21' distribution: 'temurin' cache: maven - name: Build with Maven From b8469d8ae82d0c6ccb22bdf6a02d6e8ed8e69f0a Mon Sep 17 00:00:00 2001 From: Papin Nikolai Date: Sun, 24 Nov 2024 19:49:11 +0300 Subject: [PATCH 28/49] Update maven.yml Disabled tests (can't setup appcontext for test as of now) --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 0113bc5..4943a22 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -28,7 +28,7 @@ jobs: distribution: 'temurin' cache: maven - name: Build with Maven - run: mvn -B package --file MainService/pom.xml + run: mvn -B package --file MainService/pom.xml -DskipTests # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - name: Update dependency graph From 5f0e69a4b2efd01981c25529704476bcb546a399 Mon Sep 17 00:00:00 2001 From: Papin Nikolai Date: Sun, 24 Nov 2024 19:52:30 +0300 Subject: [PATCH 29/49] Update maven.yml changed working directory for the project --- .github/workflows/maven.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 4943a22..f610d9e 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -28,7 +28,8 @@ jobs: distribution: 'temurin' cache: maven - name: Build with Maven - run: mvn -B package --file MainService/pom.xml -DskipTests + working-directory: MainService + run: mvn -B package --file pom.xml -DskipTests # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - name: Update dependency graph From bd3652f94d9cd2fa6b09d60fd8a7bad8eb0bef86 Mon Sep 17 00:00:00 2001 From: Papin Nikolai Date: Sun, 24 Nov 2024 19:55:32 +0300 Subject: [PATCH 30/49] Update maven.yml --- .github/workflows/maven.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index f610d9e..1079499 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -28,8 +28,7 @@ jobs: distribution: 'temurin' cache: maven - name: Build with Maven - working-directory: MainService - run: mvn -B package --file pom.xml -DskipTests + run: cd MainService && mvn -B package --file pom.xml -DskipTests # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - name: Update dependency graph From 6c38ce820ca282c02c4386e2c39c70a6f63f5cae Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sun, 24 Nov 2024 20:00:34 +0300 Subject: [PATCH 31/49] Potential workflow fix --- .github/workflows/maven.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 1079499..8565f16 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -28,8 +28,11 @@ jobs: distribution: 'temurin' cache: maven - name: Build with Maven - run: cd MainService && mvn -B package --file pom.xml -DskipTests + working-directory: MainService + run: mvn -B package -DskipTests # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - name: Update dependency graph uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 + with: + working-directory: MainService From e40c68a82855f93cf13f76fc221cbf90007c79f6 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Sun, 24 Nov 2024 20:02:35 +0300 Subject: [PATCH 32/49] Disabled updating dependency graph --- .github/workflows/maven.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 8565f16..328403c 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -32,7 +32,7 @@ jobs: run: mvn -B package -DskipTests # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - - name: Update dependency graph - uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 - with: - working-directory: MainService + #- name: Update dependency graph + # uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 + # with: + # working-directory: MainService From af59a7df02902582bfc76f1b297857b10f851e10 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Mon, 25 Nov 2024 00:42:51 +0300 Subject: [PATCH 33/49] study groups and course learning resource --- .../ep/iptip/course/CourseController.java | 50 ++++++++----- .../espada/ep/iptip/course/CourseService.java | 75 +++++++++++++------ .../CourseLearningResourceController.java | 17 +---- .../CourseLearningResourceService.java | 6 +- .../CourseLearningResourceServiceImpl.java | 6 -- ...teCourseLearningResourceCategoryModel.java | 3 +- .../iptip/course/model/CreateCourseModel.java | 4 + .../DetachStudyGroupFromCourseModel.java | 15 ---- .../model/DetachUserFromCourseModel.java | 15 ---- ...eModel.java => StudyGroupCourseModel.java} | 4 +- ...oCourseModel.java => UserCourseModel.java} | 4 +- .../PermissionElevator.java | 35 ++++++++- .../iptip/study_groups/StudyGroupService.java | 1 + .../study_groups/StudyGroupServiceImpl.java | 56 ++++++++++++++ .../table_helper/TableHelperService.java | 53 +++++++++++++ .../src/main/resources/application.properties | 2 +- 16 files changed, 245 insertions(+), 101 deletions(-) rename MainService/src/main/java/ru/espada/ep/iptip/course/{learning_resource_category => }/model/CreateCourseLearningResourceCategoryModel.java (76%) delete mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachStudyGroupFromCourseModel.java delete mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachUserFromCourseModel.java rename MainService/src/main/java/ru/espada/ep/iptip/course/model/{AttachStudyGroupToCourseModel.java => StudyGroupCourseModel.java} (85%) rename MainService/src/main/java/ru/espada/ep/iptip/course/model/{AttachUserToCourseModel.java => UserCourseModel.java} (87%) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/table_helper/TableHelperService.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index 210b339..c00c84a 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -7,6 +7,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import ru.espada.ep.iptip.course.model.CreateCourseLearningResourceCategoryModel; import ru.espada.ep.iptip.course.model.*; import java.security.Principal; @@ -19,7 +20,8 @@ public class CourseController { private CourseService courseService; @PostMapping("attachUser") - public ResponseEntity attachUserToCourse(@Valid @RequestBody AttachUserToCourseModel attachUserToCourseModel) { + @PreAuthorize("hasPermission(#attachUserToCourseModel, 'course.amdin.{courseId}')") + public ResponseEntity attachUserToCourse(@Valid @RequestBody UserCourseModel attachUserToCourseModel) { courseService.attachUserToCourse( attachUserToCourseModel.getCourseId(), attachUserToCourseModel.getUserId() @@ -28,7 +30,8 @@ public ResponseEntity attachUserToCourse(@Valid @RequestBody AttachUserToCour } @DeleteMapping("detachUser") - public ResponseEntity detachUserFromCourse(@Valid @RequestBody DetachUserFromCourseModel detachUserFromCourseModel) { + @PreAuthorize("hasPermission(#detachUserFromCourseModel, 'course.amdin.{courseId}')") + public ResponseEntity detachUserFromCourse(@Valid @RequestBody UserCourseModel detachUserFromCourseModel) { courseService.detachUserFromCourse( detachUserFromCourseModel.getCourseId(), detachUserFromCourseModel.getUserId() @@ -36,21 +39,17 @@ public ResponseEntity detachUserFromCourse(@Valid @RequestBody DetachUserFrom return ResponseEntity.ok().build(); } + // защищено! @PostMapping("attachStudyGroup") - public ResponseEntity attachStudyGroupToCourse(@Valid @RequestBody AttachStudyGroupToCourseModel attachStudyGroupToCourseModel) { - courseService.attachStudyGroupToCourse( - attachStudyGroupToCourseModel.getCourseId(), - attachStudyGroupToCourseModel.getStudyGroupId() - ); + public ResponseEntity attachStudyGroupToCourse(Principal principal, @Valid @RequestBody StudyGroupCourseModel attachStudyGroupToCourseModel) { + courseService.attachStudyGroupToCourse(principal, attachStudyGroupToCourseModel); return ResponseEntity.ok().build(); } + // защищено! @DeleteMapping("detachStudyGroup/") - public ResponseEntity detachStudyGroupFromCourse(@Valid @RequestBody DetachStudyGroupFromCourseModel detachStudyGroupFromCourseModel) { - courseService.detachStudyGroupFromCourse( - detachStudyGroupFromCourseModel.getCourseId(), - detachStudyGroupFromCourseModel.getStudyGroupId() - ); + public ResponseEntity detachStudyGroupFromCourse(Principal principal, @Valid @RequestBody StudyGroupCourseModel detachStudyGroupFromCourseModel) { + courseService.detachStudyGroupFromCourse(principal, detachStudyGroupFromCourseModel); return ResponseEntity.ok().build(); } @@ -60,15 +59,16 @@ public ResponseEntity getUserCourses(@PathVariable Long userId) { } @PostMapping("course") - public ResponseEntity createCourse(Principal principal, @Valid @RequestBody CreateCourseModel createCourseModel) { - // FIXME: is principal supposed to be here? - courseService.createCourse(principal, createCourseModel); - return ResponseEntity.status(HttpStatus.CREATED).build(); + @PreAuthorize("hasPermission(#createCourseModel, 'university.{universityId}.institute.{instituteIdd}.major.{majorId}.faculty.{facultyId}.courses')") + public ResponseEntity createCourse(@Valid @RequestBody CreateCourseModel createCourseModel) { + Long id = courseService.createCourse(createCourseModel); + return ResponseEntity.status(HttpStatus.CREATED).body(id); } @DeleteMapping("/{id}") - public ResponseEntity deleteCourse(@PathVariable Long id) { - courseService.deleteCourse(id); + @PreAuthorize("hasPermission(#id, 'course.amdin.{id}')") + public ResponseEntity deleteCourse(Principal principal, @PathVariable Long id) { + courseService.deleteCourse(principal, id); return ResponseEntity.ok().build(); } @@ -77,6 +77,20 @@ public ResponseEntity getCourse(@PathVariable Long id) { return ResponseEntity.ok(courseService.getCourse(id)); } + @PostMapping("/resource/category") + @PreAuthorize("hasPermission(#createCourseLearningResourceCategoryModel, 'course.amdin.{courseId}')") + public ResponseEntity createCourseLearningResourceCategory(@Valid @RequestBody CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel) { + Long id = courseService.createCourseLearningResourceCategory(createCourseLearningResourceCategoryModel); + return ResponseEntity.status(HttpStatus.CREATED).body(id); + } + + @DeleteMapping("/resource/category/{id}") + @PreAuthorize("hasPermission(#id, 'course.amdin.{id}')") + public ResponseEntity deleteCourseLearningResourceCategory(@PathVariable Long id) { + courseService.deleteCourseLearningResourceCategory(id); + return ResponseEntity.status(HttpStatus.OK).build(); + } + @Autowired public void setCourseService(CourseService courseService) { this.courseService = courseService; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index 6919f2d..389d220 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -1,15 +1,20 @@ package ru.espada.ep.iptip.course; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import ru.espada.ep.iptip.course.model.CourseResponseModel; +import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryEntity; +import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryRepository; import ru.espada.ep.iptip.course.model.CreateCourseModel; -import ru.espada.ep.iptip.course.test.TestEntity; +import ru.espada.ep.iptip.course.model.CreateCourseLearningResourceCategoryModel; +import ru.espada.ep.iptip.course.model.StudyGroupCourseModel; import ru.espada.ep.iptip.course.user_course.UserCourseEntity; import ru.espada.ep.iptip.course.user_course.UserCourseRepository; import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import ru.espada.ep.iptip.study_groups.StudyGroupRepository; +import ru.espada.ep.iptip.study_groups.StudyGroupService; +import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.UserRepository; import ru.espada.ep.iptip.user.UserService; @@ -17,6 +22,7 @@ import java.security.Principal; import java.util.Comparator; import java.util.List; +import java.util.Set; @Service public class CourseService { @@ -26,18 +32,21 @@ public class CourseService { private StudyGroupRepository studyGroupRepository; private UserRepository userRepository; private UserService userService; + private StudyGroupService studyGroupService; + private CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository; - public void createCourse(Principal principal, CreateCourseModel createCourseModel) { - UserEntity userEntity = userRepository.findByUsername(principal.getName()).orElseThrow(() -> new RuntimeException("User not found")); + public Long createCourse(CreateCourseModel createCourseModel) { CourseEntity courseEntity = CourseEntity.builder() .name(createCourseModel.getName()) .description(createCourseModel.getDescription()) + .faculties(Set.of(FacultyEntity.builder().id(createCourseModel.getFacultyId()).build())) .build(); courseRepository.save(courseEntity); + return courseEntity.getId(); } - public void deleteCourse(Long id) { + public void deleteCourse(Principal principal, Long id) { courseRepository.deleteById(id); } @@ -57,19 +66,20 @@ public UserCourseEntity attachUserToCourse(Long courseId, Long userId) { } @Transactional - public Boolean detachUserFromCourse(Long courseId, Long userId) { + public void detachUserFromCourse(Long courseId, Long userId) { UserEntity userEntity = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("User not found")); CourseEntity courseEntity = courseRepository.findById(courseId).orElseThrow(() -> new RuntimeException("Course not found")); UserCourseEntity userCourseEntity = userCourseRepository.findUserCourseEntityByUserIdAndCourseId(userEntity.getId(), courseEntity.getId()); userCourseRepository.delete(userCourseEntity); - return true; } @Transactional - public Boolean attachStudyGroupToCourse(Long courseId, Long studyGroupId) { - CourseEntity courseEntity = courseRepository.findById(courseId).orElseThrow(() -> new RuntimeException("Course not found")); - StudyGroupEntity studyGroupEntity = studyGroupRepository.findById(studyGroupId).orElseThrow(() -> new RuntimeException("StudyGroup not found")); + public void attachStudyGroupToCourse(Principal principal, StudyGroupCourseModel attachStudyGroupToCourseModel) { + if (!studyGroupService.hasPermission(principal.getName(), attachStudyGroupToCourseModel.getCourseId())) throw new RuntimeException("Permission denied"); + + CourseEntity courseEntity = courseRepository.findById(attachStudyGroupToCourseModel.getCourseId()).orElseThrow(() -> new RuntimeException("Course not found")); + StudyGroupEntity studyGroupEntity = studyGroupRepository.findById(attachStudyGroupToCourseModel.getStudyGroupId()).orElseThrow(() -> new RuntimeException("StudyGroup not found")); List users = studyGroupEntity.getUsers().stream().toList(); userCourseRepository.saveAll(users.stream().map(user -> UserCourseEntity.builder() @@ -77,13 +87,14 @@ public Boolean attachStudyGroupToCourse(Long courseId, Long studyGroupId) { .userId(user.getId()) .build()).toList()); - return true; } @Transactional - public Boolean detachStudyGroupFromCourse(Long courseId, Long studyGroupId) { - CourseEntity courseEntity = courseRepository.findById(courseId).orElseThrow(() -> new RuntimeException("Course not found")); - StudyGroupEntity studyGroupEntity = studyGroupRepository.findById(studyGroupId).orElseThrow(() -> new RuntimeException("StudyGroup not found")); + public void detachStudyGroupFromCourse(Principal principal, StudyGroupCourseModel detachUserFromCourseModel) { + if (!studyGroupService.hasPermission(principal.getName(), detachUserFromCourseModel.getCourseId())) throw new RuntimeException("Permission denied"); + + CourseEntity courseEntity = courseRepository.findById(detachUserFromCourseModel.getCourseId()).orElseThrow(() -> new RuntimeException("Course not found")); + StudyGroupEntity studyGroupEntity = studyGroupRepository.findById(detachUserFromCourseModel.getStudyGroupId()).orElseThrow(() -> new RuntimeException("StudyGroup not found")); List users = studyGroupEntity.getUsers().stream().toList(); userCourseRepository.deleteAll(users.stream().map(user -> UserCourseEntity.builder() @@ -91,7 +102,27 @@ public Boolean detachStudyGroupFromCourse(Long courseId, Long studyGroupId) { .userId(user.getId()) .build()).toList()); - return true; + } + + public List getUserCourses(Long userId) { + return this.userCourseRepository.findUserCourseEntitiesByUserId(userId) + .stream() + .map(userCourseEntity -> courseRepository.findById(userCourseEntity.getCourseId()).orElseThrow(() -> new RuntimeException("Course not found"))) + .sorted(Comparator.comparing(CourseEntity::getName)) + .toList(); + } + + public Long createCourseLearningResourceCategory(CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel) { + CourseLearningResourceCategoryEntity courseLearningResourceCategoryEntity = CourseLearningResourceCategoryEntity.builder() + .name(createCourseLearningResourceCategoryModel.getName()) + .course(CourseEntity.builder().id(createCourseLearningResourceCategoryModel.getCourseId()).build()) + .build(); + + return courseLearningResourceCategoryRepository.save(courseLearningResourceCategoryEntity).getId(); + } + + public void deleteCourseLearningResourceCategory(Long id) { + courseLearningResourceCategoryRepository.deleteById(id); } @Autowired @@ -119,11 +150,13 @@ public void setUserService(UserService userService) { this.userService = userService; } - public List getUserCourses(Long userId) { - return this.userCourseRepository.findUserCourseEntitiesByUserId(userId) - .stream() - .map(userCourseEntity -> courseRepository.findById(userCourseEntity.getCourseId()).orElseThrow(() -> new RuntimeException("Course not found"))) - .sorted(Comparator.comparing(CourseEntity::getName)) - .toList(); + @Autowired + public void setCourseLearningResourceCategoryRepository(CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository) { + this.courseLearningResourceCategoryRepository = courseLearningResourceCategoryRepository; + } + + @Autowired + public void setStudyGroupService(StudyGroupService studyGroupService) { + this.studyGroupService = studyGroupService; } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java index 6d71e7f..9376cfd 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java @@ -1,16 +1,7 @@ package ru.espada.ep.iptip.course.learning_resource_category; -import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestMapping; -import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLearningResourceCategoryModel; - -import java.security.Principal; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/course/resource") @@ -18,12 +9,6 @@ public class CourseLearningResourceController { private CourseLearningResourceService courseLearningResourceService; - @PostMapping("/category") - public ResponseEntity createCourseLearningResourceCategory(@Valid @RequestBody CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel) { - courseLearningResourceService.createCourseLearningResourceCategory(createCourseLearningResourceCategoryModel); - return ResponseEntity.status(HttpStatus.CREATED).build(); - } - @Autowired public void setCourseLearningResourceService(CourseLearningResourceService courseLearningResourceService) { this.courseLearningResourceService = courseLearningResourceService; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java index aa0b43f..f78e1e6 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java @@ -1,9 +1,5 @@ package ru.espada.ep.iptip.course.learning_resource_category; -import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLearningResourceCategoryModel; - -import java.security.Principal; - public interface CourseLearningResourceService { - void createCourseLearningResourceCategory(CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel); + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java index c31a236..f278030 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java @@ -2,18 +2,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLearningResourceCategoryModel; @Service public class CourseLearningResourceServiceImpl implements CourseLearningResourceService { private CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository; - @Override - public void createCourseLearningResourceCategory(CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel) { - - } - @Autowired public void setCourseLearningResourceCategoryRepository(CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository) { this.courseLearningResourceCategoryRepository = courseLearningResourceCategoryRepository; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceCategoryModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseLearningResourceCategoryModel.java similarity index 76% rename from MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceCategoryModel.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseLearningResourceCategoryModel.java index 872d2fe..6a1ab58 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceCategoryModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseLearningResourceCategoryModel.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course.learning_resource_category.model; +package ru.espada.ep.iptip.course.model; import lombok.*; import ru.espada.ep.iptip.audit.Auditable; @@ -10,5 +10,6 @@ public class CreateCourseLearningResourceCategoryModel extends Auditable { private String name; + private Long courseId; } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseModel.java index c3947a9..43f36e6 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseModel.java @@ -11,6 +11,10 @@ @Builder public class CreateCourseModel { + private Long UniversityId; + private Long InstituteId; + private Long MajorId; + private Long FacultyId; private String name; private String description; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachStudyGroupFromCourseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachStudyGroupFromCourseModel.java deleted file mode 100644 index 0f036c4..0000000 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachStudyGroupFromCourseModel.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.espada.ep.iptip.course.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class DetachStudyGroupFromCourseModel { - private Long studyGroupId; - private Long courseId; -} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachUserFromCourseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachUserFromCourseModel.java deleted file mode 100644 index 4803302..0000000 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/model/DetachUserFromCourseModel.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.espada.ep.iptip.course.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class DetachUserFromCourseModel { - private Long courseId; - private Long userId; -} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachStudyGroupToCourseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/StudyGroupCourseModel.java similarity index 85% rename from MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachStudyGroupToCourseModel.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/model/StudyGroupCourseModel.java index 0786bce..196957c 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachStudyGroupToCourseModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/StudyGroupCourseModel.java @@ -9,7 +9,9 @@ @AllArgsConstructor @NoArgsConstructor @Builder -public class AttachStudyGroupToCourseModel { +public class StudyGroupCourseModel { + private Long studyGroupId; private Long courseId; + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachUserToCourseModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/UserCourseModel.java similarity index 87% rename from MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachUserToCourseModel.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/model/UserCourseModel.java index 41f6871..a2d892c 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/model/AttachUserToCourseModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/UserCourseModel.java @@ -9,7 +9,9 @@ @AllArgsConstructor @NoArgsConstructor @Builder -public class AttachUserToCourseModel { +public class UserCourseModel { + private Long courseId; private Long userId; + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java b/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java index 007d7f6..176bcde 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java @@ -1,21 +1,27 @@ package ru.espada.ep.iptip.security.premission_elevators; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.security.access.PermissionEvaluator; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Component; +import ru.espada.ep.iptip.table_helper.TableHelperService; import ru.espada.ep.iptip.user.permission.UserPermissionService; import java.io.Serializable; import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; @Component public class PermissionElevator implements PermissionEvaluator { private final UserPermissionService userPermissionService; + private final TableHelperService tableHelperService; - public PermissionElevator(UserPermissionService userPermissionService) { + public PermissionElevator(UserPermissionService userPermissionService, TableHelperService tableHelperService) { this.userPermissionService = userPermissionService; + this.tableHelperService = tableHelperService; } @Override @@ -37,6 +43,33 @@ public boolean hasPermission(Authentication authentication, Object targetDomainO @Override public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) { + /* + String permissionName = permission.toString(); + + Map targetDomainObjects = new HashMap<>(); + // паттерн placeholder:table:entityField + // разделитель "," + String[] parts = targetType.split(":"); + for (String part : parts) { + String[] date = part.split(","); + JpaRepository repository = tableHelperService.getRepository(date[1]); + Class entityClass = tableHelperService.getEntityClass(date[1]); + } + + + for (Field field : targetDomainObject.getClass().getDeclaredFields()) { + field.setAccessible(true); + try { + String value = field.get(targetDomainObject).toString(); + permissionName = permissionName.replace("{" + field.getName() + "}", value); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + return userPermissionService.hasPermission(authentication.getName(), permissionName); + + */ return false; } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupService.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupService.java index 47f2dfb..7dc81ff 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupService.java @@ -1,4 +1,5 @@ package ru.espada.ep.iptip.study_groups; public interface StudyGroupService { + boolean hasPermission(String name, Long studyGroupId); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupServiceImpl.java index 43191cb..2132fe1 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupServiceImpl.java @@ -3,14 +3,70 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.espada.ep.iptip.university.UniversityEntity; +import ru.espada.ep.iptip.university.institute.InstituteEntity; +import ru.espada.ep.iptip.university.institute.major.MajorEntity; +import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; +import ru.espada.ep.iptip.user.UserEntity; +import ru.espada.ep.iptip.user.UserService; +import ru.espada.ep.iptip.user.permission.UserPermissionEntity; +import ru.espada.ep.iptip.user.permission.UserPermissionService; + +import java.util.List; @RequiredArgsConstructor @Service public class StudyGroupServiceImpl implements StudyGroupService { + private StudyGroupRepository studyGroupRepository; + private UserService userService; + private UserPermissionService userPermissionService; + + @Override + public boolean hasPermission(String username, Long studyGroupId) { + UserEntity user = userService.getUser(username); + if (user == null) { + return false; + } + List permissions = user.getPermissions().stream().map(UserPermissionEntity::getName).toList(); + if (permissions.contains("admin")) return true; + StudyGroupEntity studyGroupEntity = studyGroupRepository.findById(studyGroupId).orElse(null); + if (studyGroupEntity == null) { + return false; + } + FacultyEntity faculty = studyGroupEntity.getFaculty(); + if (faculty == null) { + return false; + } + MajorEntity major = faculty.getMajor(); + if (major == null) { + return false; + } + InstituteEntity institute = major.getInstitute(); + if (institute == null) { + return false; + } + UniversityEntity university = institute.getUniversity(); + if (university == null) { + return false; + } + return userPermissionService.hasPermission(username, "university.%s.institute.%s.major.%s.faculty.%s.study_group.%s".formatted( + university.getId(), institute.getId(), major.getId(), faculty.getId(), studyGroupEntity.getId() + )); + } @Autowired public void setStudyGroupRepository(StudyGroupRepository studyGroupRepository) { this.studyGroupRepository = studyGroupRepository; } + + @Autowired + public void setUserService(UserService userService) { + this.userService = userService; + } + + @Autowired + public void setUserPermissionService(UserPermissionService userPermissionService) { + this.userPermissionService = userPermissionService; + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/table_helper/TableHelperService.java b/MainService/src/main/java/ru/espada/ep/iptip/table_helper/TableHelperService.java new file mode 100644 index 0000000..2d753ed --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/table_helper/TableHelperService.java @@ -0,0 +1,53 @@ +package ru.espada.ep.iptip.table_helper; + +import jakarta.annotation.PostConstruct; +import jakarta.persistence.Table; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Service; + +import java.lang.reflect.ParameterizedType; +import java.util.HashMap; +import java.util.Map; + +@Service +public class TableHelperService { + + @Autowired + private ApplicationContext applicationContext; + + Map> repositoryMap = new HashMap<>(); // table -> repository + Map> entityMap = new HashMap<>(); // table -> entity + + @PostConstruct + public void init() { + String[] repositoryBeans = applicationContext.getBeanNamesForType(JpaRepository.class); + for (String repositoryBean : repositoryBeans) { + Object repository = applicationContext.getBean(repositoryBean); + Class entityClass = getEntityClass(repository); + if (entityClass != null) { + Table table = entityClass.getAnnotation(Table.class); + if (table != null) { + String tableName = table.name(); + repositoryMap.put(tableName, (JpaRepository) repository); + entityMap.put(tableName, entityClass); + } + } + } + } + + private Class getEntityClass(Object repository) { + ParameterizedType parameterizedType = (ParameterizedType) repository.getClass().getGenericSuperclass(); + return (Class) parameterizedType.getActualTypeArguments()[0]; + } + + public JpaRepository getRepository(String tableName) { + return repositoryMap.get(tableName); + } + + public Class getEntityClass(String tableName) { + return entityMap.get(tableName); + } + +} diff --git a/MainService/src/main/resources/application.properties b/MainService/src/main/resources/application.properties index ea3cf3b..1fc8c37 100644 --- a/MainService/src/main/resources/application.properties +++ b/MainService/src/main/resources/application.properties @@ -26,4 +26,4 @@ s3.access-key=${S3_ACCESS_KEY} s3.secret-key=${S3_ACCESS_KEY} s3.image-expiry-time=7 -user.permissions.special=user.register,user.profile,users.admin,admin \ No newline at end of file +user.permissions.special=user.register,user.profile,users.admin,admin,course.admin \ No newline at end of file From 7e9db71ec115ffcde3c603a6c829b57741420f5d Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Mon, 25 Nov 2024 11:27:07 +0300 Subject: [PATCH 34/49] fix table_helper_service --- .../ep/iptip/course/CourseController.java | 74 +++++++++++++------ .../espada/ep/iptip/course/CourseService.java | 19 ++++- .../ep/iptip/course/test/TestController.java | 1 - .../ep/iptip/course/test/TestService.java | 2 - .../TestAttemptAnswerStatus.java | 9 +++ .../UserTestAttemptAnswerEntity.java | 3 +- .../PermissionElevator.java | 8 +- .../table_helper/TableHelperService.java | 53 ------------- 8 files changed, 80 insertions(+), 89 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/TestAttemptAnswerStatus.java delete mode 100644 MainService/src/main/java/ru/espada/ep/iptip/table_helper/TableHelperService.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index c00c84a..6627c0b 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.*; import ru.espada.ep.iptip.course.model.CreateCourseLearningResourceCategoryModel; import ru.espada.ep.iptip.course.model.*; +import ru.espada.ep.iptip.course.test.model.CreateTestModel; import java.security.Principal; @@ -19,6 +20,33 @@ public class CourseController { private CourseService courseService; + // + // Курс CRUD + // + + @PostMapping("course") + @PreAuthorize("hasPermission(#createCourseModel, 'university.{universityId}.institute.{instituteIdd}.major.{majorId}.faculty.{facultyId}.courses')") + public ResponseEntity createCourse(Principal principal, @Valid @RequestBody CreateCourseModel createCourseModel) { + Long id = courseService.createCourse(principal, createCourseModel); + return ResponseEntity.status(HttpStatus.CREATED).body(id); + } + + @DeleteMapping("/{id}") + @PreAuthorize("hasPermission(#id, 'course.amdin.{id}')") + public ResponseEntity deleteCourse(Principal principal, @PathVariable Long id) { + courseService.deleteCourse(principal, id); + return ResponseEntity.ok().build(); + } + + @GetMapping("/{id}") + public ResponseEntity getCourse(@PathVariable Long id) { + return ResponseEntity.ok(courseService.getCourse(id)); + } + + // + // Пользователи + // + @PostMapping("attachUser") @PreAuthorize("hasPermission(#attachUserToCourseModel, 'course.amdin.{courseId}')") public ResponseEntity attachUserToCourse(@Valid @RequestBody UserCourseModel attachUserToCourseModel) { @@ -39,6 +67,15 @@ public ResponseEntity detachUserFromCourse(@Valid @RequestBody UserCourseMode return ResponseEntity.ok().build(); } + @GetMapping("userCourses/{userId}") + public ResponseEntity getUserCourses(@PathVariable Long userId) { + return ResponseEntity.ok(courseService.getUserCourses(userId)); + } + + // + // Ученические группы + // + // защищено! @PostMapping("attachStudyGroup") public ResponseEntity attachStudyGroupToCourse(Principal principal, @Valid @RequestBody StudyGroupCourseModel attachStudyGroupToCourseModel) { @@ -53,29 +90,9 @@ public ResponseEntity detachStudyGroupFromCourse(Principal principal, @Valid return ResponseEntity.ok().build(); } - @GetMapping("userCourses/{userId}") - public ResponseEntity getUserCourses(@PathVariable Long userId) { - return ResponseEntity.ok(courseService.getUserCourses(userId)); - } - - @PostMapping("course") - @PreAuthorize("hasPermission(#createCourseModel, 'university.{universityId}.institute.{instituteIdd}.major.{majorId}.faculty.{facultyId}.courses')") - public ResponseEntity createCourse(@Valid @RequestBody CreateCourseModel createCourseModel) { - Long id = courseService.createCourse(createCourseModel); - return ResponseEntity.status(HttpStatus.CREATED).body(id); - } - - @DeleteMapping("/{id}") - @PreAuthorize("hasPermission(#id, 'course.amdin.{id}')") - public ResponseEntity deleteCourse(Principal principal, @PathVariable Long id) { - courseService.deleteCourse(principal, id); - return ResponseEntity.ok().build(); - } - - @GetMapping("/{id}") - public ResponseEntity getCourse(@PathVariable Long id) { - return ResponseEntity.ok(courseService.getCourse(id)); - } + // + // Ресурсы курсов + // @PostMapping("/resource/category") @PreAuthorize("hasPermission(#createCourseLearningResourceCategoryModel, 'course.amdin.{courseId}')") @@ -91,6 +108,17 @@ public ResponseEntity deleteCourseLearningResourceCategory(@PathVariable Long return ResponseEntity.status(HttpStatus.OK).build(); } + // + // Тесты + // + + @PostMapping("/test") + @PreAuthorize("hasPermission(#createTestModel, 'course.amdin.{courseId}')") + public ResponseEntity createTest(@Valid @RequestBody CreateTestModel createTestModel) { + Long id = courseService.createTest(createTestModel); + return ResponseEntity.status(HttpStatus.CREATED).body(id); + } + @Autowired public void setCourseService(CourseService courseService) { this.courseService = courseService; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index 389d220..560f81f 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -9,6 +9,7 @@ import ru.espada.ep.iptip.course.model.CreateCourseModel; import ru.espada.ep.iptip.course.model.CreateCourseLearningResourceCategoryModel; import ru.espada.ep.iptip.course.model.StudyGroupCourseModel; +import ru.espada.ep.iptip.course.test.model.CreateTestModel; import ru.espada.ep.iptip.course.user_course.UserCourseEntity; import ru.espada.ep.iptip.course.user_course.UserCourseRepository; import ru.espada.ep.iptip.study_groups.StudyGroupEntity; @@ -18,6 +19,7 @@ import ru.espada.ep.iptip.user.UserEntity; import ru.espada.ep.iptip.user.UserRepository; import ru.espada.ep.iptip.user.UserService; +import ru.espada.ep.iptip.user.permission.UserPermissionService; import java.security.Principal; import java.util.Comparator; @@ -34,15 +36,19 @@ public class CourseService { private UserService userService; private StudyGroupService studyGroupService; private CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository; + private UserPermissionService userPermissionService; - - public Long createCourse(CreateCourseModel createCourseModel) { + @Transactional + public Long createCourse(Principal principal, CreateCourseModel createCourseModel) { CourseEntity courseEntity = CourseEntity.builder() .name(createCourseModel.getName()) .description(createCourseModel.getDescription()) .faculties(Set.of(FacultyEntity.builder().id(createCourseModel.getFacultyId()).build())) .build(); courseRepository.save(courseEntity); + + userPermissionService.addPermission(principal.getName(), "course.amdin." + courseEntity.getId(), -1L, -1L); + return courseEntity.getId(); } @@ -125,6 +131,10 @@ public void deleteCourseLearningResourceCategory(Long id) { courseLearningResourceCategoryRepository.deleteById(id); } + public Long createTest(CreateTestModel createTestModel) { + return 0L; + } + @Autowired public void setCourseRepository(CourseRepository courseRepository) { this.courseRepository = courseRepository; @@ -159,4 +169,9 @@ public void setCourseLearningResourceCategoryRepository(CourseLearningResourceCa public void setStudyGroupService(StudyGroupService studyGroupService) { this.studyGroupService = studyGroupService; } + + @Autowired + public void setUserPermissionService(UserPermissionService userPermissionService) { + this.userPermissionService = userPermissionService; + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java index 87320fc..8f31c00 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestController.java @@ -6,7 +6,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import ru.espada.ep.iptip.course.test.model.CreateTestModel; import ru.espada.ep.iptip.course.test.question.model.CreateQuestionModel; @RestController diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java index 1391dcd..f93e7c3 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/TestService.java @@ -2,8 +2,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.espada.ep.iptip.course.CourseEntity; -import ru.espada.ep.iptip.course.test.model.CreateTestModel; import ru.espada.ep.iptip.course.test.question.QuestionEntity; import ru.espada.ep.iptip.course.test.question.QuestionRepository; import ru.espada.ep.iptip.course.test.question.QuestionType; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/TestAttemptAnswerStatus.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/TestAttemptAnswerStatus.java new file mode 100644 index 0000000..cddbcb1 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/TestAttemptAnswerStatus.java @@ -0,0 +1,9 @@ +package ru.espada.ep.iptip.course.test.user_test_attempt.user_test_attempt_answer; + +public enum TestAttemptAnswerStatus { + + ON_VERIFICATION, + CORRECT, + WRONG + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/UserTestAttemptAnswerEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/UserTestAttemptAnswerEntity.java index f91f92e..79a5b6d 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/UserTestAttemptAnswerEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/test/user_test_attempt/user_test_attempt_answer/UserTestAttemptAnswerEntity.java @@ -28,6 +28,7 @@ public class UserTestAttemptAnswerEntity { private QuestionEntity question; private String content; - private boolean is_correct; + private TestAttemptAnswerStatus status; + private Long statusModifiedAt; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java b/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java index 176bcde..312990d 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java @@ -1,27 +1,21 @@ package ru.espada.ep.iptip.security.premission_elevators; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.security.access.PermissionEvaluator; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Component; -import ru.espada.ep.iptip.table_helper.TableHelperService; import ru.espada.ep.iptip.user.permission.UserPermissionService; import java.io.Serializable; import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; @Component public class PermissionElevator implements PermissionEvaluator { private final UserPermissionService userPermissionService; - private final TableHelperService tableHelperService; - public PermissionElevator(UserPermissionService userPermissionService, TableHelperService tableHelperService) { + public PermissionElevator(UserPermissionService userPermissionService) { this.userPermissionService = userPermissionService; - this.tableHelperService = tableHelperService; } @Override diff --git a/MainService/src/main/java/ru/espada/ep/iptip/table_helper/TableHelperService.java b/MainService/src/main/java/ru/espada/ep/iptip/table_helper/TableHelperService.java deleted file mode 100644 index 2d753ed..0000000 --- a/MainService/src/main/java/ru/espada/ep/iptip/table_helper/TableHelperService.java +++ /dev/null @@ -1,53 +0,0 @@ -package ru.espada.ep.iptip.table_helper; - -import jakarta.annotation.PostConstruct; -import jakarta.persistence.Table; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Service; - -import java.lang.reflect.ParameterizedType; -import java.util.HashMap; -import java.util.Map; - -@Service -public class TableHelperService { - - @Autowired - private ApplicationContext applicationContext; - - Map> repositoryMap = new HashMap<>(); // table -> repository - Map> entityMap = new HashMap<>(); // table -> entity - - @PostConstruct - public void init() { - String[] repositoryBeans = applicationContext.getBeanNamesForType(JpaRepository.class); - for (String repositoryBean : repositoryBeans) { - Object repository = applicationContext.getBean(repositoryBean); - Class entityClass = getEntityClass(repository); - if (entityClass != null) { - Table table = entityClass.getAnnotation(Table.class); - if (table != null) { - String tableName = table.name(); - repositoryMap.put(tableName, (JpaRepository) repository); - entityMap.put(tableName, entityClass); - } - } - } - } - - private Class getEntityClass(Object repository) { - ParameterizedType parameterizedType = (ParameterizedType) repository.getClass().getGenericSuperclass(); - return (Class) parameterizedType.getActualTypeArguments()[0]; - } - - public JpaRepository getRepository(String tableName) { - return repositoryMap.get(tableName); - } - - public Class getEntityClass(String tableName) { - return entityMap.get(tableName); - } - -} From 446fc62dcf0a2cbf57194f7d33f22f1dc34dcdd3 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Mon, 25 Nov 2024 16:01:50 +0300 Subject: [PATCH 35/49] fix controller dtos --- .../ep/iptip/course/CourseController.java | 13 ++--- .../ep/iptip/course/CourseEntityDto.java | 19 +++++++ .../espada/ep/iptip/course/CourseService.java | 18 ++++--- .../ep/iptip/user/AdminUserController.java | 3 +- .../espada/ep/iptip/user/UserController.java | 22 ++++---- .../java/ru/espada/ep/iptip/user/UserDto.java | 32 ++++++++++++ .../ru/espada/ep/iptip/user/UserService.java | 50 +++++++++++++++++-- .../models/response/GetMyCoursesResponse.java | 4 +- .../permission/groups/GroupController.java | 13 ++++- .../user/permission/groups/GroupEntity.java | 2 +- .../permission/groups/GroupEntityDto.java | 16 ++++++ .../user/permission/groups/GroupService.java | 4 +- .../permission/groups/GroupServiceImpl.java | 28 +++++++++-- .../ep/iptip/user/profile/ProfileEntity.java | 2 +- 14 files changed, 188 insertions(+), 38 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntityDto.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/UserDto.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntityDto.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index 6627c0b..4e05161 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -12,6 +12,7 @@ import ru.espada.ep.iptip.course.test.model.CreateTestModel; import java.security.Principal; +import java.util.List; @RestController @SecurityRequirement(name = "JWT") @@ -39,8 +40,8 @@ public ResponseEntity deleteCourse(Principal principal, @PathVariable Long id } @GetMapping("/{id}") - public ResponseEntity getCourse(@PathVariable Long id) { - return ResponseEntity.ok(courseService.getCourse(id)); + public ResponseEntity getCourse(@PathVariable Long id) { + return ResponseEntity.ok(courseService.getCourseDto(id)); } // @@ -68,7 +69,7 @@ public ResponseEntity detachUserFromCourse(@Valid @RequestBody UserCourseMode } @GetMapping("userCourses/{userId}") - public ResponseEntity getUserCourses(@PathVariable Long userId) { + public ResponseEntity> getUserCourses(@PathVariable Long userId) { return ResponseEntity.ok(courseService.getUserCourses(userId)); } @@ -96,14 +97,14 @@ public ResponseEntity detachStudyGroupFromCourse(Principal principal, @Valid @PostMapping("/resource/category") @PreAuthorize("hasPermission(#createCourseLearningResourceCategoryModel, 'course.amdin.{courseId}')") - public ResponseEntity createCourseLearningResourceCategory(@Valid @RequestBody CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel) { + public ResponseEntity createCourseLearningResourceCategory(@Valid @RequestBody CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel) { Long id = courseService.createCourseLearningResourceCategory(createCourseLearningResourceCategoryModel); return ResponseEntity.status(HttpStatus.CREATED).body(id); } @DeleteMapping("/resource/category/{id}") @PreAuthorize("hasPermission(#id, 'course.amdin.{id}')") - public ResponseEntity deleteCourseLearningResourceCategory(@PathVariable Long id) { + public ResponseEntity deleteCourseLearningResourceCategory(@PathVariable Long id) { courseService.deleteCourseLearningResourceCategory(id); return ResponseEntity.status(HttpStatus.OK).build(); } @@ -114,7 +115,7 @@ public ResponseEntity deleteCourseLearningResourceCategory(@PathVariable Long @PostMapping("/test") @PreAuthorize("hasPermission(#createTestModel, 'course.amdin.{courseId}')") - public ResponseEntity createTest(@Valid @RequestBody CreateTestModel createTestModel) { + public ResponseEntity createTest(@Valid @RequestBody CreateTestModel createTestModel) { Long id = courseService.createTest(createTestModel); return ResponseEntity.status(HttpStatus.CREATED).body(id); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntityDto.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntityDto.java new file mode 100644 index 0000000..83a0391 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntityDto.java @@ -0,0 +1,19 @@ +package ru.espada.ep.iptip.course; + +import lombok.*; + +import java.util.Date; + + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CourseEntityDto { + + private Date createdAt; + private Long id; + private String name; + private String description; + +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index 560f81f..a335191 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -60,6 +60,16 @@ public CourseEntity getCourse(Long id) { return courseRepository.findById(id).orElseThrow(() -> new RuntimeException("Course not found")); } + public CourseEntityDto getCourseDto(Long id) { + CourseEntity courseEntity = getCourse(id); + return CourseEntityDto.builder() + .id(courseEntity.getId()) + .createdAt(courseEntity.getCreatedAt()) + .name(courseEntity.getName()) + .description(courseEntity.getDescription()) + .build(); + } + @Transactional public UserCourseEntity attachUserToCourse(Long courseId, Long userId) { UserEntity userEntity = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("User not found")); @@ -110,12 +120,8 @@ public void detachStudyGroupFromCourse(Principal principal, StudyGroupCourseMode } - public List getUserCourses(Long userId) { - return this.userCourseRepository.findUserCourseEntitiesByUserId(userId) - .stream() - .map(userCourseEntity -> courseRepository.findById(userCourseEntity.getCourseId()).orElseThrow(() -> new RuntimeException("Course not found"))) - .sorted(Comparator.comparing(CourseEntity::getName)) - .toList(); + public List getUserCourses(Long userId) { + return this.userCourseRepository.findUserCourseEntitiesByUserId(userId).stream().map(UserCourseEntity::getCourseId).toList(); } public Long createCourseLearningResourceCategory(CreateCourseLearningResourceCategoryModel createCourseLearningResourceCategoryModel) { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java index 872787d..e73fd7a 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/AdminUserController.java @@ -10,6 +10,7 @@ import ru.espada.ep.iptip.user.models.request.AddRoleRequest; import java.security.Principal; +import java.util.List; @RestController @SecurityRequirement(name = "JWT") @@ -25,7 +26,7 @@ public ResponseEntity addPermission(Principal principal, @RequestBody AddRole } @GetMapping("/users/{page}") - public ResponseEntity getUsers(@PathVariable int page) { + public ResponseEntity> getUsers(@PathVariable int page) { return ResponseEntity.ok(userService.allUsers(page)); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index cc5ed96..6630b7f 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -7,6 +7,8 @@ import org.springframework.web.bind.annotation.*; import ru.espada.ep.iptip.user.models.request.AddRoleRequest; import ru.espada.ep.iptip.user.models.request.CreateProfileRequest; +import ru.espada.ep.iptip.user.models.response.GetMyCoursesResponse; +import ru.espada.ep.iptip.user.models.response.InstituteInfoResponse; import java.security.Principal; @@ -28,38 +30,38 @@ public ResponseEntity createProfile(Principal principal, @Valid @RequestBody } @GetMapping("/user") - public ResponseEntity getUser(Principal principal) { - return ResponseEntity.ok(userService.getUser(principal.getName())); + public ResponseEntity getUser(Principal principal) { + return ResponseEntity.ok(userService.getUserDto(principal.getName())); } @GetMapping("/user/id/{id}") - public ResponseEntity getUser(@PathVariable Long id) { - return ResponseEntity.ok(userService.getUser(id)); + public ResponseEntity getUser(@PathVariable Long id) { + return ResponseEntity.ok(userService.getUserDto(id)); } @GetMapping("/user/username/{username}") - public ResponseEntity getUser(@PathVariable String username) { - return ResponseEntity.ok(userService.getUser(username)); + public ResponseEntity getUser(@PathVariable String username) { + return ResponseEntity.ok(userService.getUserDto(username)); } @PostMapping("/avatar") - public ResponseEntity uploadAvatar(Principal principal, @RequestBody byte[] avatar) { + public ResponseEntity uploadAvatar(Principal principal, @RequestBody byte[] avatar) { String url = userService.uploadAvatar(principal.getName(), avatar).join(); return ResponseEntity.ok(url); } @GetMapping("/avatar") - public ResponseEntity getAvatarUrl(Principal principal) { + public ResponseEntity getAvatarUrl(Principal principal) { return ResponseEntity.ok(userService.getAvatarUrl(principal.getName())); } @GetMapping("/instituteInfo/username/{username}") - public ResponseEntity getInstituteInfo(@PathVariable String username) { + public ResponseEntity getInstituteInfo(@PathVariable String username) { return ResponseEntity.ok(userService.getInstituteInfo(username)); } @GetMapping("/courses/username/{username}") - public ResponseEntity getMyCourses(@PathVariable String username) { + public ResponseEntity getMyCourses(@PathVariable String username) { return ResponseEntity.ok(userService.getMyCourses(username)); } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserDto.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserDto.java new file mode 100644 index 0000000..d56c28c --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserDto.java @@ -0,0 +1,32 @@ +package ru.espada.ep.iptip.user; + +import jakarta.validation.constraints.Size; +import lombok.*; + +import java.util.Date; +import java.util.Set; + + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserDto { + + private Long id; + private Date createdAt; + private String username; + private String profileIcon; + private String profileName; + private String profileSurname; + private String profilePatronymic; + private Date profileBirthDate; + private String profilePhone; + private boolean profilePhoneConfirmed; + private String profileEmail; + private boolean profileEmailConfirmed; + private int profileSemester; + private String profileStudentIdCard; + private Set studyGroupNames; + +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java index a3784d8..b31ee6f 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java @@ -47,6 +47,7 @@ import java.util.Objects; import java.util.Optional; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; @Service public class UserService implements UserDetailsService { @@ -74,9 +75,12 @@ public List getUsers() { } @Cacheable(value = "users", key = "#page - 'users'", unless = "#result == null") - public List allUsers(int page) { + @Transactional + public List allUsers(int page) { Pageable pageable = PageRequest.of(page, pageSize); - return userRepository.findAll(pageable).toList(); + + return userRepository.findAll(pageable).stream(). + map(this::toUserDto).toList(); } @CacheEvict(value = "users", key = "'users'") @@ -105,6 +109,14 @@ public UserEntity getUser(String username) { return userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found")); } + public UserDto getUserDto(Long id) { + return toUserDto(getUser(id)); + } + + public UserDto getUserDto(String username) { + return toUserDto(getUser(username)); + } + @Transactional public void createProfile(Principal principal, CreateProfileRequest createProfileRequest) { UserEntity user = userRepository.findByUsername(principal.getName()).orElseThrow(() -> new UsernameNotFoundException("User not found")); @@ -182,14 +194,12 @@ public InstituteInfoResponse getInstituteInfo(String username) { .build(); } - @Transactional public GetMyCoursesResponse getMyCourses(String username) { UserEntity user = getUser(username); List userCourses = userCourseRepository.findUserCourseEntitiesByUserIdAndSemester(user.getId(), user.getProfile().getSemester()); - List courses = courseRepository.findAllById(userCourses.stream().map(UserCourseEntity::getCourseId).toList()); return GetMyCoursesResponse.builder() - .courses(courses) + .courses(userCourses.stream().map(UserCourseEntity::getCourseId).collect(Collectors.toList())) .build(); } @@ -206,6 +216,36 @@ public void addPermission(String username, AddRoleRequest addRoleRequest) { userPermissionService.addPermission(addRoleRequest.getUsername(), permission, addRoleRequest.getStartTime(), addRoleRequest.getEndTime()); } + private UserDto toUserDto(UserEntity user) { + if (user.getProfile() == null) { + return UserDto.builder() + .id(user.getId()) + .username(user.getUsername()) + .createdAt(user.getCreatedAt()) + .build(); + } + return UserDto.builder() + .id(user.getId()) + .username(user.getUsername()) + .createdAt(user.getCreatedAt()) + + .profileName(user.getProfile().getName()) + .profileSurname(user.getProfile().getSurname()) + .profilePatronymic(user.getProfile().getPatronymic()) + + .profilePhone(user.getProfile().getPhone()) + .profilePhoneConfirmed(user.getProfile().isPhoneConfirmed()) + .profileEmail(user.getProfile().getEmail()) + .profileEmailConfirmed(user.getProfile().isEmailConfirmed()) + + .profileBirthDate(user.getProfile().getBirthDate()) + .profileSemester(user.getProfile().getSemester()) + .profileStudentIdCard(user.getProfile().getStudentIdCard()) + .profileIcon(user.getProfile().getIcon()) + .studyGroupNames(user.getStudyGroups().stream().map(StudyGroupEntity::getName).collect(Collectors.toSet())) + .build(); + } + @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java index aaa6e20..823223c 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/models/response/GetMyCoursesResponse.java @@ -13,5 +13,7 @@ @NoArgsConstructor @Builder public class GetMyCoursesResponse { - private List courses; + + private List courses; + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java index 2222331..2decce8 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java @@ -13,6 +13,7 @@ import ru.espada.ep.iptip.user.permission.groups.models.GroupToUserRequest; import java.security.Principal; +import java.util.List; @RestController @SecurityRequirement(name = "JWT") @@ -21,17 +22,25 @@ public class GroupController { private GroupService groupService; - @GetMapping("") - public ResponseEntity getGroups(Principal principal) { + // защищено + @GetMapping("/groups") + public ResponseEntity> getGroups(Principal principal) { return ResponseEntity.ok(groupService.getGroups(principal.getName())); } + // защищено @PostMapping("") public ResponseEntity createGroup(Principal principal, @Valid @RequestBody CreateGroupModel createGroupModel) { groupService.createGroup(principal, createGroupModel); return ResponseEntity.status(HttpStatus.CREATED).build(); } + @GetMapping("/{id}") + @PreAuthorize("hasPermission(#id, 'group.{group}')") + public ResponseEntity getGroup(@PathVariable Long id) { + return ResponseEntity.ok(groupService.getGroup(id)); + } + @DeleteMapping("/{group}") @PreAuthorize("hasPermission(#group, 'group.{group}')") public ResponseEntity deleteGroup(@PathVariable String group) { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java index 7d99a93..633935a 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntity.java @@ -26,6 +26,6 @@ public class GroupEntity { @OneToMany @JoinColumn(name = "group_id") - private List permission_groups; + private List permissionGroups; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntityDto.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntityDto.java new file mode 100644 index 0000000..6addb64 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupEntityDto.java @@ -0,0 +1,16 @@ +package ru.espada.ep.iptip.user.permission.groups; + +import lombok.*; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class GroupEntityDto { + private Long id; + private String name; + private String color; + private List groupPermissions; +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java index 55fb2bb..6866259 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupService.java @@ -9,7 +9,7 @@ import java.util.List; public interface GroupService { - List getGroups(String username); + List getGroups(String username); void createGroup(Principal principal, CreateGroupModel createGroupModel); @@ -21,4 +21,6 @@ public interface GroupService { void deleteGroup(String group); void addGroupPermission(Principal principal, AddPermissionsToGroup addPermissionsToGroup); + + GroupEntityDto getGroup(Long id); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java index 124f5cf..44650e9 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupServiceImpl.java @@ -38,8 +38,28 @@ public void addGroup(GroupEntity groupEntity) { } @Override - public List getGroups(String username) { - return groupRepository.findAll().stream().filter(groupEntity -> userPermissionService.hasPermission(username, "group." + groupEntity.getName())).toList(); + @Transactional + public List getGroups(String username) { + return groupRepository.findAll().stream() + .filter(groupEntity -> userPermissionService.hasPermission(username, "group." + groupEntity.getName())) + .map(groupEntity -> GroupEntityDto.builder() + .id(groupEntity.getId()) + .name(groupEntity.getName()) + .color(groupEntity.getColor()) + .groupPermissions(groupEntity.getPermissionGroups().stream().map(PermissionGroupEntity::getPermission).toList()) + .build()) + .toList(); + } + + @Override + public GroupEntityDto getGroup(Long id) { + GroupEntity groupEntity = groupRepository.findById(id).orElseThrow(); + return GroupEntityDto.builder() + .id(groupEntity.getId()) + .name(groupEntity.getName()) + .color(groupEntity.getColor()) + .groupPermissions(groupEntity.getPermissionGroups().stream().map(PermissionGroupEntity::getPermission).toList()) + .build(); } @Override @@ -105,7 +125,7 @@ public void giveGroupToUsers(GroupToUserRequest groupToUserRequest) { GroupEntity groupEntity = groupRepository.findGroupEntityByName(groupToUserRequest.getGroup()).orElseThrow(); for (String username : groupToUserRequest.getUsers()) { - userPermissionService.addPermissions(username, groupEntity.getPermission_groups().stream().map(PermissionGroupEntity::getPermission).toList(), -1L, -1L); + userPermissionService.addPermissions(username, groupEntity.getPermissionGroups().stream().map(PermissionGroupEntity::getPermission).toList(), -1L, -1L); } } @@ -114,7 +134,7 @@ public void removeGroupFromUser(GroupToUserRequest groupToUserRequest) { GroupEntity groupEntity = groupRepository.findGroupEntityByName(groupToUserRequest.getGroup()).orElseThrow(); for (String username : groupToUserRequest.getUsers()) { - userPermissionService.removePermissions(username, groupEntity.getPermission_groups().stream().map(PermissionGroupEntity::getPermission).toList()); + userPermissionService.removePermissions(username, groupEntity.getPermissionGroups().stream().map(PermissionGroupEntity::getPermission).toList()); } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java index b36ba7a..0b72359 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/profile/ProfileEntity.java @@ -16,7 +16,7 @@ @Builder @Entity @Table(name = "customers") -public class ProfileEntity extends Auditable implements Serializable { +public class ProfileEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) From 733891ee95d16a94cdecc3039afead9c3482858b Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Mon, 25 Nov 2024 18:36:20 +0300 Subject: [PATCH 36/49] add course resources --- .../ep/iptip/course/CourseController.java | 7 ++ .../espada/ep/iptip/course/CourseService.java | 12 ++- ...rseLearningResourceCategoryRepository.java | 4 + .../CourseLearningResourceController.java | 42 ++++++++ .../CourseLearningResourceService.java | 18 ++++ .../CourseLearningResourceServiceImpl.java | 101 ++++++++++++++++++ ...urseLearningResourceCategoryEntityDto.java | 12 +++ .../CourseLearningResourceEntityDto.java | 17 +++ .../CreateCourseLEarningFolderModel.java | 16 +++ .../CreateCourseLearningResourceModel.java | 20 ++++ .../CourseLearningResourceRepository.java | 4 + ...teCourseLearningResourceCategoryModel.java | 3 +- 12 files changed, 252 insertions(+), 4 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CourseLearningResourceCategoryEntityDto.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CourseLearningResourceEntityDto.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLEarningFolderModel.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceModel.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index 4e05161..7ea7af2 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -7,6 +7,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import ru.espada.ep.iptip.course.learning_resource_category.model.CourseLearningResourceCategoryEntityDto; import ru.espada.ep.iptip.course.model.CreateCourseLearningResourceCategoryModel; import ru.espada.ep.iptip.course.model.*; import ru.espada.ep.iptip.course.test.model.CreateTestModel; @@ -102,6 +103,12 @@ public ResponseEntity createCourseLearningResourceCategory(@Valid @Request return ResponseEntity.status(HttpStatus.CREATED).body(id); } + @GetMapping("/resource/categories") + @PreAuthorize("hasPermission(#id, 'course.amdin.{id}')") + public ResponseEntity> getCourseLearningResourceCategory(@PathVariable Long id) { + return ResponseEntity.ok(courseService.getCourseLearningResourceCategories(id)); + } + @DeleteMapping("/resource/category/{id}") @PreAuthorize("hasPermission(#id, 'course.amdin.{id}')") public ResponseEntity deleteCourseLearningResourceCategory(@PathVariable Long id) { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index a335191..233f79c 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -1,10 +1,10 @@ package ru.espada.ep.iptip.course; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryEntity; +import ru.espada.ep.iptip.course.learning_resource_category.model.CourseLearningResourceCategoryEntityDto; import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryRepository; import ru.espada.ep.iptip.course.model.CreateCourseModel; import ru.espada.ep.iptip.course.model.CreateCourseLearningResourceCategoryModel; @@ -22,7 +22,6 @@ import ru.espada.ep.iptip.user.permission.UserPermissionService; import java.security.Principal; -import java.util.Comparator; import java.util.List; import java.util.Set; @@ -70,6 +69,15 @@ public CourseEntityDto getCourseDto(Long id) { .build(); } + public List getCourseLearningResourceCategories(Long id) { + return courseLearningResourceCategoryRepository.findCourseLearningResourceCategoryEntitiesByCourse(CourseEntity.builder().id(id).build()).stream().map( + courseLearningResourceCategoryEntity -> CourseLearningResourceCategoryEntityDto.builder() + .id(courseLearningResourceCategoryEntity.getId()) + .name(courseLearningResourceCategoryEntity.getName()) + .build() + ).toList(); + } + @Transactional public UserCourseEntity attachUserToCourse(Long courseId, Long userId) { UserEntity userEntity = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("User not found")); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryRepository.java index 1cd0bff..55c89cf 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryRepository.java @@ -2,7 +2,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import ru.espada.ep.iptip.course.CourseEntity; + +import java.util.List; @Repository public interface CourseLearningResourceCategoryRepository extends JpaRepository { + List findCourseLearningResourceCategoryEntitiesByCourse(CourseEntity course); } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java index 9376cfd..a1d0515 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceController.java @@ -1,14 +1,56 @@ package ru.espada.ep.iptip.course.learning_resource_category; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLEarningFolderModel; +import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLearningResourceModel; +import ru.espada.ep.iptip.course.learning_resource_category.model.CourseLearningResourceEntityDto; + +import java.util.List; @RestController +@SecurityRequirement(name = "JWT") @RequestMapping("/course/resource") public class CourseLearningResourceController { private CourseLearningResourceService courseLearningResourceService; + @GetMapping("/{categoryId}") + @Operation(description = "Получает все ресурсы в категории курса. Надо самому разделить их на фронте по папкам.") + public ResponseEntity> getCourseLearningResource(@PathVariable Long categoryId) { + return ResponseEntity.ok(courseLearningResourceService.getCourseLearningResource(categoryId)); + } + + @PostMapping("") + public ResponseEntity createResource(@Valid @RequestBody CreateCourseLearningResourceModel createCourseLearningResourceModel) { + Long id = courseLearningResourceService.createResource(createCourseLearningResourceModel); + return ResponseEntity.ok().body(id); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteResource(@PathVariable Long id) { + courseLearningResourceService.deleteResource(id); + return ResponseEntity.ok().build(); + } + + @PostMapping("/folder") + public ResponseEntity createFolder(@Valid @RequestBody CreateCourseLEarningFolderModel createCourseLEarningFolderModel) { + Long id = courseLearningResourceService.createFolder(createCourseLEarningFolderModel); + return ResponseEntity.ok().body(id); + } + + @PostMapping("/load/file") + public ResponseEntity loadFile(@RequestBody byte[] file, @RequestHeader(HttpHeaders.CONTENT_TYPE) String contentType) { + String url = courseLearningResourceService.uploadFile(file, contentType).join(); + return ResponseEntity.ok(url); + } + @Autowired public void setCourseLearningResourceService(CourseLearningResourceService courseLearningResourceService) { this.courseLearningResourceService = courseLearningResourceService; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java index f78e1e6..3adf58e 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceService.java @@ -1,5 +1,23 @@ package ru.espada.ep.iptip.course.learning_resource_category; +import ru.espada.ep.iptip.course.learning_resource_category.model.CourseLearningResourceEntityDto; +import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLEarningFolderModel; +import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLearningResourceModel; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + public interface CourseLearningResourceService { + List getCourseLearningResource(Long categoryId); + + Long createResource(CreateCourseLearningResourceModel createCourseLearningResourceModel); + + void deleteResource(Long id); + + Long createFolder(CreateCourseLEarningFolderModel createCourseLEarningFolderModel); + + CompletableFuture uploadFile(byte[] avatar, String contentType); + + boolean isValidFileType(String contentType); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java index f278030..fa15e71 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java @@ -1,15 +1,116 @@ package ru.espada.ep.iptip.course.learning_resource_category; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import ru.espada.ep.iptip.course.learning_resource_category.folder.CourseLearningResourceFolderEntity; +import ru.espada.ep.iptip.course.learning_resource_category.folder.CourseLearningResourceFolderRepository; +import ru.espada.ep.iptip.course.learning_resource_category.model.CourseLearningResourceEntityDto; +import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLEarningFolderModel; +import ru.espada.ep.iptip.course.learning_resource_category.model.CreateCourseLearningResourceModel; +import ru.espada.ep.iptip.course.learning_resource_category.resource.CourseLearningResourceEntity; +import ru.espada.ep.iptip.course.learning_resource_category.resource.CourseLearningResourceRepository; +import ru.espada.ep.iptip.s3.S3Service; +import ru.espada.ep.iptip.user.UserEntity; + +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Service public class CourseLearningResourceServiceImpl implements CourseLearningResourceService { private CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository; + private CourseLearningResourceRepository courseLearningResourceRepository; + private CourseLearningResourceFolderRepository courseLearningResourceFolderRepository; + private S3Service s3Service; + + @Override + @Transactional + public List getCourseLearningResource(Long categoryId) { + return courseLearningResourceRepository.findCourseLearningResourceEntitiesByCategory(CourseLearningResourceCategoryEntity.builder().id(categoryId).build()).stream() + .map(courseLearningResourceEntity -> CourseLearningResourceEntityDto.builder() + .id(courseLearningResourceEntity.getId()) + .type(courseLearningResourceEntity.getType()) + .name(courseLearningResourceEntity.getName()) + .content(courseLearningResourceEntity.getContent()) + .folderName(courseLearningResourceEntity.getFolder() == null ? null : courseLearningResourceEntity.getFolder().getName()) + .build() + ).toList(); + } + + @Override + @Transactional + public Long createResource(CreateCourseLearningResourceModel createCourseLearningResourceModel) { + CourseLearningResourceEntity courseLearningResourceEntity = CourseLearningResourceEntity.builder() + .name(createCourseLearningResourceModel.getName()) + .type(createCourseLearningResourceModel.getType()) + .content(createCourseLearningResourceModel.getContent()) + .folder(CourseLearningResourceFolderEntity.builder().id(createCourseLearningResourceModel.getFolderId()).build()) + .build(); + return courseLearningResourceRepository.save(courseLearningResourceEntity).getId(); + } + + @Override + public void deleteResource(Long id) { + courseLearningResourceRepository.deleteById(id); + } + + @Override + public Long createFolder(CreateCourseLEarningFolderModel createCourseLEarningFolderModel) { + CourseLearningResourceFolderEntity courseLearningResourceFolderEntity = CourseLearningResourceFolderEntity.builder() + .name(createCourseLEarningFolderModel.getName()) + .build(); + courseLearningResourceFolderRepository.save(courseLearningResourceFolderEntity); + return courseLearningResourceFolderEntity.getId(); + } + + @Override + public CompletableFuture uploadFile(byte[] avatar, String contentType) { + if (!isValidFileType(contentType)) { + throw new IllegalArgumentException("exception.resource.upload.unsupported.file.type"); + } + + UUID uuid = UUID.randomUUID(); + return s3Service.uploadPng(avatar, uuid.toString(), "resources") + .thenCompose(fileName -> { + if (fileName == null) { + throw new IllegalArgumentException("exception.resource.upload.failed"); + } else { + return s3Service.getFileUrl("resources", fileName); + } + }).thenApply(url -> url); + } + + @Override + public boolean isValidFileType(String contentType) { + return contentType.equals("application/pdf") || + contentType.equals("application/pptx") || + contentType.equals("application/docx") || + contentType.equals("application/xlsx") || + contentType.equals("application/txt"); + } @Autowired public void setCourseLearningResourceCategoryRepository(CourseLearningResourceCategoryRepository courseLearningResourceCategoryRepository) { this.courseLearningResourceCategoryRepository = courseLearningResourceCategoryRepository; } + + @Autowired + public void setCourseLearningResourceRepository(CourseLearningResourceRepository courseLearningResourceRepository) { + this.courseLearningResourceRepository = courseLearningResourceRepository; + } + + @Autowired + public void setCourseLearningResourceFolderRepository(CourseLearningResourceFolderRepository courseLearningResourceFolderRepository) { + this.courseLearningResourceFolderRepository = courseLearningResourceFolderRepository; + } + + @Autowired + public void setS3Service(S3Service s3Service) { + this.s3Service = s3Service; + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CourseLearningResourceCategoryEntityDto.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CourseLearningResourceCategoryEntityDto.java new file mode 100644 index 0000000..1f21e06 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CourseLearningResourceCategoryEntityDto.java @@ -0,0 +1,12 @@ +package ru.espada.ep.iptip.course.learning_resource_category.model; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CourseLearningResourceCategoryEntityDto { + private Long id; + private String name; +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CourseLearningResourceEntityDto.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CourseLearningResourceEntityDto.java new file mode 100644 index 0000000..d3ecb08 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CourseLearningResourceEntityDto.java @@ -0,0 +1,17 @@ +package ru.espada.ep.iptip.course.learning_resource_category.model; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CourseLearningResourceEntityDto { + + private Long id; + private String name; + private String type; + private String content; + private String folderName; + +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLEarningFolderModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLEarningFolderModel.java new file mode 100644 index 0000000..cf4e41f --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLEarningFolderModel.java @@ -0,0 +1,16 @@ +package ru.espada.ep.iptip.course.learning_resource_category.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateCourseLEarningFolderModel { + + private String name; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceModel.java new file mode 100644 index 0000000..4e1acdf --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceModel.java @@ -0,0 +1,20 @@ +package ru.espada.ep.iptip.course.learning_resource_category.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateCourseLearningResourceModel { + + private Long courseId; + private String name; + private String type; + private String content; + private Long folderId; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceRepository.java index 1ed7c4c..ead63d8 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceRepository.java @@ -2,7 +2,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryEntity; + +import java.util.List; @Repository public interface CourseLearningResourceRepository extends JpaRepository { + List findCourseLearningResourceEntitiesByCategory(CourseLearningResourceCategoryEntity category); } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseLearningResourceCategoryModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseLearningResourceCategoryModel.java index 6a1ab58..a5cab25 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseLearningResourceCategoryModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CreateCourseLearningResourceCategoryModel.java @@ -1,13 +1,12 @@ package ru.espada.ep.iptip.course.model; import lombok.*; -import ru.espada.ep.iptip.audit.Auditable; @Data @AllArgsConstructor @NoArgsConstructor @Builder -public class CreateCourseLearningResourceCategoryModel extends Auditable { +public class CreateCourseLearningResourceCategoryModel { private String name; private Long courseId; From 06028417d558fc8c312d419078147a0f74fd3e31 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Mon, 25 Nov 2024 21:03:36 +0300 Subject: [PATCH 37/49] universities institutes majors and faculties + resources --- .../CourseLearningResourceCategoryEntity.java | 2 +- .../CourseLearningResourceServiceImpl.java | 8 +++++- .../CourseLearningResourceFolderEntity.java | 2 +- .../CreateCourseLearningResourceModel.java | 1 + .../CourseLearningResourceEntity.java | 2 +- .../university/CreateUniversityModel.java | 16 ++++++++++++ .../university/UniversityController.java | 13 ++++++++++ .../iptip/university/UniversityService.java | 1 + .../university/UniversityServiceImpl.java | 6 +++++ .../institute/CreateInstituteModel.java | 17 ++++++++++++ .../institute/InstituteController.java | 21 +++++++++++++++ .../institute/InstituteService.java | 1 + .../institute/InstituteServiceImpl.java | 20 ++++++++++++++ .../institute/major/CreateMajorModel.java | 17 ++++++++++++ .../institute/major/MajorController.java | 19 ++++++++++++++ .../institute/major/MajorService.java | 1 + .../institute/major/MajorServiceImpl.java | 21 +++++++++++++++ .../major/faculty/CreateFacultyModel.java | 17 ++++++++++++ .../major/faculty/FacultyController.java | 19 ++++++++++++++ .../major/faculty/FacultyService.java | 1 + .../major/faculty/FacultyServiceImpl.java | 26 ++++++++++++++++--- 21 files changed, 224 insertions(+), 7 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/CreateUniversityModel.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/CreateInstituteModel.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/CreateMajorModel.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/CreateFacultyModel.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java index 175a624..04f9441 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceCategoryEntity.java @@ -22,7 +22,7 @@ public class CourseLearningResourceCategoryEntity extends Auditable { private String name; @ManyToOne - @JoinColumn(name = "course_id") + @JoinColumn(name = "course_id", nullable = false) private CourseEntity course; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java index fa15e71..7b1573a 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java @@ -45,11 +45,17 @@ public List getCourseLearningResource(Long cate @Override @Transactional public Long createResource(CreateCourseLearningResourceModel createCourseLearningResourceModel) { + CourseLearningResourceFolderEntity courseLearningResourceFolderEntity = null; + if (!(createCourseLearningResourceModel.getFolderId() == null)) { + courseLearningResourceFolderEntity = courseLearningResourceFolderRepository.findById(createCourseLearningResourceModel.getFolderId()).orElse(null); + } + CourseLearningResourceEntity courseLearningResourceEntity = CourseLearningResourceEntity.builder() .name(createCourseLearningResourceModel.getName()) .type(createCourseLearningResourceModel.getType()) .content(createCourseLearningResourceModel.getContent()) - .folder(CourseLearningResourceFolderEntity.builder().id(createCourseLearningResourceModel.getFolderId()).build()) + .folder(courseLearningResourceFolderEntity) + .category(courseLearningResourceCategoryRepository.findById(createCourseLearningResourceModel.getCategoryId()).orElseThrow(() -> new UsernameNotFoundException("category not found"))) .build(); return courseLearningResourceRepository.save(courseLearningResourceEntity).getId(); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java index 8b645dd..e8b5573 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderEntity.java @@ -23,7 +23,7 @@ public class CourseLearningResourceFolderEntity extends Auditable { private String name; @ManyToOne - @JoinColumn(name = "course_learning_resource_category_id") + @JoinColumn(name = "course_learning_resource_category_id", nullable = false) private CourseLearningResourceCategoryEntity category; } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceModel.java index 4e1acdf..93e168a 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLearningResourceModel.java @@ -15,6 +15,7 @@ public class CreateCourseLearningResourceModel { private String name; private String type; private String content; + private Long categoryId; private Long folderId; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java index 1aa3c61..12ca9fe 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/resource/CourseLearningResourceEntity.java @@ -26,7 +26,7 @@ public class CourseLearningResourceEntity extends Auditable { private String content; @ManyToOne - @JoinColumn(name = "course_learning_resource_category_id") + @JoinColumn(name = "course_learning_resource_category_id", nullable = false) private CourseLearningResourceCategoryEntity category; @ManyToOne diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/CreateUniversityModel.java b/MainService/src/main/java/ru/espada/ep/iptip/university/CreateUniversityModel.java new file mode 100644 index 0000000..5b06e00 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/CreateUniversityModel.java @@ -0,0 +1,16 @@ +package ru.espada.ep.iptip.university; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateUniversityModel { + + private String name; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityController.java b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityController.java index f9b6e96..7d280a9 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityController.java @@ -1,7 +1,13 @@ package ru.espada.ep.iptip.university; import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; @@ -11,6 +17,13 @@ public class UniversityController { private UniversityService universityService; + @PostMapping("/university") + @PreAuthorize("hasPermission(#createUniversityModel, 'university')") + public ResponseEntity createUniversity(@Valid @RequestBody CreateUniversityModel createUniversityModel) { + Long id = universityService.createUniversity(createUniversityModel); + return ResponseEntity.status(HttpStatus.CREATED).body(id); + } + @Autowired public void setUniversityService(UniversityService universityService) { this.universityService = universityService; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityService.java b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityService.java index 3576b11..f0a4d61 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityService.java @@ -1,4 +1,5 @@ package ru.espada.ep.iptip.university; public interface UniversityService { + Long createUniversity(CreateUniversityModel createUniversityModel); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityServiceImpl.java index e4ae91f..1213560 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/UniversityServiceImpl.java @@ -7,8 +7,14 @@ @RequiredArgsConstructor @Service public class UniversityServiceImpl implements UniversityService { + private UniversityRepository universityRepository; + @Override + public Long createUniversity(CreateUniversityModel createUniversityModel) { + return universityRepository.save(UniversityEntity.builder().name(createUniversityModel.getName()).build()).getId(); + } + @Autowired public void setUniversityRepository(UniversityRepository universityRepository) { this.universityRepository = universityRepository; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/CreateInstituteModel.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/CreateInstituteModel.java new file mode 100644 index 0000000..c57a9eb --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/CreateInstituteModel.java @@ -0,0 +1,17 @@ +package ru.espada.ep.iptip.university.institute; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateInstituteModel { + + private Long universityId; + private String name; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteController.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteController.java index db2ded2..8b80c8c 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteController.java @@ -1,6 +1,13 @@ package ru.espada.ep.iptip.university.institute; import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; @@ -9,5 +16,19 @@ @RequestMapping("/institute") public class InstituteController { + private InstituteService instituteService; + + @PostMapping("/institute") + @PreAuthorize("hasPermission(#createInstituteModel, 'university.{universityId}')") + public ResponseEntity createInstitute(@Valid @RequestBody CreateInstituteModel createInstituteModel) { + Long id = instituteService.createInstitute(createInstituteModel); + return ResponseEntity.status(HttpStatus.CREATED).body(id); + } + + @Autowired + public void setInstituteService(InstituteService instituteService) { + this.instituteService = instituteService; + } + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteService.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteService.java index e283f21..59cb93e 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteService.java @@ -1,4 +1,5 @@ package ru.espada.ep.iptip.university.institute; public interface InstituteService { + Long createInstitute(CreateInstituteModel createInstituteModel); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteServiceImpl.java index a5501f9..0ea9d00 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/InstituteServiceImpl.java @@ -2,15 +2,35 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import ru.espada.ep.iptip.university.UniversityEntity; +import ru.espada.ep.iptip.university.UniversityRepository; @RequiredArgsConstructor @Service public class InstituteServiceImpl implements InstituteService { + private InstituteRepository repository; + private UniversityRepository universityRepository; + + @Override + public Long createInstitute(CreateInstituteModel createInstituteModel) { + UniversityEntity university = universityRepository.findById(createInstituteModel.getUniversityId()).orElseThrow(() -> new UsernameNotFoundException("University not found")); + InstituteEntity instituteEntity = repository.save(InstituteEntity.builder() + .name(createInstituteModel.getName()) + .university(university) + .build()); + return instituteEntity.getId(); + } @Autowired public void setRepository(InstituteRepository repository) { this.repository = repository; } + + @Autowired + public void setUniversityRepository(UniversityRepository universityRepository) { + this.universityRepository = universityRepository; + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/CreateMajorModel.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/CreateMajorModel.java new file mode 100644 index 0000000..2b6a796 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/CreateMajorModel.java @@ -0,0 +1,17 @@ +package ru.espada.ep.iptip.university.institute.major; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateMajorModel { + + private String name; + private Long instituteId; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorController.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorController.java index 774850f..756a350 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorController.java @@ -1,6 +1,12 @@ package ru.espada.ep.iptip.university.institute.major; import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; @@ -9,5 +15,18 @@ @RequestMapping("/major") public class MajorController { + private MajorService majorService; + + @PostMapping("/major") + public ResponseEntity createMajor(@Valid @RequestBody CreateMajorModel createMajorModel) { + Long id = majorService.createMajor(createMajorModel); + return ResponseEntity.status(HttpStatus.CREATED).body(id); + } + + @Autowired + public void setMajorService(MajorService majorService) { + this.majorService = majorService; + } + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorService.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorService.java index f684f97..d7f5d61 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorService.java @@ -1,4 +1,5 @@ package ru.espada.ep.iptip.university.institute.major; public interface MajorService { + Long createMajor(CreateMajorModel createMajorModel); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorServiceImpl.java index efedd6a..7423c59 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/MajorServiceImpl.java @@ -2,15 +2,36 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import ru.espada.ep.iptip.university.UniversityEntity; +import ru.espada.ep.iptip.university.institute.InstituteEntity; +import ru.espada.ep.iptip.university.institute.InstituteRepository; @RequiredArgsConstructor @Service public class MajorServiceImpl implements MajorService { + private MajorRepository repository; + private InstituteRepository instituteRepository; + + @Override + public Long createMajor(CreateMajorModel createMajorModel) { + InstituteEntity institute = instituteRepository.findById(createMajorModel.getInstituteId()).orElseThrow(() -> new UsernameNotFoundException("Institute not found")); + MajorEntity majorEntity = repository.save(MajorEntity.builder() + .name(createMajorModel.getName()) + .institute(institute) + .build()); + return majorEntity.getId(); + } @Autowired public void setRepository(MajorRepository repository) { this.repository = repository; } + + @Autowired + public void setInstituteRepository(InstituteRepository instituteRepository) { + this.instituteRepository = instituteRepository; + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/CreateFacultyModel.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/CreateFacultyModel.java new file mode 100644 index 0000000..3ec2aab --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/CreateFacultyModel.java @@ -0,0 +1,17 @@ +package ru.espada.ep.iptip.university.institute.major.faculty; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateFacultyModel { + + private String name; + private Long majorId; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyController.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyController.java index ba46a71..7ad1c47 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyController.java @@ -1,6 +1,12 @@ package ru.espada.ep.iptip.university.institute.major.faculty; import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; @@ -9,5 +15,18 @@ @RequestMapping("/faculty") public class FacultyController { + private FacultyService facultyService; + + @PostMapping("/faculty") + public ResponseEntity createFaculty(@Valid @RequestBody CreateFacultyModel createFacultyModel) { + Long id = facultyService.createFaculty(createFacultyModel); + return ResponseEntity.status(HttpStatus.CREATED).body(id); + } + + @Autowired + public void setFacultyService(FacultyService facultyService) { + this.facultyService = facultyService; + } + } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyService.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyService.java index 89877f9..fb4d3d7 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyService.java @@ -1,4 +1,5 @@ package ru.espada.ep.iptip.university.institute.major.faculty; public interface FacultyService { + Long createFaculty(CreateFacultyModel createFacultyModel); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyServiceImpl.java index d13c267..5141848 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/university/institute/major/faculty/FacultyServiceImpl.java @@ -2,15 +2,35 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import ru.espada.ep.iptip.university.institute.major.MajorEntity; +import ru.espada.ep.iptip.university.institute.major.MajorRepository; @RequiredArgsConstructor @Service public class FacultyServiceImpl implements FacultyService { - private FacultyRepository repository; + + private FacultyRepository facultyRepository; + private MajorRepository majorRepository; + + @Override + public Long createFaculty(CreateFacultyModel createFacultyModel) { + MajorEntity major = majorRepository.findById(createFacultyModel.getMajorId()).orElseThrow(() -> new UsernameNotFoundException("Major not found")); + FacultyEntity facultyEntity = facultyRepository.save(FacultyEntity.builder() + .name(createFacultyModel.getName()) + .major(major) + .build()); + return facultyEntity.getId(); + } + + @Autowired + public void setFacultyRepository(FacultyRepository facultyRepository) { + this.facultyRepository = facultyRepository; + } @Autowired - public void setFacultyRepository(FacultyRepository repository) { - this.repository = repository; + public void setMajorRepository(MajorRepository majorRepository) { + this.majorRepository = majorRepository; } } From 04b55ed7d72d5339509edeae12b325c8ed53de5d Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Mon, 25 Nov 2024 23:08:08 +0300 Subject: [PATCH 38/49] fix courseLearning requests --- .../ep/iptip/course/CourseController.java | 8 +++--- .../CourseLearningResourceServiceImpl.java | 3 ++- ...ourseLearningResourceFolderRepository.java | 3 +++ .../CreateCourseLEarningFolderModel.java | 1 + .../PermissionElevator.java | 3 +++ .../OptionalUserEventEntity.java | 26 +++++++++++++++++++ .../permission/groups/GroupController.java | 2 +- 7 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/user/optional_user_event/OptionalUserEventEntity.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java index 7ea7af2..267abeb 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseController.java @@ -34,7 +34,7 @@ public ResponseEntity createCourse(Principal principal, @Valid @RequestBody C } @DeleteMapping("/{id}") - @PreAuthorize("hasPermission(#id, 'course.amdin.{id}')") + @PreAuthorize("hasPermission(#id, 'course.amdin.{long}')") public ResponseEntity deleteCourse(Principal principal, @PathVariable Long id) { courseService.deleteCourse(principal, id); return ResponseEntity.ok().build(); @@ -103,14 +103,14 @@ public ResponseEntity createCourseLearningResourceCategory(@Valid @Request return ResponseEntity.status(HttpStatus.CREATED).body(id); } - @GetMapping("/resource/categories") - @PreAuthorize("hasPermission(#id, 'course.amdin.{id}')") + @GetMapping("/resource/categories/{id}") + @PreAuthorize("hasPermission(#id, 'course.amdin.{long}')") public ResponseEntity> getCourseLearningResourceCategory(@PathVariable Long id) { return ResponseEntity.ok(courseService.getCourseLearningResourceCategories(id)); } @DeleteMapping("/resource/category/{id}") - @PreAuthorize("hasPermission(#id, 'course.amdin.{id}')") + @PreAuthorize("hasPermission(#id, 'course.amdin.{long}')") public ResponseEntity deleteCourseLearningResourceCategory(@PathVariable Long id) { courseService.deleteCourseLearningResourceCategory(id); return ResponseEntity.status(HttpStatus.OK).build(); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java index 7b1573a..894a40f 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/CourseLearningResourceServiceImpl.java @@ -47,7 +47,7 @@ public List getCourseLearningResource(Long cate public Long createResource(CreateCourseLearningResourceModel createCourseLearningResourceModel) { CourseLearningResourceFolderEntity courseLearningResourceFolderEntity = null; if (!(createCourseLearningResourceModel.getFolderId() == null)) { - courseLearningResourceFolderEntity = courseLearningResourceFolderRepository.findById(createCourseLearningResourceModel.getFolderId()).orElse(null); + courseLearningResourceFolderEntity = courseLearningResourceFolderRepository.findCourseLearningResourceFolderEntityById(createCourseLearningResourceModel.getFolderId()).orElse(null); } CourseLearningResourceEntity courseLearningResourceEntity = CourseLearningResourceEntity.builder() @@ -69,6 +69,7 @@ public void deleteResource(Long id) { public Long createFolder(CreateCourseLEarningFolderModel createCourseLEarningFolderModel) { CourseLearningResourceFolderEntity courseLearningResourceFolderEntity = CourseLearningResourceFolderEntity.builder() .name(createCourseLEarningFolderModel.getName()) + .category(CourseLearningResourceCategoryEntity.builder().id(createCourseLEarningFolderModel.getCategoryId()).build()) .build(); courseLearningResourceFolderRepository.save(courseLearningResourceFolderEntity); return courseLearningResourceFolderEntity.getId(); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderRepository.java index 7a92571..761bee9 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/folder/CourseLearningResourceFolderRepository.java @@ -3,6 +3,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface CourseLearningResourceFolderRepository extends JpaRepository { + Optional findCourseLearningResourceFolderEntityById(Long id); } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLEarningFolderModel.java b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLEarningFolderModel.java index cf4e41f..05aba15 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLEarningFolderModel.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/learning_resource_category/model/CreateCourseLEarningFolderModel.java @@ -12,5 +12,6 @@ public class CreateCourseLEarningFolderModel { private String name; + private Long categoryId; } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java b/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java index 312990d..a309b52 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/security/premission_elevators/PermissionElevator.java @@ -20,6 +20,9 @@ public PermissionElevator(UserPermissionService userPermissionService) { @Override public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) { + if (targetDomainObject.getClass().equals(Long.class)) { + return userPermissionService.hasPermission(authentication.getName(), permission.toString().replace("{" + "long" + "}", targetDomainObject.toString())); + } String permissionName = permission.toString(); if (targetDomainObject != null) { for (Field field : targetDomainObject.getClass().getDeclaredFields()) { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/optional_user_event/OptionalUserEventEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/user/optional_user_event/OptionalUserEventEntity.java new file mode 100644 index 0000000..0095128 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/optional_user_event/OptionalUserEventEntity.java @@ -0,0 +1,26 @@ +package ru.espada.ep.iptip.user.optional_user_event; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "optional_user_event") +public class OptionalUserEventEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "user_id") + private Long userId; + @Column(name = "event_id") + private Long eventId; + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java index 2decce8..c0ad9c4 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/permission/groups/GroupController.java @@ -36,7 +36,7 @@ public ResponseEntity createGroup(Principal principal, @Valid @RequestBody Cr } @GetMapping("/{id}") - @PreAuthorize("hasPermission(#id, 'group.{group}')") + @PreAuthorize("hasPermission(#id, 'group.{long}')") public ResponseEntity getGroup(@PathVariable Long id) { return ResponseEntity.ok(groupService.getGroup(id)); } From 004d770833662fe9c35c1dbabb5e93cb1a6c1a1e Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Tue, 26 Nov 2024 00:15:46 +0300 Subject: [PATCH 39/49] StudyGroupEventController related stuff --- .../StudyGroupEventController.java | 30 ++++++++++-- .../StudyGroupEventRepository.java | 1 + .../StudyGroupEventService.java | 8 ++++ .../StudyGroupEventServiceImpl.java | 46 +++++++++++++++++++ .../AttachEventToStudyGroupRequest.java | 15 ++++++ .../DetachEventFromStudyGroupRequest.java | 15 ++++++ 6 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/model/requests/AttachEventToStudyGroupRequest.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/model/requests/DetachEventFromStudyGroupRequest.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java index 00ba83c..7ba847a 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java @@ -1,15 +1,39 @@ package ru.espada.ep.iptip.study_groups.study_group_event; import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestMapping; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import ru.espada.ep.iptip.study_groups.study_group_event.model.requests.AttachEventToStudyGroupRequest; +import ru.espada.ep.iptip.study_groups.study_group_event.model.requests.DetachEventFromStudyGroupRequest; + +import java.security.Principal; @RestController @SecurityRequirement(name = "JWT") @RequestMapping("/studyGroupEvent") public class StudyGroupEventController { - // TODO: add methods: create event, modify event, delete event + private StudyGroupEventService studyGroupEventService; + + @PostMapping("/attachEventToStudyGroup") + public ResponseEntity attachEventToStudyGroup(Principal principal, @Valid @RequestBody AttachEventToStudyGroupRequest request) { + StudyGroupEventEntity studyGroupEvent = studyGroupEventService.attachEventToStudyGroup(principal, request); + return ResponseEntity.status(HttpStatus.CREATED).body(studyGroupEvent); + } + + // TODO: deal with the principal stuff in here as well + @DeleteMapping("/detachEventFromStudyGroup") + public ResponseEntity detachEventFromStudyGroup(Principal principal, @Valid @RequestBody DetachEventFromStudyGroupRequest request) { + studyGroupEventService.detachEventFromStudyGroup(principal, request); + return ResponseEntity.status(HttpStatus.OK).build(); + } + @Autowired + public void setStudyGroupEventService(StudyGroupEventService studyGroupEventService) { + this.studyGroupEventService = studyGroupEventService; + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java index ee3d9f6..2c624c7 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java @@ -5,4 +5,5 @@ @Repository public interface StudyGroupEventRepository extends JpaRepository { + StudyGroupEventEntity findByEventIdAndStudyGroupId(Long eventId, Long studyGroupId); } \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventService.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventService.java index 76c94f3..d1c7aa0 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventService.java @@ -1,4 +1,12 @@ package ru.espada.ep.iptip.study_groups.study_group_event; +import ru.espada.ep.iptip.study_groups.study_group_event.model.requests.AttachEventToStudyGroupRequest; +import ru.espada.ep.iptip.study_groups.study_group_event.model.requests.DetachEventFromStudyGroupRequest; + +import java.security.Principal; + public interface StudyGroupEventService { + StudyGroupEventEntity attachEventToStudyGroup(Principal principal, AttachEventToStudyGroupRequest request); + + void detachEventFromStudyGroup(Principal principal, DetachEventFromStudyGroupRequest request); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java index 8974b90..b19f584 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java @@ -4,14 +4,60 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.espada.ep.iptip.event.EventEntity; +import ru.espada.ep.iptip.event.EventRepository; +import ru.espada.ep.iptip.study_groups.StudyGroupEntity; +import ru.espada.ep.iptip.study_groups.StudyGroupRepository; +import ru.espada.ep.iptip.study_groups.study_group_event.model.requests.AttachEventToStudyGroupRequest; +import ru.espada.ep.iptip.study_groups.study_group_event.model.requests.DetachEventFromStudyGroupRequest; + +import java.security.Principal; @RequiredArgsConstructor @Service public class StudyGroupEventServiceImpl implements StudyGroupEventService { private StudyGroupEventRepository studyGroupEventRepository; + private EventRepository eventRepository; + private StudyGroupRepository studyGroupRepository; + + // TODO: deal with the principal stuff here + @Override + public StudyGroupEventEntity attachEventToStudyGroup(Principal principal, AttachEventToStudyGroupRequest request) { + + EventEntity event = eventRepository.findById(request.getEventId()).orElseThrow(); + StudyGroupEntity studyGroup = studyGroupRepository.findById(request.getStudyGroupId()).orElseThrow(); + + return studyGroupEventRepository.save(StudyGroupEventEntity.builder() + .eventId(event.getId()) + .studyGroupId(studyGroup.getId()) + .build()); + } + + // TODO: deal with the principal stuff here as well + @Override + public void detachEventFromStudyGroup(Principal principal, DetachEventFromStudyGroupRequest request) { + + EventEntity event = eventRepository.findById(request.getEventId()).orElseThrow(); + StudyGroupEntity studyGroup = studyGroupRepository.findById(request.getStudyGroupId()).orElseThrow(); + + StudyGroupEventEntity studyGroupEvent = studyGroupEventRepository + .findByEventIdAndStudyGroupId(event.getId(), studyGroup.getId()); + + studyGroupEventRepository.delete(studyGroupEvent); + } @Autowired public void setStudyGroupEventRepository(StudyGroupEventRepository studyGroupEventRepository) { this.studyGroupEventRepository = studyGroupEventRepository; } + + @Autowired + public void setEventRepository(EventRepository eventRepository) { + this.eventRepository = eventRepository; + } + + @Autowired + public void setStudyGroupRepository(StudyGroupRepository studyGroupRepository) { + this.studyGroupRepository = studyGroupRepository; + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/model/requests/AttachEventToStudyGroupRequest.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/model/requests/AttachEventToStudyGroupRequest.java new file mode 100644 index 0000000..3beaa9a --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/model/requests/AttachEventToStudyGroupRequest.java @@ -0,0 +1,15 @@ +package ru.espada.ep.iptip.study_groups.study_group_event.model.requests; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AttachEventToStudyGroupRequest { + private Long studyGroupId; + private Long eventId; +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/model/requests/DetachEventFromStudyGroupRequest.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/model/requests/DetachEventFromStudyGroupRequest.java new file mode 100644 index 0000000..02738ef --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/model/requests/DetachEventFromStudyGroupRequest.java @@ -0,0 +1,15 @@ +package ru.espada.ep.iptip.study_groups.study_group_event.model.requests; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class DetachEventFromStudyGroupRequest { + private long studyGroupId; + private long eventId; +} From 9b2fb6b0acf75e2b9752d6d6fb73becfe2dcf211 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Tue, 26 Nov 2024 00:34:10 +0300 Subject: [PATCH 40/49] ForbiddenException added --- .../espada/ep/iptip/course/CourseService.java | 5 ++- .../exceptions/custom/ForbiddenException.java | 9 +++++ .../handlers/ForbiddenExceptionAdvice.java | 39 +++++++++++++++++++ .../StudyGroupEventServiceImpl.java | 14 +++++++ 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/ForbiddenException.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/ForbiddenExceptionAdvice.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index 233f79c..b8a0409 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -12,6 +12,7 @@ import ru.espada.ep.iptip.course.test.model.CreateTestModel; import ru.espada.ep.iptip.course.user_course.UserCourseEntity; import ru.espada.ep.iptip.course.user_course.UserCourseRepository; +import ru.espada.ep.iptip.exceptions.custom.ForbiddenException; import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import ru.espada.ep.iptip.study_groups.StudyGroupRepository; import ru.espada.ep.iptip.study_groups.StudyGroupService; @@ -100,7 +101,7 @@ public void detachUserFromCourse(Long courseId, Long userId) { @Transactional public void attachStudyGroupToCourse(Principal principal, StudyGroupCourseModel attachStudyGroupToCourseModel) { - if (!studyGroupService.hasPermission(principal.getName(), attachStudyGroupToCourseModel.getCourseId())) throw new RuntimeException("Permission denied"); + if (!studyGroupService.hasPermission(principal.getName(), attachStudyGroupToCourseModel.getCourseId())) throw new ForbiddenException("Permission denied"); CourseEntity courseEntity = courseRepository.findById(attachStudyGroupToCourseModel.getCourseId()).orElseThrow(() -> new RuntimeException("Course not found")); StudyGroupEntity studyGroupEntity = studyGroupRepository.findById(attachStudyGroupToCourseModel.getStudyGroupId()).orElseThrow(() -> new RuntimeException("StudyGroup not found")); @@ -115,7 +116,7 @@ public void attachStudyGroupToCourse(Principal principal, StudyGroupCourseModel @Transactional public void detachStudyGroupFromCourse(Principal principal, StudyGroupCourseModel detachUserFromCourseModel) { - if (!studyGroupService.hasPermission(principal.getName(), detachUserFromCourseModel.getCourseId())) throw new RuntimeException("Permission denied"); + if (!studyGroupService.hasPermission(principal.getName(), detachUserFromCourseModel.getCourseId())) throw new ForbiddenException("Permission denied"); CourseEntity courseEntity = courseRepository.findById(detachUserFromCourseModel.getCourseId()).orElseThrow(() -> new RuntimeException("Course not found")); StudyGroupEntity studyGroupEntity = studyGroupRepository.findById(detachUserFromCourseModel.getStudyGroupId()).orElseThrow(() -> new RuntimeException("StudyGroup not found")); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/ForbiddenException.java b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/ForbiddenException.java new file mode 100644 index 0000000..d4612db --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/custom/ForbiddenException.java @@ -0,0 +1,9 @@ +package ru.espada.ep.iptip.exceptions.custom; + +public class ForbiddenException extends RuntimeException { + + public ForbiddenException(String message) { + super(message); + } + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/ForbiddenExceptionAdvice.java b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/ForbiddenExceptionAdvice.java new file mode 100644 index 0000000..6b694fd --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/exceptions/handlers/ForbiddenExceptionAdvice.java @@ -0,0 +1,39 @@ +package ru.espada.ep.iptip.exceptions.handlers; + +import jakarta.validation.ConstraintViolationException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import ru.espada.ep.iptip.exceptions.custom.ForbiddenException; +import ru.espada.ep.iptip.exceptions.custom.LocalizationException; +import ru.espada.ep.iptip.exceptions.response.OperationStatus; +import ru.espada.ep.iptip.localization.LocalizationService; + +@ControllerAdvice +public class ForbiddenExceptionAdvice { + + private LocalizationService localizationService; + + @Autowired + public void setLocalizationService(LocalizationService localizationService) { + this.localizationService = localizationService; + } + + @ExceptionHandler + public ResponseEntity handleForbiddenException(ForbiddenException e) { + String message = e.getMessage(); + try { + message = localizationService.getLocalizedMessage(message); + } catch (LocalizationException ignored) { + } + return ResponseEntity.status(HttpStatus.FORBIDDEN).body( + OperationStatus.builder() + .status(false) + .message(message) + .build() + ); + } + +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java index b19f584..363c9e9 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventServiceImpl.java @@ -6,8 +6,10 @@ import org.springframework.stereotype.Service; import ru.espada.ep.iptip.event.EventEntity; import ru.espada.ep.iptip.event.EventRepository; +import ru.espada.ep.iptip.exceptions.custom.ForbiddenException; import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import ru.espada.ep.iptip.study_groups.StudyGroupRepository; +import ru.espada.ep.iptip.study_groups.StudyGroupService; import ru.espada.ep.iptip.study_groups.study_group_event.model.requests.AttachEventToStudyGroupRequest; import ru.espada.ep.iptip.study_groups.study_group_event.model.requests.DetachEventFromStudyGroupRequest; @@ -19,10 +21,14 @@ public class StudyGroupEventServiceImpl implements StudyGroupEventService { private StudyGroupEventRepository studyGroupEventRepository; private EventRepository eventRepository; private StudyGroupRepository studyGroupRepository; + private StudyGroupService studyGroupService; // TODO: deal with the principal stuff here @Override public StudyGroupEventEntity attachEventToStudyGroup(Principal principal, AttachEventToStudyGroupRequest request) { + if (!studyGroupService.hasPermission(principal.getName(), request.getStudyGroupId())) { + throw new ForbiddenException("User does not have permission to attach event to study group"); + } EventEntity event = eventRepository.findById(request.getEventId()).orElseThrow(); StudyGroupEntity studyGroup = studyGroupRepository.findById(request.getStudyGroupId()).orElseThrow(); @@ -36,6 +42,9 @@ public StudyGroupEventEntity attachEventToStudyGroup(Principal principal, Attach // TODO: deal with the principal stuff here as well @Override public void detachEventFromStudyGroup(Principal principal, DetachEventFromStudyGroupRequest request) { + if (!studyGroupService.hasPermission(principal.getName(), request.getStudyGroupId())) { + throw new ForbiddenException("User does not have permission to detach event from study group"); + } EventEntity event = eventRepository.findById(request.getEventId()).orElseThrow(); StudyGroupEntity studyGroup = studyGroupRepository.findById(request.getStudyGroupId()).orElseThrow(); @@ -60,4 +69,9 @@ public void setEventRepository(EventRepository eventRepository) { public void setStudyGroupRepository(StudyGroupRepository studyGroupRepository) { this.studyGroupRepository = studyGroupRepository; } + + @Autowired + public void setStudyGroupService(StudyGroupService studyGroupService) { + this.studyGroupService = studyGroupService; + } } From ae7bf173b64841afe3e2314f6e127476c710c96f Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Tue, 26 Nov 2024 00:40:54 +0300 Subject: [PATCH 41/49] fix --- .../study_group_event/StudyGroupEventController.java | 2 ++ .../main/java/ru/espada/ep/iptip/user/UserController.java | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java index 7ba847a..ea43c24 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventController.java @@ -19,12 +19,14 @@ public class StudyGroupEventController { private StudyGroupEventService studyGroupEventService; @PostMapping("/attachEventToStudyGroup") + // защищено! public ResponseEntity attachEventToStudyGroup(Principal principal, @Valid @RequestBody AttachEventToStudyGroupRequest request) { StudyGroupEventEntity studyGroupEvent = studyGroupEventService.attachEventToStudyGroup(principal, request); return ResponseEntity.status(HttpStatus.CREATED).body(studyGroupEvent); } // TODO: deal with the principal stuff in here as well + // защищено! @DeleteMapping("/detachEventFromStudyGroup") public ResponseEntity detachEventFromStudyGroup(Principal principal, @Valid @RequestBody DetachEventFromStudyGroupRequest request) { studyGroupEventService.detachEventFromStudyGroup(principal, request); diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index 6630b7f..16ba0e5 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -60,8 +60,8 @@ public ResponseEntity getInstituteInfo(@PathVariable Stri return ResponseEntity.ok(userService.getInstituteInfo(username)); } - @GetMapping("/courses/username/{username}") - public ResponseEntity getMyCourses(@PathVariable String username) { - return ResponseEntity.ok(userService.getMyCourses(username)); + @GetMapping("/courses") + public ResponseEntity getMyCourses(Principal principal) { + return ResponseEntity.ok(userService.getMyCourses(principal.getName())); } } From b8c29c04e2d96410c01eeff21584041b0e9028e1 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Tue, 26 Nov 2024 01:58:12 +0300 Subject: [PATCH 42/49] (Partial) EventController --- .../ep/iptip/event/EventController.java | 22 +++++++ .../espada/ep/iptip/event/EventService.java | 7 +++ .../ep/iptip/event/EventServiceImpl.java | 63 +++++++++++++++++++ .../CreateEventForStudyGroupsRequest.java | 27 ++++++++ .../models/requests/CreateEventRequest.java | 26 ++++++++ .../UserEventAttendanceEntity.java | 26 -------- 6 files changed, 145 insertions(+), 26 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/CreateEventForStudyGroupsRequest.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/CreateEventRequest.java delete mode 100644 MainService/src/main/java/ru/espada/ep/iptip/event/user_event_attendance/UserEventAttendanceEntity.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java index 418468d..e7ce625 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java @@ -1,9 +1,17 @@ package ru.espada.ep.iptip.event; import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; +import ru.espada.ep.iptip.event.models.requests.CreateEventForStudyGroupsRequest; +import ru.espada.ep.iptip.event.models.requests.CreateEventRequest; + +import java.security.Principal; @RestController @SecurityRequirement(name = "JWT") @@ -12,6 +20,20 @@ public class EventController { private EventService eventService; + @PostMapping("/event") + public ResponseEntity createEvent(Principal principal, @Valid @RequestBody CreateEventRequest request) { + EventEntity eventEntity = eventService.createEvent(principal, request); + return ResponseEntity.ok().body(eventEntity); + } + + @PostMapping("/eventForStudyGroups") + public ResponseEntity createEventForStudyGroups(Principal principal, @Valid @RequestBody CreateEventForStudyGroupsRequest request) { + EventEntity eventEntity = eventService.createEventForStudyGroups(principal, request); + return ResponseEntity.ok().body(eventEntity); + } + + // TODO: getter, setter, remover + @Autowired public void setEventService(EventService eventService) { this.eventService = eventService; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java index 8dfdbbe..f37ba98 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java @@ -1,4 +1,11 @@ package ru.espada.ep.iptip.event; +import ru.espada.ep.iptip.event.models.requests.CreateEventRequest; +import ru.espada.ep.iptip.event.models.requests.CreateEventForStudyGroupsRequest; + +import java.security.Principal; + public interface EventService { + public EventEntity createEvent(Principal principal, CreateEventRequest request); + public EventEntity createEventForStudyGroups(Principal principal, CreateEventForStudyGroupsRequest request); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java index 0359e54..817a0ba 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java @@ -3,14 +3,77 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import ru.espada.ep.iptip.event.models.requests.CreateEventForStudyGroupsRequest; +import ru.espada.ep.iptip.event.models.requests.CreateEventRequest; +import ru.espada.ep.iptip.study_groups.StudyGroupRepository; +import ru.espada.ep.iptip.study_groups.study_group_event.StudyGroupEventEntity; +import ru.espada.ep.iptip.study_groups.study_group_event.StudyGroupEventRepository; + +import java.security.Principal; @RequiredArgsConstructor @Service public class EventServiceImpl implements EventService{ private EventRepository eventRepository; + private StudyGroupEventEntity studyGroupEventEntity; + private StudyGroupRepository studyGroupRepository; + + private final StudyGroupEventRepository studyGroupEventRepository; + + @Override + public EventEntity createEvent(Principal principal, CreateEventRequest request) { + //TODO: check permission + + EventEntity eventEntity = EventEntity.builder() + .name(request.getName()) + .date(request.getDate()) + .weekday(request.getWeekday()) + .is_week_event(request.is_week_event()) + .begin_date(request.getBegin_date()) + .end_date(request.getEnd_date()) + .duration(request.getDuration()) + .build(); + return eventRepository.save(eventEntity); + } + + @Override + @Transactional + public EventEntity createEventForStudyGroups(Principal principal, CreateEventForStudyGroupsRequest request) { + + EventEntity eventEntity = EventEntity.builder() + .name(request.getName()) + .date(request.getDate()) + .weekday(request.getWeekday()) + .is_week_event(request.is_week_event()) + .begin_date(request.getBegin_date()) + .end_date(request.getEnd_date()) + .duration(request.getDuration()) + .build(); + eventEntity = eventRepository.save(eventEntity); + + for (Long studyGroupId : request.getStudy_group_ids()) { + StudyGroupEventEntity studyGroupEventEntity = StudyGroupEventEntity.builder() + .eventId(eventEntity.getId()) + .studyGroupId(studyGroupId) + .build(); + studyGroupEventEntity = studyGroupEventRepository.save(studyGroupEventEntity); + } + return eventEntity; + } @Autowired public void setEventRepository(EventRepository eventRepository) { this.eventRepository = eventRepository; } + + @Autowired + public void setStudyGroupRepository(StudyGroupRepository studyGroupRepository) { + this.studyGroupRepository = studyGroupRepository; + } + + @Autowired + public void setStudyGroupEventEntity(StudyGroupEventEntity studyGroupEventEntity) { + this.studyGroupEventEntity = studyGroupEventEntity; + } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/CreateEventForStudyGroupsRequest.java b/MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/CreateEventForStudyGroupsRequest.java new file mode 100644 index 0000000..4afab4d --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/CreateEventForStudyGroupsRequest.java @@ -0,0 +1,27 @@ +package ru.espada.ep.iptip.event.models.requests; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateEventForStudyGroupsRequest { + // TODO: implement request model + @NotNull + private String name; + @NotNull + private Long date; + private int weekday; + private boolean is_week_event; + private Long begin_date; + private Long end_date; + private Long duration; + private List study_group_ids; +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/CreateEventRequest.java b/MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/CreateEventRequest.java new file mode 100644 index 0000000..4a6fb12 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/CreateEventRequest.java @@ -0,0 +1,26 @@ +package ru.espada.ep.iptip.event.models.requests; + +import jakarta.persistence.Column; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.espada.ep.iptip.user.permission.annotation.FieldPermission; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateEventRequest { + + @NotNull + private String name; + @NotNull + private Long date; + private int weekday; + private boolean is_week_event; + private Long begin_date; + private Long end_date; + private Long duration; +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/user_event_attendance/UserEventAttendanceEntity.java b/MainService/src/main/java/ru/espada/ep/iptip/event/user_event_attendance/UserEventAttendanceEntity.java deleted file mode 100644 index e86f719..0000000 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/user_event_attendance/UserEventAttendanceEntity.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.espada.ep.iptip.event.user_event_attendance; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -@Entity -@Table(name = "user_event_attendance") -public class UserEventAttendanceEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private Long userId; - private Long eventId; - - private boolean status; - -} From a00aef5cc6194d5696220158ce05f09756fd66e5 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Tue, 26 Nov 2024 02:17:09 +0300 Subject: [PATCH 43/49] ModifyEvent method --- .../ep/iptip/event/EventController.java | 12 ++++-- .../espada/ep/iptip/event/EventService.java | 11 ++++- .../ep/iptip/event/EventServiceImpl.java | 43 +++++++++++++++++++ .../models/requests/ModifyEventRequest.java | 28 ++++++++++++ 4 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/ModifyEventRequest.java diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java index e7ce625..77bdf5f 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java @@ -4,12 +4,10 @@ import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.*; import ru.espada.ep.iptip.event.models.requests.CreateEventForStudyGroupsRequest; import ru.espada.ep.iptip.event.models.requests.CreateEventRequest; +import ru.espada.ep.iptip.event.models.requests.ModifyEventRequest; import java.security.Principal; @@ -32,6 +30,12 @@ public ResponseEntity createEventForStudyGroups(Principal principal, @Valid @ return ResponseEntity.ok().body(eventEntity); } + @PatchMapping("event/") + public ResponseEntity modifyEvent(Principal principal, @Valid @RequestBody ModifyEventRequest request) { + EventEntity eventEntity = eventService.modifyEvent(principal, request); + return ResponseEntity.ok().body(eventEntity); + } + // TODO: getter, setter, remover @Autowired diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java index f37ba98..1fdd8d6 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventService.java @@ -2,10 +2,17 @@ import ru.espada.ep.iptip.event.models.requests.CreateEventRequest; import ru.espada.ep.iptip.event.models.requests.CreateEventForStudyGroupsRequest; +import ru.espada.ep.iptip.event.models.requests.ModifyEventRequest; +import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import java.security.Principal; +import java.util.List; public interface EventService { - public EventEntity createEvent(Principal principal, CreateEventRequest request); - public EventEntity createEventForStudyGroups(Principal principal, CreateEventForStudyGroupsRequest request); + EventEntity createEvent(Principal principal, CreateEventRequest request); + EventEntity createEventForStudyGroups(Principal principal, CreateEventForStudyGroupsRequest request); + EventEntity modifyEvent(Principal principal, ModifyEventRequest request); + EventEntity getEvent(Principal principal, Long id); + List eventStudyGroups(Principal principal, Long id); + void deleteEvent(Principal principal, Long id); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java index 817a0ba..75ca2cc 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java @@ -6,11 +6,16 @@ import org.springframework.transaction.annotation.Transactional; import ru.espada.ep.iptip.event.models.requests.CreateEventForStudyGroupsRequest; import ru.espada.ep.iptip.event.models.requests.CreateEventRequest; +import ru.espada.ep.iptip.event.models.requests.ModifyEventRequest; +import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import ru.espada.ep.iptip.study_groups.StudyGroupRepository; import ru.espada.ep.iptip.study_groups.study_group_event.StudyGroupEventEntity; import ru.espada.ep.iptip.study_groups.study_group_event.StudyGroupEventRepository; +import javax.swing.text.html.Option; import java.security.Principal; +import java.util.List; +import java.util.Optional; @RequiredArgsConstructor @Service @@ -40,6 +45,7 @@ public EventEntity createEvent(Principal principal, CreateEventRequest request) @Override @Transactional public EventEntity createEventForStudyGroups(Principal principal, CreateEventForStudyGroupsRequest request) { + //TODO: check permission EventEntity eventEntity = EventEntity.builder() .name(request.getName()) @@ -62,6 +68,43 @@ public EventEntity createEventForStudyGroups(Principal principal, CreateEventFor return eventEntity; } + // TODO: implementation + + @Override + public EventEntity modifyEvent(Principal principal, ModifyEventRequest request) { + //TODO: check permission + EventEntity eventEntity = eventRepository.findById(request.getId()).orElseThrow(); + + eventEntity.setName(Optional.ofNullable(request.getName()).orElse(eventEntity.getName())); + eventEntity.setDate(Optional.ofNullable(request.getDate()).orElse(eventEntity.getDate())); + // FIXME: i am not sure, can bools be null in java? what will happen down here? + eventEntity.setWeekday(Optional.ofNullable(request.getWeekday()).orElse(eventEntity.getWeekday())); + eventEntity.set_week_event(Optional.ofNullable(request.is_week_event()).orElse(eventEntity.is_week_event())); + eventEntity.setBegin_date(Optional.ofNullable(request.getBegin_date()).orElse(eventEntity.getBegin_date())); + eventEntity.setEnd_date(Optional.ofNullable(request.getEnd_date()).orElse(eventEntity.getEnd_date())); + eventEntity.setDuration(Optional.ofNullable(request.getDuration()).orElse(eventEntity.getDuration())); + + return eventRepository.save(eventEntity); + } + + @Override + public EventEntity getEvent(Principal principal, Long id) { + //TODO: check permission + return null; + } + + @Override + public List eventStudyGroups(Principal principal, Long id) { + //TODO: check permission + return List.of(); + } + + @Override + public void deleteEvent(Principal principal, Long id) { + //TODO: check permission + + } + @Autowired public void setEventRepository(EventRepository eventRepository) { this.eventRepository = eventRepository; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/ModifyEventRequest.java b/MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/ModifyEventRequest.java new file mode 100644 index 0000000..71da659 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/models/requests/ModifyEventRequest.java @@ -0,0 +1,28 @@ +package ru.espada.ep.iptip.event.models.requests; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ModifyEventRequest { + + @NotNull + private Long id; + private String name; + private Long date; + private int weekday; + private boolean is_week_event; + private Long begin_date; + private Long end_date; + private Long duration; + private List study_group_ids; +} From 76362e823bcfea2780fc61556c30cd95dbaf97c6 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Tue, 26 Nov 2024 02:42:23 +0300 Subject: [PATCH 44/49] Delete method for eventcontroller --- .../ep/iptip/event/EventController.java | 9 +++++++-- .../ep/iptip/event/EventServiceImpl.java | 19 +++++++++++++------ .../StudyGroupEventRepository.java | 4 ++++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java index 77bdf5f..7623fbf 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java @@ -30,13 +30,18 @@ public ResponseEntity createEventForStudyGroups(Principal principal, @Valid @ return ResponseEntity.ok().body(eventEntity); } - @PatchMapping("event/") + @PatchMapping("/event") public ResponseEntity modifyEvent(Principal principal, @Valid @RequestBody ModifyEventRequest request) { EventEntity eventEntity = eventService.modifyEvent(principal, request); return ResponseEntity.ok().body(eventEntity); } - // TODO: getter, setter, remover + // TODO: getter, setter + @DeleteMapping("/event") + public ResponseEntity deleteEvent(Principal principal, Long id) { + eventService.deleteEvent(principal, id); + return ResponseEntity.ok().build(); + } @Autowired public void setEventService(EventService eventService) { diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java index 75ca2cc..2e22da9 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java @@ -28,7 +28,7 @@ public class EventServiceImpl implements EventService{ @Override public EventEntity createEvent(Principal principal, CreateEventRequest request) { - //TODO: check permission + // TODO: check permission EventEntity eventEntity = EventEntity.builder() .name(request.getName()) @@ -45,7 +45,7 @@ public EventEntity createEvent(Principal principal, CreateEventRequest request) @Override @Transactional public EventEntity createEventForStudyGroups(Principal principal, CreateEventForStudyGroupsRequest request) { - //TODO: check permission + // TODO: check permission EventEntity eventEntity = EventEntity.builder() .name(request.getName()) @@ -72,7 +72,7 @@ public EventEntity createEventForStudyGroups(Principal principal, CreateEventFor @Override public EventEntity modifyEvent(Principal principal, ModifyEventRequest request) { - //TODO: check permission + // TODO: check permission EventEntity eventEntity = eventRepository.findById(request.getId()).orElseThrow(); eventEntity.setName(Optional.ofNullable(request.getName()).orElse(eventEntity.getName())); @@ -89,20 +89,27 @@ public EventEntity modifyEvent(Principal principal, ModifyEventRequest request) @Override public EventEntity getEvent(Principal principal, Long id) { - //TODO: check permission + // TODO: check permission return null; } @Override public List eventStudyGroups(Principal principal, Long id) { - //TODO: check permission + // TODO: check permission return List.of(); } @Override public void deleteEvent(Principal principal, Long id) { - //TODO: check permission + EventEntity eventEntity = eventRepository.findById(id).orElseThrow(); + // Remove study group events + List studyGroupEventEntities = studyGroupEventRepository.findAllByEventId(eventEntity.getId()); + if (!studyGroupEventEntities.isEmpty()) { + studyGroupEventRepository.deleteAll(studyGroupEventEntities); + } + + eventRepository.delete(eventEntity); } @Autowired diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java index 2c624c7..6997309 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/study_group_event/StudyGroupEventRepository.java @@ -3,7 +3,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface StudyGroupEventRepository extends JpaRepository { StudyGroupEventEntity findByEventIdAndStudyGroupId(Long eventId, Long studyGroupId); + + List findAllByEventId(Long eventId); } \ No newline at end of file From f9be4f30f33547c3190c27f9e887e1edc24ac181 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Tue, 26 Nov 2024 02:46:44 +0300 Subject: [PATCH 45/49] Event controller complete --- .../ru/espada/ep/iptip/event/EventController.java | 15 ++++++++++++++- .../espada/ep/iptip/event/EventServiceImpl.java | 5 +++-- .../iptip/study_groups/StudyGroupRepository.java | 3 +++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java index 7623fbf..2965e71 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java @@ -8,8 +8,10 @@ import ru.espada.ep.iptip.event.models.requests.CreateEventForStudyGroupsRequest; import ru.espada.ep.iptip.event.models.requests.CreateEventRequest; import ru.espada.ep.iptip.event.models.requests.ModifyEventRequest; +import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import java.security.Principal; +import java.util.List; @RestController @SecurityRequirement(name = "JWT") @@ -36,13 +38,24 @@ public ResponseEntity modifyEvent(Principal principal, @Valid @RequestBody Mo return ResponseEntity.ok().body(eventEntity); } - // TODO: getter, setter @DeleteMapping("/event") public ResponseEntity deleteEvent(Principal principal, Long id) { eventService.deleteEvent(principal, id); return ResponseEntity.ok().build(); } + @GetMapping("/event/{id}") + public ResponseEntity getEvent(Principal principal, @PathVariable Long id) { + EventEntity eventEntity = eventService.getEvent(principal, id); + return ResponseEntity.ok().body(eventEntity); + } + + @GetMapping("/event/{id}/studyGroups") + public ResponseEntity eventStudyGroups(Principal principal, @PathVariable Long id) { + List studyGroups = eventService.eventStudyGroups(principal, id); + return ResponseEntity.ok().body(studyGroups); + } + @Autowired public void setEventService(EventService eventService) { this.eventService = eventService; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java index 2e22da9..42fa217 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java @@ -90,17 +90,18 @@ public EventEntity modifyEvent(Principal principal, ModifyEventRequest request) @Override public EventEntity getEvent(Principal principal, Long id) { // TODO: check permission - return null; + return eventRepository.findById(id).orElseThrow(); } @Override public List eventStudyGroups(Principal principal, Long id) { // TODO: check permission - return List.of(); + return studyGroupRepository.findAllByEventId(id); } @Override public void deleteEvent(Principal principal, Long id) { + // TODO: check permission EventEntity eventEntity = eventRepository.findById(id).orElseThrow(); // Remove study group events diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java index 7688a94..d2e1267 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java @@ -3,6 +3,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface StudyGroupRepository extends JpaRepository { + List findAllByEventId(Object unknownAttr1); } \ No newline at end of file From 20180623c88723df2ebbfac6dcb116b853f4a123 Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Tue, 26 Nov 2024 02:50:17 +0300 Subject: [PATCH 46/49] todo specification --- .../src/main/java/ru/espada/ep/iptip/event/EventController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java index 2965e71..7c23dd7 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventController.java @@ -56,6 +56,8 @@ public ResponseEntity eventStudyGroups(Principal principal, @PathVariable Lon return ResponseEntity.ok().body(studyGroups); } + // TODO: implement getters of events for particular groups and particular time periods + @Autowired public void setEventService(EventService eventService) { this.eventService = eventService; From 8a2760755b7e1c9a58c1af117983746142ed3e14 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Tue, 26 Nov 2024 02:52:57 +0300 Subject: [PATCH 47/49] user courses --- .../espada/ep/iptip/course/CourseFullDto.java | 21 ++++++ .../ep/iptip/course/CourseRepository.java | 4 +- .../espada/ep/iptip/course/CourseService.java | 1 + .../ep/iptip/course/CourseTestEntityDto.java | 21 ++++++ .../ep/iptip/course/TeacherEntityDto.java | 17 +++++ .../course/{ => model}/CourseEntityDto.java | 2 +- .../user_course/UserCourseRepository.java | 2 + .../espada/ep/iptip/user/UserController.java | 14 ++-- .../ru/espada/ep/iptip/user/UserService.java | 67 ++++++++++++++----- 9 files changed, 125 insertions(+), 24 deletions(-) create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/CourseFullDto.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/CourseTestEntityDto.java create mode 100644 MainService/src/main/java/ru/espada/ep/iptip/course/TeacherEntityDto.java rename MainService/src/main/java/ru/espada/ep/iptip/course/{ => model}/CourseEntityDto.java (85%) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseFullDto.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseFullDto.java new file mode 100644 index 0000000..3d5edbd --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseFullDto.java @@ -0,0 +1,21 @@ +package ru.espada.ep.iptip.course; + +import lombok.*; + +import java.util.Date; +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CourseFullDto { + + private Date createdAt; + private Long id; + private String name; + private String description; + private Set tests; + private Set teachers; + +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseRepository.java index 8f9370a..a8b68e5 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseRepository.java @@ -3,9 +3,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface CourseRepository extends JpaRepository { - - } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java index b8a0409..8d452ee 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseService.java @@ -6,6 +6,7 @@ import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryEntity; import ru.espada.ep.iptip.course.learning_resource_category.model.CourseLearningResourceCategoryEntityDto; import ru.espada.ep.iptip.course.learning_resource_category.CourseLearningResourceCategoryRepository; +import ru.espada.ep.iptip.course.model.CourseEntityDto; import ru.espada.ep.iptip.course.model.CreateCourseModel; import ru.espada.ep.iptip.course.model.CreateCourseLearningResourceCategoryModel; import ru.espada.ep.iptip.course.model.StudyGroupCourseModel; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseTestEntityDto.java b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseTestEntityDto.java new file mode 100644 index 0000000..0a521b8 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/CourseTestEntityDto.java @@ -0,0 +1,21 @@ +package ru.espada.ep.iptip.course; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CourseTestEntityDto { + private Long id; + private String name; + private Long startTime; + private Long endTime; + private int attempts; + private Long time; + private boolean hideResultScore; + private boolean hideAnswers; + private boolean hideAnswerCorrectness; + private int minScore; + private int maxScore; +} diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/TeacherEntityDto.java b/MainService/src/main/java/ru/espada/ep/iptip/course/TeacherEntityDto.java new file mode 100644 index 0000000..25403b4 --- /dev/null +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/TeacherEntityDto.java @@ -0,0 +1,17 @@ +package ru.espada.ep.iptip.course; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TeacherEntityDto { + + private Long id; + private String icon; + private String name; + private String surname; + private String patronymic; + +} \ No newline at end of file diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntityDto.java b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CourseEntityDto.java similarity index 85% rename from MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntityDto.java rename to MainService/src/main/java/ru/espada/ep/iptip/course/model/CourseEntityDto.java index 83a0391..152e9a6 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/CourseEntityDto.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/model/CourseEntityDto.java @@ -1,4 +1,4 @@ -package ru.espada.ep.iptip.course; +package ru.espada.ep.iptip.course.model; import lombok.*; diff --git a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java index 09e2236..0bed761 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/course/user_course/UserCourseRepository.java @@ -16,4 +16,6 @@ public interface UserCourseRepository extends JpaRepository findUserCourseEntitiesByUserIdAndSemester(Long userId, int semester); UserCourseEntity findUserCourseEntityByUserIdAndCourseId(Long userId, Long courseId); + + boolean existsByUserIdAndCourseId(Long id, Long id1); } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java index 16ba0e5..e794750 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserController.java @@ -5,12 +5,13 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import ru.espada.ep.iptip.user.models.request.AddRoleRequest; +import ru.espada.ep.iptip.course.CourseFullDto; +import ru.espada.ep.iptip.course.model.CourseEntityDto; import ru.espada.ep.iptip.user.models.request.CreateProfileRequest; -import ru.espada.ep.iptip.user.models.response.GetMyCoursesResponse; import ru.espada.ep.iptip.user.models.response.InstituteInfoResponse; import java.security.Principal; +import java.util.List; @RestController @SecurityRequirement(name = "JWT") @@ -61,7 +62,12 @@ public ResponseEntity getInstituteInfo(@PathVariable Stri } @GetMapping("/courses") - public ResponseEntity getMyCourses(Principal principal) { - return ResponseEntity.ok(userService.getMyCourses(principal.getName())); + public ResponseEntity> getUserCourses(Principal principal) { + return ResponseEntity.ok(userService.getUserCourses(principal.getName())); + } + + @GetMapping("/course/{id}") + public ResponseEntity getCourse(Principal principal, @PathVariable Long id) { + return ResponseEntity.ok(userService.getCourseFullDto(principal, id)); } } diff --git a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java index b31ee6f..24eecde 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java @@ -1,7 +1,5 @@ package ru.espada.ep.iptip.user; -import jakarta.annotation.PostConstruct; -import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; @@ -9,30 +7,24 @@ import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import ru.espada.ep.iptip.course.CourseEntity; -import ru.espada.ep.iptip.course.CourseRepository; +import ru.espada.ep.iptip.course.*; +import ru.espada.ep.iptip.course.model.CourseEntityDto; import ru.espada.ep.iptip.course.user_course.UserCourseEntity; import ru.espada.ep.iptip.course.user_course.UserCourseRepository; import ru.espada.ep.iptip.s3.S3Service; import ru.espada.ep.iptip.study_groups.StudyGroupEntity; import ru.espada.ep.iptip.university.UniversityEntity; -import ru.espada.ep.iptip.university.UniversityRepository; import ru.espada.ep.iptip.university.institute.InstituteEntity; -import ru.espada.ep.iptip.university.institute.InstituteRepository; import ru.espada.ep.iptip.university.institute.major.MajorEntity; -import ru.espada.ep.iptip.university.institute.major.MajorRepository; import ru.espada.ep.iptip.university.institute.major.faculty.FacultyEntity; import ru.espada.ep.iptip.university.institute.major.faculty.FacultyRepository; -import ru.espada.ep.iptip.user.models.response.GetMyCoursesResponse; import ru.espada.ep.iptip.user.models.response.InstituteInfoResponse; -import ru.espada.ep.iptip.user.permission.UserPermissionEntity; import ru.espada.ep.iptip.user.profile.ProfileEntity; import ru.espada.ep.iptip.user.profile.ProfileRepository; import ru.espada.ep.iptip.user.models.request.AddRoleRequest; @@ -42,10 +34,8 @@ import java.security.Principal; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -194,13 +184,19 @@ public InstituteInfoResponse getInstituteInfo(String username) { .build(); } - public GetMyCoursesResponse getMyCourses(String username) { + public List getUserCourses(String username) { UserEntity user = getUser(username); List userCourses = userCourseRepository.findUserCourseEntitiesByUserIdAndSemester(user.getId(), user.getProfile().getSemester()); - - return GetMyCoursesResponse.builder() - .courses(userCourses.stream().map(UserCourseEntity::getCourseId).collect(Collectors.toList())) - .build(); + List courses = courseRepository.findAllById(userCourses.stream().map(UserCourseEntity::getCourseId).toList()); + + return courses.stream().map(course -> + CourseEntityDto.builder() + .id(course.getId()) + .name(course.getName()) + .description(course.getDescription()) + .createdAt(course.getCreatedAt()) + .build()) + .collect(Collectors.toList()); } public void addPermission(String username, AddRoleRequest addRoleRequest) { @@ -246,6 +242,43 @@ private UserDto toUserDto(UserEntity user) { .build(); } + @Transactional + public CourseFullDto getCourseFullDto(Principal principal, Long id) { + CourseEntity course = courseRepository.findById(id).orElse(null); + if (course == null) { + throw new RuntimeException("exception.course.not_found"); + } + UserEntity user = getUser(principal.getName()); + + if (!userCourseRepository.existsByUserIdAndCourseId(user.getId(), course.getId())) { + throw new RuntimeException("exception.user.not_in_course"); + } + + return CourseFullDto.builder() + .id(course.getId()) + .name(course.getName()) + .description(course.getDescription()) + .createdAt(course.getCreatedAt()) + .teachers(course.getTeachers().stream().map(teacher -> TeacherEntityDto.builder() + .id(teacher.getId()) + .name(teacher.getProfile().getName()) + .surname(teacher.getProfile().getSurname()) + .patronymic(teacher.getProfile().getPatronymic()) + .icon(teacher.getProfile().getIcon()) + .build()).collect(Collectors.toSet())) + .tests(course.getTests().stream().map(test -> CourseTestEntityDto.builder() + .id(test.getId()) + .name(test.getName()) + .time(test.getTime()) + .endTime(test.getEndTime()) + .hideAnswerCorrectness(test.isHideAnswerCorrectness()) + .hideAnswers(test.isHideAnswers()) + .hideResultScore(test.isHideResultScore()) + .build() + ).collect(Collectors.toSet())) + .build(); + } + @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; From 9a1b1587f6529ef899e904cf6ced9b4c0915953c Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Tue, 26 Nov 2024 03:07:26 +0300 Subject: [PATCH 48/49] fix for method in eventcontroller and repository --- .../espada/ep/iptip/study_groups/StudyGroupRepository.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java index d2e1267..f59518e 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/study_groups/StudyGroupRepository.java @@ -1,11 +1,16 @@ package ru.espada.ep.iptip.study_groups; +import io.lettuce.core.dynamic.annotation.Param; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Set; @Repository public interface StudyGroupRepository extends JpaRepository { - List findAllByEventId(Object unknownAttr1); + // This is utterly retarded solution but it will do for now + @Query("SELECT sg FROM StudyGroupEntity sg JOIN sg.events e WHERE e.id = :eventId") + List findAllByEventId(@Param("eventId") Long eventId); } \ No newline at end of file From e858352f428093fb36b868bbe47550254186f462 Mon Sep 17 00:00:00 2001 From: maxdo1511 Date: Tue, 26 Nov 2024 03:11:15 +0300 Subject: [PATCH 49/49] fix --- .../java/ru/espada/ep/iptip/event/EventServiceImpl.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java index 42fa217..ea77c93 100644 --- a/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java +++ b/MainService/src/main/java/ru/espada/ep/iptip/event/EventServiceImpl.java @@ -21,7 +21,6 @@ @Service public class EventServiceImpl implements EventService{ private EventRepository eventRepository; - private StudyGroupEventEntity studyGroupEventEntity; private StudyGroupRepository studyGroupRepository; private final StudyGroupEventRepository studyGroupEventRepository; @@ -122,9 +121,4 @@ public void setEventRepository(EventRepository eventRepository) { public void setStudyGroupRepository(StudyGroupRepository studyGroupRepository) { this.studyGroupRepository = studyGroupRepository; } - - @Autowired - public void setStudyGroupEventEntity(StudyGroupEventEntity studyGroupEventEntity) { - this.studyGroupEventEntity = studyGroupEventEntity; - } }