Phase F
Some checks failed
CI / Node — lint, typecheck, test, build (push) Failing after 10s
CI / Go — node-agent tests (push) Failing after 8s
CI / Go — edge-gateway build (push) Successful in 18s

This commit is contained in:
smueller
2026-06-26 15:05:01 +02:00
parent 333ad1cc7d
commit 15cf302afc
23 changed files with 2116 additions and 8 deletions

View File

@@ -243,4 +243,23 @@ export {
type WhmcsCreateSsoResponse,
type SsoConsumeRequest,
type SsoConsumeResponse,
whmcsReconcileRequestSchema,
whmcsReconcileResponseSchema,
whmcsListAccountsResponseSchema,
whmcsImportServiceRequestSchema,
whmcsEventsResponseSchema,
whmcsEventsAckRequestSchema,
whmcsEventsAckResponseSchema,
whmcsUsageQuerySchema,
whmcsUsageResponseSchema,
whmcsUsageAdjustmentRequestSchema,
type WhmcsReconcileRequest,
type WhmcsReconcileResponse,
type WhmcsListAccountsResponse,
type WhmcsImportServiceRequest,
type WhmcsEventsResponse,
type WhmcsEventsAckRequest,
type WhmcsEventsAckResponse,
type WhmcsUsageResponse,
type WhmcsUsageAdjustmentRequest,
} from './whmcs';

View File

@@ -108,3 +108,163 @@ export type WhmcsCreateSsoRequest = z.infer<typeof whmcsCreateSsoRequestSchema>;
export type WhmcsCreateSsoResponse = z.infer<typeof whmcsCreateSsoResponseSchema>;
export type SsoConsumeRequest = z.infer<typeof ssoConsumeRequestSchema>;
export type SsoConsumeResponse = z.infer<typeof ssoConsumeResponseSchema>;
export const whmcsExpectedStatusSchema = z.enum([
'Pending',
'Active',
'Suspended',
'Terminated',
'Cancelled',
]);
export const whmcsReconcileRequestSchema = z.object({
expectedWhmcsStatus: whmcsExpectedStatusSchema.optional(),
expectedPlanSlug: z.string().max(64).optional(),
expectedRamMb: z.number().int().min(512).max(65536).optional(),
dryRun: z.boolean().default(false),
autoRepair: z.boolean().default(false),
});
export const reconciliationSeveritySchema = z.enum([
'INFO',
'WARNING',
'BLOCKING',
'DESTRUCTIVE',
'SECURITY',
]);
export const reconciliationIssueSchema = z.object({
id: z.string().uuid(),
code: z.string(),
severity: reconciliationSeveritySchema,
message: z.string(),
externalServiceId: z.string().nullable(),
serverId: z.string().uuid().nullable(),
details: z.record(z.unknown()).optional(),
autoRepaired: z.boolean(),
});
export const whmcsReconcileResponseSchema = z.object({
runId: z.string().uuid(),
dryRun: z.boolean(),
issues: z.array(reconciliationIssueSchema),
repaired: z.array(z.string()),
});
export const whmcsListAccountsResponseSchema = z.object({
accounts: z.array(
z.object({
externalServiceId: z.string(),
externalClientId: z.string(),
serverId: z.string().uuid(),
domain: z.string(),
username: z.string().nullable(),
status: z.enum(['Active', 'Suspended', 'Terminated', 'Pending']),
planSlug: z.string(),
ramMb: z.number().int(),
gameCloudStatus: z.string(),
linkStatus: z.enum(['PENDING', 'ACTIVE', 'SUSPENDED', 'TERMINATED']),
lastReconciledAt: z.string().datetime().nullable(),
}),
),
});
export const whmcsImportServiceRequestSchema = z.object({
externalServiceId: z.string().min(1).max(64),
externalClientId: z.string().min(1).max(64),
serverId: z.string().uuid(),
externalProductId: z.string().max(64).optional(),
expectedPlanSlug: z.string().max(64).optional(),
});
export const integrationEventSchema = z.object({
id: z.string().uuid(),
eventType: z.string(),
payload: z.record(z.unknown()),
status: z.enum(['PENDING', 'ACKNOWLEDGED', 'DEAD_LETTER']),
createdAt: z.string().datetime(),
});
export const whmcsEventsResponseSchema = z.object({
events: z.array(integrationEventSchema),
nextCursor: z.string().uuid().nullable(),
});
export const whmcsEventsAckRequestSchema = z.object({
eventIds: z.array(z.string().uuid()).min(1).max(100),
deadLetter: z.boolean().default(false),
deadLetterReason: z.string().max(512).optional(),
});
export const whmcsEventsAckResponseSchema = z.object({
acknowledged: z.number().int(),
});
export const whmcsUsageMetricsSchema = z.object({
runtime_minutes: z.number(),
memory_gib_minutes: z.number(),
cpu_core_minutes: z.number(),
storage_gib_days: z.number(),
backup_storage_gib_days: z.number(),
egress_gib: z.number(),
extra_port_days: z.number(),
priority_queue_minutes: z.number(),
managed_service_units: z.number(),
});
export const whmcsUsageUpdateSchema = z.object({
diskUsageGiB: z.number(),
bandwidthGiB: z.number(),
});
export const whmcsUsageQuerySchema = z.object({
periodStart: z.string().datetime().optional(),
periodEnd: z.string().datetime().optional(),
testMode: z.coerce.boolean().default(false),
});
export const whmcsUsageResponseSchema = z.object({
exportId: z.string().uuid(),
externalServiceId: z.string(),
serverId: z.string().uuid(),
periodStart: z.string().datetime(),
periodEnd: z.string().datetime(),
metrics: whmcsUsageMetricsSchema,
usageUpdate: whmcsUsageUpdateSchema,
contentHash: z.string(),
status: z.enum(['DRAFT', 'EXPORTED', 'ADJUSTED']),
isTestMode: z.boolean(),
adjustments: z.array(
z.object({
metricKey: z.string(),
delta: z.number(),
reason: z.string(),
}),
),
});
export const whmcsUsageAdjustmentRequestSchema = z.object({
periodStart: z.string().datetime(),
periodEnd: z.string().datetime(),
adjustments: z
.array(
z.object({
metricKey: z.string().min(1).max(64),
delta: z.number(),
reason: z.string().min(1).max(256),
}),
)
.min(1)
.max(20),
testMode: z.boolean().default(false),
});
export type WhmcsReconcileRequest = z.infer<typeof whmcsReconcileRequestSchema>;
export type WhmcsReconcileResponse = z.infer<typeof whmcsReconcileResponseSchema>;
export type WhmcsListAccountsResponse = z.infer<typeof whmcsListAccountsResponseSchema>;
export type WhmcsImportServiceRequest = z.infer<typeof whmcsImportServiceRequestSchema>;
export type WhmcsEventsResponse = z.infer<typeof whmcsEventsResponseSchema>;
export type WhmcsEventsAckRequest = z.infer<typeof whmcsEventsAckRequestSchema>;
export type WhmcsEventsAckResponse = z.infer<typeof whmcsEventsAckResponseSchema>;
export type WhmcsUsageResponse = z.infer<typeof whmcsUsageResponseSchema>;
export type WhmcsUsageAdjustmentRequest = z.infer<typeof whmcsUsageAdjustmentRequestSchema>;