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

더 자세히 ...

WeddingThankYou.Services.LocalPhotoService에 대한 상속 다이어그램 :
WeddingThankYou.Services.LocalPhotoService에 대한 협력 다이어그램:

Public 멤버 함수

 LocalPhotoService (ITenantStore tenants, IMediaQuotaPolicyResolver policyResolver, IImageOptimizationService imageOptimization, IMediaUsageQueryService usageQuery)
async Task< IReadOnlyList< PhotoInfo > > GetGalleryAsync (string slug, CancellationToken ct=default)
async Task< string > UploadAsync (string slug, IBrowserFile file, CancellationToken ct=default)
async Task< string > UploadHeroAsync (string slug, IBrowserFile file, CancellationToken ct=default)
async Task< string > UploadRoadMapAsync (string slug, IBrowserFile file, CancellationToken ct=default)
async Task DeleteAsync (string slug, string fileName, CancellationToken ct=default)
string GetPhotoUrl (string slug, string fileName)
string GetThumbUrl (string slug, string fileName)
string GetHeroUrl (string slug, string fileName)
string GetRoadMapUrl (string slug, string fileName)
async Task< string > UploadMusicAsync (string slug, IBrowserFile file, CancellationToken ct=default)
string GetMusicUrl (string slug, string fileName)
async Task< string > UploadOgImageAsync (string slug, IBrowserFile file, CancellationToken ct=default)
async Task< string > UploadVideoAsync (string slug, IBrowserFile file, CancellationToken ct=default)
async Task DeleteVideoAsync (string slug, string fileName, CancellationToken ct=default)
string GetVideoUrl (string slug, string fileName)

Private 멤버 함수

string GalleryPath (string slug, string fileName)
async Task ValidateImageQuotaAsync (TenantConfig config, EffectiveMediaPolicy policy, IBrowserFile file, bool countGalleryImage, CancellationToken ct)
async Task< string > SaveImageFileAsync (string slug, IBrowserFile file, string destinationDirectory, string baseName, EffectiveMediaPolicy policy, CancellationToken ct)
string ResolveWritableOutputFormat (string? preferredFormat, string? originalExtension)

정적 Private 멤버 함수

static void ValidateImageFile (IBrowserFile file)
static string NormalizeOutputExtension (string? outputFormat)
static string UniqueFileName (string originalName)

Private 속성

readonly ITenantStore _tenants
readonly IMediaQuotaPolicyResolver _policyResolver
readonly IImageOptimizationService _imageOptimization
readonly IMediaUsageQueryService _usageQuery

정적 Private 속성

const long MaxImageUploadBytes = 200 * 1024 * 1024
static readonly string[] AllowedExts = [".jpg", ".jpeg", ".png", ".webp", ".gif"]

상세한 설명

Local Photo Service 기능과 관련 상태를 캡슐화합니다.

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

생성자 & 소멸자 문서화

◆ LocalPhotoService()

WeddingThankYou.Services.LocalPhotoService.LocalPhotoService ( ITenantStore tenants,
IMediaQuotaPolicyResolver policyResolver,
IImageOptimizationService imageOptimization,
IMediaUsageQueryService usageQuery )
inline

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

매개변수
tenantstenants에 사용할 ITenantStore 값입니다.
policyResolverpolicy Resolver에 사용할 IMediaQuotaPolicyResolver 값입니다.
imageOptimizationimage Optimization에 사용할 IImageOptimizationService 값입니다.
usageQueryusage Query에 사용할 IMediaUsageQueryService 값입니다.

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

117 {
118 _tenants = tenants;
119 _policyResolver = policyResolver;
120 _imageOptimization = imageOptimization;
121 _usageQuery = usageQuery;
122 }

다음을 참조함 : _imageOptimization, _policyResolver, _tenants, _usageQuery.

멤버 함수 문서화

◆ DeleteAsync()

async Task WeddingThankYou.Services.LocalPhotoService.DeleteAsync ( string slug,
string fileName,
CancellationToken ct = default )
inline

