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

더 자세히 ...

FamiliesApp.Services.JsonPostStore에 대한 상속 다이어그램 :
FamiliesApp.Services.JsonPostStore에 대한 협력 다이어그램:

Public 멤버 함수

 JsonPostStore (IFamilyTenantStore tenants)
async Task< PostEntry?> GetAsync (string slug, string postId, CancellationToken ct=default)
async Task< IReadOnlyList< PostEntry > > GetAllAsync (string slug, CancellationToken ct=default)
async Task<(IReadOnlyList< PostEntry > Items, int TotalCount)> GetPageAsync (string slug, int page, int pageSize, CancellationToken ct=default)
async Task< IReadOnlyList< PostEntry > > GetByAlbumAsync (string slug, string albumId, CancellationToken ct=default)
async Task<(IReadOnlyList< PostEntry > Items, int TotalCount)> GetByAlbumPageAsync (string slug, string albumId, int page, int pageSize, CancellationToken ct=default)
async Task SaveAsync (string slug, PostEntry post, CancellationToken ct=default)
Task DeleteAsync (string slug, string postId, CancellationToken ct=default)

Private 멤버 함수

string PostsDir (string slug)
string PostPath (string slug, string postId)

정적 Private 멤버 함수

static string Sanitize (string id)

Private 속성

readonly IFamilyTenantStore _tenants

정적 Private 속성

static readonly SemaphoreSlim _gate = new(1, 1)
static readonly JsonSerializerOptions _jsonOpts

상세한 설명

Json Post Store 기능과 관련 상태를 캡슐화합니다.

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

생성자 & 소멸자 문서화

◆ JsonPostStore()

FamiliesApp.Services.JsonPostStore.JsonPostStore ( IFamilyTenantStore tenants)
inline

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

매개변수
tenantstenants에 사용할 IFamilyTenantStore 값입니다.

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

68=> _tenants = tenants;

다음을 참조함 : _tenants.

멤버 함수 문서화

◆ DeleteAsync()

Task FamiliesApp.Services.JsonPostStore.DeleteAsync ( string slug,
string postId,
CancellationToken ct = default )
inline

Delete Async 작업을 수행합니다.

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

FamiliesApp.Services.IPostStore를 구현.

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

507 {
508 var path = PostPath(slug, postId);
509 if (File.Exists(path)) File.Delete(path);
510
511 var mediaDir = Path.Combine(_tenants.GetTenantDataPath(slug), "media", postId);
512 if (Directory.Exists(mediaDir)) Directory.Delete(mediaDir, recursive: true);
513
514 return Task.CompletedTask;
515 }

다음을 참조함 : _tenants, PostPath().

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

◆ GetAllAsync()

async Task< IReadOnlyList< PostEntry > > FamiliesApp.Services.JsonPostStore.GetAllAsync ( string slug,
CancellationToken ct = default )
inline

All Async 값을 가져옵니다.

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

FamiliesApp.Services.IPostStore를 구현.

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

219 {
220 var dir = PostsDir(slug);
221 if (!Directory.Exists(dir)) return [];
222
223 var list = new List<PostEntry>();
224 foreach (var file in Directory.GetFiles(dir, "*.json"))
225 {
226 await _gate.WaitAsync(ct).ConfigureAwait(false);
227 try
228 {
229 await using var fs = File.OpenRead(file);
230 var p = await JsonSerializer.DeserializeAsync<PostEntry>(fs, _jsonOpts, ct).ConfigureAwait(false);
231 if (p != null) list.Add(p);
232 }
233 catch { /* 깨진 파일 하나로 전체 목록이 죽지 않도록 */ }
234 finally { _gate.Release(); }
235 }
236 return list.OrderByDescending(p => p.IsPinned).ThenByDescending(p => p.PostedAt).ToList();
237 }

다음을 참조함 : _gate, _jsonOpts, PostsDir().

다음에 의해서 참조됨 : GetByAlbumAsync(), GetPageAsync().

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

◆ GetAsync()

async Task< PostEntry?> FamiliesApp.Services.JsonPostStore.GetAsync ( string slug,
string postId,
CancellationToken ct = default )
inline

Async 값을 가져옵니다.

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

FamiliesApp.Services.IPostStore를 구현.

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

173 {
174 var path = PostPath(slug, postId);
175 if (!File.Exists(path)) return null;
176
177 await _gate.WaitAsync(ct).ConfigureAwait(false);
178 try
179 {
180 await using var fs = File.OpenRead(path);
181 return await JsonSerializer.DeserializeAsync<PostEntry>(fs, _jsonOpts, ct).ConfigureAwait(false);
182 }
183 finally { _gate.Release(); }
184 }

다음을 참조함 : _gate, _jsonOpts, PostPath().

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

◆ GetByAlbumAsync()

async Task< IReadOnlyList< PostEntry > > FamiliesApp.Services.JsonPostStore.GetByAlbumAsync ( string slug,
string albumId,
CancellationToken ct = default )
inline

By Album Async 값을 가져옵니다.

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

FamiliesApp.Services.IPostStore를 구현.

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

336 {
337 var all = await GetAllAsync(slug, ct).ConfigureAwait(false);
338 return all.Where(p => p.AlbumId == albumId).ToList();
339 }

다음을 참조함 : GetAllAsync().

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

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

◆ GetByAlbumPageAsync()

async Task<(IReadOnlyList< PostEntry > Items, int TotalCount)> FamiliesApp.Services.JsonPostStore.GetByAlbumPageAsync ( string slug,
string albumId,
int page,
int pageSize,
CancellationToken ct = default )
inline

