package com.syzton.sunread.controller.semester;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javassist.NotFoundException;
import javax.validation.Valid;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.syzton.sunread.dto.common.PageResource;
import com.syzton.sunread.dto.semester.SemesterDTO;
import com.syzton.sunread.model.semester.Semester;
import com.syzton.sunread.service.semester.SemesterService;
/*
* @Date:2015-3-15
* @Author: Morgan-Leon
*/
@Controller
@RequestMapping(value="/api")
public class SemesterController {
private static final Logger LOGGER = LoggerFactory.getLogger(SemesterController.class);
private SemesterService service;
@Autowired
public SemesterController(SemesterService service){
this.service = service;
}
//Add a Semester
@RequestMapping(value = "/campus/{campusId}/semester", method = RequestMethod.POST)
@ResponseBody
public SemesterDTO add(@Valid @RequestBody SemesterDTO dto,@PathVariable("campusId")Long campusId) {
LOGGER.debug("Adding a new semester entry with information: {}", dto);
SemesterDTO added = service.add(dto,campusId);
LOGGER.debug("Added a semester entry with information: {}", added);
return added;
}
//Delete a semester
@RequestMapping(value = "/semester/{id}", method = RequestMethod.DELETE)
@ResponseBody
public Semester deleteById(@Valid @PathVariable("id") Long id) {
LOGGER.debug("Deleting a semester entry with id: {}", id);
Semester deleted = service.deleteById(id);
LOGGER.debug("Deleted semester entry with information: {}", deleted);
return deleted;
}
//Update a semester
@RequestMapping(value = "/semester/{id}", method = RequestMethod.PUT)
@ResponseBody
public SemesterDTO update(@Valid @RequestBody SemesterDTO dto,@PathVariable("id") long id) throws NotFoundException {
LOGGER.debug("Adding a new semester entry with information: {}", dto);
SemesterDTO updated = service.update(dto,id);
LOGGER.debug("Added a semester with information: {}", updated);
return updated;
}
//Get all Semesters
@RequestMapping(value = "/semesters", method = RequestMethod.GET)
@ResponseBody
public PageResource<Semester> findAll(
@RequestParam("page") int page,
@RequestParam("size") int size,
@RequestParam(value = "sortBy",required = false) String sortBy) throws NotFoundException {
LOGGER.debug("Finding semesters entry " );
sortBy = sortBy==null?"id": sortBy;
Pageable pageable = new PageRequest(page,size,new Sort(sortBy));
Page<Semester> pageResult = service.findAll(pageable);
return new PageResource<>(pageResult,"page","size");
}
//Get all Semesters By userId
@RequestMapping(value = "/student/{studentId}/semesters", method = RequestMethod.GET)
@ResponseBody
public List<Semester> findAll(@PathVariable("studentId")Long studentId) throws NotFoundException {
LOGGER.debug("Finding semesters entry " );
List<Semester> semesters = service.findByStudentId(studentId);
Collections.sort(semesters, new Comparator<Semester>() {
public int compare(Semester o1, Semester o2) {
return o2.getStartTime().compareTo(o1.getStartTime());
}
});
return semesters;
}
//Get Semesters by campus
@RequestMapping(value = "/campus/{campusId}/semesters", method = RequestMethod.GET)
@ResponseBody
public PageResource<Semester> findByTime(@RequestParam("campusId") long campusId,
@RequestParam("page") int page,
@RequestParam("size") int size,
@RequestParam(value = "sortBy",required = false) String sortBy) throws NotFoundException {
LOGGER.debug("Finding a semester entry with id: {}", campusId);
sortBy = sortBy==null?"id": sortBy;
Pageable pageable = new PageRequest(page,size,new Sort(sortBy));
Page<Semester> pageResult = service.findByCampus(campusId, pageable);
return new PageResource<>(pageResult,"page","size");
}
//Get a Semester
@RequestMapping(value = "/semester/{id}", method = RequestMethod.GET)
@ResponseBody
public Semester findById(@PathVariable("id") Long id) throws NotFoundException {
LOGGER.debug("Finding a semester entry with id: {}", id);
Semester found = service.findOne(id);
LOGGER.debug("Found semester entry with information: {}", found);
return found;
}
//Get a Semester by time
@RequestMapping(value = "/campus/{campusId}/time/{time}/semester", method = RequestMethod.GET)
@ResponseBody
public Semester findByTime(@PathVariable("time") Long time,@RequestParam("campusId") long campusId) throws NotFoundException {
LOGGER.debug("Finding a semester entry with id: {}", time);
DateTime timeDate = new DateTime(time);
Semester found = service.findByTime(timeDate,campusId);
LOGGER.debug("Found semester entry with information: {}", found);
return found;
}
}