!20 Merge remote-tracking branch 'origin/dev' into dev
Merge pull request !20 from Dawn/dev
This commit is contained in:
@@ -6,6 +6,7 @@ import com.hula.common.domain.vo.req.IdReqVO;
|
||||
import com.hula.common.domain.vo.res.CursorPageBaseResp;
|
||||
import com.hula.common.domain.vo.res.GroupListVO;
|
||||
import com.hula.common.domain.vo.res.IdRespVO;
|
||||
import com.hula.core.chat.domain.entity.Announcements;
|
||||
import com.hula.core.chat.domain.entity.RoomGroup;
|
||||
import com.hula.core.chat.domain.vo.request.ChatMessageMemberReq;
|
||||
import com.hula.core.chat.domain.vo.request.GroupAddReq;
|
||||
@@ -158,8 +159,15 @@ public class RoomController {
|
||||
return ApiResult.success();
|
||||
}
|
||||
|
||||
@Operation(summary = "公告列表")
|
||||
@GetMapping("/announcement/list/{id}")
|
||||
public ApiResult<IPage<Announcements>> announcementList(@PathVariable("id") Long roomId, @RequestParam("current") Long current,@RequestParam("size") Long size){
|
||||
IPage<Announcements> page = new Page<>(current,size);
|
||||
return ApiResult.success(roomService.announcementList(roomId, page));
|
||||
}
|
||||
|
||||
@Operation(summary = "查看公告")
|
||||
@GetMapping("/announcement/{id}")
|
||||
@GetMapping("/announcement")
|
||||
public ApiResult announcement(ReadAnnouncementsParam param){
|
||||
return ApiResult.success(roomService.getAnnouncement(RequestHolder.get().getUid(), param));
|
||||
}
|
||||
@@ -170,6 +178,12 @@ public class RoomController {
|
||||
return ApiResult.success(roomService.pushAnnouncement(RequestHolder.get().getUid(), param));
|
||||
}
|
||||
|
||||
@Operation(summary = "删除公告")
|
||||
@PostMapping("announcement/delete/{id}")
|
||||
public ApiResult announcementDelete(@PathVariable("id") Long id){
|
||||
return ApiResult.success(roomService.announcementDelete(RequestHolder.get().getUid(), id));
|
||||
}
|
||||
|
||||
@Operation(summary = "已读公告")
|
||||
@PostMapping("announcement/read")
|
||||
public ApiResult readAnnouncement(@RequestBody ReadAnnouncementsParam param){
|
||||
|
||||
@@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 表情图片消息入参
|
||||
@@ -28,6 +29,12 @@ public class EmojisMsgDTO implements Serializable {
|
||||
|
||||
@Schema(description ="回复的消息id")
|
||||
private Long replyMsgId;
|
||||
|
||||
@Schema(description ="艾特的uid")
|
||||
private List<Long> atUidList;
|
||||
|
||||
@Schema(description ="父消息,如果没有父消息,返回的是null")
|
||||
private ReplyMsg reply;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import lombok.experimental.SuperBuilder;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 语音消息入参
|
||||
@@ -30,4 +31,10 @@ public class FileMsgDTO extends BaseFileDTO implements Serializable {
|
||||
|
||||
@Schema(description ="回复的消息id")
|
||||
private Long replyMsgId;
|
||||
|
||||
@Schema(description ="艾特的uid")
|
||||
private List<Long> atUidList;
|
||||
|
||||
@Schema(description ="父消息,如果没有父消息,返回的是null")
|
||||
private ReplyMsg reply;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import jakarta.validation.constraints.NotNull;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 图片消息入参
|
||||
@@ -35,6 +36,12 @@ public class ImgMsgDTO extends BaseFileDTO implements Serializable {
|
||||
|
||||
@Schema(description ="回复的消息id")
|
||||
private Long replyMsgId;
|
||||
|
||||
@Schema(description ="艾特的uid")
|
||||
private List<Long> atUidList;
|
||||
|
||||
@Schema(description ="父消息,如果没有父消息,返回的是null")
|
||||
private ReplyMsg reply;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.hula.core.chat.domain.entity.msg;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
@@ -14,7 +13,6 @@ import java.util.Date;
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class MsgRecall implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
@@ -22,4 +20,9 @@ public class MsgRecall implements Serializable {
|
||||
private Long recallUid;
|
||||
//撤回的时间点
|
||||
private Date recallTime;
|
||||
|
||||
public MsgRecall(Long recallUid, Date date) {
|
||||
this.recallUid = recallUid;
|
||||
this.recallTime = date;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.hula.core.chat.domain.entity.msg;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class ReplyMsg implements Serializable {
|
||||
@Schema(description = "消息id")
|
||||
private Long id;
|
||||
@Schema(description = "用户uid")
|
||||
private Long uid;
|
||||
@Schema(description = "用户名称")
|
||||
private String username;
|
||||
@Schema(description = "消息类型 1正常文本 2.撤回消息")
|
||||
private Integer type;
|
||||
@Schema(description = "消息内容不同的消息类型,见父消息内容体")
|
||||
private Object body;
|
||||
@Schema(description = "是否可消息跳转 0否 1是")
|
||||
private Integer canCallback;
|
||||
@Schema(description = "跳转间隔的消息条数")
|
||||
private Integer gapCount;
|
||||
}
|
||||
@@ -11,6 +11,7 @@ import lombok.experimental.SuperBuilder;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 视频消息入参
|
||||
@@ -43,4 +44,10 @@ public class VideoMsgDTO extends BaseFileDTO implements Serializable {
|
||||
|
||||
@Schema(description ="回复的消息id")
|
||||
private Long replyMsgId;
|
||||
|
||||
@Schema(description ="艾特的uid")
|
||||
private List<Long> atUidList;
|
||||
|
||||
@Schema(description ="父消息,如果没有父消息,返回的是null")
|
||||
private ReplyMsg reply;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 聊天公告
|
||||
@@ -16,10 +15,6 @@ public class AnnouncementsParam implements Serializable {
|
||||
@NotNull(message = "请选择群聊")
|
||||
private Long roomId;
|
||||
|
||||
private Long uid;
|
||||
|
||||
@NotEmpty(message = "请输入公告内容")
|
||||
private String content;
|
||||
|
||||
private LocalDateTime publishTime;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.hula.core.chat.domain.vo.response.msg;
|
||||
|
||||
import com.hula.common.utils.discover.domain.UrlInfo;
|
||||
import com.hula.core.chat.domain.entity.msg.ReplyMsg;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@@ -27,25 +28,4 @@ public class TextMsgResp {
|
||||
private List<Long> atUidList;
|
||||
@Schema(description ="父消息,如果没有父消息,返回的是null")
|
||||
private ReplyMsg reply;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public static class ReplyMsg {
|
||||
@Schema(description ="消息id")
|
||||
private Long id;
|
||||
@Schema(description ="用户uid")
|
||||
private Long uid;
|
||||
@Schema(description ="用户名称")
|
||||
private String username;
|
||||
@Schema(description ="消息类型 1正常文本 2.撤回消息")
|
||||
private Integer type;
|
||||
@Schema(description ="消息内容不同的消息类型,见父消息内容体")
|
||||
private Object body;
|
||||
@Schema(description ="是否可消息跳转 0否 1是")
|
||||
private Integer canCallback;
|
||||
@Schema(description ="跳转间隔的消息条数")
|
||||
private Integer gapCount;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.hula.common.domain.vo.req.CursorPageBaseReq;
|
||||
import com.hula.common.domain.vo.res.CursorPageBaseResp;
|
||||
import com.hula.common.domain.vo.res.GroupListVO;
|
||||
import com.hula.core.chat.domain.entity.Announcements;
|
||||
import com.hula.core.chat.domain.entity.RoomGroup;
|
||||
import com.hula.core.chat.domain.vo.request.ChatMessageMemberReq;
|
||||
import com.hula.core.chat.domain.vo.request.ContactFriendReq;
|
||||
@@ -27,6 +28,7 @@ import com.hula.core.chat.domain.vo.response.ChatRoomResp;
|
||||
import com.hula.core.chat.domain.vo.response.MemberResp;
|
||||
import com.hula.core.user.domain.vo.resp.ws.ChatMemberResp;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -90,6 +92,12 @@ public interface RoomAppService {
|
||||
*/
|
||||
Boolean pushAnnouncement(Long uid, AnnouncementsParam param);
|
||||
|
||||
/**
|
||||
* 获取公告列表
|
||||
* @return
|
||||
*/
|
||||
IPage<Announcements> announcementList(Long roomId, IPage<Announcements> page);
|
||||
|
||||
/**
|
||||
* 已读公告
|
||||
*/
|
||||
@@ -100,6 +108,11 @@ public interface RoomAppService {
|
||||
*/
|
||||
AnnouncementsResp getAnnouncement(Long uid, ReadAnnouncementsParam param);
|
||||
|
||||
/**
|
||||
* 删除公告
|
||||
*/
|
||||
Boolean announcementDelete(Long uid, Long id);
|
||||
|
||||
/**
|
||||
* 隐藏会话
|
||||
* @return
|
||||
|
||||
@@ -2,14 +2,12 @@ package com.hula.core.chat.service;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.hula.common.domain.po.RoomChatInfoPO;
|
||||
import com.hula.common.domain.vo.res.GroupListVO;
|
||||
import com.hula.core.chat.domain.entity.Announcements;
|
||||
import com.hula.core.chat.domain.entity.AnnouncementsReadRecord;
|
||||
import com.hula.core.chat.domain.entity.RoomFriend;
|
||||
import com.hula.core.chat.domain.entity.RoomGroup;
|
||||
import com.hula.core.chat.domain.vo.request.GroupAddReq;
|
||||
import com.hula.core.chat.domain.vo.request.room.AnnouncementsParam;
|
||||
import com.hula.core.chat.domain.vo.response.AnnouncementsResp;
|
||||
|
||||
import java.util.List;
|
||||
@@ -68,6 +66,11 @@ public interface RoomService {
|
||||
*/
|
||||
Boolean readAnnouncement(Long uid, Long announcementId);
|
||||
|
||||
/**
|
||||
* 查询公告列表
|
||||
*/
|
||||
IPage<Announcements> announcementList(Long roomId, IPage<Announcements> page);
|
||||
|
||||
/**
|
||||
* 查询公告
|
||||
*/
|
||||
@@ -78,6 +81,11 @@ public interface RoomService {
|
||||
*/
|
||||
Long getAnnouncementReadCount(Long announcementId);
|
||||
|
||||
/**
|
||||
* 删除指定公告
|
||||
*/
|
||||
Boolean announcementDelete(Long id);
|
||||
|
||||
/**
|
||||
* 保存群公告
|
||||
*/
|
||||
|
||||
@@ -276,7 +276,8 @@ public class RoomAppServiceImpl implements RoomAppService {
|
||||
|
||||
@Override
|
||||
public Boolean pushAnnouncement(Long uid, AnnouncementsParam param) {
|
||||
List<Long> uids = roomService.getGroupUsers(param.getRoomId(), false);
|
||||
RoomGroup roomGroup = roomGroupCache.get(param.getRoomId());
|
||||
List<Long> uids = roomService.getGroupUsers(roomGroup.getId(), false);
|
||||
if(CollUtil.isNotEmpty(uids)){
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
pushService.sendPushMsg(MessageAdapter.buildRoomGroupAnnouncement(param.getContent()), uids, uid);
|
||||
@@ -303,6 +304,11 @@ public class RoomAppServiceImpl implements RoomAppService {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<Announcements> announcementList(Long roomId, IPage<Announcements> page) {
|
||||
return roomService.announcementList(roomId, page);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean readAnnouncement(Long uid, ReadAnnouncementsParam param) {
|
||||
// 1.更新已读状态
|
||||
@@ -338,6 +344,19 @@ public class RoomAppServiceImpl implements RoomAppService {
|
||||
return announcement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean announcementDelete(Long uid, Long id) {
|
||||
// 1. 鉴权
|
||||
RoomGroup roomGroup = roomGroupCache.get(id);
|
||||
GroupMember groupMember = verifyGroupPermissions(uid, roomGroup);
|
||||
|
||||
if(GroupRoleEnum.MEMBER.getType().equals(groupMember.getRole())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return roomService.announcementDelete(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean setHide(Long uid, ContactHideReq req) {
|
||||
return contactDao.setHide(uid, req.getRoomId(), req.getHide());
|
||||
|
||||
@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.hula.common.domain.vo.res.GroupListVO;
|
||||
import com.hula.common.enums.NormalOrNoEnum;
|
||||
import com.hula.core.chat.dao.AnnouncementsDao;
|
||||
import com.hula.core.chat.dao.AnnouncementsReadRecordDao;
|
||||
import com.hula.core.chat.domain.entity.Announcements;
|
||||
@@ -148,6 +147,11 @@ public class RoomServiceImpl implements RoomService {
|
||||
.eq(AnnouncementsReadRecord::getAnnouncementsId, announcementId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean announcementDelete(Long id) {
|
||||
return announcementsDao.removeById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean saveAnnouncements(Announcements announcements) {
|
||||
return announcementsDao.save(announcements);
|
||||
@@ -202,4 +206,9 @@ public class RoomServiceImpl implements RoomService {
|
||||
groupMember.setUid(uid);
|
||||
groupMemberDao.save(groupMember);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<Announcements> announcementList(Long roomId, IPage<Announcements> page) {
|
||||
return announcementsDao.getBaseMapper().selectPage(page, new QueryWrapper<Announcements>().eq("room_id", roomId));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,37 @@
|
||||
package com.hula.core.chat.service.strategy.msg;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.hula.common.enums.YesOrNoEnum;
|
||||
import com.hula.core.chat.dao.MessageDao;
|
||||
import com.hula.core.chat.domain.entity.Message;
|
||||
import com.hula.core.chat.domain.entity.msg.ReplyMsg;
|
||||
import com.hula.core.chat.domain.enums.MessageStatusEnum;
|
||||
import com.hula.core.chat.domain.enums.MessageTypeEnum;
|
||||
import com.hula.core.chat.domain.vo.request.ChatMessageReq;
|
||||
import com.hula.core.chat.service.adapter.MessageAdapter;
|
||||
import com.hula.core.chat.service.cache.MsgPlusCache;
|
||||
import com.hula.core.user.domain.entity.User;
|
||||
import com.hula.core.user.service.cache.UserCache;
|
||||
import com.hula.utils.AssertUtil;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
|
||||
public abstract class AbstractMsgHandler<T> {
|
||||
@Resource
|
||||
private MessageDao messageDao;
|
||||
|
||||
@Resource
|
||||
private MsgPlusCache msgPlusCache;
|
||||
|
||||
@Resource
|
||||
private UserCache userCache;
|
||||
|
||||
private Class<T> bodyClass;
|
||||
|
||||
@PostConstruct
|
||||
@@ -62,6 +76,32 @@ public abstract class AbstractMsgHandler<T> {
|
||||
*/
|
||||
public abstract Object showMsg(Message msg);
|
||||
|
||||
/**
|
||||
* 回复消息
|
||||
* @param msg 消息主体
|
||||
* @return
|
||||
*/
|
||||
public ReplyMsg replyMsg(Message msg){
|
||||
Optional<Message> reply = Optional.ofNullable(msg.getReplyMsgId())
|
||||
.map(msgPlusCache::get)
|
||||
.filter(a -> Objects.equals(a.getStatus(), MessageStatusEnum.NORMAL.getStatus()));
|
||||
// TODO 这里的缓存不会立即删除,导致撤回消息后回复的信息还有 (nyh -> 2024-07-14 03:46:34)
|
||||
if (reply.isPresent()) {
|
||||
Message replyMessage = reply.get();
|
||||
ReplyMsg replyMsgVO = new ReplyMsg();
|
||||
replyMsgVO.setId(replyMessage.getId());
|
||||
replyMsgVO.setUid(replyMessage.getFromUid());
|
||||
replyMsgVO.setType(replyMessage.getType());
|
||||
replyMsgVO.setBody(MsgHandlerFactory.getStrategyNoNull(replyMessage.getType()).showReplyMsg(replyMessage));
|
||||
User replyUser = userCache.getUserInfo(replyMessage.getFromUid());
|
||||
replyMsgVO.setUsername(replyUser.getName());
|
||||
replyMsgVO.setCanCallback(YesOrNoEnum.toStatus(Objects.nonNull(msg.getGapCount()) && msg.getGapCount() <= MessageAdapter.CAN_CALLBACK_GAP_COUNT));
|
||||
replyMsgVO.setGapCount(msg.getGapCount());
|
||||
return replyMsgVO;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 被回复时——展示的消息
|
||||
*/
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.hula.core.chat.dao.MessageDao;
|
||||
import com.hula.core.chat.domain.entity.Message;
|
||||
import com.hula.core.chat.domain.entity.msg.EmojisMsgDTO;
|
||||
import com.hula.core.chat.domain.entity.msg.MessageExtra;
|
||||
import com.hula.core.chat.domain.entity.msg.ReplyMsg;
|
||||
import com.hula.core.chat.domain.enums.MessageTypeEnum;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -37,7 +38,10 @@ public class EmojisMsgHandler extends AbstractMsgHandler<EmojisMsgDTO> {
|
||||
|
||||
@Override
|
||||
public Object showMsg(Message msg) {
|
||||
return msg.getExtra().getEmojisMsgDTO();
|
||||
EmojisMsgDTO resp = msg.getExtra().getEmojisMsgDTO();
|
||||
resp.setAtUidList(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getAtUidList).orElse(null));
|
||||
resp.setReply(replyMsg(msg));
|
||||
return resp;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -37,7 +37,10 @@ public class FileMsgHandler extends AbstractMsgHandler<FileMsgDTO> {
|
||||
|
||||
@Override
|
||||
public Object showMsg(Message msg) {
|
||||
return msg.getExtra().getFileMsg();
|
||||
FileMsgDTO resp = msg.getExtra().getFileMsg();
|
||||
resp.setAtUidList(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getAtUidList).orElse(null));
|
||||
resp.setReply(replyMsg(msg));
|
||||
return resp;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -37,7 +37,10 @@ public class ImgMsgHandler extends AbstractMsgHandler<ImgMsgDTO> {
|
||||
|
||||
@Override
|
||||
public Object showMsg(Message msg) {
|
||||
return msg.getExtra().getImgMsgDTO();
|
||||
ImgMsgDTO resp = msg.getExtra().getImgMsgDTO();
|
||||
resp.setAtUidList(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getAtUidList).orElse(null));
|
||||
resp.setReply(replyMsg(msg));
|
||||
return resp;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.hula.core.chat.service.strategy.msg;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.hula.common.enums.YesOrNoEnum;
|
||||
import com.hula.core.chat.domain.entity.msg.ReplyMsg;
|
||||
import com.hula.utils.AssertUtil;
|
||||
import com.hula.common.utils.discover.PrioritizedUrlDiscover;
|
||||
import com.hula.common.utils.discover.domain.UrlInfo;
|
||||
@@ -105,24 +106,7 @@ public class TextMsgHandler extends AbstractMsgHandler<TextMsgReq> {
|
||||
resp.setContent(msg.getContent());
|
||||
resp.setUrlContentMap(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getUrlContentMap).orElse(null));
|
||||
resp.setAtUidList(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getAtUidList).orElse(null));
|
||||
//回复消息
|
||||
Optional<Message> reply = Optional.ofNullable(msg.getReplyMsgId())
|
||||
.map(msgPlusCache::get)
|
||||
.filter(a -> Objects.equals(a.getStatus(), MessageStatusEnum.NORMAL.getStatus()));
|
||||
// TODO 这里的缓存不会立即删除,导致撤回消息后回复的信息还有 (nyh -> 2024-07-14 03:46:34)
|
||||
if (reply.isPresent()) {
|
||||
Message replyMessage = reply.get();
|
||||
TextMsgResp.ReplyMsg replyMsgVO = new TextMsgResp.ReplyMsg();
|
||||
replyMsgVO.setId(replyMessage.getId());
|
||||
replyMsgVO.setUid(replyMessage.getFromUid());
|
||||
replyMsgVO.setType(replyMessage.getType());
|
||||
replyMsgVO.setBody(MsgHandlerFactory.getStrategyNoNull(replyMessage.getType()).showReplyMsg(replyMessage));
|
||||
User replyUser = userCache.getUserInfo(replyMessage.getFromUid());
|
||||
replyMsgVO.setUsername(replyUser.getName());
|
||||
replyMsgVO.setCanCallback(YesOrNoEnum.toStatus(Objects.nonNull(msg.getGapCount()) && msg.getGapCount() <= MessageAdapter.CAN_CALLBACK_GAP_COUNT));
|
||||
replyMsgVO.setGapCount(msg.getGapCount());
|
||||
resp.setReply(replyMsgVO);
|
||||
}
|
||||
resp.setReply(replyMsg(msg));
|
||||
return resp;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,10 @@ public class VideoMsgHandler extends AbstractMsgHandler<VideoMsgDTO> {
|
||||
|
||||
@Override
|
||||
public Object showMsg(Message msg) {
|
||||
return msg.getExtra().getVideoMsgDTO();
|
||||
VideoMsgDTO resp = msg.getExtra().getVideoMsgDTO();
|
||||
resp.setAtUidList(Optional.ofNullable(msg.getExtra()).map(MessageExtra::getAtUidList).orElse(null));
|
||||
resp.setReply(replyMsg(msg));
|
||||
return resp;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.hula.core.user.controller;
|
||||
|
||||
import com.hula.core.user.domain.vo.req.user.ForgotPasswordReq;
|
||||
import com.hula.core.user.domain.vo.req.user.LoginReq;
|
||||
import com.hula.core.user.domain.vo.req.user.LogoutReq;
|
||||
import com.hula.core.user.domain.vo.req.user.RefreshTokenReq;
|
||||
@@ -49,6 +50,12 @@ public class TokenController {
|
||||
return ApiResult.success(registerReq.getEmail());
|
||||
}
|
||||
|
||||
@PostMapping("/forgotPassword")
|
||||
@Operation(summary ="忘记密码|重置密码")
|
||||
public ApiResult<Boolean> forgotPassword(@Valid @RequestBody ForgotPasswordReq forgotPasswordReq) {
|
||||
return ApiResult.success(loginService.forgotPassword(forgotPasswordReq));
|
||||
}
|
||||
|
||||
@PostMapping("/refreshToken")
|
||||
@Operation(summary ="token续签")
|
||||
public ApiResult<LoginResultVO> refreshToken(@RequestBody RefreshTokenReq refreshTokenReq) {
|
||||
|
||||
@@ -46,8 +46,8 @@ public class UserDao extends ServiceImpl<UserMapper, User> {
|
||||
updateById(update);
|
||||
}
|
||||
|
||||
public User getByName(String name) {
|
||||
return lambdaQuery().eq(User::getName, name).one();
|
||||
public User getByEmail(String email) {
|
||||
return lambdaQuery().eq(User::getEmail, email).one();
|
||||
}
|
||||
|
||||
public List<User> getMemberList() {
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.hula.core.user.domain.vo.req.user;
|
||||
|
||||
import com.hula.domain.BaseEntity;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.Pattern;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author 乾乾
|
||||
*/
|
||||
@Data
|
||||
public class ForgotPasswordReq extends BaseEntity {
|
||||
|
||||
@NotEmpty(message = "请填写邮箱")
|
||||
@Schema(description = "邮箱")
|
||||
@Pattern(regexp = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$", message = "请输入有效的邮箱地址")
|
||||
private String email;
|
||||
|
||||
@NotEmpty(message = "邮箱验证码不能为空")
|
||||
@Schema(description = "邮箱验证码")
|
||||
private String code;
|
||||
|
||||
@NotEmpty(message = "修改码非法!")
|
||||
@Schema(description = "uuid")
|
||||
private String uuid;
|
||||
|
||||
@NotEmpty(message = "请输入密码")
|
||||
private String password;
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
package com.hula.core.user.service;
|
||||
|
||||
import com.hula.core.user.domain.vo.req.user.ForgotPasswordReq;
|
||||
import com.hula.core.user.domain.vo.req.user.LoginReq;
|
||||
import com.hula.core.user.domain.vo.req.user.RefreshTokenReq;
|
||||
import com.hula.core.user.domain.vo.req.user.RegisterReq;
|
||||
import com.hula.core.user.domain.vo.resp.user.LoginResultVO;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.validation.Valid;
|
||||
|
||||
/**
|
||||
* @author nyh
|
||||
@@ -39,4 +41,9 @@ public interface LoginService {
|
||||
* 退出登录
|
||||
*/
|
||||
void logout(Boolean autoLogin);
|
||||
|
||||
/**
|
||||
* 重置密码
|
||||
*/
|
||||
Boolean forgotPassword(@Valid ForgotPasswordReq forgotPasswordReq);
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import com.hula.core.chat.service.ContactService;
|
||||
import com.hula.core.chat.service.RoomService;
|
||||
import com.hula.core.user.dao.UserDao;
|
||||
import com.hula.core.user.domain.entity.User;
|
||||
import com.hula.core.user.domain.vo.req.user.ForgotPasswordReq;
|
||||
import com.hula.core.user.domain.vo.req.user.LoginReq;
|
||||
import com.hula.core.user.domain.vo.req.user.RefreshTokenReq;
|
||||
import com.hula.core.user.domain.vo.req.user.RegisterReq;
|
||||
@@ -78,17 +79,7 @@ public class LoginServiceImpl implements LoginService {
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void normalRegister(RegisterReq req) {
|
||||
String emailCode;
|
||||
Object codeObj = RedisUtils.hget("emailCode", req.getUuid());
|
||||
if (ObjectUtil.isNotNull(codeObj)) {
|
||||
emailCode = codeObj.toString();
|
||||
} else {
|
||||
throw new BizException("验证码已过期");
|
||||
}
|
||||
|
||||
if(StrUtil.isEmpty(emailCode) || !emailCode.equals(req.getCode())){
|
||||
throw new BizException("验证码错误!");
|
||||
}
|
||||
checkCode(req.getUuid(), req.getCode());
|
||||
|
||||
// 2. 检查邮箱是否已被其他用户绑定
|
||||
if (userDao.existsByEmailAndIdNot(null, req.getEmail())) {
|
||||
@@ -162,4 +153,36 @@ public class LoginServiceImpl implements LoginService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean forgotPassword(ForgotPasswordReq req) {
|
||||
// 1. 校验
|
||||
checkCode(req.getUuid(), req.getCode());
|
||||
|
||||
// 2. 修改密码
|
||||
User dbuUser = userDao.getByEmail(req.getEmail());
|
||||
User user = new User();
|
||||
user.setId(dbuUser.getId());
|
||||
user.setPassword(req.getPassword());
|
||||
return userDao.updateById(user);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查验证码
|
||||
* @param uuid 验证码id
|
||||
* @param code 验证码值
|
||||
*/
|
||||
private static void checkCode(String uuid, String code) {
|
||||
String emailCode;
|
||||
Object codeObj = RedisUtils.hget("emailCode", uuid);
|
||||
if (ObjectUtil.isNotNull(codeObj)) {
|
||||
emailCode = codeObj.toString();
|
||||
} else {
|
||||
throw new BizException("验证码已过期");
|
||||
}
|
||||
|
||||
if (StrUtil.isEmpty(emailCode) || !emailCode.equals(code)) {
|
||||
throw new BizException("验证码错误!");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -162,3 +162,4 @@ public:
|
||||
- /token/register
|
||||
- /captcha/captcha
|
||||
- /captcha/sendCode
|
||||
- /token/forgotPassword
|
||||
|
||||
Reference in New Issue
Block a user