Files
mixtape/zero.Web/ViewHelpers/ZeroPageHelper.cs
T

118 lines
2.5 KiB
C#

using Microsoft.AspNetCore.Http;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using zero.Extensions;
namespace zero.Web.ViewHelpers;
public class ZeroPageHelper : IZeroPageHelper
{
HttpContext HttpContext;
IMediaCollection Media;
/// <summary>
/// Media cache for repetitive queries within an HTTP request
/// </summary>
Dictionary<string, Media> Cache { get; set; } = new Dictionary<string, Media>();
public ZeroPageHelper(IHttpContextAccessor httpContextAccessor, IMediaCollection media)
{
HttpContext = httpContextAccessor.HttpContext;
Media = media;
}
/// <inheritdoc />
public async Task<Media> GetById(string id)
{
if (id.IsNullOrEmpty())
{
return null;
}
if (!Cache.TryGetValue(id, out Media media))
{
media = await Media.Load(id);
Cache.Add(id, media);
}
return media;
}
/// <inheritdoc />
public async Task<Dictionary<string, Media>> GetByIds(string[] ids)
{
HashSet<string> remoteIds = new HashSet<string>();
Dictionary<string, Media> items = new Dictionary<string, Media>();
foreach (string id in ids)
{
if (Cache.TryGetValue(id, out Media media))
{
items.Add(id, media);
}
else
{
remoteIds.Add(id);
}
}
if (remoteIds.Count > 0)
{
Dictionary<string, Media> remoteItems = await Media.Load(remoteIds);
foreach (var item in remoteItems)
{
items.Add(item.Key, item.Value);
Cache.Add(item.Key, item.Value);
}
}
return items;
}
/// <inheritdoc />
public async Task<string> GetUrl(string id, bool isAbsolute = false)
{
Media media = await GetById(id);
return media?.Source;
}
/// <inheritdoc />
public async Task<Dictionary<string, string>> GetUrls(string[] ids, bool isAbsolute = false)
{
Dictionary<string, Media> medias = await GetByIds(ids);
return medias.ToDictionary(x => x.Key, x => x.Value?.Source);
}
}
public interface IZeroPageHelper
{
/// <summary>
/// Get media by Id
/// </summary>
Task<Media> GetById(string id);
/// <summary>
/// Get media items by Ids
/// </summary>
Task<Dictionary<string, Media>> GetByIds(string[] ids);
/// <summary>
/// Get source for a media item
/// </summary>
Task<string> GetUrl(string id, bool isAbsolute = false);
/// <summary>
/// Get source for media items
/// </summary>
Task<Dictionary<string, string>> GetUrls(string[] ids, bool isAbsolute = false);
}