Families.Web 1.0.0.0
사진, 동영상, 글, 댓글과 반응을 가족끼리만 공유하는 비공개 앨범·타임라인 서비스입니다.
로딩중...
검색중...
일치하는것 없음
FamiliesApp.ViewModels.FamilyAdminViewModel 클래스 참조sealed

더 자세히 ...

FamiliesApp.ViewModels.FamilyAdminViewModel에 대한 협력 다이어그램:

Public 멤버 함수

 FamilyAdminViewModel (IFamilyTenantStore tenants, IPostStore posts, IAlbumStore albums, IMediaService media, FamilyUserContext userContext)
async Task< bool > LoginAsync (string slug, CancellationToken ct=default)
async Task InitializeAsync (string slug, CancellationToken ct=default)
async Task LoadAsync (string slug, CancellationToken ct=default)
async Task RemoveAdminAsync (string userId, CancellationToken ct=default)
async Task SaveConfigAsync (CancellationToken ct=default)
void NewPost ()
void EditPost (PostEntry post)
void CancelEdit ()
async Task UploadPendingFilesAsync (string slug, CancellationToken ct=default)
async Task SavePostAsync (string slug, CancellationToken ct=default)
async Task DeletePostAsync (string slug, string postId, CancellationToken ct=default)
async Task DeletePostMediaAsync (string slug, string postId, string fileName, CancellationToken ct=default)
async Task UploadCoverAsync (string slug, IBrowserFile file, CancellationToken ct=default)
async Task AddAlbumAsync (string slug, CancellationToken ct=default)
async Task DeleteAlbumAsync (string slug, string albumId, CancellationToken ct=default)
async Task DeleteSelfAsync (string slug, CancellationToken ct=default)
string GetCoverUrl (string slug, string fileName)
string GetMediaUrl (string slug, string postId, string fileName)
string GetThumbUrl (string slug, string postId, string fileName)

정적 Public 멤버 함수

static bool IsYouTube (string url)

속성

FamilyConfigConfig [get, private set]
IReadOnlyList< PostEntryPosts = [] [get, private set]
IReadOnlyList< AlbumInfoAlbums = [] [get, private set]
bool IsLoaded [get, private set]
bool IsAuthenticated [get, private set]
bool IsSignedIn [get, private set]
bool IsLinkedToCurrentUser [get, private set]
bool IsOwner [get, private set]
string StatusMessage = "" [get, private set]
string CurrentUserLabel = "" [get, private set]
bool IsUploading [get, private set]
string LoginPassword = "" [get, set]
IReadOnlyList< FamilyAdminUserEffectiveAdminUsers [get]
PostEntryEditingPost [get, private set]
List< IBrowserFile > PendingFiles = new() [get, private set]
string NewAlbumName = "" [get, set]
string NewAlbumDesc = "" [get, set]

Private 멤버 함수

async Task RefreshCurrentUserAsync ()

정적 Private 멤버 함수

static bool IsOwnerUser (FamilyConfig config, FamilyCurrentUser user)
static bool IsAdminUser (FamilyConfig config, FamilyCurrentUser user)
static void EnsureAdminUser (FamilyConfig config, FamilyCurrentUser user, string role)
static IReadOnlyList< FamilyAdminUserBuildEffectiveAdminUsers (FamilyConfig config)

Private 속성

readonly IFamilyTenantStore _tenants
readonly IPostStore _posts
readonly IAlbumStore _albums
readonly IMediaService _media
readonly FamilyUserContext _userContext

상세한 설명

Family Admin View Model 기능과 관련 상태를 캡슐화합니다.

FamilyAdminViewModel.cs 파일의 17 번째 라인에서 정의되었습니다.

생성자 & 소멸자 문서화

◆ FamilyAdminViewModel()

FamiliesApp.ViewModels.FamilyAdminViewModel.FamilyAdminViewModel ( IFamilyTenantStore tenants,
IPostStore posts,
IAlbumStore albums,
IMediaService media,
FamilyUserContext userContext )
inline

지정한 설정으로 FamilyAdminViewModel 클래스의 새 인스턴스를 초기화합니다.

매개변수
tenantstenants에 사용할 IFamilyTenantStore 값입니다.
postsposts에 사용할 IPostStore 값입니다.
albumsalbums에 사용할 IAlbumStore 값입니다.
mediamedia에 사용할 IMediaService 값입니다.
userContextuser Context에 사용할 FamilyUserContext 값입니다.

FamilyAdminViewModel.cs 파일의 113 번째 라인에서 정의되었습니다.

115 {
116 _tenants = tenants;
117 _posts = posts;
118 _albums = albums;
119 _media = media;
120 _userContext = userContext;
121 }

다음을 참조함 : _albums, _media, _posts, _tenants, _userContext.

