Subversion Repositories SmartDukaan

Rev

Rev 35434 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.spice.profitmandi.web.controller;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.spice.profitmandi.dao.entity.Page;
import com.spice.profitmandi.dao.entity.dtr.WebListing;
import com.spice.profitmandi.dao.repository.dtr.WebListingRepository;
import com.spice.profitmandi.service.page.PageRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.stream.Collectors;

@Controller
@RequestMapping("/pages")
@Transactional(rollbackFor = Throwable.class)
public class PageController {
    private static final Logger logger = LogManager.getLogger(PageController.class);

    @Autowired
    private PageRepository pageRepository;

    @Autowired
    private WebListingRepository webListingRepository;

    private final ObjectMapper objectMapper = new ObjectMapper();

    @GetMapping
    public ResponseEntity<?> index(HttpServletRequest request) {
        List<Page> pages = pageRepository.selectAll();
        List<Map<String, Object>> parsedPages = pages.stream().map(p -> {
            try {
                Map<String, Object> data = objectMapper.readValue(
                    p.getSectionData(),
                    new TypeReference<Map<String, Object>>() {}
                );

                data.put("tabTitle", p.getTabTitle());

                Map<String, Object> pageMap = new HashMap<>();
                pageMap.put("id", p.getId());
                pageMap.put("title", p.getTitle());
                pageMap.put("slug", p.getSlug());
                pageMap.put("visibleOn", p.getVisibleOn());
                pageMap.put("sectionGroup", p.getSectionGroup());
                pageMap.put("sectionBelow", p.getSectionBelow());
                pageMap.put("status", p.isStatus());
                pageMap.put("sectionOrder", p.getSectionOrder());
                pageMap.put("sectionData", data);
                return pageMap;
            } catch (Exception e) {
                throw new RuntimeException("Failed to parse sectionData", e);
            }
        }).collect(Collectors.toList());

        List<Map<String, Object>> merged = parsedPages.stream()
        .filter(p -> "Parent".equals(p.get("sectionGroup"))) // only parents
        .map(parent -> {

            List<Map<String, Object>> children = parsedPages.stream()
                    .filter(c -> String.valueOf(parent.get("id")).equals(c.get("sectionGroup")))
                    .collect(Collectors.toList());

            List<Object> sectionDataList = new ArrayList<>();
            sectionDataList.add(parent.get("sectionData"));
            children.forEach(c -> sectionDataList.add(c.get("sectionData")));

            if (parent.get("sectionBelow") == null && !children.isEmpty()) {
                Object firstChildBelow = children.get(0).get("sectionBelow");
                if (firstChildBelow != null) {
                    parent.put("sectionBelow", firstChildBelow);
                }
            }

            try {
                parent.put("sectionData", objectMapper.writeValueAsString(sectionDataList));
            } catch (Exception e) {
                throw new RuntimeException("Failed to serialize sectionData list", e);
            }

            return parent;
        })
        .sorted(Comparator.comparingInt(p -> (int) p.get("sectionOrder")))
        .collect(Collectors.toList());

        return ResponseEntity.ok(merged);
    }

    @GetMapping("/{page}")
    public ResponseEntity<?> getPage(HttpServletRequest request, @PathVariable String page) {
        Page pageDetail = pageRepository.selectPageBySlug(page);
        return ResponseEntity.ok(pageDetail);
    }

    @GetMapping("/web-listing/{id}")
    public ResponseEntity<?> webListing(HttpServletRequest request, @PathVariable int id) {
        WebListing web = webListingRepository.selectById(id);
        return ResponseEntity.ok(web);
    }
}