WeddingThankYou 1.0.0.0
결혼식 이후 감사 인사와 사진, 계좌 안내, 연락처를 모바일 페이지로 전달하는 감사장 서비스입니다.
로딩중...
검색중...
일치하는것 없음
WeddingThankYou.Services.JsonTenantStore 클래스 참조sealed
WeddingThankYou.Services.JsonTenantStore에 대한 상속 다이어그램 :
WeddingThankYou.Services.JsonTenantStore에 대한 협력 다이어그램:

Public 멤버 함수

 JsonTenantStore (WeddingOptions opts)
string GetTenantDataPath (string slug)
async Task< TenantConfig?> GetAsync (string slug, CancellationToken ct=default)
async Task< IReadOnlyList< TenantConfig > > GetAllAsync (CancellationToken ct=default)
async Task SaveAsync (TenantConfig config, CancellationToken ct=default)
Task< bool > ExistsAsync (string slug, CancellationToken ct=default)
Task DeleteAsync (string slug, CancellationToken ct=default)

Private 멤버 함수

string ConfigPath (string slug)

정적 Private 멤버 함수

static string Sanitize (string slug)
static async Task< TenantConfig?> ReadTenantAsync (string path, CancellationToken ct)
static void LogLegacyLayoutModeFallback (string path, string json)
static ? string TryGetDesignLayoutMode (string json)
static bool TryGetProperty (JsonElement element, string name, out JsonElement value)
static bool IsCanonicalLayoutMode (string? value)
static void LogTenantReadError (string path, JsonException ex)

Private 속성

readonly string _dataRoot

정적 Private 속성

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

상세한 설명

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

생성자 & 소멸자 문서화

◆ JsonTenantStore()

WeddingThankYou.Services.JsonTenantStore.JsonTenantStore ( WeddingOptions opts)
inline

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

매개변수
optsopts에 사용할 WeddingOptions 값입니다.

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

74 {
75 _dataRoot = opts.ResolvedDataPath;
76 Directory.CreateDirectory(_dataRoot);
77 }

다음을 참조함 : _dataRoot, WeddingThankYou.Services.WeddingOptions.ResolvedDataPath.

멤버 함수 문서화

◆ ConfigPath()

string WeddingThankYou.Services.JsonTenantStore.ConfigPath ( string slug)
inlineprivate

Config Path 작업을 수행합니다.

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

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

351 =>
352 Path.Combine(GetTenantDataPath(slug), "config.json");

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

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

◆ DeleteAsync()

Task WeddingThankYou.Services.JsonTenantStore.DeleteAsync ( string slug,
CancellationToken ct = default )
inline

Delete Async 작업을 수행합니다.

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

WeddingThankYou.Services.ITenantStore를 구현.

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

320 {
321 var dir = GetTenantDataPath(slug);
322 if (Directory.Exists(dir))
323 Directory.Delete(dir, recursive: true);
324 return Task.CompletedTask;
325 }

다음을 참조함 : GetTenantDataPath().

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

◆ ExistsAsync()

Task< bool > WeddingThankYou.Services.JsonTenantStore.ExistsAsync ( string slug,
CancellationToken ct = default )
inline

Exists Async 작업을 수행합니다.

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

WeddingThankYou.Services.ITenantStore를 구현.

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

284 =>
285 Task.FromResult(File.Exists(ConfigPath(slug)));

다음을 참조함 : ConfigPath().

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

◆ GetAllAsync()

async Task< IReadOnlyList< TenantConfig > > WeddingThankYou.Services.JsonTenantStore.GetAllAsync ( CancellationToken ct = default)
inline

All Async 값을 가져옵니다.

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

WeddingThankYou.Services.ITenantStore를 구현.

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

176 {
177 var list = new List<TenantConfig>();
178 if (!Directory.Exists(_dataRoot)) return list;
179
180 foreach (var dir in Directory.GetDirectories(_dataRoot))
181 {
182 var cfg = Path.Combine(dir, "config.json");
183 if (!File.Exists(cfg)) continue;
184
185 await _gate.WaitAsync(ct).ConfigureAwait(false);
186 try
187 {
188 var t = await ReadTenantAsync(cfg, ct).ConfigureAwait(false);
189 if (t != null) list.Add(t);
190 }
191 catch (JsonException ex)
192 {
193 LogTenantReadError(cfg, ex);
194 }
195 finally { _gate.Release(); }
196 }
197 return list;
198 }

