074d39d9a2
CI / backend (push) Successful in 1m4s
CI / frontend (push) Successful in 18s
CI / format (push) Successful in 1m1s
CI / db-tests (push) Successful in 1m4s
Deploy Staging / deploy (push) Successful in 37s
CI / backend (pull_request) Successful in 1m7s
CI / frontend (pull_request) Successful in 18s
CI / format (pull_request) Successful in 59s
CI / db-tests (pull_request) Successful in 1m5s
Security / secrets (push) Successful in 4s
Security / dependencies (push) Successful in 1m4s
Security / secrets (pull_request) Successful in 4s
Security / dependencies (pull_request) Successful in 1m4s
43 lines
1.5 KiB
C#
43 lines
1.5 KiB
C#
using InboxIntel.Domain.Common;
|
|
|
|
namespace InboxIntel.Domain.Entities;
|
|
|
|
/// <summary>
|
|
/// System-wide feature flag (docs/discovery/multi-provider/04). The admin master switches:
|
|
/// a disabled flag turns its feature off for EVERYONE regardless of user preferences.
|
|
/// Reads are fail-closed — an unknown key counts as disabled.
|
|
/// </summary>
|
|
public class FeatureFlag : AuditableEntity
|
|
{
|
|
/// <summary>Stable key, e.g. "ai.enabled", "provider.google".</summary>
|
|
public string Key { get; set; } = string.Empty;
|
|
|
|
public bool Enabled { get; set; }
|
|
|
|
/// <summary>True = a user preference may turn the feature OFF for themselves
|
|
/// (never on beyond the flag); false = system-only switch.</summary>
|
|
public bool UserOverridable { get; set; }
|
|
|
|
public string? Description { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Per-user preferences (docs/discovery/multi-provider/04). One row per user, created
|
|
/// lazily; absent row = defaults. AiOptIn defaults true so enabling the ai.enabled flag
|
|
/// behaves exactly like today until a user opts out.
|
|
/// </summary>
|
|
public class UserSetting : AuditableEntity
|
|
{
|
|
public Guid UserId { get; set; }
|
|
public User? User { get; set; }
|
|
|
|
/// <summary>"system" | "light" | "dark".</summary>
|
|
public string Theme { get; set; } = "dark";
|
|
|
|
/// <summary>Master per-user AI opt-in (effective only while ai.enabled is on).</summary>
|
|
public bool AiOptIn { get; set; } = true;
|
|
|
|
/// <summary>Free-form UI preferences (layout, density, notifications) as JSON.</summary>
|
|
public string? PreferencesJson { get; set; }
|
|
}
|