Delete Async 작업을 수행합니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

397 {
398 var galleryFile = GalleryPath(slug, fileName);
399 var thumbFile = Path.Combine(_tenants.GetTenantDataPath(slug), "thumb", fileName);
400 if (File.Exists(galleryFile)) File.Delete(galleryFile);
401 if (File.Exists(thumbFile)) File.Delete(thumbFile);
402
403 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false);
404 if (config is null) return;
405 config.GalleryFileNames.Remove(fileName);
406 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
407 }

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

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

◆ DeleteVideoAsync()

async Task WeddingThankYou.Services.LocalPhotoService.DeleteVideoAsync ( string slug,
string fileName,
CancellationToken ct = default )
inline

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

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

WeddingThankYou.Services.IPhotoService를 구현.

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

843 {
844 var path = Path.Combine(_tenants.GetTenantDataPath(slug), fileName);
845 if (File.Exists(path)) File.Delete(path);
846
847 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false);
848 if (config is null) return;
849 config.VideoFileNames.Remove(fileName);
850 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
851 }

다음을 참조함 : _tenants.

◆ GalleryPath()

string WeddingThankYou.Services.LocalPhotoService.GalleryPath ( string slug,
string fileName )
inlineprivate

Gallery Path 작업을 수행합니다.

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

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

920 =>
921 Path.Combine(_tenants.GetTenantDataPath(slug), "gallery", fileName);

다음을 참조함 : _tenants.

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

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

◆ GetGalleryAsync()

async Task< IReadOnlyList< PhotoInfo > > WeddingThankYou.Services.LocalPhotoService.GetGalleryAsync ( string slug,
CancellationToken ct = default )
inline

Gallery Async 값을 가져옵니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

157 {
158 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false);
159 if (config is null) return [];
160
161 var list = new List<PhotoInfo>();
162 foreach (var fn in config.GalleryFileNames)
163 {
164 var full = GalleryPath(slug, fn);
165 if (!File.Exists(full)) continue;
166 var fi = new FileInfo(full);
167 list.Add(new PhotoInfo
168 {
169 FileName = fn,
170 Url = GetPhotoUrl(slug, fn),
171 ThumbUrl = GetThumbUrl(slug, fn),
172 SizeBytes = fi.Length,
173 LastModified = fi.LastWriteTime
174 });
175 }
176 return list;
177 }

다음을 참조함 : _tenants, GalleryPath(), GetPhotoUrl(), GetThumbUrl().

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

◆ GetHeroUrl()

string WeddingThankYou.Services.LocalPhotoService.GetHeroUrl ( string slug,
string fileName )
inline

Hero Url 값을 가져옵니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

511 =>
512 $"/wedding-data/{slug}/{Uri.EscapeDataString(fileName)}";

◆ GetMusicUrl()

string WeddingThankYou.Services.LocalPhotoService.GetMusicUrl ( string slug,
string fileName )
inline

Music Url 값을 가져옵니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

652 =>
653 $"/wedding-data/{slug}/{Uri.EscapeDataString(fileName)}";

◆ GetPhotoUrl()

string WeddingThankYou.Services.LocalPhotoService.GetPhotoUrl ( string slug,
string fileName )
inline

Photo Url 값을 가져옵니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

441 =>
442 $"/wedding-data/{slug}/gallery/{Uri.EscapeDataString(fileName)}";

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

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

◆ GetRoadMapUrl()

string WeddingThankYou.Services.LocalPhotoService.GetRoadMapUrl ( string slug,
string fileName )
inline

Road Map Url 값을 가져옵니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

546 =>
547 $"/wedding-data/{slug}/{Uri.EscapeDataString(fileName)}";

◆ GetThumbUrl()

string WeddingThankYou.Services.LocalPhotoService.GetThumbUrl ( string slug,
string fileName )
inline

Thumb Url 값을 가져옵니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

476 =>
477 $"/wedding-data/{slug}/thumb/{Uri.EscapeDataString(fileName)}";

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

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

◆ GetVideoUrl()