멤버 함수 문서화

◆ AddAlbumAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.AddAlbumAsync ( string slug,
CancellationToken ct = default )
inline

Album Async 항목을 추가합니다.

매개변수
slugslug에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Add Album Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 1150 번째 라인에서 정의되었습니다.

1151 {
1152 if (string.IsNullOrWhiteSpace(NewAlbumName)) { StatusMessage = "앨범 이름을 입력해주세요."; return; }
1153 try
1154 {
1155 var album = new AlbumInfo { Name = NewAlbumName.Trim(), Description = NewAlbumDesc.Trim() };
1156 await _albums.SaveAsync(slug, album, ct).ConfigureAwait(false);
1157 Albums = await _albums.GetAllAsync(slug, ct).ConfigureAwait(false);
1158 NewAlbumName = "";
1159 NewAlbumDesc = "";
1160 StatusMessage = "앨범이 추가되었습니다.";
1161 }
1162 catch (Exception ex) { StatusMessage = $"앨범 추가 오류: {ex.Message}"; }
1163 }

다음을 참조함 : _albums, Albums, NewAlbumDesc, NewAlbumName, StatusMessage.

◆ BuildEffectiveAdminUsers()

IReadOnlyList< FamilyAdminUser > FamiliesApp.ViewModels.FamilyAdminViewModel.BuildEffectiveAdminUsers ( FamilyConfig config)
inlinestaticprivate

Effective Admin Users 값을 구성합니다.

매개변수
configconfig에 사용할 FamilyConfig 값입니다.
반환값
Build Effective Admin Users 작업에서 생성한 IReadOnlyList<FamilyAdminUser> 결과입니다.

FamilyAdminViewModel.cs 파일의 720 번째 라인에서 정의되었습니다.

721 {
722 var result = new List<FamilyAdminUser>();
723 if (!string.IsNullOrWhiteSpace(config.OwnerUserId))
724 {
725 result.Add(new FamilyAdminUser
726 {
727 UserId = config.OwnerUserId,
728 Provider = config.OwnerProvider,
729 Email = config.OwnerEmail,
730 DisplayName = config.OwnerDisplayName,
731 Role = "Owner",
732 AddedAt = config.OwnerLinkedAt ?? DateTime.MinValue
733 });
734 }
735
736 foreach (var admin in config.AdminUsers)
737 {
738 var existing = result.FirstOrDefault(x =>
739 string.Equals(x.UserId, admin.UserId, StringComparison.Ordinal));
740 if (existing is null)
741 {
742 result.Add(admin);
743 }
744 else if (string.Equals(existing.Role, "Owner", StringComparison.OrdinalIgnoreCase))
745 {
746 existing.Provider = string.IsNullOrWhiteSpace(existing.Provider) ? admin.Provider : existing.Provider;
747 existing.Email = string.IsNullOrWhiteSpace(existing.Email) ? admin.Email : existing.Email;
748 existing.DisplayName = string.IsNullOrWhiteSpace(existing.DisplayName) ? admin.DisplayName : existing.DisplayName;
749 }
750 }
751
752 return result
753 .OrderBy(x => string.Equals(x.Role, "Owner", StringComparison.OrdinalIgnoreCase) ? 0 : 1)
754 .ThenBy(x => x.AddedAt)
755 .ToList();
756 }
List< FamilyAdminUser > AdminUsers

다음을 참조함 : FamiliesApp.Models.FamilyConfig.AdminUsers, FamiliesApp.Models.FamilyConfig.OwnerDisplayName, FamiliesApp.Models.FamilyConfig.OwnerEmail, FamiliesApp.Models.FamilyConfig.OwnerProvider, FamiliesApp.Models.FamilyConfig.OwnerUserId.

◆ CancelEdit()

void FamiliesApp.ViewModels.FamilyAdminViewModel.CancelEdit ( )
inline

Cancel Edit 조건을 확인합니다.

FamilyAdminViewModel.cs 파일의 840 번째 라인에서 정의되었습니다.

841 {
842 EditingPost = null;
843 PendingFiles.Clear();
844 }

다음을 참조함 : EditingPost, PendingFiles.

◆ DeleteAlbumAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.DeleteAlbumAsync ( string slug,
string albumId,
CancellationToken ct = default )
inline

Delete Album Async 작업을 수행합니다.

매개변수
slugslug에 사용할 string 값입니다.
albumIdalbum Id에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Delete Album Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 1205 번째 라인에서 정의되었습니다.

1206 {
1207 try
1208 {
1209 await _albums.DeleteAsync(slug, albumId, ct).ConfigureAwait(false);
1210 Albums = await _albums.GetAllAsync(slug, ct).ConfigureAwait(false);
1211 StatusMessage = "앨범이 삭제되었습니다.";
1212 }
1213 catch (Exception ex) { StatusMessage = $"앨범 삭제 오류: {ex.Message}"; }
1214 }

