WeddingPlatform.Web 1.0.0.0
지도, 갤러리, 방명록, 계좌 안내와 배경음악을 링크 하나에 담는 무료 모바일 청첩장 서비스입니다.
로딩중...
검색중...
일치하는것 없음
WeddingPlatform.Services.LocalPhotoService 클래스 참조sealed

더 자세히 ...

WeddingPlatform.Services.LocalPhotoService에 대한 상속 다이어그램 :
WeddingPlatform.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 > UploadThankYouOgImageAsync (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()

WeddingPlatform.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 WeddingPlatform.Services.LocalPhotoService.DeleteAsync ( string slug,
string fileName,
CancellationToken ct = default )
inline

Delete Async 작업을 수행합니다.

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

WeddingPlatform.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 WeddingPlatform.Services.LocalPhotoService.DeleteVideoAsync ( string slug,
string fileName,
CancellationToken ct = default )
inline

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

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

WeddingPlatform.Services.IPhotoService를 구현.

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

900 {
901 var path = Path.Combine(_tenants.GetTenantDataPath(slug), fileName);
902 if (File.Exists(path)) File.Delete(path);
903
904 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false);
905 if (config is null) return;
906 config.VideoFileNames.Remove(fileName);
907 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
908 }

다음을 참조함 : _tenants.

◆ GalleryPath()

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

Gallery Path 작업을 수행합니다.

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

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

977 =>
978 Path.Combine(_tenants.GetTenantDataPath(slug), "gallery", fileName);

다음을 참조함 : _tenants.

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

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

◆ GetGalleryAsync()

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

Gallery Async 값을 가져옵니다.

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

WeddingPlatform.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 WeddingPlatform.Services.LocalPhotoService.GetHeroUrl ( string slug,
string fileName )
inline

Hero Url 값을 가져옵니다.

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

WeddingPlatform.Services.IPhotoService를 구현.

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

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

◆ GetMusicUrl()

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

Music Url 값을 가져옵니다.

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

WeddingPlatform.Services.IPhotoService를 구현.

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

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

◆ GetPhotoUrl()

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

Photo Url 값을 가져옵니다.

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

WeddingPlatform.Services.IPhotoService를 구현.

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

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

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

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

◆ GetRoadMapUrl()

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

Road Map Url 값을 가져옵니다.

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

WeddingPlatform.Services.IPhotoService를 구현.

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

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

◆ GetThumbUrl()

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

Thumb Url 값을 가져옵니다.

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

WeddingPlatform.Services.IPhotoService를 구현.

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

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

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

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

◆ GetVideoUrl()

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

Video Url 값을 가져옵니다.

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

WeddingPlatform.Services.IPhotoService를 구현.

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

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

◆ NormalizeOutputExtension()

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

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

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

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

1272 {
1273 var normalized = outputFormat?.Trim().TrimStart('.').ToLowerInvariant();
1274 return string.IsNullOrWhiteSpace(normalized) ? "webp" : normalized;
1275 }

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

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

◆ ResolveWritableOutputFormat()

string WeddingPlatform.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 파일의 1203 번째 라인에서 정의되었습니다.

1204 {
1205 var preferred = NormalizeOutputExtension(preferredFormat);
1206 if (_imageOptimization.CanEncode(preferred)) return preferred;
1207
1208 if (_imageOptimization.CanEncode("jpg")) return "jpg";
1209
1210 var original = NormalizeOutputExtension(originalExtension);
1211 return _imageOptimization.CanEncode(original) ? original : "";
1212 }

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

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

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

◆ SaveImageFileAsync()

async Task< string > WeddingPlatform.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 파일의 1125 번째 라인에서 정의되었습니다.