string WeddingThankYou.Services.LocalPhotoService.GetVideoUrl ( string slug,
string fileName )
inline

Video Url 값을 가져옵니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

885 =>
886 $"/wedding-data/{slug}/{Uri.EscapeDataString(fileName)}";

◆ NormalizeOutputExtension()

string WeddingThankYou.Services.LocalPhotoService.NormalizeOutputExtension ( string? outputFormat)
inlinestaticprivate

Normalize Output Extension 작업을 수행합니다.

매개변수
outputFormatoutput Format에 사용할 string? 값입니다.
반환값
Normalize Output Extension 작업에서 생성한 string 결과입니다.

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

1215 {
1216 var normalized = outputFormat?.Trim().TrimStart('.').ToLowerInvariant();
1217 return string.IsNullOrWhiteSpace(normalized) ? "webp" : normalized;
1218 }

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

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

◆ ResolveWritableOutputFormat()

string WeddingThankYou.Services.LocalPhotoService.ResolveWritableOutputFormat ( string? preferredFormat,
string? originalExtension )
inlineprivate

Resolve Writable Output Format 작업을 수행합니다.

매개변수
preferredFormatpreferred Format에 사용할 string? 값입니다.
originalExtensionoriginal Extension에 사용할 string? 값입니다.
반환값
Resolve Writable Output Format 작업에서 생성한 string 결과입니다.

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

1147 {
1148 var preferred = NormalizeOutputExtension(preferredFormat);
1149 if (_imageOptimization.CanEncode(preferred)) return preferred;
1150
1151 if (_imageOptimization.CanEncode("jpg")) return "jpg";
1152
1153 var original = NormalizeOutputExtension(originalExtension);
1154 return _imageOptimization.CanEncode(original) ? original : "";
1155 }

다음을 참조함 : _imageOptimization, NormalizeOutputExtension().

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

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

◆ SaveImageFileAsync()

async Task< string > WeddingThankYou.Services.LocalPhotoService.SaveImageFileAsync ( string slug,
IBrowserFile file,
string destinationDirectory,
string baseName,
EffectiveMediaPolicy policy,
CancellationToken ct )
inlineprivate

Image File Async 데이터를 저장합니다.

매개변수
slugslug에 사용할 string 값입니다.
filefile에 사용할 IBrowserFile 값입니다.
destinationDirectorydestination Directory에 사용할 string 값입니다.
baseNamebase Name에 사용할 string 값입니다.
policypolicy에 사용할 EffectiveMediaPolicy 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Save Image File Async 작업에서 생성한 Task<string> 결과입니다.

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

1069 {
1070 var root = _tenants.GetTenantDataPath(slug);
1071 var originalDir = Path.Combine(root, "original");
1072 var originalExt = Path.GetExtension(file.Name).ToLowerInvariant();
1073 var tempPath = Path.Combine(destinationDirectory, $"{baseName}.upload{originalExt}");
1074 Directory.CreateDirectory(destinationDirectory);
1075
1076 await using (var dest = File.Create(tempPath))
1077 {
1078 await file.OpenReadStream(MaxImageUploadBytes, ct).CopyToAsync(dest, ct).ConfigureAwait(false);
1079 }
1080
1081 if (policy.KeepOriginalImages)
1082 {
1083 Directory.CreateDirectory(originalDir);
1084 File.Copy(tempPath, Path.Combine(originalDir, $"{baseName}{originalExt}"), overwrite: true);
1085 }
1086
1087 var outputFormat = ResolveWritableOutputFormat(policy.ImageOutputFormat, originalExt);
1088 if (!string.IsNullOrWhiteSpace(outputFormat))
1089 {
1090 var outputExt = $".{outputFormat}";
1091 var optimizedName = $"{baseName}{outputExt}";
1092 var optimizedPath = Path.Combine(destinationDirectory, optimizedName);
1093 var tempOptimizedPath = Path.Combine(destinationDirectory, $"{baseName}.optimized.tmp{outputExt}");
1094 var result = await _imageOptimization.OptimizeAsync(tempPath, tempOptimizedPath, policy, ct).ConfigureAwait(false);
1095 if (result.Succeeded && File.Exists(tempOptimizedPath))
1096 {
1097 File.Move(tempOptimizedPath, optimizedPath, overwrite: true);
1098 File.Delete(tempPath);
1099 return optimizedName;
1100 }
1101
1102 if (File.Exists(tempOptimizedPath))
1103 {
1104 File.Delete(tempOptimizedPath);
1105 }
1106 }
1107
1108 var fallbackName = $"{baseName}{originalExt}";
1109 var fallbackPath = Path.Combine(destinationDirectory, fallbackName);
1110 File.Move(tempPath, fallbackPath, overwrite: true);
1111 return fallbackName;
1112 }

