Add image management functionality: introduce Image entity and related API endpoints, update database schema to support image storage, and enhance UI with a new gallery feature for image selection and upload. Update translations for gallery-related terms.

This commit is contained in:
Leonid Pershin
2026-07-25 11:27:34 +03:00
parent 72451f89a8
commit 149cd153b9
34 changed files with 1732 additions and 11 deletions
@@ -0,0 +1,39 @@
namespace TeleWave.Domain.Images;
/// <summary>
/// Запись общего реестра изображений приложения. Единая точка для всех картинок (постеры шоу, кадры
/// серий, фоны заставок, ручные загрузки) — файл лежит под images/{Id}{FileExtension}, а потребители
/// ссылаются на <see cref="Id"/>. Позволяет иметь общую галерею с вкладками по <see cref="Category"/>.
/// </summary>
public class Image
{
public Guid Id { get; private set; }
public ImageCategory Category { get; private set; }
/// <summary>Расширение файла с точкой в нижнем регистре (например «.jpg»).</summary>
public string FileExtension { get; private set; } = string.Empty;
/// <summary>Имя исходного файла (для ручных загрузок) или описательная метка — для показа в галерее.</summary>
public string? OriginalFileName { get; private set; }
public DateTimeOffset CreatedAt { get; private set; }
private Image() { }
public static Image Create(ImageCategory category, string fileExtension, string? originalFileName) =>
new()
{
Id = Guid.NewGuid(),
Category = category,
FileExtension = Normalize(fileExtension),
OriginalFileName = string.IsNullOrWhiteSpace(originalFileName) ? null : originalFileName.Trim(),
CreatedAt = DateTimeOffset.UtcNow,
};
private static string Normalize(string extension)
{
var ext = extension.Trim().ToLowerInvariant();
return ext.StartsWith('.') ? ext : "." + ext;
}
}
@@ -0,0 +1,17 @@
namespace TeleWave.Domain.Images;
/// <summary>Категория изображения в общей галерее (вкладка). Определяет, откуда картинка пришла/где используется.</summary>
public enum ImageCategory
{
/// <summary>Загружено напрямую в галерею, не привязано к конкретной сущности.</summary>
Library,
/// <summary>Постер шоу.</summary>
ShowPoster,
/// <summary>Кадр серии.</summary>
EpisodeStill,
/// <summary>Фон блока ТВ-заставки.</summary>
BumperBackground,
}