网站首页 网站源码
using Dpz.Core.Public.ViewModel.RequestEvent;
using ZiggyCreatures.Caching.Fusion;
namespace Dpz.Core.Service.RepositoryServiceImpl;
public class TimelineService(
IRepository<Timeline> repository,
IMapper mapper,
IMediator mediator,
IFusionCache fusionCache
) : AbstractCacheService(fusionCache), ITimelineService
{
public async Task<List<VmTimeline>> GetTimelinesAsync(string account)
{
return await GetOrSetCacheAsync<List<VmTimeline>>(
nameof(GetTimelinesAsync),
async (_, cancellationToken) =>
{
var list = await repository
.SearchFor(x => x.Author.Id == account)
.OrderByDescending(x => x.Date)
.ThenByDescending(x => x.CreateTime)
.ToListAsync(cancellationToken);
return mapper.Map<List<VmTimeline>>(list);
},
new { account }
);
}
public async Task SaveAsync(VmTimeline viewModel)
{
var entity = mapper.Map<Timeline>(viewModel);
if (entity == null)
{
throw new ArgumentException("viewModel is null", nameof(viewModel));
}
if (entity.Id != ObjectId.Empty)
{
entity = await repository.TryGetAsync(viewModel.Id);
if (entity == null)
{
return;
}
var request = new EditMarkdownRequest
{
Markdown = viewModel.Content,
OriginalMarkdown = entity.Content,
};
await mediator.Send(request);
var update = Builders<Timeline>
.Update.Set(x => x.Title, viewModel.Title)
.Set(x => x.Content, viewModel.Content)
.Set(x => x.Date, viewModel.Date)
.Set(x => x.More, viewModel.More)
.Set(x => x.LastUpdateTime, DateTime.Now);
await repository.UpdateAsync(x => x.Id == entity.Id, update);
await RemoveByPrefixAsync();
return;
}
await repository.InsertAsync(entity);
await RemoveByPrefixAsync();
}
public async Task DeleteAsync(params string[] id)
{
var ids = id.Select(x => ObjectId.TryParse(x, out var oid) ? oid : (ObjectId?)null)
.Where(x => x.HasValue)
.Select(x => x!.Value)
.ToArray();
var list = await repository.SearchFor(x => ids.Contains(x.Id)).ToListAsync();
var contents = list.Select(x => x.Content).ToList();
await mediator.Send(new DeleteMarkdownRequest { Markdown = contents });
await repository.DeleteAsync(x => ids.Contains(x.Id));
await RemoveByPrefixAsync();
}
public async Task<IPagedList<VmTimeline>> GetPageAsync(
int pageIndex,
int pageSize,
string? content = null,
string? account = null
)
{
return await GetOrSetPagedListAsync(
nameof(GetPageAsync),
async _ =>
{
var predicate = repository.SearchFor(x => true);
if (!string.IsNullOrEmpty(content))
{
predicate = predicate.Where(x =>
x.Title.Contains(content) || x.Content.Contains(content)
);
}
if (!string.IsNullOrEmpty(account))
{
predicate = predicate.Where(x => x.Author.Id == account);
}
return await predicate
.OrderByDescending(x => x.Date)
.ToPagedListAsync<Timeline, VmTimeline>(pageIndex, pageSize);
},
new
{
pageIndex,
pageSize,
content,
account,
}
);
}
public async Task<VmTimeline?> FindAsync(string id)
{
return await GetOrSetCacheAsync<VmTimeline?>(
nameof(FindAsync),
async (_, _) =>
{
var entity = await repository.TryGetAsync(id);
return entity == null ? null : mapper.Map<VmTimeline>(entity);
},
new { id }
);
}
protected override string CachePrefixKey =>
"Dpz.Core.Service.RepositoryServiceImpl.TimelineService";
protected override TimeSpan CacheDefaultExpiration => TimeSpan.FromDays(7);
}
上述代码定义了一个名为 TimelineService
的类,它实现了 ITimelineService
接口,提供了一系列与时间线(Timeline)相关的服务。这个类主要用于处理时间线的 CRUD(创建、读取、更新、删除)操作,并且与数据库交互。以下是对每个方法的详细解释:
GetTimelinesAsync(string account)
repository
查询时间线,筛选出作者 ID 匹配的记录。Date
)和创建时间(CreateTime
)降序排列。VmTimeline
视图模型列表并返回。SaveAsync(VmTimeline viewModel)
VmTimeline
),可以是插入新记录或更新现有记录。Timeline
实体。EditMarkdownRequest
请求以处理 Markdown 内容的编辑。DeleteAsync(params string[] id)
ObjectId
,并过滤掉无效的 ID。DeleteMarkdownRequest
请求以处理 Markdown 内容的删除。GetPageAsync(int pageIndex, int pageSize, string? content = null, string? account = null)
FindAsync(string id)
repository
尝试获取指定 ID 的时间线实体。VmTimeline
视图模型并返回;如果未找到,则返回 null
。TimelineService
类提供了对时间线数据的全面管理,包括获取、保存、删除和查找时间线记录的功能。它利用了仓储模式(Repository Pattern)与映射器(Mapper)来简化数据访问和转换,同时使用中介者模式(Mediator Pattern)来处理与 Markdown 内容相关的请求。