New packages: - @lab/core: Resource types, Output<T> (Pulumi), audit event types, auth types, environment/account types, resource kind registry New Prisma schema (mcpctl pattern): - User (email/password/bcrypt), Session (bearer tokens), Group, GroupMember - ServiceAccount, RbacDefinition (JSON subjects + roleBindings) - AuditEvent (correlation IDs, causal chains, fire-and-forget batching) - Environment, Account (driver config, Infisical secret path), Binding - Resource (generic, kind/name/env unique, origin/managedBy tracking) - Secret, Fleet, FleetMember, GitSource - Keeps v1.0 models: Server, Agent, Bastion, Cluster, JoinToken New services: - AuthService: bearer token login, bootstrap (first login creates admin), session management with 30-day expiry - RbacService: environment-scoped permission checks, group membership, role hierarchy (admin > edit > view) - AuditService: fire-and-forget event collection, batch 50 / flush 5s, correlation IDs for causal chains - ResourceStore: CRUD with origin/managedBy, RBAC-enforced routes New routes: - POST /api/auth/login, POST /api/auth/logout (bearer token auth) - GET/POST/PUT/DELETE /api/resources (RBAC-enforced CRUD) - GET/POST /api/environments, GET/POST /api/accounts - POST /api/accounts/bind, GET /api/bindings - GET /api/events (audit query with --last, --kind, --env, --correlation) New middleware: - Bearer token auth (validates Authorization header, resolves user identity) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
84 lines
1.9 KiB
TypeScript
84 lines
1.9 KiB
TypeScript
// Core resource types for the labctl platform.
|
|
// Every managed thing (Server, Database, App, Cluster) is a Resource.
|
|
|
|
export type ResourceOrigin = "file" | "cli" | "fleet" | "imported";
|
|
export type ResourceManagedBy = "gitops" | "manual" | "auto";
|
|
|
|
export type ResourceStatus =
|
|
| "pending"
|
|
| "creating"
|
|
| "ready"
|
|
| "updating"
|
|
| "deleting"
|
|
| "error"
|
|
| "unknown";
|
|
|
|
export interface ResourceMetadata {
|
|
kind: string;
|
|
name: string;
|
|
environmentId: string;
|
|
accountId: string;
|
|
origin: ResourceOrigin;
|
|
managedBy: ResourceManagedBy;
|
|
sourceRef?: string;
|
|
}
|
|
|
|
export interface ResourceState {
|
|
status: ResourceStatus;
|
|
message?: string;
|
|
lastReconciled?: Date;
|
|
platformRef?: string;
|
|
}
|
|
|
|
export interface Resource<TSpec = Record<string, unknown>> {
|
|
id: string;
|
|
metadata: ResourceMetadata;
|
|
desiredSpec: TSpec;
|
|
actualSpec?: TSpec;
|
|
state: ResourceState;
|
|
createdAt: Date;
|
|
updatedAt: Date;
|
|
}
|
|
|
|
// Well-known resource kinds. Drivers register additional kinds.
|
|
export const RESOURCE_KINDS = {
|
|
SERVER: "server",
|
|
DATABASE: "database",
|
|
CACHE: "cache",
|
|
CLUSTER: "cluster",
|
|
APP: "app",
|
|
SERVICE: "service",
|
|
CRONJOB: "cronjob",
|
|
NETWORK: "network",
|
|
LOADBALANCER: "loadbalancer",
|
|
DNSZONE: "dnszone",
|
|
CERTIFICATE: "certificate",
|
|
OBJECTSTORE: "objectstore",
|
|
QUEUE: "queue",
|
|
SECRET: "secret",
|
|
FLEET: "fleet",
|
|
} as const;
|
|
|
|
export type ResourceKind = (typeof RESOURCE_KINDS)[keyof typeof RESOURCE_KINDS];
|
|
|
|
// Resource aliases for CLI (kubectl-style shortnames)
|
|
export const RESOURCE_ALIASES: Record<string, string> = {
|
|
srv: "server",
|
|
db: "database",
|
|
cl: "cluster",
|
|
svc: "service",
|
|
cj: "cronjob",
|
|
lb: "loadbalancer",
|
|
dns: "dnszone",
|
|
cert: "certificate",
|
|
os: "objectstore",
|
|
mq: "queue",
|
|
sec: "secret",
|
|
fl: "fleet",
|
|
};
|
|
|
|
export function resolveResourceKind(input: string): string {
|
|
const lower = input.toLowerCase();
|
|
return RESOURCE_ALIASES[lower] ?? lower;
|
|
}
|