Enhanced the group management system by introducing dynamic group capabilities, allowing for the exclusion of elements from dynamic groups. Updated the Group and GroupItem models to support a new GroupMode, enabling the distinction between static and dynamic groups. Implemented API endpoints for excluding elements and updated related services to handle group composition based on the selected mode. Improved the frontend to accommodate these changes, including new API functions and UI components for managing exclusions and group modes, thereby enhancing the overall user experience in group management.
57 lines
2.3 KiB
C#
57 lines
2.3 KiB
C#
namespace TeleWave.Domain.Programming;
|
|
|
|
/// <summary>
|
|
/// Позиция группы: ссылка на шоу или коллекцию плюс вес и порядок.
|
|
///
|
|
/// <see cref="ElementId"/> — полиморфная ссылка, поэтому внешнего ключа на неё нет: удаление шоу
|
|
/// или коллекции из библиотеки чистит позиции команд удаления, а не каскадом БД.
|
|
/// </summary>
|
|
public class GroupItem
|
|
{
|
|
public Guid Id { get; private set; }
|
|
public Guid GroupId { get; private set; }
|
|
public GroupElementKind ElementKind { get; private set; }
|
|
public Guid ElementId { get; private set; }
|
|
|
|
/// <summary>Чем эта позиция является для группы — см. <see cref="GroupItemRole"/>.</summary>
|
|
public GroupItemRole Role { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Вес при случайном выборе внутри группы (по умолчанию 1). Не конфликтует с остыванием, если
|
|
/// применять их в правильном порядке: сначала остывание отсекает недавно показанное, затем
|
|
/// взвешенный выбор работает среди оставшихся.
|
|
/// </summary>
|
|
public int Weight { get; private set; }
|
|
|
|
/// <summary>Порядок для последовательных стратегий (может иметь разрывы после удалений).</summary>
|
|
public int Position { get; private set; }
|
|
|
|
public const int DefaultWeight = 1;
|
|
|
|
private GroupItem() { }
|
|
|
|
internal static GroupItem Create(
|
|
Guid groupId,
|
|
GroupElementKind elementKind,
|
|
Guid elementId,
|
|
int position,
|
|
GroupItemRole role = GroupItemRole.Member
|
|
) =>
|
|
new()
|
|
{
|
|
Id = Guid.NewGuid(),
|
|
GroupId = groupId,
|
|
ElementKind = elementKind,
|
|
ElementId = elementId,
|
|
Role = role,
|
|
Weight = DefaultWeight,
|
|
Position = position,
|
|
};
|
|
|
|
internal void SetRole(GroupItemRole role) => Role = role;
|
|
|
|
internal void SetPosition(int position) => Position = position;
|
|
|
|
internal void SetWeight(int weight) => Weight = Math.Max(0, weight);
|
|
}
|