1126 {
1127 var root = _tenants.GetTenantDataPath(slug);
1128 var originalDir = Path.Combine(root, "original");
1129 var originalExt = Path.GetExtension(file.Name).ToLowerInvariant();
1130 var tempPath = Path.Combine(destinationDirectory, $"{baseName}.upload{originalExt}");
1131 Directory.CreateDirectory(destinationDirectory);
1132
1133 await using (var dest = File.Create(tempPath))
1134 {
1135 await file.OpenReadStream(MaxImageUploadBytes, ct).CopyToAsync(dest, ct).ConfigureAwait(false);
1136 }
1137
1138 if (policy.KeepOriginalImages)
1139 {
1140 Directory.CreateDirectory(originalDir);
1141 File.Copy(tempPath, Path.Combine(originalDir, $"{baseName}{originalExt}"), overwrite: true);
1142 }
1143
1144 var outputFormat = ResolveWritableOutputFormat(policy.ImageOutputFormat, originalExt);
1145 if (!string.IsNullOrWhiteSpace(outputFormat))
1146 {
1147 var outputExt = $".{outputFormat}";
1148 var optimizedName = $"{baseName}{outputExt}";
1149 var optimizedPath = Path.Combine(destinationDirectory, optimizedName);
1150 var tempOptimizedPath = Path.Combine(destinationDirectory, $"{baseName}.optimized.tmp{outputExt}");
1151 var result = await _imageOptimization.OptimizeAsync(tempPath, tempOptimizedPath, policy, ct).ConfigureAwait(false);
1152 if (result.Succeeded && File.Exists(tempOptimizedPath))
1153 {
1154 File.Move(tempOptimizedPath, optimizedPath, overwrite: true);
1155 File.Delete(tempPath);
1156 return optimizedName;
1157 }
1158
1159 if (File.Exists(tempOptimizedPath))
1160 {
1161 File.Delete(tempOptimizedPath);
1162 }
1163 }
1164
1165 var fallbackName = $"{baseName}{originalExt}";
1166 var fallbackPath = Path.Combine(destinationDirectory, fallbackName);
1167 File.Move(tempPath, fallbackPath, overwrite: true);
1168 return fallbackName;
1169 }

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

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

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

◆ UniqueFileName()

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

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

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

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

1302 {
1303 var ext = Path.GetExtension(originalName).ToLowerInvariant();
1304 return $"{DateTime.Now:yyyyMMdd_HHmmss}_{Guid.NewGuid():N}{ext}";
1305 }

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

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

◆ UploadAsync()

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

Upload Async 작업을 수행합니다.

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

WeddingPlatform.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 > WeddingPlatform.Services.LocalPhotoService.UploadHeroAsync ( string slug,
IBrowserFile file,
CancellationToken ct = default )
inline

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

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

WeddingPlatform.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 > WeddingPlatform.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 작업을 수행할 수 없는 경우 발생합니다.

WeddingPlatform.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 > WeddingPlatform.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> 결과입니다.

WeddingPlatform.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 > WeddingPlatform.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> 결과입니다.

WeddingPlatform.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().

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

◆ UploadThankYouOgImageAsync()

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

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

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

WeddingPlatform.Services.IPhotoService를 구현.

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

753 {
754 ValidateImageFile(file);
755 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false) ?? new TenantConfig { Slug = slug };
756 var policy = await _policyResolver.ResolveAsync(config, ct).ConfigureAwait(false);
757 await ValidateImageQuotaAsync(config, policy, file, countGalleryImage: false, ct).ConfigureAwait(false);
758
759 var dir = _tenants.GetTenantDataPath(slug);
760 Directory.CreateDirectory(dir);
761
762 var fileName = await SaveImageFileAsync(slug, file, dir, "og-thankyou", policy, ct).ConfigureAwait(false);
763 config.ThankYouOgImageFileName = fileName;
764 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
765
766 return fileName;
767 }

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

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

◆ UploadVideoAsync()

async Task< string > WeddingPlatform.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 작업을 수행할 수 없는 경우 발생합니다.

WeddingPlatform.Services.IPhotoService를 구현.

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