다음을 참조함 : _albums, Albums, StatusMessage.

◆ DeletePostAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.DeletePostAsync ( string slug,
string postId,
CancellationToken ct = default )
inline

Delete Post Async 작업을 수행합니다.

매개변수
slugslug에 사용할 string 값입니다.
postIdpost Id에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Delete Post Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 991 번째 라인에서 정의되었습니다.

992 {
993 try
994 {
995 await _posts.DeleteAsync(slug, postId, ct).ConfigureAwait(false);
996 Posts = await _posts.GetAllAsync(slug, ct).ConfigureAwait(false);
997 StatusMessage = "포스트가 삭제되었습니다.";
998 }
999 catch (Exception ex) { StatusMessage = $"삭제 오류: {ex.Message}"; }
1000 }

다음을 참조함 : _posts, Posts, StatusMessage.

◆ DeletePostMediaAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.DeletePostMediaAsync ( string slug,
string postId,
string fileName,
CancellationToken ct = default )
inline

Delete Post Media Async 작업을 수행합니다.

매개변수
slugslug에 사용할 string 값입니다.
postIdpost Id에 사용할 string 값입니다.
fileNamefile Name에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Delete Post Media Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 1050 번째 라인에서 정의되었습니다.

1051 {
1052 try
1053 {
1054 await _media.DeletePostMediaAsync(slug, postId, fileName, ct).ConfigureAwait(false);
1055 if (EditingPost is not null)
1056 {
1057 EditingPost.PhotoFileNames.Remove(fileName);
1058 EditingPost.VideoFileNames.Remove(fileName);
1059 }
1060 StatusMessage = "파일이 삭제되었습니다.";
1061 }
1062 catch (Exception ex) { StatusMessage = $"삭제 오류: {ex.Message}"; }
1063 }

다음을 참조함 : _media, EditingPost, StatusMessage.

◆ DeleteSelfAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.DeleteSelfAsync ( string slug,
CancellationToken ct = default )
inline

Delete Self Async 작업을 수행합니다.

매개변수
slugslug에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Delete Self Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 1248 번째 라인에서 정의되었습니다.

1249 {
1250 await _tenants.DeleteAsync(slug, ct).ConfigureAwait(false);
1251 }

다음을 참조함 : _tenants.

◆ EditPost()

void FamiliesApp.ViewModels.FamilyAdminViewModel.EditPost ( PostEntry post)
inline

Edit Post 작업을 수행합니다.

매개변수
postpost에 사용할 PostEntry 값입니다.

FamilyAdminViewModel.cs 파일의 825 번째 라인에서 정의되었습니다.

826 {
827 EditingPost = post;
828 PendingFiles.Clear();
829 StatusMessage = "";
830 }

다음을 참조함 : EditingPost, PendingFiles, StatusMessage.

◆ EnsureAdminUser()

void FamiliesApp.ViewModels.FamilyAdminViewModel.EnsureAdminUser ( FamilyConfig config,
FamilyCurrentUser user,
string role )
inlinestaticprivate

Ensure Admin User 작업을 수행합니다.

매개변수
configconfig에 사용할 FamilyConfig 값입니다.
useruser에 사용할 FamilyCurrentUser 값입니다.
rolerole에 사용할 string 값입니다.

FamilyAdminViewModel.cs 파일의 669 번째 라인에서 정의되었습니다.

670 {
671 var existing = config.AdminUsers.FirstOrDefault(x =>
672 string.Equals(x.UserId, user.Id, StringComparison.Ordinal));
673 if (existing is null)
674 {
675 config.AdminUsers.Add(new FamilyAdminUser
676 {
677 UserId = user.Id,
678 Provider = user.Provider,
679 Email = user.Email,
680 DisplayName = user.DisplayName,
681 Role = role,
682 AddedAt = DateTime.Now
683 });
684 return;
685 }
686
687 existing.Provider = user.Provider;
688 existing.Email = user.Email;
689 existing.DisplayName = user.DisplayName;
690 if (string.Equals(role, "Owner", StringComparison.OrdinalIgnoreCase))
691 {
692 existing.Role = "Owner";
693 }
694 }

다음을 참조함 : FamiliesApp.Models.FamilyConfig.AdminUsers, FamiliesApp.Services.FamilyCurrentUser().

다음에 의해서 참조됨 : LoginAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ GetCoverUrl()

string FamiliesApp.ViewModels.FamilyAdminViewModel.GetCoverUrl ( string slug,
string fileName )
inline

Cover Url 값을 가져옵니다.

