feat: 新增消息软删除及批量隐藏接口
This commit is contained in:
@@ -7,4 +7,18 @@ public class MessageGetListInput:PagedAllResultRequestDto
|
||||
{
|
||||
[Required]
|
||||
public Guid SessionId { get; set; }
|
||||
}
|
||||
|
||||
public class MessageDeleteInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 要删除的消息Id列表
|
||||
/// </summary>
|
||||
[Required]
|
||||
public List<Guid> Ids { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// 是否同时隐藏后续消息(同一会话中时间大于当前消息的所有消息)
|
||||
/// </summary>
|
||||
public bool IsDeleteSubsequent { get; set; } = false;
|
||||
}
|
||||
@@ -35,8 +35,59 @@ public class MessageService : ApplicationService
|
||||
var entities = await _repository._DbQueryable
|
||||
.Where(x => x.SessionId == input.SessionId)
|
||||
.Where(x=>x.UserId == userId)
|
||||
.Where(x => !x.IsHidden)
|
||||
.OrderBy(x => x.Id)
|
||||
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
|
||||
return new PagedResultDto<MessageDto>(total, entities.Adapt<List<MessageDto>>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除消息(软删除,标记为隐藏)
|
||||
/// </summary>
|
||||
/// <param name="input">删除参数,包含消息Id列表和是否删除后续消息的开关</param>
|
||||
[Authorize]
|
||||
public async Task DeleteAsync([FromBody] MessageDeleteInput input)
|
||||
{
|
||||
var userId = CurrentUser.GetId();
|
||||
|
||||
// 获取要删除的消息
|
||||
var messages = await _repository._DbQueryable
|
||||
.Where(x => input.Ids.Contains(x.Id))
|
||||
.Where(x => x.UserId == userId)
|
||||
.ToListAsync();
|
||||
|
||||
if (messages.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// 标记当前消息为隐藏
|
||||
var idsToHide = messages.Select(x => x.Id).ToList();
|
||||
|
||||
// 如果需要删除后续消息
|
||||
if (input.IsDeleteSubsequent)
|
||||
{
|
||||
foreach (var message in messages)
|
||||
{
|
||||
// 获取同一会话中时间大于当前消息的所有消息Id
|
||||
var subsequentIds = await _repository._DbQueryable
|
||||
.Where(x => x.SessionId == message.SessionId)
|
||||
.Where(x => x.UserId == userId)
|
||||
.Where(x => x.CreationTime > message.CreationTime)
|
||||
.Where(x => !x.IsHidden)
|
||||
.Select(x => x.Id)
|
||||
.ToListAsync();
|
||||
|
||||
idsToHide.AddRange(subsequentIds);
|
||||
}
|
||||
|
||||
idsToHide = idsToHide.Distinct().ToList();
|
||||
}
|
||||
|
||||
// 批量更新为隐藏状态
|
||||
await _repository._Db.Updateable<MessageAggregateRoot>()
|
||||
.SetColumns(x => x.IsHidden == true)
|
||||
.Where(x => idsToHide.Contains(x.Id))
|
||||
.ExecuteCommandAsync();
|
||||
}
|
||||
}
|
||||
@@ -75,4 +75,9 @@ public class MessageAggregateRoot : FullAuditedAggregateRoot<Guid>
|
||||
[SugarColumn(IsOwnsOne = true)] public TokenUsageValueObject TokenUsage { get; set; } = new TokenUsageValueObject();
|
||||
|
||||
public MessageTypeEnum MessageType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否隐藏(软删除标记,隐藏后不返回给前端)
|
||||
/// </summary>
|
||||
public bool IsHidden { get; set; } = false;
|
||||
}
|
||||
Reference in New Issue
Block a user