Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/planetscale

src/models.ts

94 lines · 3.5 KB · TypeScript
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),
	}
}