diff --git a/src/main/java/com/imyeyu/api/modules/common/controller/NotifyController.java b/src/main/java/com/imyeyu/api/modules/common/controller/NotifyController.java index c40a072..720f4cb 100644 --- a/src/main/java/com/imyeyu/api/modules/common/controller/NotifyController.java +++ b/src/main/java/com/imyeyu/api/modules/common/controller/NotifyController.java @@ -1,15 +1,20 @@ package com.imyeyu.api.modules.common.controller; +import com.fasterxml.jackson.annotation.JsonView; import com.imyeyu.api.annotation.RequireCorePermission; import com.imyeyu.api.bean.CorePermissionCode; import com.imyeyu.api.modules.common.entity.Notify; import com.imyeyu.api.modules.common.entity.NotifyDetail; import com.imyeyu.api.modules.common.service.NotifyDetailService; import com.imyeyu.api.modules.common.service.NotifyService; +import com.imyeyu.api.modules.user.entity.User; import com.imyeyu.api.modules.user.service.UserLoginService; +import com.imyeyu.api.modules.user.service.UserService; +import com.imyeyu.java.TimiJava; import com.imyeyu.spring.annotation.RequiredToken; import com.imyeyu.spring.bean.Page; import com.imyeyu.spring.bean.PageResult; +import com.imyeyu.spring.util.ResponseView; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -17,6 +22,12 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + /// 通知接口 /// /// @author 夜雨 @@ -26,11 +37,10 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/notify") public class NotifyController { + private final UserService userService; private final NotifyService service; - - private final NotifyDetailService detailService; - private final UserLoginService userLoginService; + private final NotifyDetailService detailService; /// 创建通知,同时创建通知详情 /// @@ -48,13 +58,28 @@ public class NotifyController { /// /// @param id 通知 ID /// @return 通知及通知详情 + @JsonView(ResponseView.Public.class) @RequireCorePermission(CorePermissionCode.NOTIFY_READ) @RequiredToken - @PostMapping("/detail") + @RequestMapping("/detail") public Notify detail(@RequestParam String id) { Notify notify = service.get(id); - if (notify != null) { - notify.setDetailList(detailService.listByNotifyId(id)); + { + List detailList = detailService.listByNotifyId(id); + Set userIdSet = detailList.stream() + .filter(item -> item.getMsgType() == NotifyDetail.MsgType.INTERNAL) + .flatMap(item -> Stream.of(item.getSendFrom(), item.getSendTo())) + .collect(Collectors.toSet()); + Map userMap = userService.mapByIdList(userIdSet); + for (NotifyDetail detail : detailList) { + if (TimiJava.isNotEmpty(detail.getSendFrom())) { + detail.setFromUser(userMap.get(detail.getSendFrom())); + } + if (TimiJava.isNotEmpty(detail.getSendTo())) { + detail.setToUser(userMap.get(detail.getSendTo())); + } + } + notify.setDetailList(detailList); } return notify; } @@ -94,6 +119,31 @@ public class NotifyController { return detailService.pageInternalByUserId(page, userLoginService.getRequireLoginUserId(), unreadOnly); } + @JsonView(ResponseView.Public.class) + @RequireCorePermission(CorePermissionCode.NOTIFY_READ) + @RequiredToken + @PostMapping("/internal/detail") + public NotifyDetail internalDetail(@RequestParam String id) { + NotifyDetail detail = detailService.getInternalByUserId(id, userLoginService.getRequireLoginUserId()); + if (TimiJava.isNotEmpty(detail.getSendFrom())) { + detail.setFromUser(userService.get(detail.getSendFrom())); + } + if (TimiJava.isNotEmpty(detail.getSendTo())) { + detail.setToUser(userService.get(detail.getSendTo())); + } + return detail; + } + + /// 删除当前用户的一条站内通知 + /// + /// @param id 通知详情 ID + @RequireCorePermission(CorePermissionCode.NOTIFY_READ) + @RequiredToken + @PostMapping("/internal/delete") + public void deleteInternal(@RequestParam String id) { + detailService.deleteInternalByUserId(id, userLoginService.getRequireLoginUserId()); + } + /// 查询当前用户未读通知数量 /// /// @return 未读通知数量 diff --git a/src/main/java/com/imyeyu/api/modules/common/entity/Article.java b/src/main/java/com/imyeyu/api/modules/common/entity/Article.java index 52b9973..f7b4aec 100644 --- a/src/main/java/com/imyeyu/api/modules/common/entity/Article.java +++ b/src/main/java/com/imyeyu/api/modules/common/entity/Article.java @@ -52,6 +52,19 @@ public class Article extends UUIDEntity implements SettingSupport { TIP_TAP } + /// 文章状态 + public enum Status { + + /// 草稿 + DART, + + /// 正常 + NORMAL, + + /// 隐藏 + HIDDEN + } + /** 业务类型 */ protected BizType bizType; @@ -61,8 +74,8 @@ public class Article extends UUIDEntity implements SettingSupport { /** 标题 */ protected String title; - /** 摘要 */ - protected String digest; + /** 描述 */ + protected String description; /** 正文类型 */ protected ContentType contentType; @@ -77,6 +90,9 @@ public class Article extends UUIDEntity implements SettingSupport { /** 喜欢数量 */ protected Integer likes; + /** 文章状态 */ + protected Status status; + @Transient protected List settingList; diff --git a/src/main/java/com/imyeyu/api/modules/common/entity/NotifyDetail.java b/src/main/java/com/imyeyu/api/modules/common/entity/NotifyDetail.java index c941160..96482d5 100644 --- a/src/main/java/com/imyeyu/api/modules/common/entity/NotifyDetail.java +++ b/src/main/java/com/imyeyu/api/modules/common/entity/NotifyDetail.java @@ -1,13 +1,16 @@ package com.imyeyu.api.modules.common.entity; +import com.fasterxml.jackson.annotation.JsonView; import com.imyeyu.api.TimiServerAPI; import com.imyeyu.api.modules.common.service.BaseQueueService; import com.imyeyu.api.modules.common.service.HTTPQueueService; import com.imyeyu.api.modules.common.service.MailQueueService; import com.imyeyu.api.modules.common.service.SmsQueueService; import com.imyeyu.api.modules.common.service.WechatQueueService; +import com.imyeyu.api.modules.user.entity.User; import com.imyeyu.spring.annotation.table.Transient; import com.imyeyu.spring.entity.UUIDEntity; +import com.imyeyu.spring.util.ResponseView; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -79,47 +82,67 @@ public class NotifyDetail extends UUIDEntity { } /** 所属通知 ID */ + @JsonView(ResponseView.Public.class) private String notifyId; /** 消息类型 */ + @JsonView(ResponseView.Public.class) private MsgType msgType; /** 模板 ID */ + @JsonView(ResponseView.Admin.class) private String templateId; /** 标题 */ + @JsonView(ResponseView.Public.class) private String subject; /** 内容 */ + @JsonView(ResponseView.Public.class) private String data; /** 参数 */ + @JsonView(ResponseView.Public.class) private String args; /** 发送来源 */ + @JsonView(ResponseView.Public.class) private String sendFrom; /** 发送去向 */ + @JsonView(ResponseView.Public.class) private String sendTo; /** 发送时间 */ + @JsonView(ResponseView.Public.class) private Long sendAt; /** 重试计数 */ + @JsonView(ResponseView.Admin.class) private Integer retry; /** 超时时间 */ + @JsonView(ResponseView.Admin.class) private Long timeoutAt; /** 结果描述 */ + @JsonView(ResponseView.Admin.class) private String resultDesc; /** 状态 */ + @JsonView(ResponseView.Public.class) private Status status; /** 已读时间,站内通知未读时为空 */ + @JsonView(ResponseView.Public.class) private Long readAt; @Transient protected Notify notify; + + @Transient + protected User fromUser; + + @Transient + protected User toUser; } diff --git a/src/main/java/com/imyeyu/api/modules/common/mapper/NotifyDetailMapper.java b/src/main/java/com/imyeyu/api/modules/common/mapper/NotifyDetailMapper.java index 8d45c0a..d17daf5 100644 --- a/src/main/java/com/imyeyu/api/modules/common/mapper/NotifyDetailMapper.java +++ b/src/main/java/com/imyeyu/api/modules/common/mapper/NotifyDetailMapper.java @@ -36,6 +36,10 @@ public interface NotifyDetailMapper extends BaseMapper { @Select("SELECT * FROM `notify_detail` WHERE `id` = #{detailId} AND `msg_type` = 'INTERNAL' AND `send_to` = #{userId} " + NOT_DELETE + " LIMIT 1") NotifyDetail selectSiteByIdAndUserId(@Param("detailId") String detailId, @Param("userId") String userId); + /** 删除用户的站内通知 */ + @Update("UPDATE `notify_detail` SET `deleted_at` = " + UNIX_TIME + ", `updated_at` = " + UNIX_TIME + " WHERE `id` = #{detailId} AND `msg_type` = 'INTERNAL' AND `send_to` = #{userId} " + NOT_DELETE) + int deleteSiteByIdAndUserId(@Param("detailId") String detailId, @Param("userId") String userId); + /** 标记站内通知已读 */ @Update("UPDATE `notify_detail` SET `read_at` = #{readAt}, `updated_at` = " + UNIX_TIME + " WHERE `id` = #{detailId} AND `msg_type` = 'INTERNAL' AND `send_to` = #{userId} AND `read_at` IS NULL " + NOT_DELETE) int markSiteRead(@Param("detailId") String detailId, @Param("userId") String userId, @Param("readAt") long readAt); diff --git a/src/main/java/com/imyeyu/api/modules/common/service/NotifyDetailService.java b/src/main/java/com/imyeyu/api/modules/common/service/NotifyDetailService.java index f02bacd..0380a52 100644 --- a/src/main/java/com/imyeyu/api/modules/common/service/NotifyDetailService.java +++ b/src/main/java/com/imyeyu/api/modules/common/service/NotifyDetailService.java @@ -34,6 +34,19 @@ public interface NotifyDetailService extends BaseService { /// @return 站内通知分页结果 PageResult pageInternalByUserId(Page page, String userId, boolean unreadOnly); + /// 查询当前用户拥有的站内通知详情 + /// + /// @param detailId 通知详情 ID + /// @param userId 用户 ID + /// @return 通知详情 + NotifyDetail getInternalByUserId(String detailId, String userId); + + /// 删除当前用户拥有的站内通知详情 + /// + /// @param detailId 通知详情 ID + /// @param userId 用户 ID + void deleteInternalByUserId(String detailId, String userId); + /// 查询用户未读站内通知数量 /// /// @param userId 用户 ID diff --git a/src/main/java/com/imyeyu/api/modules/common/service/implement/NotifyDetailServiceImplement.java b/src/main/java/com/imyeyu/api/modules/common/service/implement/NotifyDetailServiceImplement.java index d2ebb00..fd276cf 100644 --- a/src/main/java/com/imyeyu/api/modules/common/service/implement/NotifyDetailServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/common/service/implement/NotifyDetailServiceImplement.java @@ -141,6 +141,33 @@ public class NotifyDetailServiceImplement extends AbstractEntityService implements NotifyService { - private final NotifyDetailService detailService; private final LoggerService loggerService; + private final UserLoginService userLoginService; + private final NotifyDetailService detailService; private final NotifyMapper mapper; @@ -53,8 +55,15 @@ public class NotifyServiceImplement extends AbstractEntityService