매개변수
slugslug에 사용할 string 값입니다.
fileNamefile Name에 사용할 string 값입니다.
반환값
Get Cover Url 작업에서 생성한 string 결과입니다.

FamilyAdminViewModel.cs 파일의 1285 번째 라인에서 정의되었습니다.

1285=> _media.GetCoverUrl(slug, fileName);

다음을 참조함 : _media.

◆ GetMediaUrl()

string FamiliesApp.ViewModels.FamilyAdminViewModel.GetMediaUrl ( string slug,
string postId,
string fileName )
inline

Media Url 값을 가져옵니다.

매개변수
slugslug에 사용할 string 값입니다.
postIdpost Id에 사용할 string 값입니다.
fileNamefile Name에 사용할 string 값입니다.
반환값
Get Media Url 작업에서 생성한 string 결과입니다.

FamilyAdminViewModel.cs 파일의 1326 번째 라인에서 정의되었습니다.

1326=> _media.GetMediaUrl(slug, postId, fileName);

다음을 참조함 : _media.

◆ GetThumbUrl()

string FamiliesApp.ViewModels.FamilyAdminViewModel.GetThumbUrl ( string slug,
string postId,
string fileName )
inline

Thumb Url 값을 가져옵니다.

매개변수
slugslug에 사용할 string 값입니다.
postIdpost Id에 사용할 string 값입니다.
fileNamefile Name에 사용할 string 값입니다.
반환값
Get Thumb Url 작업에서 생성한 string 결과입니다.

FamilyAdminViewModel.cs 파일의 1367 번째 라인에서 정의되었습니다.

1367=> _media.GetThumbUrl(slug, postId, fileName);

다음을 참조함 : _media.

◆ InitializeAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.InitializeAsync ( string slug,
CancellationToken ct = default )
inline

Initialize Async 작업을 수행합니다.

매개변수
slugslug에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Initialize Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 410 번째 라인에서 정의되었습니다.

411 {
412 StatusMessage = "";
413 await RefreshCurrentUserAsync().ConfigureAwait(false);
414
415 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false);
416 if (config is null)
417 {
418 return;
419 }
420
421 var user = await _userContext.GetCurrentAsync().ConfigureAwait(false);
422 IsLinkedToCurrentUser = IsAdminUser(config, user);
423 IsOwner = IsOwnerUser(config, user);
424
425 if (IsLinkedToCurrentUser)
426 {
427 IsAuthenticated = true;
428 await LoadAsync(slug, ct).ConfigureAwait(false);
429 }
430 }

다음을 참조함 : _tenants, _userContext, IsAdminUser(), IsAuthenticated, IsLinkedToCurrentUser, IsOwner, IsOwnerUser(), LoadAsync(), RefreshCurrentUserAsync(), StatusMessage.

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ IsAdminUser()

bool FamiliesApp.ViewModels.FamilyAdminViewModel.IsAdminUser ( FamilyConfig config,
FamilyCurrentUser user )
inlinestaticprivate

Is Admin User 조건을 확인합니다.

매개변수
configconfig에 사용할 FamilyConfig 값입니다.
useruser에 사용할 FamilyCurrentUser 값입니다.
반환값
Is Admin User 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

FamilyAdminViewModel.cs 파일의 632 번째 라인에서 정의되었습니다.

632 =>
633 user.IsAuthenticated &&
634 (IsOwnerUser(config, user) ||
635 config.AdminUsers.Any(x => string.Equals(x.UserId, user.Id, StringComparison.Ordinal)));

다음을 참조함 : FamiliesApp.Services.FamilyCurrentUser().

다음에 의해서 참조됨 : InitializeAsync(), LoginAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ IsOwnerUser()

bool FamiliesApp.ViewModels.FamilyAdminViewModel.IsOwnerUser ( FamilyConfig config,
FamilyCurrentUser user )
inlinestaticprivate

Is Owner User 조건을 확인합니다.

매개변수
configconfig에 사용할 FamilyConfig 값입니다.
useruser에 사용할 FamilyCurrentUser 값입니다.
반환값
Is Owner User 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

FamilyAdminViewModel.cs 파일의 596 번째 라인에서 정의되었습니다.

596 =>
597 user.IsAuthenticated &&
598 string.Equals(config.OwnerUserId, user.Id, StringComparison.Ordinal);

다음을 참조함 : FamiliesApp.Services.FamilyCurrentUser().

다음에 의해서 참조됨 : InitializeAsync(), LoginAsync(), RemoveAdminAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ IsYouTube()

bool FamiliesApp.ViewModels.FamilyAdminViewModel.IsYouTube ( string url)
inlinestatic

Is You Tube 조건을 확인합니다.

매개변수
urlurl에 사용할 string 값입니다.
반환값
Is You Tube 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