818 {
819 var ext = Path.GetExtension(file.Name).ToLowerInvariant();
820 if (ext is not (".mp4" or ".webm" or ".mov" or ".m4v"))
821 throw new InvalidOperationException($"허용되지 않는 동영상 형식입니다: {ext}. mp4/webm/mov 권장");
822
823 var config = await _tenants.GetAsync(slug, ct).ConfigureAwait(false) ?? new TenantConfig { Slug = slug };
824 var policy = await _policyResolver.ResolveAsync(config, ct).ConfigureAwait(false);
825
826 var effectiveCount = policy.VideoMaxCount;
827 if (effectiveCount > 0 && config.VideoFileNames.Count >= effectiveCount)
828 throw new InvalidOperationException($"동영상은 최대 {effectiveCount}개까지 업로드할 수 있습니다.");
829
830 var effectiveMb = policy.VideoMaxFileSizeMb;
831 var maxBytes = policy.VideoMaxFileSizeBytes;
832
833 if (file.Size > maxBytes)
834 throw new InvalidOperationException($"동영상 파일은 {effectiveMb}MB 이하여야 합니다.");
835
836 if (policy.VideoMaxStorageMb > 0)
837 {
838 var usage = await _usageQuery.GetTenantUsageAsync(config, ct).ConfigureAwait(false);
839 if (usage.VideoBytes + file.Size > policy.VideoMaxStorageBytes)
840 {
841 throw new InvalidOperationException($"동영상 저장 용량은 최대 {policy.VideoMaxStorageMb}MB까지 사용할 수 있습니다.");
842 }
843 }
844
845 var dir = _tenants.GetTenantDataPath(slug);
846 Directory.CreateDirectory(dir);
847
848 var fileName = $"video-{DateTime.Now:yyyyMMdd_HHmmss}_{Guid.NewGuid().ToString("N")[..8]}{ext}";
849 var destPath = Path.Combine(dir, fileName);
850 await using (var dest = File.Create(destPath))
851 await file.OpenReadStream(maxBytes, ct).CopyToAsync(dest, ct).ConfigureAwait(false);
852
853 config.VideoFileNames.Add(fileName);
854 await _tenants.SaveAsync(config, ct).ConfigureAwait(false);
855
856 return fileName;
857 }

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

◆ ValidateImageFile()

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

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

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

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

1239 {
1240 var ext = Path.GetExtension(file.Name).ToLowerInvariant();
1241 if (!Array.Exists(AllowedExts, e => e == ext))
1242 throw new InvalidOperationException($"허용되지 않는 파일 형식입니다: {ext}");
1243 if (file.Size > MaxImageUploadBytes)
1244 throw new InvalidOperationException("이미지 파일 크기는 200MB 이하여야 합니다.");
1245 }

다음을 참조함 : AllowedExts, MaxImageUploadBytes.

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

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

◆ ValidateImageQuotaAsync()

async Task WeddingPlatform.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 파일의 1044 번째 라인에서 정의되었습니다.

1045 {
1046 if (countGalleryImage && policy.ImageMaxCount > 0 && config.GalleryFileNames.Count >= policy.ImageMaxCount)
1047 {
1048 throw new InvalidOperationException($"이미지는 최대 {policy.ImageMaxCount}장까지 업로드할 수 있습니다.");
1049 }
1050
1051 if (policy.ImageOptimizedMaxStorageMb > 0)
1052 {
1053 var usage = await _usageQuery.GetTenantUsageAsync(config, ct).ConfigureAwait(false);
1054 if (usage.OptimizedImageBytes + file.Size > policy.ImageOptimizedMaxStorageBytes)
1055 {
1056 throw new InvalidOperationException($"이미지 저장 용량은 최대 {policy.ImageOptimizedMaxStorageMb}MB까지 사용할 수 있습니다.");
1057 }
1058 }
1059 }

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

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

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

멤버 데이터 문서화

◆ _imageOptimization

readonly IImageOptimizationService WeddingPlatform.Services.LocalPhotoService._imageOptimization
private

image Optimization 값을 보관합니다.

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

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

◆ _policyResolver

readonly IMediaQuotaPolicyResolver WeddingPlatform.Services.LocalPhotoService._policyResolver
private

policy Resolver 값을 보관합니다.

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

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

◆ _tenants

readonly ITenantStore WeddingPlatform.Services.LocalPhotoService._tenants
private

◆ _usageQuery

readonly IMediaUsageQueryService WeddingPlatform.Services.LocalPhotoService._usageQuery
private

usage Query 값을 보관합니다.

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

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

◆ AllowedExts

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

Allowed Exts 값을 보관합니다.

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

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

◆ MaxImageUploadBytes

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

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

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

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


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