다음을 참조함 : _dataRoot, _gate, LogTenantReadError(), ReadTenantAsync().

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

◆ GetAsync()

async Task< TenantConfig?> WeddingThankYou.Services.JsonTenantStore.GetAsync ( string slug,
CancellationToken ct = default )
inline

Async 값을 가져옵니다.

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

WeddingThankYou.Services.ITenantStore를 구현.

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

139 {
140 var path = ConfigPath(slug);
141 if (!File.Exists(path)) return null;
142
143 await _gate.WaitAsync(ct).ConfigureAwait(false);
144 try
145 {
146 return await ReadTenantAsync(path, ct).ConfigureAwait(false);
147 }
148 finally { _gate.Release(); }
149 }

다음을 참조함 : _gate, ConfigPath(), ReadTenantAsync().

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

◆ GetTenantDataPath()

string WeddingThankYou.Services.JsonTenantStore.GetTenantDataPath ( string slug)
inline

Tenant Data Path 값을 가져옵니다.

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

WeddingThankYou.Services.ITenantStore를 구현.

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

103 =>
104 Path.Combine(_dataRoot, Sanitize(slug));

다음을 참조함 : _dataRoot.

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

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

◆ IsCanonicalLayoutMode()

bool WeddingThankYou.Services.JsonTenantStore.IsCanonicalLayoutMode ( string? value)
inlinestaticprivate

Is Canonical Layout Mode 조건을 확인합니다.

매개변수
value적용할 값입니다.
반환값
Is Canonical Layout Mode 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

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

577 =>
578 value is not null
579 && (string.Equals(value, "WebPage", StringComparison.Ordinal)
580 || string.Equals(value, "TabMenu", StringComparison.Ordinal)
581 || string.Equals(value, "Gallery", StringComparison.Ordinal)
582 || string.Equals(value, "Story", StringComparison.Ordinal)
583 || string.Equals(value, "Card", StringComparison.Ordinal)
584 || string.Equals(value, "PhotoBook", StringComparison.Ordinal));

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

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

◆ LogLegacyLayoutModeFallback()

void WeddingThankYou.Services.JsonTenantStore.LogLegacyLayoutModeFallback ( string path,
string json )
inlinestaticprivate

Log Legacy Layout Mode Fallback 작업을 수행합니다.

매개변수
pathpath에 사용할 string 값입니다.
jsonjson에 사용할 string 값입니다.

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

445 {
446 var raw = TryGetDesignLayoutMode(json);
447 if (raw is null || IsCanonicalLayoutMode(raw)) return;
448
449 Console.Error.WriteLine($"[JsonTenantStore] Legacy DesignSettings.LayoutMode '{raw}' in '{path}' was loaded with compatibility fallback.");
450 }

다음을 참조함 : IsCanonicalLayoutMode(), TryGetDesignLayoutMode().

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

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

◆ LogTenantReadError()

void WeddingThankYou.Services.JsonTenantStore.LogTenantReadError ( string path,
JsonException ex )
inlinestaticprivate

Log Tenant Read Error 작업을 수행합니다.

매개변수
pathpath에 사용할 string 값입니다.
exex에 사용할 JsonException 값입니다.

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

611 {
612 Console.Error.WriteLine($"[JsonTenantStore] Skipped invalid tenant JSON '{path}': {ex.Message}");
613 }

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

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

◆ ReadTenantAsync()

async Task< TenantConfig?> WeddingThankYou.Services.JsonTenantStore.ReadTenantAsync ( string path,
CancellationToken ct )
inlinestaticprivate

Tenant Async 데이터를 읽습니다.

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

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

414 {
415 var json = await File.ReadAllTextAsync(path, ct).ConfigureAwait(false);
416 LogLegacyLayoutModeFallback(path, json);
417 return JsonSerializer.Deserialize<TenantConfig>(json, _jsonOpts);
418 }

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

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

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

