AdminForumMessageController.java 8.1 KB
Newer Older
街头小贩's avatar
街头小贩 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
package com.apobates.forum.thrones.admin.controller;

import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.apobates.forum.letterbox.entity.ForumLetterTypeEnum;
import com.apobates.forum.letterbox.entity.proxy.ForumLetterReplica;
import com.apobates.forum.letterbox.service.ForumLetterService;
import com.apobates.forum.letterbox.service.InboxService;
import com.apobates.forum.letterbox.service.OutboxService;
import com.apobates.forum.member.entity.Member;
import com.apobates.forum.member.service.MemberService;
import com.apobates.forum.member.storage.core.MemberSessionBean;
import com.apobates.forum.thrones.admin.controller.form.ForumMessageFullForm;
import com.apobates.forum.thrones.admin.exception.ResourceNotFoundException;
import com.apobates.forum.utils.Commons;
import com.apobates.forum.utils.FrontPageURL;
import com.apobates.forum.utils.TipMessage;
import com.apobates.forum.utils.lang.EnumArchitecture;
import com.apobates.forum.utils.persistence.Page;
import com.apobates.forum.utils.persistence.PageRequest;
import com.apobates.forum.utils.persistence.Pageable;

/**
 * 消息控制器
 *
 * @author xiaofanku
 * @since 20190719
 */
@Controller
@RequestMapping(value = "/message")
public class AdminForumMessageController {
    @Autowired
    private InboxService inboxService;
    @Autowired
    private OutboxService outboxService;
    @Autowired
    private ForumLetterService forumLetterService;
    @Autowired
    private MemberService memberService;
    @Value("${site.pageSize}")
    private int pageSize;
    
    //当前管理员收到的消息
    @GetMapping(path = "/")
    public String listInboxPage(
            @RequestParam(value = "p", required = false, defaultValue = "1") int page,
            MemberSessionBean mbean,
            HttpServletRequest request,
            Model model) {
        FrontPageURL fpbuild = new FrontPageURL(request.getContextPath() + "/message/").addPageSize("number", pageSize);
        Pageable pr = new PageRequest(page, fpbuild.getPageSize());
        Page<ForumLetterReplica> rs = inboxService.getInBox(mbean.getMid(), pr);
        model.addAttribute("rs", rs.getResult().collect(Collectors.toList()));
        model.addAttribute("pageData", fpbuild.toPageData(pr, rs.getTotalElements()));
        return "admin/message/index";
    }
    
    //当前管理员发送的消息
    @GetMapping(path = "/sent")
    public String listSentPage(
            @RequestParam(value = "p", required = false, defaultValue = "1") int page,
            MemberSessionBean mbean,
            HttpServletRequest request,
            Model model) {
        FrontPageURL fpbuild = new FrontPageURL(request.getContextPath() + "/message/sent").addPageSize("number", pageSize);
        Pageable pr = new PageRequest(page, fpbuild.getPageSize());
        Page<ForumLetterReplica> rs = outboxService.getSent(mbean.getMid(), pr);
        model.addAttribute("rs", rs.getResult().collect(Collectors.toList()));
        model.addAttribute("pageData", fpbuild.toPageData(pr, rs.getTotalElements()));
        return "admin/message/sent";
    }
    
    //查看
    @GetMapping(path = "/view")
    public String showMessageDetails(
            @RequestParam("id") long id,
            MemberSessionBean mbean,
            HttpServletRequest request,
            Model model) {
        ForumLetterReplica data = forumLetterService.getOneLazyReceiver(id).orElseThrow(()->new ResourceNotFoundException("查看的消息不存在或暂时无法访问"));
        model.addAttribute("letter", data);
        //
        boolean isInbox = false;
        long senderMember = 0;
        String receiver = "";
        String sender = "";
        //
        if (data.getAuthor() == mbean.getMid()) { //我发送的消息
            receiver = data.getTargetReceiverNicknames();
            sender = "我";
        } else {
            sender = data.getNickname();
            receiver = "我";
            isInbox = true;
            senderMember = data.getAuthor();
        }
        model.addAttribute("senderMember", senderMember);
        model.addAttribute("isInbox", isInbox);
        //
        model.addAttribute("receiver", receiver);
        model.addAttribute("sender", sender);
        return "admin/message/view";
    }
    
    //新消息
    @GetMapping(path = "/create")
    public String createMessageForm(
            @RequestParam(value = "receiver", required = false, defaultValue = "0") long receiver,
            @RequestParam(value = "names", required = false, defaultValue = "") String receiverNames,
            @RequestParam(value = "label", required = false, defaultValue = "-1") int label,
            HttpServletRequest request,
            Model model) {
        ForumMessageFullForm form = new ForumMessageFullForm();
        if (receiver > 0) {
            form.setUid("u" + receiver);
            form.setSnames(receiverNames);
            form.setLabel(label + "");
        }
        //
        form.setToken(Commons.randomAlphaNumeric(8));
        model.addAttribute("form", form);
        return "admin/message/create";
    }
    
    @PostMapping(path = "/create")
    public String createMessageAction(
            @ModelAttribute("form") ForumMessageFullForm form,
            MemberSessionBean mbean,
            HttpServletRequest request,
            Model model) {
        String receiverNickname = "*";
        long receiver = 0L;
        //
        Member m = memberService.get(form.getMemberId()).orElse(null);
        if (null != m) {
            receiverNickname = m.getNickname();
            receiver = m.getId();
        }
        Long messageId = forumLetterService.create(form.getEnumLabel(), form.getTitle(), form.getContent(), receiver, receiverNickname, mbean.getMid(), mbean.getNickname()).orElse(0L);
        if (messageId > 0) {
            return "redirect:/message/sent";
        }
        model.addAttribute("errors", "发送消息操作失败");
        //
        form.setToken(Commons.randomAlphaNumeric(8));
        model.addAttribute("form", form);
        return "admin/message/create";
    }
    
    //删除消息(发件人不可以操作)
    @PostMapping(path = "/delete", produces = "application/json;charset=UTF-8")
    @ResponseBody
    public TipMessage removeMessageAction(
            @RequestParam("id") long id,
            MemberSessionBean mbean,
            HttpServletRequest request,
            Model model) {
        int affect = inboxService.remove(mbean.getMid(), Arrays.asList(id)).orElse(-1);
        if (affect == 1) {
            return TipMessage.ofSuccess("消息删除成功");
        }
        return TipMessage.ofError("操作失败");
    }
    
    //阅读消息(发件人不可以操作)
    @PostMapping(path = "/read", produces = "application/json;charset=UTF-8")
    @ResponseBody
    public TipMessage readMessageAction(
            @RequestParam("id") long id,
            MemberSessionBean mbean,
            HttpServletRequest request,
            Model model) {
        int affect = inboxService.readed(mbean.getMid(), Arrays.asList(id)).orElse(-1);
        if (affect == 1) {
            return TipMessage.ofSuccess("消息标记成功");
        }
        return TipMessage.ofError("操作失败");
    }
    
    @GetMapping(path = "/label/json", produces = "application/json;charset=UTF-8")
    @ResponseBody
    public Map<Integer, String> getAllRoles(HttpServletRequest request, Model model) {
        //滤掉0
        return EnumArchitecture.getInstance(ForumLetterTypeEnum.class).entrySet().stream().filter(x -> x.getKey() > 0).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    }
}