Skip to content

Commit

Permalink
study groups and course learning resource
Browse files Browse the repository at this point in the history
  • Loading branch information
maxdo1511 committed Nov 24, 2024
1 parent e40c68a commit af59a7d
Show file tree
Hide file tree
Showing 16 changed files with 245 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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()
Expand All @@ -28,29 +30,26 @@ 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()
);
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();
}

Expand All @@ -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();
}

Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,28 @@
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;

import java.security.Principal;
import java.util.Comparator;
import java.util.List;
import java.util.Set;

@Service
public class CourseService {
Expand All @@ -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);
}

Expand All @@ -57,41 +66,63 @@ 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<UserEntity> 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"));
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<UserEntity> users = studyGroupEntity.getUsers().stream().toList();

userCourseRepository.deleteAll(users.stream().map(user -> UserCourseEntity.builder()
.courseId(courseEntity.getId())
.userId(user.getId())
.build()).toList());

return true;
}

public List<CourseEntity> 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
Expand Down Expand Up @@ -119,11 +150,13 @@ public void setUserService(UserService userService) {
this.userService = userService;
}

public List<CourseEntity> 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;
}
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,14 @@
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")
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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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);

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -10,5 +10,6 @@
public class CreateCourseLearningResourceCategoryModel extends Auditable {

private String name;
private Long courseId;

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

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AttachStudyGroupToCourseModel {
public class StudyGroupCourseModel {

private Long studyGroupId;
private Long courseId;

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AttachUserToCourseModel {
public class UserCourseModel {

private Long courseId;
private Long userId;

}
Loading

0 comments on commit af59a7d

Please sign in to comment.