@vfarcic/dot-ai
Version:
AI-powered development productivity platform that enhances software development workflows through intelligent automation and AI-driven assistance
174 lines (173 loc) • 8.05 kB
JavaScript
"use strict";
/**
* Resource Endpoint Schemas
*
* Schemas for resource-related endpoints:
* - GET /api/v1/resources/kinds
* - GET /api/v1/resources/search
* - GET /api/v1/resources (list)
* - GET /api/v1/resource (single)
* - POST /api/v1/resources/sync
* - GET /api/v1/namespaces
*
* PRD #354: REST API Route Registry with Auto-Generated OpenAPI and Test Fixtures
* PRD #328: Resource endpoints for UI
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ResourceSyncErrorSchema = exports.NamespacesErrorSchema = exports.SingleResourceErrorSchema = exports.ResourceListErrorSchema = exports.ResourceSearchErrorSchema = exports.ResourceKindsErrorSchema = exports.ResourcePluginUnavailableErrorSchema = exports.ResourceBadRequestErrorSchema = exports.ResourceNotFoundErrorSchema = exports.ResourceSyncResponseSchema = exports.ResourceSyncDataSchema = exports.ResourceSyncRequestSchema = exports.NamespacesResponseSchema = exports.NamespacesDataSchema = exports.SingleResourceResponseSchema = exports.SingleResourceDataSchema = exports.ResourceListResponseSchema = exports.ResourceListDataSchema = exports.ResourceSearchResponseSchema = exports.ResourceSearchDataSchema = exports.ResourceSummarySchema = exports.ResourceKindsResponseSchema = exports.ResourceKindsDataSchema = exports.ResourceKindSchema = void 0;
const zod_1 = require("zod");
const common_1 = require("./common");
/**
* Resource kind with count
*/
exports.ResourceKindSchema = zod_1.z.object({
kind: zod_1.z.string().describe('Resource kind (e.g., "Pod", "Deployment")'),
apiVersion: zod_1.z.string().describe('API version (e.g., "v1", "apps/v1")'),
count: zod_1.z.number().describe('Number of resources of this kind'),
apiGroup: zod_1.z.string().optional().describe('API group (e.g., "apps", "networking.k8s.io")'),
});
/**
* Resource kinds response data
* GET /api/v1/resources/kinds
*/
exports.ResourceKindsDataSchema = zod_1.z.object({
kinds: zod_1.z.array(exports.ResourceKindSchema).describe('List of resource kinds with counts'),
});
exports.ResourceKindsResponseSchema = (0, common_1.createSuccessResponseSchema)(exports.ResourceKindsDataSchema);
/**
* Resource summary for list/search results
*/
exports.ResourceSummarySchema = zod_1.z.object({
name: zod_1.z.string().describe('Resource name'),
namespace: zod_1.z.string().optional().describe('Namespace (for namespaced resources)'),
kind: zod_1.z.string().describe('Resource kind'),
apiVersion: zod_1.z.string().describe('API version'),
apiGroup: zod_1.z.string().optional().describe('API group'),
labels: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).optional().describe('Resource labels'),
createdAt: zod_1.z.string().optional().describe('Creation timestamp'),
score: zod_1.z.number().optional().describe('Search relevance score (for search results)'),
status: zod_1.z.any().optional().describe('Live status from Kubernetes API'),
});
/**
* Resource search response data
* GET /api/v1/resources/search
*/
exports.ResourceSearchDataSchema = zod_1.z.object({
resources: zod_1.z.array(exports.ResourceSummarySchema).describe('Matching resources'),
total: zod_1.z.number().describe('Total number of matches'),
limit: zod_1.z.number().describe('Requested limit'),
offset: zod_1.z.number().describe('Requested offset'),
});
exports.ResourceSearchResponseSchema = (0, common_1.createSuccessResponseSchema)(exports.ResourceSearchDataSchema);
/**
* Resource list response data
* GET /api/v1/resources
*/
exports.ResourceListDataSchema = zod_1.z.object({
resources: zod_1.z.array(exports.ResourceSummarySchema).describe('List of resources'),
total: zod_1.z.number().describe('Total number of resources'),
limit: zod_1.z.number().optional().describe('Applied limit'),
offset: zod_1.z.number().optional().describe('Applied offset'),
});
exports.ResourceListResponseSchema = (0, common_1.createSuccessResponseSchema)(exports.ResourceListDataSchema);
/**
* Single resource response data
* GET /api/v1/resource
*/
exports.SingleResourceDataSchema = zod_1.z.object({
resource: zod_1.z.record(zod_1.z.string(), zod_1.z.any()).describe('Full Kubernetes resource object'),
});
exports.SingleResourceResponseSchema = (0, common_1.createSuccessResponseSchema)(exports.SingleResourceDataSchema);
/**
* Namespaces response data
* GET /api/v1/namespaces
*/
exports.NamespacesDataSchema = zod_1.z.object({
namespaces: zod_1.z.array(zod_1.z.string()).describe('List of namespace names'),
});
exports.NamespacesResponseSchema = (0, common_1.createSuccessResponseSchema)(exports.NamespacesDataSchema);
/**
* Resource sync request body
* POST /api/v1/resources/sync
*/
exports.ResourceSyncRequestSchema = zod_1.z.object({
upserts: zod_1.z.array(zod_1.z.record(zod_1.z.string(), zod_1.z.any())).optional().describe('Resources to upsert'),
deletes: zod_1.z.array(zod_1.z.record(zod_1.z.string(), zod_1.z.any())).optional().describe('Resources to delete (requires namespace, name, kind, apiVersion)'),
isResync: zod_1.z.boolean().optional().describe('When true, performs full reconciliation - deletes resources not in upserts list'),
});
/**
* Resource sync response data
*/
exports.ResourceSyncDataSchema = zod_1.z.object({
upserted: zod_1.z.number().optional().describe('Number of resources upserted'),
deleted: zod_1.z.number().optional().describe('Number of resources deleted'),
healthy: zod_1.z.boolean().optional().describe('Health check result'),
message: zod_1.z.string().optional().describe('Operation message'),
});
exports.ResourceSyncResponseSchema = (0, common_1.createSuccessResponseSchema)(exports.ResourceSyncDataSchema);
/**
* Resource endpoint error schemas
*/
exports.ResourceNotFoundErrorSchema = common_1.NotFoundErrorSchema.extend({
error: zod_1.z.object({
code: zod_1.z.literal('NOT_FOUND'),
message: zod_1.z.string(),
details: zod_1.z.any().optional(),
}),
});
exports.ResourceBadRequestErrorSchema = common_1.BadRequestErrorSchema.extend({
error: zod_1.z.object({
code: zod_1.z.enum(['BAD_REQUEST', 'MISSING_PARAMETER', 'INVALID_PARAMETER', 'VALIDATION_ERROR']),
message: zod_1.z.string(),
details: zod_1.z.any().optional(),
}),
});
exports.ResourcePluginUnavailableErrorSchema = common_1.ServiceUnavailableErrorSchema.extend({
error: zod_1.z.object({
code: zod_1.z.literal('PLUGIN_UNAVAILABLE'),
message: zod_1.z.string(),
details: zod_1.z.any().optional(),
}),
});
exports.ResourceKindsErrorSchema = common_1.InternalServerErrorSchema.extend({
error: zod_1.z.object({
code: zod_1.z.literal('RESOURCE_KINDS_ERROR'),
message: zod_1.z.string(),
details: zod_1.z.any().optional(),
}),
});
exports.ResourceSearchErrorSchema = common_1.InternalServerErrorSchema.extend({
error: zod_1.z.object({
code: zod_1.z.literal('SEARCH_ERROR'),
message: zod_1.z.string(),
details: zod_1.z.any().optional(),
}),
});
exports.ResourceListErrorSchema = common_1.InternalServerErrorSchema.extend({
error: zod_1.z.object({
code: zod_1.z.literal('LIST_RESOURCES_ERROR'),
message: zod_1.z.string(),
details: zod_1.z.any().optional(),
}),
});
exports.SingleResourceErrorSchema = common_1.InternalServerErrorSchema.extend({
error: zod_1.z.object({
code: zod_1.z.literal('RESOURCE_ERROR'),
message: zod_1.z.string(),
details: zod_1.z.any().optional(),
}),
});
exports.NamespacesErrorSchema = common_1.InternalServerErrorSchema.extend({
error: zod_1.z.object({
code: zod_1.z.literal('NAMESPACES_ERROR'),
message: zod_1.z.string(),
details: zod_1.z.any().optional(),
}),
});
exports.ResourceSyncErrorSchema = common_1.InternalServerErrorSchema.extend({
error: zod_1.z.object({
code: zod_1.z.literal('SYNC_ERROR'),
message: zod_1.z.string(),
details: zod_1.z.any().optional(),
}),
});