다음을 참조함 : _imageOptimization, _tenants, WeddingThankYou.Models.EffectiveMediaPolicy.ImageOutputFormat, WeddingThankYou.Models.EffectiveMediaPolicy.KeepOriginalImages, MaxImageUploadBytes, ResolveWritableOutputFormat().

다음에 의해서 참조됨 : UploadAsync(), UploadHeroAsync(), UploadOgImageAsync(), UploadRoadMapAsync().

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

◆ UniqueFileName()

string WeddingThankYou.Services.LocalPhotoService.UniqueFileName ( string originalName)
inlinestaticprivate

Unique File Name 작업을 수행합니다.

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

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

1245 {
1246 var ext = Path.GetExtension(originalName).ToLowerInvariant();
1247 return $"{DateTime.Now:yyyyMMdd_HHmmss}_{Guid.NewGuid():N}{ext}";
1248 }

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

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

◆ UploadAsync()

async Task< string > WeddingThankYou.Services.LocalPhotoService.UploadAsync ( string slug,
IBrowserFile file,
CancellationToken ct = default )
inline

Upload Async 작업을 수행합니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

220 {
221 ValidateImageFile(file);
222 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false) ?? new TenantConfig { Slug = slug };
223 var policy = await _policyResolver.ResolveAsync(config, ct).ConfigureAwait(false);
224 await ValidateImageQuotaAsync(config, policy, file, countGalleryImage: true, ct).ConfigureAwait(false);
225
226 var baseName = Path.GetFileNameWithoutExtension(UniqueFileName(file.Name));
227 var galleryDir = Path.Combine(_tenants.GetTenantDataPath(slug), "gallery");
228 var thumbDir = Path.Combine(_tenants.GetTenantDataPath(slug), "thumb");
229 Directory.CreateDirectory(galleryDir);
230 Directory.CreateDirectory(thumbDir);
231
232 var fileName = await SaveImageFileAsync(slug, file, galleryDir, baseName, policy, ct).ConfigureAwait(false);
233 File.Copy(Path.Combine(galleryDir, fileName), Path.Combine(thumbDir, fileName), overwrite: true);
234
235 if (!config.GalleryFileNames.Contains(fileName))
236 config.GalleryFileNames.Add(fileName);
237 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
238
239 return fileName;
240 }

다음을 참조함 : _policyResolver, _tenants, SaveImageFileAsync(), UniqueFileName(), ValidateImageFile(), ValidateImageQuotaAsync().

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

◆ UploadHeroAsync()

async Task< string > WeddingThankYou.Services.LocalPhotoService.UploadHeroAsync ( string slug,
IBrowserFile file,
CancellationToken ct = default )
inline

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

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

WeddingThankYou.Services.IPhotoService를 구현.

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

283 {
284 ValidateImageFile(file);
285 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false) ?? new TenantConfig { Slug = slug };
286 var policy = await _policyResolver.ResolveAsync(config, ct).ConfigureAwait(false);
287 await ValidateImageQuotaAsync(config, policy, file, countGalleryImage: false, ct).ConfigureAwait(false);
288
289 var dir = _tenants.GetTenantDataPath(slug);
290 Directory.CreateDirectory(dir);
291
292 var fileName = await SaveImageFileAsync(slug, file, dir, "hero", policy, ct).ConfigureAwait(false);
293 config.HeroImageFileName = fileName;
294 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
295
296 return fileName;
297 }

