// App Types export type TAppType = 'global' | 'partner' | 'custom_oidc'; export type TAppApprovalStatus = 'draft' | 'pending_review' | 'approved' | 'rejected' | 'suspended'; // OAuth Credentials export interface IOAuthCredentials { clientId: string; clientSecretHash: string; redirectUris: string[]; allowedScopes: string[]; grantTypes: ('authorization_code' | 'client_credentials' | 'refresh_token')[]; } // Base app data shared by all app types export interface IAppBaseData { name: string; description: string; logoUrl: string; appUrl: string; } // Global App - First-party apps managed by platform (foss.global, task.vc, etc.) export interface IGlobalApp { id: string; type: 'global'; data: IAppBaseData & { oauthCredentials: IOAuthCredentials; isActive: boolean; category: string; }; } // Partner App - Third-party apps submitted to AppStore export interface IPartnerApp { id: string; type: 'partner'; data: IAppBaseData & { ownerOrganizationId: string; oauthCredentials: IOAuthCredentials; appStoreMetadata: { shortDescription: string; longDescription: string; screenshots: string[]; category: string; tags: string[]; pricing: { model: 'free' | 'paid' | 'freemium' }; }; approvalStatus: TAppApprovalStatus; isPublished: boolean; installCount: number; }; } // Custom OIDC App - Organization-created OAuth clients export interface ICustomOidcApp { id: string; type: 'custom_oidc'; data: IAppBaseData & { ownerOrganizationId: string; oauthCredentials: IOAuthCredentials; oidcSettings: { accessTokenLifetime: number; // seconds refreshTokenLifetime: number; // seconds }; }; } // Union type for all app types export type IApp = IGlobalApp | IPartnerApp | ICustomOidcApp; /** * Legacy interface for backwards compatibility with existing code * that expects a flat app structure (e.g., idpclient, transfermanager) */ export interface IAppLegacy { /** * must be unique */ id: string; /** * should be unique */ name: string; description: string; logoUrl: string; appUrl: string; } /** * Storage interface for SmartData documents * Uses the discriminated union approach with a 'type' field */ export interface IAppDocument { id: string; type: TAppType; data: IGlobalApp['data'] | IPartnerApp['data'] | ICustomOidcApp['data']; }