feat(platform): feature flags + user settings foundation (#35)
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
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
This commit was merged in pull request #35.
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
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; }
|
||||
}
|
||||
Reference in New Issue
Block a user