feat: 新增消息软删除及批量隐藏接口

This commit is contained in:
chenchun
2026-01-29 14:40:03 +08:00
parent adafb65221
commit 4441244575
3 changed files with 70 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -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();
}
}

View File

@@ -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;
}