FamilyAdminViewModel.cs 파일의 1393 번째 라인에서 정의되었습니다.

1393 =>
1394 url.Contains("youtube.com", StringComparison.OrdinalIgnoreCase) ||
1395 url.Contains("youtu.be/", StringComparison.OrdinalIgnoreCase);

◆ LoadAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.LoadAsync ( string slug,
CancellationToken ct = default )
inline

Async 데이터를 불러옵니다.

매개변수
slugslug에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Load Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 464 번째 라인에서 정의되었습니다.

465 {
466 Config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false)
467 ?? new FamilyConfig { Slug = slug };
468 Posts = await _posts.GetAllAsync(slug, ct).ConfigureAwait(false);
469 Albums = await _albums.GetAllAsync(slug, ct).ConfigureAwait(false);
470 IsLoaded = true;
471 }

다음을 참조함 : _albums, _posts, _tenants, Albums, Config, IsLoaded, Posts.

다음에 의해서 참조됨 : InitializeAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ LoginAsync()

async Task< bool > FamiliesApp.ViewModels.FamilyAdminViewModel.LoginAsync ( string slug,
CancellationToken ct = default )
inline

Login Async 작업을 수행합니다.

매개변수
slugslug에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Login Async 작업에서 생성한 Task<bool> 결과입니다.

FamilyAdminViewModel.cs 파일의 314 번째 라인에서 정의되었습니다.

315 {
316 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false);
317 if (config is null) { StatusMessage = "존재하지 않는 슬러그입니다."; return false; }
318
319 var user = await _userContext.GetCurrentAsync().ConfigureAwait(false);
320 await RefreshCurrentUserAsync().ConfigureAwait(false);
321
322 if (IsAdminUser(config, user))
323 {
324 IsAuthenticated = true;
325 IsLinkedToCurrentUser = true;
326 IsOwner = IsOwnerUser(config, user);
327 StatusMessage = "";
328 return true;
329 }
330
331 var verification = DreaminePasswordHasher.VerifyPassword(LoginPassword, config.PasswordHash, out var upgradedHash);
332 IsAuthenticated = verification is not PasswordHashVerificationResult.Failed;
333 if (!IsAuthenticated)
334 {
335 StatusMessage = "비밀번호가 틀렸습니다.";
336 return false;
337 }
338
339 if (verification is PasswordHashVerificationResult.SuccessRehashNeeded && upgradedHash is not null)
340 {
341 config.PasswordHash = upgradedHash;
342 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
343 }
344
345 if (user.IsAuthenticated && string.IsNullOrWhiteSpace(config.OwnerUserId))
346 {
347 config.OwnerUserId = user.Id;
348 config.OwnerProvider = user.Provider;
349 config.OwnerEmail = user.Email;
350 config.OwnerDisplayName = user.DisplayName;
351 config.OwnerLinkedAt = DateTime.Now;
352 EnsureAdminUser(config, user, "Owner");
353 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
354 IsLinkedToCurrentUser = true;
355 IsOwner = true;
356 StatusMessage = "CodeMaru/Dreamine 계정에 연결되었습니다. 다음부터는 공용 로그인으로 관리할 수 있습니다.";
357 }
358 else if (user.IsAuthenticated)
359 {
360 EnsureAdminUser(config, user, "Admin");
361 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
362 IsLinkedToCurrentUser = true;
363 IsOwner = IsOwnerUser(config, user);
364 StatusMessage = "현재 CodeMaru/Dreamine 계정이 이 가족 앨범의 관리자로 추가되었습니다.";
365 }
366 else if (!user.IsAuthenticated && string.IsNullOrWhiteSpace(config.OwnerUserId))
367 {
368 StatusMessage = "로그인은 성공했습니다. 공용 계정에 연결하려면 먼저 CodeMaru/Dreamine 로그인을 해주세요.";
369 }
370 else
371 {
372 StatusMessage = "";
373 }
374
375 return IsAuthenticated;
376 }

다음을 참조함 : _tenants, _userContext, EnsureAdminUser(), IsAdminUser(), IsAuthenticated, IsLinkedToCurrentUser, IsOwner, IsOwnerUser(), LoginPassword, RefreshCurrentUserAsync(), StatusMessage.

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ NewPost()

void FamiliesApp.ViewModels.FamilyAdminViewModel.NewPost ( )
inline

New Post 작업을 수행합니다.

FamilyAdminViewModel.cs 파일의 802 번째 라인에서 정의되었습니다.

803 {
804 EditingPost = new PostEntry { PostedAt = DateTime.Now };
805 PendingFiles.Clear();
806 StatusMessage = "";
807 }

다음을 참조함 : EditingPost, PendingFiles, StatusMessage.

