aboutsummaryrefslogblamecommitdiff
path: root/juick-www/src/main/java/com/juick/www/controllers/Home.java
blob: 763d829ece3aa59a794ee608928031b244d3c920 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  
                                 












                                                                           
                                  
                                                   
                                         
                                    
                                     
                                       
                            
                                             
                                            
                                                 
                                                 
                                                 






                                                                           
 
                           
                           
                           
                      
                                   



                       
           
                   
           
                                    
           
                                            
           
                                  
           
                      
 
                                 
                                                                 









                                                                                                                     
                                                                                



                                                                      
                                                           
             
                                              

                                                                  
                                                                        
                
                                              
         
 
                    





                                                                                                                     
                          
                                                                                 
         
                                                            
 


                                                               
                     
                           
 
                                  
                                                                                
                                                                                           
                                       
                                       
                                               
                                                                                 
                    
                                                                                        
                                                                  
             
 
                                             
                                
                                                               
                                        
                                                                                  
                                                                    
                                         
                                                                             
                                                                    
                                           
                                                                                 
                                                                        
                                               
                                                                                 
                                                
                                           
                                  
                                                                                
                    
                                                                 
             
                                             
                                                
                                  
                                                                             
                    
                                                              
             
                
                                              
         





                                                                 
                                                                                






                                                                                               






                                                                                                       
             
                                                                                                
             
                                                     

                                                                                            
                                                      

                                                                              
         
                                                                    
                             
     
/*
 * Copyright (C) 2008-2017, Juick
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.juick.www.controllers;

import com.juick.server.util.HttpNotFoundException;
import com.juick.service.MessagesService;
import com.juick.service.TagService;
import com.juick.service.UserService;
import com.juick.server.util.UserUtils;
import com.juick.server.util.WebUtils;
import com.juick.www.Utils;
import com.juick.www.WebApp;
import org.apache.commons.codec.CharEncoding;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.text.StringEscapeUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import org.springframework.web.util.UriComponents;
import ru.sape.Sape;

import javax.inject.Inject;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.stream.Collectors;

/**
 *
 * @author Ugnich Anton
 */
@Controller
public class Home {
    @Inject
    private UserService userService;
    @Inject
    private MessagesService messagesService;
    @Inject
    private TagService tagService;
    @Inject
    private Sape sape;

    @GetMapping("/{anything}/**")
    protected String parseAnyThing(@PathVariable String anything,
                                 @RequestParam(required = false, defaultValue = "0") int before) throws IOException {
        if (before == 0) {
            boolean isPostNumber = WebUtils.isPostNumber(anything);
            int messageId = isPostNumber ?
                    NumberUtils.toInt(anything) : 0;

            if (isPostNumber && anything.equals(Integer.toString(messageId))) {
                if (messageId > 0) {
                    com.juick.User author = messagesService.getMessageAuthor(messageId);

                    if (author != null) {
                        return "redirect:/" + author.getName() + "/" + anything;
                    }
                }
            }
            com.juick.User user = userService.getUserByName(anything);
            if (user.getUid() > 0) {
                return "redirect:/" + user.getName() + "/";
            }
            throw new HttpNotFoundException();
        }
        com.juick.User user = userService.getUserByName(anything);
        if (user.getUid() > 0) {
            return "redirect:/" + user.getName() + "/?before=" + before;
        } else {
            throw new HttpNotFoundException();
        }
    }