다음을 참조함 : _policyResolver, _tenants, SaveImageFileAsync(), ValidateImageFile(), ValidateImageQuotaAsync().

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

◆ UploadMusicAsync()

async Task< string > WeddingThankYou.Services.LocalPhotoService.UploadMusicAsync ( string slug,
IBrowserFile file,
CancellationToken ct = default )
inline

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

매개변수
slugslug에 사용할 string 값입니다.
filefile에 사용할 IBrowserFile 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Upload Music Async 작업에서 생성한 Task<string> 결과입니다.
예외
InvalidOperationException현재 객체 상태에서 Upload Music Async 작업을 수행할 수 없는 경우 발생합니다.

WeddingThankYou.Services.IPhotoService를 구현.

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

598 {
599 var ext = Path.GetExtension(file.Name).ToLowerInvariant();
600 if (ext is not (".mp3" or ".ogg" or ".wav" or ".aac" or ".m4a"))
601 throw new InvalidOperationException($"허용되지 않는 오디오 형식입니다: {ext}");
602 if (file.Size > 30 * 1024 * 1024)
603 throw new InvalidOperationException("음악 파일은 30MB 이하여야 합니다.");
604
605 var dir = _tenants.GetTenantDataPath(slug);
606 Directory.CreateDirectory(dir);
607
608 var fileName = $"bgmusic{ext}";
609 var destPath = Path.Combine(dir, fileName);
610 await using (var dest = File.Create(destPath))
611 await file.OpenReadStream(30 * 1024 * 1024, ct).CopyToAsync(dest, ct).ConfigureAwait(false);
612
613 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false) ?? new TenantConfig { Slug = slug };
614 config.MusicFileName = fileName;
615 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
616
617 return fileName;
618 }

다음을 참조함 : _tenants.

◆ UploadOgImageAsync()

async Task< string > WeddingThankYou.Services.LocalPhotoService.UploadOgImageAsync ( string slug,
IBrowserFile file,
CancellationToken ct = default )
inline

Upload Og Image Async 작업을 수행합니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

696 {
697 ValidateImageFile(file);
698 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false) ?? new TenantConfig { Slug = slug };
699 var policy = await _policyResolver.ResolveAsync(config, ct).ConfigureAwait(false);
700 await ValidateImageQuotaAsync(config, policy, file, countGalleryImage: false, ct).ConfigureAwait(false);
701
702 var dir = _tenants.GetTenantDataPath(slug);
703 Directory.CreateDirectory(dir);
704
705 var fileName = await SaveImageFileAsync(slug, file, dir, "og", policy, ct).ConfigureAwait(false);
706 config.OgImageFileName = fileName;
707 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
708
709 return fileName;
710 }

다음을 참조함 : _policyResolver, _tenants, SaveImageFileAsync(), ValidateImageFile(), ValidateImageQuotaAsync().

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

◆ UploadRoadMapAsync()

async Task< string > WeddingThankYou.Services.LocalPhotoService.UploadRoadMapAsync ( string slug,
IBrowserFile file,
CancellationToken ct = default )
inline

Upload Road Map Async 작업을 수행합니다.

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

WeddingThankYou.Services.IPhotoService를 구현.

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

340 {
341 ValidateImageFile(file);
342 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false) ?? new TenantConfig { Slug = slug };
343 var policy = await _policyResolver.ResolveAsync(config, ct).ConfigureAwait(false);
344 await ValidateImageQuotaAsync(config, policy, file, countGalleryImage: false, ct).ConfigureAwait(false);
345
346 var dir = _tenants.GetTenantDataPath(slug);
347 Directory.CreateDirectory(dir);
348
349 var fileName = await SaveImageFileAsync(slug, file, dir, "roadmap", policy, ct).ConfigureAwait(false);
350 config.RoadMapFileName = fileName;
351 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
352
353 return fileName;
354 }

