package com.plannaplan.controllers; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.plannaplan.App; import com.plannaplan.entities.Course; import com.plannaplan.responses.mappers.CoursesResponseMappers; import com.plannaplan.responses.models.CoursesDefaultResponse; import com.plannaplan.responses.models.CoursesWithGroupsResponse; import com.plannaplan.responses.models.GroupWithCapacityResponse; import com.plannaplan.services.CourseService; import com.plannaplan.services.GroupService; import com.plannaplan.types.GroupType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RestController; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import com.plannaplan.responses.models.abstracts.CoursesResponse; /** * Rest controller to Courses related endpoints. More detailed api docs is * available via swagger */ @RestController @CrossOrigin @RequestMapping("/api/" + App.API_VERSION + "/courses") @Api(tags = { "Course" }, value = "Course", description = "Endpoints to deal with courses. All courses can have classes, lectures or both.") public class CoursesController { @Autowired private CourseService courseService; @Autowired private GroupService groupService; /** * @param groups should include groups in response * @param takenPlaces should include groups in response * @return list of all courses in system */ @GetMapping("/all") @ApiOperation(value = "Return all courses") public ResponseEntity> getMethodName( @RequestParam(name = "groups", defaultValue = "false") @ApiParam(value = "Boolean if you want to have resopnse with associated groups or without") Boolean groups, @RequestParam(name = "takenPlaces", defaultValue = "false") @ApiParam(value = "Boolean if we want to have respoonse with information about taken places by other students. Needs to be set groups true first") Boolean takenPlaces) { List courses = this.courseService.getAllCourses(); if (groups) { if (takenPlaces) { final List response = new ArrayList<>(); courses.forEach(course -> { final List lectures = new ArrayList<>(); final List classes = new ArrayList<>(); final HashMap ammounts = this.groupService.getTakenPlaces(course.getGroups()); course.getGroups().stream().forEach(group -> { if (GroupType.isLectureOrClass(group.getType()) == GroupType.CLASS) { classes.add(new GroupWithCapacityResponse(group, ammounts.get(group.getId()))); } else { lectures.add(new GroupWithCapacityResponse(group, ammounts.get(group.getId()))); } }); response.add(new CoursesWithGroupsResponse(course, lectures, classes)); }); return new ResponseEntity<>(response, HttpStatus.OK); } final List response = CoursesResponseMappers .mapToGetCoursesWithGroupsResponse(courses); return new ResponseEntity<>(response, HttpStatus.OK); } final List response = CoursesResponseMappers.mapToGetCoursesResponse(courses); return new ResponseEntity<>(response, HttpStatus.OK); } }