153 lines
4.2 KiB
TypeScript
153 lines
4.2 KiB
TypeScript
import type { IRouteConfig } from '@push.rocks/smartproxy';
|
|
|
|
// Derive IRouteSecurity from IRouteConfig since it's not directly exported
|
|
export type IRouteSecurity = NonNullable<IRouteConfig['security']>;
|
|
|
|
// ============================================================================
|
|
// Route Management Data Types
|
|
// ============================================================================
|
|
|
|
export type TApiTokenScope =
|
|
| 'routes:read' | 'routes:write'
|
|
| 'config:read'
|
|
| 'tokens:read' | 'tokens:manage'
|
|
| 'profiles:read' | 'profiles:write'
|
|
| 'targets:read' | 'targets:write';
|
|
|
|
// ============================================================================
|
|
// Security Profile Types
|
|
// ============================================================================
|
|
|
|
/**
|
|
* A reusable, named security profile that can be referenced by routes.
|
|
* Stores the full IRouteSecurity shape from SmartProxy.
|
|
*/
|
|
export interface ISecurityProfile {
|
|
id: string;
|
|
name: string;
|
|
description?: string;
|
|
/** The security configuration — mirrors SmartProxy's IRouteSecurity. */
|
|
security: IRouteSecurity;
|
|
/** IDs of profiles this one extends (resolved top-down, later overrides earlier). */
|
|
extendsProfiles?: string[];
|
|
createdAt: number;
|
|
updatedAt: number;
|
|
createdBy: string;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Network Target Types
|
|
// ============================================================================
|
|
|
|
/**
|
|
* A reusable, named network target (host + port) that can be referenced by routes.
|
|
*/
|
|
export interface INetworkTarget {
|
|
id: string;
|
|
name: string;
|
|
description?: string;
|
|
host: string | string[];
|
|
port: number;
|
|
createdAt: number;
|
|
updatedAt: number;
|
|
createdBy: string;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Route Metadata Types
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Metadata on a stored route tracking where its resolved values came from.
|
|
*/
|
|
export interface IRouteMetadata {
|
|
/** ID of the SecurityProfileDoc used to resolve this route's security. */
|
|
securityProfileRef?: string;
|
|
/** ID of the NetworkTargetDoc used to resolve this route's targets. */
|
|
networkTargetRef?: string;
|
|
/** Snapshot of the profile name at resolution time, for display. */
|
|
securityProfileName?: string;
|
|
/** Snapshot of the target name at resolution time, for display. */
|
|
networkTargetName?: string;
|
|
/** Timestamp of last reference resolution. */
|
|
lastResolvedAt?: number;
|
|
}
|
|
|
|
/**
|
|
* A merged route combining hardcoded and programmatic sources.
|
|
*/
|
|
export interface IMergedRoute {
|
|
route: IRouteConfig;
|
|
source: 'hardcoded' | 'programmatic';
|
|
enabled: boolean;
|
|
overridden: boolean;
|
|
storedRouteId?: string;
|
|
createdAt?: number;
|
|
updatedAt?: number;
|
|
metadata?: IRouteMetadata;
|
|
}
|
|
|
|
/**
|
|
* A warning generated during route merge/startup.
|
|
*/
|
|
export interface IRouteWarning {
|
|
type: 'disabled-hardcoded' | 'disabled-programmatic' | 'orphaned-override';
|
|
routeName: string;
|
|
message: string;
|
|
}
|
|
|
|
/**
|
|
* Public info about an API token (never includes the hash).
|
|
*/
|
|
export interface IApiTokenInfo {
|
|
id: string;
|
|
name: string;
|
|
scopes: TApiTokenScope[];
|
|
createdAt: number;
|
|
expiresAt: number | null;
|
|
lastUsedAt: number | null;
|
|
enabled: boolean;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Storage Schemas (persisted via StorageManager)
|
|
// ============================================================================
|
|
|
|
/**
|
|
* A programmatic route stored in /config-api/routes/{id}.json
|
|
*/
|
|
export interface IStoredRoute {
|
|
id: string;
|
|
route: IRouteConfig;
|
|
enabled: boolean;
|
|
createdAt: number;
|
|
updatedAt: number;
|
|
createdBy: string;
|
|
metadata?: IRouteMetadata;
|
|
}
|
|
|
|
/**
|
|
* An override for a hardcoded route, stored in /config-api/overrides/{routeName}.json
|
|
*/
|
|
export interface IRouteOverride {
|
|
routeName: string;
|
|
enabled: boolean;
|
|
updatedAt: number;
|
|
updatedBy: string;
|
|
}
|
|
|
|
/**
|
|
* A stored API token, stored in /config-api/tokens/{id}.json
|
|
*/
|
|
export interface IStoredApiToken {
|
|
id: string;
|
|
name: string;
|
|
tokenHash: string;
|
|
scopes: TApiTokenScope[];
|
|
createdAt: number;
|
|
expiresAt: number | null;
|
|
lastUsedAt: number | null;
|
|
createdBy: string;
|
|
enabled: boolean;
|
|
}
|