다음을 참조함 : _policyResolver, _tenants, SaveImageFileAsync(), ValidateImageFile(), ValidateImageQuotaAsync().

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

◆ UploadVideoAsync()

async Task< string > WeddingThankYou.Services.LocalPhotoService.UploadVideoAsync ( string slug,
IBrowserFile file,
CancellationToken ct = default )
inline

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

매개변수
slugslug에 사용할 string 값입니다.
filefile에 사용할 IBrowserFile 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Upload Video Async 작업에서 생성한 Task<string> 결과입니다.
예외
InvalidOperationException현재 객체 상태에서 Upload Video Async 작업을 수행할 수 없는 경우 발생합니다.

WeddingThankYou.Services.IPhotoService를 구현.

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

761 {
762 var ext = Path.GetExtension(file.Name).ToLowerInvariant();
763 if (ext is not (".mp4" or ".webm" or ".mov" or ".m4v"))
764 throw new InvalidOperationException($"허용되지 않는 동영상 형식입니다: {ext}. mp4/webm/mov 권장");
765
766 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false) ?? new TenantConfig { Slug = slug };
767 var policy = await _policyResolver.ResolveAsync(config, ct).ConfigureAwait(false);
768
769 var effectiveCount = policy.VideoMaxCount;
770 if (effectiveCount > 0 && config.VideoFileNames.Count >= effectiveCount)
771 throw new InvalidOperationException($"동영상은 최대 {effectiveCount}개까지 업로드할 수 있습니다.");
772
773 var effectiveMb = policy.VideoMaxFileSizeMb;
774 var maxBytes = policy.VideoMaxFileSizeBytes;
775
776 if (file.Size > maxBytes)
777 throw new InvalidOperationException($"동영상 파일은 {effectiveMb}MB 이하여야 합니다.");
778
779 if (policy.VideoMaxStorageMb > 0)
780 {
781 var usage = await _usageQuery.GetTenantUsageAsync(config, ct).ConfigureAwait(false);
782 if (usage.VideoBytes + file.Size > policy.VideoMaxStorageBytes)
783 {
784 throw new InvalidOperationException($"동영상 저장 용량은 최대 {policy.VideoMaxStorageMb}MB까지 사용할 수 있습니다.");
785 }
786 }
787
788 var dir = _tenants.GetTenantDataPath(slug);
789 Directory.CreateDirectory(dir);
790
791 var fileName = $"video-{DateTime.Now:yyyyMMdd_HHmmss}_{Guid.NewGuid().ToString("N")[..8]}{ext}";
792 var destPath = Path.Combine(dir, fileName);
793 await using (var dest = File.Create(destPath))
794 await file.OpenReadStream(maxBytes, ct).CopyToAsync(dest, ct).ConfigureAwait(false);
795
796 config.VideoFileNames.Add(fileName);
797 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
798
799 return fileName;
800 }

다음을 참조함 : _policyResolver, _tenants, _usageQuery.

◆ ValidateImageFile()

void WeddingThankYou.Services.LocalPhotoService.ValidateImageFile ( IBrowserFile file)
inlinestaticprivate

Image File 값의 유효성을 검사합니다.

매개변수
filefile에 사용할 IBrowserFile 값입니다.
예외
InvalidOperationException현재 객체 상태에서 Validate Image File 작업을 수행할 수 없는 경우 발생합니다.

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

1182 {
1183 var ext = Path.GetExtension(file.Name).ToLowerInvariant();
1184 if (!Array.Exists(AllowedExts, e => e == ext))
1185 throw new InvalidOperationException($"허용되지 않는 파일 형식입니다: {ext}");
1186 if (file.Size > MaxImageUploadBytes)
1187 throw new InvalidOperationException("이미지 파일 크기는 200MB 이하여야 합니다.");
1188 }

다음을 참조함 : AllowedExts, MaxImageUploadBytes.

다음에 의해서 참조됨 : UploadAsync(), UploadHeroAsync(), UploadOgImageAsync(), UploadRoadMapAsync().

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

◆ ValidateImageQuotaAsync()

