package com.syzton.sunread.controller.book; import javax.validation.Valid; 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.Pageable; 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.controller.BaseController; import com.syzton.sunread.dto.book.BookDTO; import com.syzton.sunread.dto.book.BookExtraDTO; import com.syzton.sunread.dto.common.PageResource; import com.syzton.sunread.model.book.Book; import com.syzton.sunread.service.book.BookService; import com.syzton.sunread.service.book.RecommendationService; /** * @author Jerry Zhang * @date 2015-03-05 */ @Controller @RequestMapping(value = "/api") public class BookController extends BaseController { private static final Logger LOGGER = LoggerFactory.getLogger(BookController.class); private BookService bookService; private RecommendationService recommendationService; @Autowired public BookController(BookService bookService, RecommendationService qualityService) { this.bookService = bookService; this.recommendationService = qualityService; } @RequestMapping(value = "/books", method = RequestMethod.POST) @ResponseBody public BookDTO add(@Valid @RequestBody BookDTO bookDTO) { LOGGER.debug("Adding a new book entry with information: {}", bookDTO); BookDTO added = bookService.add(bookDTO); LOGGER.debug("Added a book entry with information: {}", added); return added; } @RequestMapping(value = "/books/{bookId}", method = RequestMethod.PUT) @ResponseBody public BookDTO update(@Valid @RequestBody BookDTO bookDTO,@PathVariable("bookId") long bookId) { LOGGER.debug("Adding a new book entry with information: {}", bookDTO); BookDTO updated = bookService.update(bookDTO,bookId); LOGGER.debug("Added a book entry with information: {}", updated); return updated; }// @RequestMapping(value = "/books", method = RequestMethod.GET) // @ResponseBody // public PageResource<Book> findByCategories(@RequestParam(value = "categories", required = false) String categories, // @RequestParam("page") int page, // @RequestParam("size") int size, // @RequestParam(value = "sortBy", required = false) String sortBy) { // LOGGER.debug("Finding to-do entry with id: {}"); // // Pageable pageable = getPageable(page, size, sortBy); // Page<Book> pageResult; // if (categories != null) { // String[] cIds = categories.split(","); // Set<Long> categoryIds = new HashSet<>(); // for (String id : cIds) { // categoryIds.add(Long.parseLong(id)); // } // pageResult = bookService.findByCategories(categoryIds, pageable); // } else { // pageResult = bookService.findAll(pageable); // // } // // return new PageResource<>(pageResult, "page", "size"); // } @RequestMapping(value = "/books/search", method = RequestMethod.GET) @ResponseBody public PageResource<Book> quickSearch(@RequestParam("searchTerm") String searchTerm, @RequestParam("page") int page, @RequestParam("size") int size, @RequestParam(value = "sortBy", required = false) String sortBy) { Pageable pageable = getPageable(page, size, sortBy); Page<Book> bookPage = bookService.quickSearch(searchTerm, pageable); return new PageResource<>(bookPage, "page", "size"); } @RequestMapping(value = "/books/conditions", method = RequestMethod.GET) @ResponseBody public PageResource<Book> searchByConditions( @RequestParam(value = "level", required = false) String level, @RequestParam(value = "testType", required = false) String testType, @RequestParam(value = "literature", required = false) String literature, @RequestParam(value = "language", required = false) String language, @RequestParam(value = "grade", required = false) String grade, @RequestParam(value = "category", required = false) String category, @RequestParam(value = "resource", required = false) String resource, @RequestParam(value = "ageRange", required = false) String ageRange, @RequestParam(value = "pointRange", required = false) String pointRange, @RequestParam(value = "searchTerm", required = false) String searchTerm, @RequestParam("page") int page, @RequestParam("size") int size, @RequestParam(value = "sortBy", required = false) String sortBy, @RequestParam(value = "direction", required = false) String direction) { LOGGER.debug("###################################:"+searchTerm); int levelNum = level == null ? 0 : Integer.parseInt(level); int testTypeNum = testType == null ? 0 : Integer.parseInt(testType); int literatureNum = literature == null ? 0 : Integer.parseInt(literature); int languageNum = language == null ? 0 : Integer.parseInt(language); int gradeNum = grade == null ? 0 : Integer.parseInt(grade); int categoryNum = category == null ? 0 : Integer.parseInt(category); int resourceNum = resource == null ? 0 : Integer.parseInt(resource); int ageRangeNum = ageRange == null ? 0 : Integer.parseInt(ageRange); int pointRangeNum = pointRange == null ? 0 : Integer.parseInt(pointRange); Pageable pageable = getPageable(page, size, sortBy, direction); BookExtraDTO condition = new BookExtraDTO(); condition.setAgeRange(ageRangeNum); condition.setLevel(levelNum); condition.setLiterature(literatureNum); condition.setLanguage(languageNum); condition.setCategory(categoryNum); condition.setGrade(gradeNum); condition.setTestType(testTypeNum); condition.setResource(resourceNum); condition.setPointRange(pointRangeNum); condition.setSearchTerm(searchTerm); Page<Book> bookPage = bookService.searchByCondition(condition, pageable); return new PageResource<>(bookPage, "page", "size"); } @RequestMapping(value = "/books/conditions/weeklyhot", method = RequestMethod.GET) @ResponseBody public PageResource<Book> orderByWeeklyHot( @RequestParam(value = "level", required = false) String level, @RequestParam(value = "testType", required = false) String testType, @RequestParam(value = "literature", required = false) String literature, @RequestParam(value = "language", required = false) String language, @RequestParam(value = "grade", required = false) String grade, @RequestParam(value = "category", required = false) String category, @RequestParam(value = "resource", required = false) String resource, @RequestParam(value = "ageRange", required = false) String ageRange, @RequestParam(value = "pointRange", required = false) String pointRange, @RequestParam(value = "searchTerm", required = false) String searchTerm, @RequestParam("page") int page, @RequestParam("size") int size) { return this.searchByConditions(level, testType, literature, language, grade, category, resource, ageRange, pointRange,searchTerm, page, size, "statistic.weeklyHot", "desc"); } @RequestMapping(value = "/books/conditions/monthlyhot", method = RequestMethod.GET) @ResponseBody public PageResource<Book> orderByMonthlyHot( @RequestParam(value = "level", required = false) String level, @RequestParam(value = "testType", required = false) String testType, @RequestParam(value = "literature", required = false) String literature, @RequestParam(value = "language", required = false) String language, @RequestParam(value = "grade", required = false) String grade, @RequestParam(value = "category", required = false) String category, @RequestParam(value = "resource", required = false) String resource, @RequestParam(value = "ageRange", required = false) String ageRange, @RequestParam(value = "pointRange", required = false) String pointRange, @RequestParam(value = "searchTerm", required = false) String searchTerm, @RequestParam("page") int page, @RequestParam("size") int size) { return this.searchByConditions(level, testType, literature, language, grade, category, resource, ageRange, pointRange,searchTerm, page, size, "statistic.monthlyHot", "desc"); } @RequestMapping(value = "/books/conditions/yearlyhot", method = RequestMethod.GET) @ResponseBody public PageResource<Book> orderByYearlyHot( @RequestParam(value = "level", required = false) String level, @RequestParam(value = "testType", required = false) String testType, @RequestParam(value = "literature", required = false) String literature, @RequestParam(value = "language", required = false) String language, @RequestParam(value = "grade", required = false) String grade, @RequestParam(value = "category", required = false) String category, @RequestParam(value = "resource", required = false) String resource, @RequestParam(value = "ageRange", required = false) String ageRange, @RequestParam(value = "pointRange", required = false) String pointRange, @RequestParam(value = "searchTerm", required = false) String searchTerm, @RequestParam("page") int page, @RequestParam("size") int size) { return this.searchByConditions(level, testType, literature, language, grade, category, resource, ageRange, pointRange,searchTerm, page, size, "statistic.yearlyHot", "desc"); } @RequestMapping(value = "/books/conditions/weeklyRecommend", method = RequestMethod.GET) @ResponseBody public PageResource<Book> orderByWeeklyRecommend( @RequestParam(value = "level", required = false) String level, @RequestParam(value = "testType", required = false) String testType, @RequestParam(value = "literature", required = false) String literature, @RequestParam(value = "language", required = false) String language, @RequestParam(value = "grade", required = false) String grade, @RequestParam(value = "category", required = false) String category, @RequestParam(value = "resource", required = false) String resource, @RequestParam(value = "ageRange", required = false) String ageRange, @RequestParam(value = "pointRange", required = false) String pointRange, @RequestParam(value = "searchTerm", required = false) String searchTerm, @RequestParam("page") int page, @RequestParam("size") int size) { return this.searchByConditions(level, testType, literature, language, grade, category, resource, ageRange, pointRange,searchTerm, page, size, "statistic.weeklyRecommend", "desc"); } @RequestMapping(value = "/books/conditions/monthlyRecommend", method = RequestMethod.GET) @ResponseBody public PageResource<Book> orderByMonthlyRecommend( @RequestParam(value = "level", required = false) String level, @RequestParam(value = "testType", required = false) String testType, @RequestParam(value = "literature", required = false) String literature, @RequestParam(value = "language", required = false) String language, @RequestParam(value = "grade", required = false) String grade, @RequestParam(value = "category", required = false) String category, @RequestParam(value = "resource", required = false) String resource, @RequestParam(value = "ageRange", required = false) String ageRange, @RequestParam(value = "pointRange", required = false) String pointRange, @RequestParam(value = "searchTerm", required = false) String searchTerm, @RequestParam("page") int page, @RequestParam("size") int size) { return this.searchByConditions(level, testType, literature, language, grade, category, resource, ageRange, pointRange,searchTerm, page, size, "statistic.monthlyRecommend", "desc"); } @RequestMapping(value = "/books/conditions/yearlyRecommend", method = RequestMethod.GET) @ResponseBody public PageResource<Book> orderByYearlyRecommend( @RequestParam(value = "level", required = false) String level, @RequestParam(value = "testType", required = false) String testType, @RequestParam(value = "literature", required = false) String literature, @RequestParam(value = "language", required = false) String language, @RequestParam(value = "grade", required = false) String grade, @RequestParam(value = "category", required = false) String category, @RequestParam(value = "resource", required = false) String resource, @RequestParam(value = "ageRange", required = false) String ageRange, @RequestParam(value = "pointRange", required = false) String pointRange, @RequestParam(value = "searchTerm", required = false) String searchTerm, @RequestParam("page") int page, @RequestParam("size") int size) { return this.searchByConditions(level, testType, literature, language, grade, category, resource, ageRange, pointRange,searchTerm, page, size, "statistic.yearlyRecommend", "desc"); } @RequestMapping(value = "/books/{id}", method = RequestMethod.GET) @ResponseBody public Book findById(@PathVariable("id") Long id) { LOGGER.debug("Finding to-do entry with id: {}", id); Book found = bookService.findById(id); LOGGER.debug("Found to-do entry with information: {}", found); return found; } @RequestMapping(value = "/books/{id}", method = RequestMethod.DELETE) @ResponseBody public Book deleteById(@PathVariable("id") Long id) { LOGGER.debug("Deleting a to-do entry with id: {}", id); Book deleted = bookService.deleteById(id); LOGGER.debug("Deleted to-do entry with information: {}", deleted); return deleted; } @RequestMapping(value = "/books/{id}/users/{userId}/recommends", method = RequestMethod.PUT) @ResponseBody public void recommend(@PathVariable("id") Long id, @PathVariable("userId") Long userId) { recommendationService.recommend(id, userId); } @RequestMapping(value = "/books/tags", method = RequestMethod.GET) @ResponseBody public PageResource<Book> tags( @RequestParam(value = "lesson", required = false) String lesson, @RequestParam(value = "subject", required = false) String subject, @RequestParam(value = "grade", required = false) String grade, @RequestParam(value = "chapter", required = false) String chapter, @RequestParam(value = "theme", required = false) String theme, @RequestParam(value = "sortBy", required = false) String sortBy, @RequestParam(value = "direction", required = false) String direction, @RequestParam("page") int page, @RequestParam("size") int size) { long lessonId = lesson == null ? 0 : Long.parseLong(lesson); long subjectId = subject == null ? 0 : Long.parseLong(subject); long gradeId = grade == null ? 0 : Long.parseLong(grade); long chapterId = chapter == null ? 0 : Long.parseLong(chapter); long themeId = theme == null ? 0 : Long.parseLong(theme); Pageable pageable = getPageable(page, size, sortBy, direction); Page<Book> bookPage = bookService.searchByTags(lessonId, subjectId, gradeId, chapterId, themeId, pageable); return new PageResource<>(bookPage, "page", "size"); } }