◆ RefreshCurrentUserAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.RefreshCurrentUserAsync ( )
inlineprivate

Refresh Current User Async 작업을 수행합니다.

반환값
Refresh Current User Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 553 번째 라인에서 정의되었습니다.

554 {
555 var user = await _userContext.GetCurrentAsync().ConfigureAwait(false);
556 IsSignedIn = user.IsAuthenticated;
557 CurrentUserLabel = user.IsAuthenticated
558 ? string.IsNullOrWhiteSpace(user.DisplayName)
559 ? user.Provider
560 : $"{user.DisplayName} ({user.Provider})"
561 : "";
562 }

다음을 참조함 : _userContext, CurrentUserLabel, IsSignedIn.

다음에 의해서 참조됨 : InitializeAsync(), LoginAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ RemoveAdminAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.RemoveAdminAsync ( string userId,
CancellationToken ct = default )
inline

Admin Async 항목을 제거합니다.

매개변수
userIduser Id에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Remove Admin Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 505 번째 라인에서 정의되었습니다.

506 {
507 if (Config is null || string.IsNullOrWhiteSpace(userId))
508 {
509 return;
510 }
511
512 var user = await _userContext.GetCurrentAsync().ConfigureAwait(false);
513 if (!IsOwnerUser(Config, user))
514 {
515 StatusMessage = "대표 관리자만 관리자를 삭제할 수 있습니다.";
516 return;
517 }
518
519 if (string.Equals(Config.OwnerUserId, userId, StringComparison.Ordinal))
520 {
521 StatusMessage = "대표 관리자는 삭제할 수 없습니다.";
522 return;
523 }
524
525 var removed = Config.AdminUsers.RemoveAll(x =>
526 string.Equals(x.UserId, userId, StringComparison.Ordinal)) > 0;
527 if (!removed)
528 {
529 StatusMessage = "삭제할 관리자를 찾을 수 없습니다.";
530 return;
531 }
532
533 await _tenants.SaveAsync(Config, ct).ConfigureAwait(false);
534 StatusMessage = "관리자가 삭제되었습니다.";
535 }

다음을 참조함 : _tenants, _userContext, Config, IsOwnerUser(), StatusMessage.

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ SaveConfigAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.SaveConfigAsync ( CancellationToken ct = default)
inline

Config Async 데이터를 저장합니다.

매개변수
ct취소 요청을 감시하는 토큰입니다.
반환값
Save Config Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 782 번째 라인에서 정의되었습니다.

783 {
784 if (Config is null) return;
785 try
786 {
787 Config.PasswordHash = DreaminePasswordHasher.HashPlainTextForStorage(Config.PasswordHash);
788 await _tenants.SaveAsync(Config, ct).ConfigureAwait(false);
789 StatusMessage = "설정이 저장되었습니다.";
790 }
791 catch (Exception ex) { StatusMessage = $"저장 오류: {ex.Message}"; }
792 }

다음을 참조함 : _tenants, Config, StatusMessage.

◆ SavePostAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.SavePostAsync ( string slug,
CancellationToken ct = default )
inline

Post Async 데이터를 저장합니다.

매개변수
slugslug에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Save Post Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 933 번째 라인에서 정의되었습니다.

934 {
935 if (EditingPost is null) return;
936 // 혹시 아직 대기 중인 파일이 있으면 먼저 업로드
937 if (PendingFiles.Count > 0)
938 await UploadPendingFilesAsync(slug, ct).ConfigureAwait(false);
939 IsUploading = true;
940 try
941 {
942 await _posts.SaveAsync(slug, EditingPost, ct).ConfigureAwait(false);
943 Posts = await _posts.GetAllAsync(slug, ct).ConfigureAwait(false);
944 EditingPost = null;
945 StatusMessage = "포스트가 저장되었습니다. ✅";
946 }
947 catch (Exception ex) { StatusMessage = $"저장 오류: {ex.Message}"; }
948 finally { IsUploading = false; }
949 }

다음을 참조함 : _posts, EditingPost, IsUploading, PendingFiles, Posts, StatusMessage, UploadPendingFilesAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ UploadCoverAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.UploadCoverAsync ( string slug,
IBrowserFile file,
CancellationToken ct = default )
inline

Upload Cover Async 작업을 수행합니다.

매개변수
slugslug에 사용할 string 값입니다.
filefile에 사용할 IBrowserFile 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Upload Cover Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 1105 번째 라인에서 정의되었습니다.

1106 {
1107 IsUploading = true;
1108 try
1109 {
1110 await _media.UploadCoverAsync(slug, file, ct).ConfigureAwait(false);
1111 Config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false);
1112 StatusMessage = "커버 이미지가 업로드되었습니다.";
1113 }
1114 catch (Exception ex) { StatusMessage = $"업로드 오류: {ex.Message}"; }
1115 finally { IsUploading = false; }
1116 }