◆ Sanitize()

string WeddingThankYou.Services.JsonTenantStore.Sanitize ( string slug)
inlinestaticprivate

Sanitize 작업을 수행합니다.

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

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

378 =>
379 string.Concat(slug.ToLowerInvariant().Split(Path.GetInvalidFileNameChars()));

◆ SaveAsync()

async Task WeddingThankYou.Services.JsonTenantStore.SaveAsync ( TenantConfig config,
CancellationToken ct = default )
inline

Async 데이터를 저장합니다.

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

WeddingThankYou.Services.ITenantStore를 구현.

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

233 {
234 var dir = GetTenantDataPath(config.Slug);
235 Directory.CreateDirectory(dir);
236 Directory.CreateDirectory(Path.Combine(dir, "gallery"));
237 Directory.CreateDirectory(Path.Combine(dir, "thumb"));
238
239 var tmp = ConfigPath(config.Slug) + ".tmp";
240 await _gate.WaitAsync(ct).ConfigureAwait(false);
241 try
242 {
243 await using (var fs = File.Create(tmp))
244 await JsonSerializer.SerializeAsync(fs, config, _jsonOpts, ct).ConfigureAwait(false);
245
246 File.Copy(tmp, ConfigPath(config.Slug), overwrite: true);
247 File.Delete(tmp);
248 }
249 finally { _gate.Release(); }
250 }

다음을 참조함 : _gate, _jsonOpts, ConfigPath(), GetTenantDataPath(), WeddingThankYou.Models.TenantConfig.Slug.

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

◆ TryGetDesignLayoutMode()

? string WeddingThankYou.Services.JsonTenantStore.TryGetDesignLayoutMode ( string json)
inlinestaticprivate

Get Design Layout Mode 작업을 시도하고 성공 여부를 반환합니다.

매개변수
jsonjson에 사용할 string 값입니다.
반환값
Try Get Design Layout Mode 작업에서 생성한 string? 결과입니다.

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

477 {
478 try
479 {
480 using var doc = JsonDocument.Parse(json);
481 if (!TryGetProperty(doc.RootElement, "DesignSettings", out var design)) return null;
482 if (!TryGetProperty(design, "LayoutMode", out var layout)) return null;
483
484 return layout.ValueKind switch
485 {
486 JsonValueKind.String => layout.GetString(),
487 JsonValueKind.Null => "",
488 JsonValueKind.Number => layout.GetRawText(),
489 _ => layout.GetRawText(),
490 };
491 }
492 catch (JsonException)
493 {
494 return null;
495 }
496 }

다음을 참조함 : TryGetProperty().

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

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

◆ TryGetProperty()

bool WeddingThankYou.Services.JsonTenantStore.TryGetProperty ( JsonElement element,
string name,
out JsonElement value )
inlinestaticprivate

Get Property 작업을 시도하고 성공 여부를 반환합니다.

매개변수
elementelement에 사용할 JsonElement 값입니다.
namename에 사용할 string 값입니다.
value적용할 값입니다.
반환값
Try Get Property 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

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

539 {
540 foreach (var property in element.EnumerateObject())
541 {
542 if (string.Equals(property.Name, name, StringComparison.OrdinalIgnoreCase))
543 {
544 value = property.Value;
545 return true;
546 }
547 }
548
549 value = default;
550 return false;
551 }

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

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

멤버 데이터 문서화

◆ _dataRoot

readonly string WeddingThankYou.Services.JsonTenantStore._dataRoot
private

data Root 값을 보관합니다.

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

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

◆ _gate

readonly SemaphoreSlim WeddingThankYou.Services.JsonTenantStore._gate = new(1, 1)
staticprivate

gate 값을 보관합니다.

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

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

◆ _jsonOpts

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

json Opts 값을 보관합니다.

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

51 {
52 WriteIndented = true,
53 PropertyNameCaseInsensitive = true,
54 Converters = { new WeddingLayoutModeJsonConverter(), new JsonStringEnumConverter() }
55 };

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


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