import type {
PlanetscaleAnomalySummary,
PlanetscaleBranchSummary,
PlanetscaleCorrelation,
PlanetscaleDatabaseSummary,
PlanetscaleOrganizationSummary,
PlanetscaleQuerySummary,
} from './types.ts'
import { booleanField, numberField, stringField } from './types.ts'
function stringList(value: unknown): Array<string> {
if (!Array.isArray(value)) return []
return value.filter((item): item is string => typeof item === 'string' && item.length > 0)
}
export function mapOrganization(value: unknown): PlanetscaleOrganizationSummary {
const record = value && typeof value === 'object' ? (value as Record<string, unknown>) : {}
return {
id: stringField(record.id) ?? '',
name: stringField(record.name),
billingEmail: stringField(record.billing_email),
}
}
export function mapDatabase(value: unknown): PlanetscaleDatabaseSummary {
const record = value && typeof value === 'object' ? (value as Record<string, unknown>) : {}
const region =
record.region && typeof record.region === 'object'
? stringField((record.region as { slug?: unknown; display_name?: unknown }).slug) ??
stringField((record.region as { display_name?: unknown }).display_name)
: stringField(record.region)
return {
id: stringField(record.id) ?? '',
name: stringField(record.name),
kind: stringField(record.kind) ?? stringField(record.engine),
region,
htmlUrl: stringField(record.html_url),
}
}
export function mapBranch(value: unknown): PlanetscaleBranchSummary {
const record = value && typeof value === 'object' ? (value as Record<string, unknown>) : {}
return {
id: stringField(record.id) ?? '',
name: stringField(record.name),
production: booleanField(record.production),
ready: booleanField(record.ready),
htmlUrl: stringField(record.html_url),
parentBranch: stringField(record.parent_branch),
}
}
export function mapQuery(value: unknown): PlanetscaleQuerySummary {
const record = value && typeof value === 'object' ? (value as Record<string, unknown>) : {}
return {
id: stringField(record.id) ?? '',
fingerprint: stringField(record.fingerprint),
normalizedSql: stringField(record.normalized_sql),
statementType: stringField(record.statement_type),
keyspace: stringField(record.keyspace),
tables: stringList(record.tables),
queryCount: numberField(record.query_count),
p99Latency: numberField(record.p99_latency),
timePerQuery: numberField(record.time_per_query),
sumRowsRead: numberField(record.sum_rows_read),
errorCount: numberField(record.error_count),
lastRunAt: stringField(record.last_run_at),
}
}
function mapCorrelation(value: unknown): PlanetscaleCorrelation {
const record = value && typeof value === 'object' ? (value as Record<string, unknown>) : {}
return {
id: stringField(record.id) ?? '',
fingerprint: stringField(record.fingerprint),
normalizedSql: stringField(record.normalized_sql),
keyspace: stringField(record.keyspace),
r: numberField(record.r),
}
}
export function mapAnomaly(value: unknown): PlanetscaleAnomalySummary {
const record = value && typeof value === 'object' ? (value as Record<string, unknown>) : {}
const correlations = Array.isArray(record.correlations) ? record.correlations : []
return {
id: stringField(record.id) ?? '',
active: booleanField(record.active),
periodStart: stringField(record.period_start),
periodEnd: stringField(record.period_end),
minutesInViolation: numberField(record.minutes_in_violation),
duration: numberField(record.duration),
correlations: correlations.map(mapCorrelation),
}
}