GooglePositionRestController.java

package sk.iway.iwcm.components.seo.rest;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import sk.iway.iwcm.Tools;
import sk.iway.iwcm.components.seo.jpa.GooglePositionEntity;
import sk.iway.iwcm.components.seo.jpa.GooglePositionRepository;
import sk.iway.iwcm.components.seo.jpa.ManagementKeywordsEntity;
import sk.iway.iwcm.components.seo.jpa.ManagementKeywordsRepository;
import sk.iway.iwcm.database.SimpleQuery;
import sk.iway.iwcm.stat.rest.StatService;
import sk.iway.iwcm.system.datatable.Datatable;
import sk.iway.iwcm.system.datatable.DatatablePageImpl;
import sk.iway.iwcm.system.datatable.DatatableRestControllerV2;

@RestController
@RequestMapping("/admin/rest/seo/google-position")
@PreAuthorize("@WebjetSecurityService.hasPermission('cmp_seo')")
@Datatable
public class GooglePositionRestController extends DatatableRestControllerV2<GooglePositionEntity, Long> {

    private final GooglePositionRepository googlePositionRepository;
    private final ManagementKeywordsRepository managementKeywordsRepository;

    @Autowired
    public GooglePositionRestController(GooglePositionRepository googlePositionRepository, ManagementKeywordsRepository managementKeywordsRepository) {
        super(googlePositionRepository);
        this.googlePositionRepository = googlePositionRepository;
        this.managementKeywordsRepository = managementKeywordsRepository;
    }

    @Override
    public void beforeSave(GooglePositionEntity entity) {
        throwError("datatables.error.recordIsNotEditable");
    }

    @Override
    public Page<GooglePositionEntity> getAllItems(Pageable pageable) {
        int keywordId = Tools.getIntValue(getRequest().getParameter("keywordId"), -1);
        if(keywordId == -1) return new DatatablePageImpl<>( new ArrayList<>() );

        Date[] dateRangeArr = StatService.processDateRangeString(getRequest().getParameter("searchDayDate"));
        Page<GooglePositionEntity> items = googlePositionRepository.findAllByKeywordIdAndDayDateBetween(keywordId, dateRangeArr[0], dateRangeArr[1], pageable);
        return new DatatablePageImpl<>( items );
    }

    @Override
    public Page<GooglePositionEntity> searchItem(Map<String, String> params, Pageable pageable, GooglePositionEntity search) {
        int keywordId = Tools.getIntValue(getRequest().getParameter("keywordId"), -1);
        if(keywordId == -1) return new DatatablePageImpl<>( new ArrayList<>() );

        Date[] dateRangeArr = StatService.processDateRangeString(getRequest().getParameter("searchDayDate"));
        Page<GooglePositionEntity> items = googlePositionRepository.findAllByKeywordIdAndDayDateBetween(keywordId, dateRangeArr[0], dateRangeArr[1], pageable);
        return new DatatablePageImpl<>( items );
    }

    @RequestMapping(
        value="/lineChartData", params={"keywordId", "dayDate"})
    @ResponseBody
    public Map<String, List<GooglePositionEntity>> getLineChartData(
                            @RequestParam("keywordId") Integer keywordId,
                            @RequestParam("dayDate") String stringRange) {
        keywordId = Tools.getIntValue(keywordId, -1);
        if(keywordId == -1) return new HashMap<>();

        Date[] dateRangeArr = StatService.processDateRangeString(stringRange);
        Map<String, List<GooglePositionEntity>> dataMap = new HashMap<>();

        //Series name is combination of name + domain
        String seriesName = "";
        ManagementKeywordsEntity seoKeyword = managementKeywordsRepository.getById(Long.valueOf(keywordId));
        if (seoKeyword != null) {
            seriesName += seoKeyword.getName();
            seriesName += " ( " + seoKeyword.getDomain() + " )";
        }

        dataMap.put(seriesName, googlePositionRepository.findAllByKeywordIdAndDayDateBetween(keywordId, dateRangeArr[0], dateRangeArr[1], PageRequest.of(0, 100)).getContent() );
        return dataMap;
    }

    @RequestMapping(value="/keywordTitle", params={"keywordId"}, produces = "text/plain;charset=UTF-8")
    public String getKeywordTitle(@RequestParam("keywordId") Integer keywordId) {
        if(keywordId < 0) return "";
        return (new SimpleQuery()).forString("SELECT name FROM seo_keywords WHERE seo_keyword_id=?", keywordId);
    }
}