Families.Web 1.0.0.0
사진, 동영상, 글, 댓글과 반응을 가족끼리만 공유하는 비공개 앨범·타임라인 서비스입니다.
로딩중...
검색중...
일치하는것 없음
FamilyAlbumViewModel.cs
이 파일의 문서화 페이지로 가기
3
5
14public sealed class FamilyAlbumViewModel
15{
24 private readonly IFamilyTenantStore _tenants;
33 private readonly IPostStore _posts;
42 private readonly IAlbumStore _albums;
51 private readonly IMediaService _media;
52
94 IAlbumStore albums, IMediaService media)
95 {
96 _tenants = tenants;
97 _posts = posts;
98 _albums = albums;
99 _media = media;
100 }
101
110 public int PageSize => Math.Clamp(Config?.PageSize ?? 20, 5, 100);
111
120 public FamilyConfig? Config { get; private set; }
129 public IReadOnlyList<PostEntry> Posts { get; private set; } = [];
138 public IReadOnlyList<AlbumInfo> Albums { get; private set; } = [];
147 public bool IsLoaded { get; private set; }
156 public bool NotFound { get; private set; }
165 public int CurrentPage { get; private set; } = 1;
174 public int TotalCount { get; private set; }
183 public int TotalPages => (int)Math.Ceiling((double)TotalCount / PageSize);
184
193 public string FamilyName => Config?.FamilyName ?? "";
202 public string Bio => Config?.Bio ?? "";
211 public string ThemeName => Config?.ThemeName ?? "warm";
220 public bool AllowReactions => Config?.AllowReactions ?? true;
229 public bool AllowComments => Config?.AllowComments ?? true;
230
239 public string CoverImageUrl
240 {
241 get
242 {
243 if (Config is null || string.IsNullOrWhiteSpace(Config.CoverImageFileName)) return "";
244 return _media.GetCoverUrl(Config.Slug, Config.CoverImageFileName);
245 }
246 }
247
256 public string OgTitle => !string.IsNullOrWhiteSpace(Config?.OgTitle)
257 ? Config.OgTitle
258 : $"{FamilyName} 가족 앨범";
259
268 public string OgDescription => !string.IsNullOrWhiteSpace(Config?.OgDescription)
269 ? Config.OgDescription
270 : $"{FamilyName}의 소중한 순간들을 담은 가족 앨범입니다.";
271
280 public string OgImageUrl
281 {
282 get
283 {
284 if (Config is null) return "";
285 var fn = !string.IsNullOrWhiteSpace(Config.OgImageFileName)
286 ? Config.OgImageFileName
287 : Config.CoverImageFileName;
288 return string.IsNullOrWhiteSpace(fn) ? "" : _media.GetCoverUrl(Config.Slug, fn);
289 }
290 }
291
316 private static bool IsExternalUrl(string s) =>
317 s.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
318 s.StartsWith("https://", StringComparison.OrdinalIgnoreCase);
319
352 public string GetMediaUrl(string postId, string fileName) =>
353 IsExternalUrl(fileName) ? fileName : _media.GetMediaUrl(Config?.Slug ?? "", postId, fileName);
354
387 public string GetThumbUrl(string postId, string fileName) =>
388 IsExternalUrl(fileName) ? fileName : _media.GetThumbUrl(Config?.Slug ?? "", postId, fileName);
389
422 public async Task LoadAsync(string slug, CancellationToken ct = default)
423 {
424 Config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false);
425 if (Config is null) { NotFound = true; IsLoaded = true; return; }
426
427 Albums = await _albums.GetAllAsync(slug, ct).ConfigureAwait(false);
428 await LoadPageAsync(slug, 1, ct).ConfigureAwait(false);
429 IsLoaded = true;
430 }
431
472 public async Task LoadPageAsync(string slug, int page, CancellationToken ct = default)
473 {
474 CurrentPage = page;
475 var (items, total) = await _posts.GetPageAsync(slug, page, PageSize, ct).ConfigureAwait(false);
476 Posts = items;
477 TotalCount = total;
478 }
479
520 public async Task<IReadOnlyList<PostEntry>> GetAlbumPostsAsync(string slug, string albumId, CancellationToken ct = default)
521 => await _posts.GetByAlbumAsync(slug, albumId, ct).ConfigureAwait(false);
522
571 public async Task<(IReadOnlyList<PostEntry> Items, int TotalCount)> GetAlbumPageAsync(
572 string slug, string albumId, int page, CancellationToken ct = default)
573 => await _posts.GetByAlbumPageAsync(slug, albumId, page, PageSize, ct).ConfigureAwait(false);
574}
async Task LoadAsync(string slug, CancellationToken ct=default)
FamilyAlbumViewModel(IFamilyTenantStore tenants, IPostStore posts, IAlbumStore albums, IMediaService media)
string GetMediaUrl(string postId, string fileName)
string GetThumbUrl(string postId, string fileName)
async Task<(IReadOnlyList< PostEntry > Items, int TotalCount)> GetAlbumPageAsync(string slug, string albumId, int page, CancellationToken ct=default)
async Task< IReadOnlyList< PostEntry > > GetAlbumPostsAsync(string slug, string albumId, CancellationToken ct=default)
async Task LoadPageAsync(string slug, int page, CancellationToken ct=default)