    @GetMapping("/")
    protected String doGet(
            @RequestParam(required = false) String tag,
            @RequestParam(name = "show", required = false) String paramShow,
            @RequestParam(name = "search", required = false) String paramSearch,
            @RequestParam(name = "before", required = false, defaultValue = "0") Integer paramBefore,
            @CookieValue(name = "sape_cookie", required = false, defaultValue = StringUtils.EMPTY) String sapeCookie,
            ModelMap model) throws IOException {
        if (tag != null) {
            return "redirect:/tag/" + URLEncoder.encode(tag, CharEncoding.UTF_8);
        }
        com.juick.User visitor = UserUtils.getCurrentUser();

        if (paramSearch != null && paramSearch.length() > 64) {
            paramSearch = null;
        }

        String title;
        List<Integer> mids;

        if (paramSearch != null) {
            title = "Поиск: " + StringEscapeUtils.escapeHtml4(paramSearch);
            mids = messagesService.getSearch(Utils.encodeSphinx(paramSearch), paramBefore);
        } else if (paramShow == null) {
            if (visitor.getUid() > 0) {
                title = "Популярные";
                mids = messagesService.getPopular(visitor.getUid(), paramBefore);
            } else {
                title = "Микроблоги Juick: популярные записи";
                mids = messagesService.getPopular(0, paramBefore);
            }

        } else if (paramShow.equals("top")) {
            return "redirect:/";
        } else if (paramShow.equals("my") && visitor != null) {
            title = "Моя лента";
            mids = messagesService.getMyFeed(visitor.getUid(), paramBefore, true);
        } else if (paramShow.equals("private") && visitor != null) {
            title = "Приватные";
            mids = messagesService.getPrivate(visitor.getUid(), paramBefore);
        } else if (paramShow.equals("discuss") && visitor != null) {
            title = "Обсуждения";
            mids = messagesService.getDiscussions(visitor.getUid(), paramBefore);
        } else if (paramShow.equals("recommended") && visitor != null) {
            title = "Рекомендации";
            mids = messagesService.getRecommended(visitor.getUid(), paramBefore);
        } else if (paramShow.equals("photos")) {
            title = "Фотографии";
            if (visitor != null) {
                mids = messagesService.getPhotos(visitor.getUid(), paramBefore);
            } else {
                mids = messagesService.getPhotos(0, paramBefore);
            }
        } else if (paramShow.equals("all")) {
            title = "Все сообщения";
            if (visitor != null) {
                mids = messagesService.getAll(visitor.getUid(), paramBefore);
            } else {
                mids = messagesService.getAll(0, paramBefore);
            }
        } else {
            throw new HttpNotFoundException();
        }

        String head = StringUtils.EMPTY;
        if (paramBefore > 0 || paramShow != null) {
            head = "<meta name=\"robots\" content=\"noindex\"/>";
        }
        model.addAttribute("title", title);
        model.addAttribute("headers", head);
        model.addAttribute("visitor", visitor);
        model.addAttribute("noindex", !(paramShow == null && paramBefore == 0));
        List<com.juick.Message> msgs = messagesService.getMessages(mids);

        if (visitor.getUid() != 0) {
            List<Integer> blUIDs = userService.checkBL(visitor.getUid(),
                    msgs.stream().map(m -> m.getUser().getUid()).collect(Collectors.toList()));
            msgs.forEach(m -> m.ReadOnly |= blUIDs.contains(m.getUser().getUid()));
        }
        model.addAttribute("msgs", msgs);
        model.addAttribute("tags", tagService.getPopularTags());
        model.addAttribute("headers", head);
        model.addAttribute("showAdv",
                paramShow == null && paramBefore == 0 && paramSearch == null && visitor.getUid() == 0);
        if (mids.size() >= 20) {
            String nextpage = "?before=" + mids.get(mids.size() - 1);
            if (paramShow != null) {
                nextpage += "&amp;show=" + paramShow;
            }
            if (paramSearch != null) {
                nextpage += "&amp;search=" + URLEncoder.encode(paramSearch, CharEncoding.UTF_8);
            }
            model.addAttribute("nextpage", nextpage);
        }
        UriComponents builder = ServletUriComponentsBuilder.fromCurrentRequestUri().build();
        String queryString = builder.getQuery();
        String requestURI = builder.toUri().getPath();
        if (sape != null && visitor.getUid() == 0 && queryString == null) {
            String links = sape.getPageLinks(requestURI, sapeCookie).render();
            model.addAttribute("links", links);
        }
        model.addAttribute("isModerator", visitor.getUid() == 3694);
        return "views/index";
    }
}