cef8610925
* feat: add enabled column to UserFeatures and TeamFeatures for tri-state semantics - Add enabled Boolean column to UserFeatures model with default true - Add enabled Boolean column to TeamFeatures model with default true - Update FeaturesRepository to use tri-state semantics: - enabled=true: feature is explicitly enabled - enabled=false: feature is explicitly disabled (blocks inheritance) - No row: inherit from team/org level - Update SQL queries to check enabled=true for feature access - Add enableFeatureForTeam method to interface and implementation Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * update comments * add integration tests * add more test * select enabled only * no @default(true) * fix types and tests * add missing enabled * add missing enabled * rename enableFeatureForTeam to updateFeatureForTeam and support FeatureState * refactor: rename updateFeatureForTeam to setTeamFeatureState Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * fix integration test * fix tests * add more tests * add missing enabled --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
20 lines
768 B
TypeScript
20 lines
768 B
TypeScript
import type { AppFlags, FeatureState } from "./config";
|
|
|
|
/**
|
|
* Interface for the core FeaturesRepository.
|
|
* This interface defines methods for checking feature flags and team feature access.
|
|
*/
|
|
export interface IFeaturesRepository {
|
|
checkIfFeatureIsEnabledGlobally(slug: keyof AppFlags): Promise<boolean>;
|
|
checkIfUserHasFeature(userId: number, slug: string): Promise<boolean>;
|
|
checkIfUserHasFeatureNonHierarchical(userId: number, slug: string): Promise<boolean>;
|
|
checkIfTeamHasFeature(teamId: number, slug: keyof AppFlags): Promise<boolean>;
|
|
getTeamsWithFeatureEnabled(slug: keyof AppFlags): Promise<number[]>;
|
|
setTeamFeatureState(
|
|
teamId: number,
|
|
featureId: keyof AppFlags,
|
|
state: FeatureState,
|
|
assignedBy: string
|
|
): Promise<void>;
|
|
}
|