async Task WeddingThankYou.Services.LocalPhotoService.ValidateImageQuotaAsync ( TenantConfig config,
EffectiveMediaPolicy policy,
IBrowserFile file,
bool countGalleryImage,
CancellationToken ct )
inlineprivate

Image Quota Async 값의 유효성을 검사합니다.

매개변수
configconfig에 사용할 TenantConfig 값입니다.
policypolicy에 사용할 EffectiveMediaPolicy 값입니다.
filefile에 사용할 IBrowserFile 값입니다.
countGalleryImagecount Gallery Image에 사용할 bool 값입니다.
ct취소 요청을 감시하는 토큰입니다.
반환값
Validate Image Quota Async 작업에서 생성한 Task 결과입니다.
예외
InvalidOperationException현재 객체 상태에서 Validate Image Quota Async 작업을 수행할 수 없는 경우 발생합니다.

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

988 {
989 if (countGalleryImage && policy.ImageMaxCount > 0 && config.GalleryFileNames.Count >= policy.ImageMaxCount)
990 {
991 throw new InvalidOperationException($"이미지는 최대 {policy.ImageMaxCount}장까지 업로드할 수 있습니다.");
992 }
993
994 if (policy.ImageOptimizedMaxStorageMb > 0)
995 {
996 var usage = await _usageQuery.GetTenantUsageAsync(config, ct).ConfigureAwait(false);
997 if (usage.OptimizedImageBytes + file.Size > policy.ImageOptimizedMaxStorageBytes)
998 {
999 throw new InvalidOperationException($"이미지 저장 용량은 최대 {policy.ImageOptimizedMaxStorageMb}MB까지 사용할 수 있습니다.");
1000 }
1001 }
1002 }

다음을 참조함 : _usageQuery, WeddingThankYou.Models.TenantConfig.GalleryFileNames, WeddingThankYou.Models.EffectiveMediaPolicy.ImageMaxCount, WeddingThankYou.Models.EffectiveMediaPolicy.ImageOptimizedMaxStorageBytes, WeddingThankYou.Models.EffectiveMediaPolicy.ImageOptimizedMaxStorageMb.

다음에 의해서 참조됨 : UploadAsync(), UploadHeroAsync(), UploadOgImageAsync(), UploadRoadMapAsync().

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

멤버 데이터 문서화

◆ _imageOptimization

readonly IImageOptimizationService WeddingThankYou.Services.LocalPhotoService._imageOptimization
private

image Optimization 값을 보관합니다.

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

다음에 의해서 참조됨 : LocalPhotoService(), ResolveWritableOutputFormat(), SaveImageFileAsync().

◆ _policyResolver

readonly IMediaQuotaPolicyResolver WeddingThankYou.Services.LocalPhotoService._policyResolver
private

policy Resolver 값을 보관합니다.

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

다음에 의해서 참조됨 : LocalPhotoService(), UploadAsync(), UploadHeroAsync(), UploadOgImageAsync(), UploadRoadMapAsync(), UploadVideoAsync().

◆ _tenants

readonly ITenantStore WeddingThankYou.Services.LocalPhotoService._tenants
private

◆ _usageQuery

readonly IMediaUsageQueryService WeddingThankYou.Services.LocalPhotoService._usageQuery
private

usage Query 값을 보관합니다.

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

다음에 의해서 참조됨 : LocalPhotoService(), UploadVideoAsync(), ValidateImageQuotaAsync().

◆ AllowedExts

readonly string [] WeddingThankYou.Services.LocalPhotoService.AllowedExts = [".jpg", ".jpeg", ".png", ".webp", ".gif"]
staticprivate

Allowed Exts 값을 보관합니다.

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

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

◆ MaxImageUploadBytes

const long WeddingThankYou.Services.LocalPhotoService.MaxImageUploadBytes = 200 * 1024 * 1024
staticprivate

Max Image Upload Bytes 값을 보관합니다.

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

다음에 의해서 참조됨 : SaveImageFileAsync(), ValidateImageFile().


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