다음을 참조함 : _media, _tenants, Config, IsUploading, StatusMessage.

◆ UploadPendingFilesAsync()

async Task FamiliesApp.ViewModels.FamilyAdminViewModel.UploadPendingFilesAsync ( string slug,
CancellationToken ct = default )
inline

Upload Pending Files Async 작업을 수행합니다.

매개변수
slugslug에 사용할 string 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Upload Pending Files Async 작업에서 생성한 Task 결과입니다.

FamilyAdminViewModel.cs 파일의 879 번째 라인에서 정의되었습니다.

880 {
881 if (EditingPost is null || PendingFiles.Count == 0) return;
882 IsUploading = true;
883 try
884 {
885 foreach (var file in PendingFiles)
886 {
887 var fn = await _media.UploadPostMediaAsync(slug, EditingPost.Id, file, ct).ConfigureAwait(false);
888 var ext = Path.GetExtension(fn).ToLowerInvariant();
889 if (ext is ".mp4" or ".webm" or ".mov" or ".m4v")
890 EditingPost.VideoFileNames.Add(fn);
891 else
892 EditingPost.PhotoFileNames.Add(fn);
893 }
894 PendingFiles.Clear();
895 StatusMessage = "파일이 추가되었습니다.";
896 }
897 catch (Exception ex) { StatusMessage = $"업로드 오류: {ex.Message}"; }
898 finally { IsUploading = false; }
899 }

다음을 참조함 : _media, EditingPost, IsUploading, PendingFiles, StatusMessage.

다음에 의해서 참조됨 : SavePostAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ _albums

readonly IAlbumStore FamiliesApp.ViewModels.FamilyAdminViewModel._albums
private

albums 값을 보관합니다.

FamilyAdminViewModel.cs 파일의 45 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AddAlbumAsync(), DeleteAlbumAsync(), FamilyAdminViewModel(), LoadAsync().

◆ _media

readonly IMediaService FamiliesApp.ViewModels.FamilyAdminViewModel._media
private

media 값을 보관합니다.

FamilyAdminViewModel.cs 파일의 54 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : DeletePostMediaAsync(), FamilyAdminViewModel(), GetCoverUrl(), GetMediaUrl(), GetThumbUrl(), UploadCoverAsync(), UploadPendingFilesAsync().

◆ _posts

readonly IPostStore FamiliesApp.ViewModels.FamilyAdminViewModel._posts
private

posts 값을 보관합니다.

FamilyAdminViewModel.cs 파일의 36 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : DeletePostAsync(), FamilyAdminViewModel(), LoadAsync(), SavePostAsync().

◆ _tenants

readonly IFamilyTenantStore FamiliesApp.ViewModels.FamilyAdminViewModel._tenants
private

tenants 값을 보관합니다.

FamilyAdminViewModel.cs 파일의 27 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : DeleteSelfAsync(), FamilyAdminViewModel(), InitializeAsync(), LoadAsync(), LoginAsync(), RemoveAdminAsync(), SaveConfigAsync(), UploadCoverAsync().

◆ _userContext

readonly FamilyUserContext FamiliesApp.ViewModels.FamilyAdminViewModel._userContext
private

user Context 값을 보관합니다.

FamilyAdminViewModel.cs 파일의 63 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : FamilyAdminViewModel(), InitializeAsync(), LoginAsync(), RefreshCurrentUserAsync(), RemoveAdminAsync().

속성 문서화

◆ Albums

IReadOnlyList<AlbumInfo> FamiliesApp.ViewModels.FamilyAdminViewModel.Albums = []
getprivate set

Albums 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 149 번째 라인에서 정의되었습니다.

149{ get; private set; } = [];

다음에 의해서 참조됨 : AddAlbumAsync(), DeleteAlbumAsync(), LoadAsync().

◆ Config

FamilyConfig? FamiliesApp.ViewModels.FamilyAdminViewModel.Config
getprivate set

Config 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 131 번째 라인에서 정의되었습니다.

131{ get; private set; }

다음에 의해서 참조됨 : LoadAsync(), RemoveAdminAsync(), SaveConfigAsync(), UploadCoverAsync().

◆ CurrentUserLabel

string FamiliesApp.ViewModels.FamilyAdminViewModel.CurrentUserLabel = ""
getprivate set

Current User Label 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 212 번째 라인에서 정의되었습니다.

212{ get; private set; } = "";

다음에 의해서 참조됨 : RefreshCurrentUserAsync().

◆ EditingPost

PostEntry? FamiliesApp.ViewModels.FamilyAdminViewModel.EditingPost
getprivate set

Editing Post 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 251 번째 라인에서 정의되었습니다.

