/*
* Copyright 2016 Studentmediene i Trondheim AS
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package no.dusken.momus.controller;
import no.dusken.momus.model.ArticleStatus;
import no.dusken.momus.model.LayoutStatus;
import no.dusken.momus.model.Page;
import no.dusken.momus.model.Publication;
import no.dusken.momus.service.PublicationService;
import no.dusken.momus.service.repository.LayoutStatusRepository;
import no.dusken.momus.service.repository.PageRepository;
import no.dusken.momus.service.repository.PublicationRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
@Service
@RequestMapping("/publication")
public class PublicationController {
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private PublicationService publicationService;
@Autowired
private PublicationRepository publicationRepository;
@Autowired
private PageRepository pageRepository;
@Autowired
private LayoutStatusRepository layoutStatusRepository;
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody List<Publication> getAllPublications(){
return publicationRepository.findAll(new Sort(new Sort.Order(Sort.Direction.DESC, "releaseDate")));
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public @ResponseBody Publication getPublicationById(@PathVariable("id") Long id){
return publicationRepository.findOne(id);
}
@RequestMapping(value = "/{id}/colophon", method = RequestMethod.GET)
public @ResponseBody String getColophon(@PathVariable("id") Long id, HttpServletResponse response){
response.addHeader("Content-Disposition", "attachment; filename=\"Kolofon_" + publicationRepository.findOne(id).getName() + ".txt\"");
response.addHeader("Content-Type", "text/plain;charset=UTF-16LE");
return publicationService.generateColophon(id);
}
@RequestMapping(value = "/active", method = RequestMethod.GET)
public @ResponseBody Publication getActivePublication(){
return publicationService.getActivePublication(new Date());
}
@RequestMapping(value = "/metadata", method = RequestMethod.PUT)
public @ResponseBody Publication savePublication(@RequestBody Publication publication) {
return publicationService.savePublication(publication);
}
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody Publication addPublication(@RequestBody Publication publication) {
Publication newPublication = publicationRepository.save(publication);
newPublication = publicationRepository.findOne(newPublication.getId());
for(int i = 0; i < 64; i++){
Page newPage = new Page();
newPage.setPageNr(i + 1);
newPage.setPublication(newPublication);
newPage.setLayoutStatus(layoutStatusRepository.findByName("Ukjent"));
pageRepository.save(newPage);
}
logger.info("Created new publication with data: {}", newPublication);
return newPublication;
}
@RequestMapping(value = "/pages/{id}", method = RequestMethod.GET)
public @ResponseBody List<Page> getPagesByPublication(@PathVariable("id") Long id) {
return pageRepository.findByPublicationIdOrderByPageNrAsc(id);
}
@RequestMapping(value = "pages/", method = RequestMethod.POST)
public @ResponseBody Page createPage(@RequestBody Page page){
return pageRepository.saveAndFlush(page);
}
@RequestMapping(value = "pages/delete/{id}", method = RequestMethod.DELETE)
public @ResponseBody void deletePage(@PathVariable("id") Long id){
pageRepository.delete(pageRepository.findOne(id));
}
@RequestMapping(value = "pages/generate/{id}", method = RequestMethod.GET)
public @ResponseBody List<Page> generateDisp(@PathVariable("id") Long id){
return publicationService.generateDisp(publicationRepository.findOne(id));
}
@RequestMapping(value = "/layoutstatus", method = RequestMethod.GET)
public @ResponseBody List<LayoutStatus> getLayoutStatuses(){
return layoutStatusRepository.findAll();
}
@RequestMapping(value = "/statuscount/{pubId}/{statId}", method = RequestMethod.GET)
public @ResponseBody int getStatusCount(@PathVariable("statId") Long as, @PathVariable("pubId") Long pi){
return pageRepository.countByLayoutStatusIdAndPublicationId(as, pi);
}
@RequestMapping(value = "/statuscount/{pubId}", method = RequestMethod.GET)
public @ResponseBody Map<Long,Integer> getStatusCountsByPubId(@PathVariable("pubId") Long pi){
List<LayoutStatus> statuses = this.getLayoutStatuses();
Map<Long, Integer> map = new HashMap<>();
for (LayoutStatus status : statuses) {
map.put(status.getId(), this.getStatusCount(status.getId(), pi));
}
return map;
}
}