By Album Page Async 값을 가져옵니다.

매개변수
slugslug에 사용할 string 값입니다.
albumIdalbum Id에 사용할 string 값입니다.
pagepage에 사용할 int 값입니다.
pageSizepage Size에 사용할 int 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Get By Album Page Async 작업에서 생성한 Task<(IReadOnlyList<PostEntry> Items, int TotalCount)> 결과입니다.

FamiliesApp.Services.IPostStore를 구현.

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

399 {
400 var filtered = await GetByAlbumAsync(slug, albumId, ct).ConfigureAwait(false);
401 var items = filtered.Skip((page - 1) * pageSize).Take(pageSize).ToList();
402 return (items, filtered.Count);
403 }

다음을 참조함 : GetByAlbumAsync().

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

◆ GetPageAsync()

async Task<(IReadOnlyList< PostEntry > Items, int TotalCount)> FamiliesApp.Services.JsonPostStore.GetPageAsync ( string slug,
int page,
int pageSize,
CancellationToken ct = default )
inline

Page Async 값을 가져옵니다.

매개변수
slugslug에 사용할 string 값입니다.
pagepage에 사용할 int 값입니다.
pageSizepage Size에 사용할 int 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Get Page Async 작업에서 생성한 Task<(IReadOnlyList<PostEntry> Items, int TotalCount)> 결과입니다.

FamiliesApp.Services.IPostStore를 구현.

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

289 {
290 var all = await GetAllAsync(slug, ct).ConfigureAwait(false);
291 var items = all.Skip((page - 1) * pageSize).Take(pageSize).ToList();
292 return (items, all.Count);
293 }

다음을 참조함 : GetAllAsync().

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

◆ PostPath()

string FamiliesApp.Services.JsonPostStore.PostPath ( string slug,
string postId )
inlineprivate

Post Path 작업을 수행합니다.

매개변수
slugslug에 사용할 string 값입니다.
postIdpost Id에 사용할 string 값입니다.
반환값
Post Path 작업에서 생성한 string 결과입니다.

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

129 =>
130 Path.Combine(PostsDir(slug), $"{Sanitize(postId)}.json");

다음에 의해서 참조됨 : DeleteAsync(), GetAsync(), SaveAsync().

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

◆ PostsDir()

string FamiliesApp.Services.JsonPostStore.PostsDir ( string slug)
inlineprivate

Posts Dir 작업을 수행합니다.

매개변수
slugslug에 사용할 string 값입니다.
반환값
Posts Dir 작업에서 생성한 string 결과입니다.

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

94 =>
95 Path.Combine(_tenants.GetTenantDataPath(slug), "posts");

다음을 참조함 : _tenants.

다음에 의해서 참조됨 : GetAllAsync(), SaveAsync().

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

◆ Sanitize()

string FamiliesApp.Services.JsonPostStore.Sanitize ( string id)
inlinestaticprivate

Sanitize 작업을 수행합니다.

매개변수
idid에 사용할 string 값입니다.
반환값
Sanitize 작업에서 생성한 string 결과입니다.

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

541 =>
542 string.Concat(id.Split(Path.GetInvalidFileNameChars()));

◆ SaveAsync()

async Task FamiliesApp.Services.JsonPostStore.SaveAsync ( string slug,
PostEntry post,
CancellationToken ct = default )
inline

Async 데이터를 저장합니다.

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

FamiliesApp.Services.IPostStore를 구현.

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

446 {
447 var dir = PostsDir(slug);
448 Directory.CreateDirectory(dir);
449 Directory.CreateDirectory(Path.Combine(_tenants.GetTenantDataPath(slug), "media", post.Id));
450
451 var path = PostPath(slug, post.Id);
452 var tmp = path + ".tmp";
453
454 await _gate.WaitAsync(ct).ConfigureAwait(false);
455 try
456 {
457 await using (var fs = File.Create(tmp))
458 await JsonSerializer.SerializeAsync(fs, post, _jsonOpts, ct).ConfigureAwait(false);
459
460 File.Copy(tmp, path, overwrite: true);
461 File.Delete(tmp);
462 }
463 finally { _gate.Release(); }
464 }

다음을 참조함 : _gate, _jsonOpts, _tenants, FamiliesApp.Models.PostEntry.Id, PostPath(), PostsDir().

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

멤버 데이터 문서화

◆ _gate

readonly SemaphoreSlim FamiliesApp.Services.JsonPostStore._gate = new(1, 1)
staticprivate

gate 값을 보관합니다.

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

다음에 의해서 참조됨 : GetAllAsync(), GetAsync(), SaveAsync().

◆ _jsonOpts

readonly JsonSerializerOptions FamiliesApp.Services.JsonPostStore._jsonOpts
staticprivate
초기값:
= new()
{
WriteIndented = true,
PropertyNameCaseInsensitive = true,
Converters = { new JsonStringEnumConverter() }
}

json Opts 값을 보관합니다.

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

46 {
47 WriteIndented = true,
48 PropertyNameCaseInsensitive = true,
49 Converters = { new JsonStringEnumConverter() }
50 };

다음에 의해서 참조됨 : GetAllAsync(), GetAsync(), SaveAsync().

◆ _tenants

readonly IFamilyTenantStore FamiliesApp.Services.JsonPostStore._tenants
private

tenants 값을 보관합니다.

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

다음에 의해서 참조됨 : DeleteAsync(), JsonPostStore(), PostsDir(), SaveAsync().


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