251{ get; private set; }

다음에 의해서 참조됨 : CancelEdit(), DeletePostMediaAsync(), EditPost(), NewPost(), SavePostAsync(), UploadPendingFilesAsync().

◆ EffectiveAdminUsers

IReadOnlyList<FamilyAdminUser> FamiliesApp.ViewModels.FamilyAdminViewModel.EffectiveAdminUsers
get

Effective Admin Users 값을 가져옵니다.

FamilyAdminViewModel.cs 파일의 239 번째 라인에서 정의되었습니다.

◆ IsAuthenticated

bool FamiliesApp.ViewModels.FamilyAdminViewModel.IsAuthenticated
getprivate set

Is Authenticated 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 167 번째 라인에서 정의되었습니다.

167{ get; private set; }

다음에 의해서 참조됨 : InitializeAsync(), LoginAsync().

◆ IsLinkedToCurrentUser

bool FamiliesApp.ViewModels.FamilyAdminViewModel.IsLinkedToCurrentUser
getprivate set

Is Linked To Current User 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 185 번째 라인에서 정의되었습니다.

185{ get; private set; }

다음에 의해서 참조됨 : InitializeAsync(), LoginAsync().

◆ IsLoaded

bool FamiliesApp.ViewModels.FamilyAdminViewModel.IsLoaded
getprivate set

Is Loaded 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 158 번째 라인에서 정의되었습니다.

158{ get; private set; }

다음에 의해서 참조됨 : LoadAsync().

◆ IsOwner

bool FamiliesApp.ViewModels.FamilyAdminViewModel.IsOwner
getprivate set

Is Owner 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 194 번째 라인에서 정의되었습니다.

194{ get; private set; }

다음에 의해서 참조됨 : InitializeAsync(), LoginAsync().

◆ IsSignedIn

bool FamiliesApp.ViewModels.FamilyAdminViewModel.IsSignedIn
getprivate set

Is Signed In 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 176 번째 라인에서 정의되었습니다.

176{ get; private set; }

다음에 의해서 참조됨 : RefreshCurrentUserAsync().

◆ IsUploading

bool FamiliesApp.ViewModels.FamilyAdminViewModel.IsUploading
getprivate set

Is Uploading 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 221 번째 라인에서 정의되었습니다.

221{ get; private set; }

다음에 의해서 참조됨 : SavePostAsync(), UploadCoverAsync(), UploadPendingFilesAsync().

◆ LoginPassword

string FamiliesApp.ViewModels.FamilyAdminViewModel.LoginPassword = ""
getset

Login Password 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 230 번째 라인에서 정의되었습니다.

230{ get; set; } = "";

다음에 의해서 참조됨 : LoginAsync().

◆ NewAlbumDesc

string FamiliesApp.ViewModels.FamilyAdminViewModel.NewAlbumDesc = ""
getset

New Album Desc 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 280 번째 라인에서 정의되었습니다.

280{ get; set; } = "";

다음에 의해서 참조됨 : AddAlbumAsync().

◆ NewAlbumName

string FamiliesApp.ViewModels.FamilyAdminViewModel.NewAlbumName = ""
getset

New Album Name 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 271 번째 라인에서 정의되었습니다.

271{ get; set; } = "";

다음에 의해서 참조됨 : AddAlbumAsync().

◆ PendingFiles

List<IBrowserFile> FamiliesApp.ViewModels.FamilyAdminViewModel.PendingFiles = new()
getprivate set

Pending Files 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 260 번째 라인에서 정의되었습니다.

260{ get; private set; } = new();

다음에 의해서 참조됨 : CancelEdit(), EditPost(), NewPost(), SavePostAsync(), UploadPendingFilesAsync().

◆ Posts

IReadOnlyList<PostEntry> FamiliesApp.ViewModels.FamilyAdminViewModel.Posts = []
getprivate set

Posts 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 140 번째 라인에서 정의되었습니다.

140{ get; private set; } = [];

다음에 의해서 참조됨 : DeletePostAsync(), LoadAsync(), SavePostAsync().

◆ StatusMessage

string FamiliesApp.ViewModels.FamilyAdminViewModel.StatusMessage = ""
getprivate set

Status Message 값을 가져오거나 설정합니다.

FamilyAdminViewModel.cs 파일의 203 번째 라인에서 정의되었습니다.

203{ get; private set; } = "";

다음에 의해서 참조됨 : AddAlbumAsync(), DeleteAlbumAsync(), DeletePostAsync(), DeletePostMediaAsync(), EditPost(), InitializeAsync(), LoginAsync(), NewPost(), RemoveAdminAsync(), SaveConfigAsync(), SavePostAsync(), UploadCoverAsync(), UploadPendingFilesAsync().


이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: