Skip to content

Commit

Permalink
user courses
Browse files Browse the repository at this point in the history
  • Loading branch information
maxdo1511 committed Nov 25, 2024
1 parent 2018062 commit 8a27607
Show file tree
Hide file tree
Showing 9 changed files with 125 additions and 24 deletions.
Original file line number Diff line number Diff line change
@@ -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<CourseTestEntityDto> tests;
private Set<TeacherEntityDto> teachers;

}
Original file line number Diff line number Diff line change
Expand Up @@ -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<CourseEntity, Long> {



}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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;

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ru.espada.ep.iptip.course;
package ru.espada.ep.iptip.course.model;

import lombok.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,6 @@ public interface UserCourseRepository extends JpaRepository<UserCourseEntity, Lo
List<UserCourseEntity> findUserCourseEntitiesByUserIdAndSemester(Long userId, int semester);

UserCourseEntity findUserCourseEntityByUserIdAndCourseId(Long userId, Long courseId);

boolean existsByUserIdAndCourseId(Long id, Long id1);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -61,7 +62,12 @@ public ResponseEntity<InstituteInfoResponse> getInstituteInfo(@PathVariable Stri
}

@GetMapping("/courses")
public ResponseEntity<GetMyCoursesResponse> getMyCourses(Principal principal) {
return ResponseEntity.ok(userService.getMyCourses(principal.getName()));
public ResponseEntity<List<CourseEntityDto>> getUserCourses(Principal principal) {
return ResponseEntity.ok(userService.getUserCourses(principal.getName()));
}

@GetMapping("/course/{id}")
public ResponseEntity<CourseFullDto> getCourse(Principal principal, @PathVariable Long id) {
return ResponseEntity.ok(userService.getCourseFullDto(principal, id));
}
}
67 changes: 50 additions & 17 deletions MainService/src/main/java/ru/espada/ep/iptip/user/UserService.java
Original file line number Diff line number Diff line change
@@ -1,38 +1,30 @@
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;
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.*;
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;
Expand All @@ -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;

Expand Down Expand Up @@ -194,13 +184,19 @@ public InstituteInfoResponse getInstituteInfo(String username) {
.build();
}

public GetMyCoursesResponse getMyCourses(String username) {
public List<CourseEntityDto> getUserCourses(String username) {
UserEntity user = getUser(username);
List<UserCourseEntity> userCourses = userCourseRepository.findUserCourseEntitiesByUserIdAndSemester(user.getId(), user.getProfile().getSemester());

return GetMyCoursesResponse.builder()
.courses(userCourses.stream().map(UserCourseEntity::getCourseId).collect(Collectors.toList()))
.build();
List<CourseEntity> 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) {
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 8a27607

Please sign in to comment.