Skip to content

Commit ee0c3ac

Browse files
committed
refactor(cli): unify report generators with helper functions
- Added generateVersionReport for A002, A013 (version-only reports) - Added generateSettingsReport for A003, A007 (settings-based reports) - Added generateIndexReport for H001, H002, H004 (index reports with totals) - Reduced ~150 lines to ~85 lines (43% reduction) - Keeps A004 explicit due to unique structure
1 parent d1d5960 commit ee0c3ac

1 file changed

Lines changed: 85 additions & 149 deletions

File tree

cli/lib/checkup.ts

Lines changed: 85 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -841,196 +841,132 @@ function resolveBuildTs(): string | null {
841841
}
842842
}
843843

844-
/**
845-
* Generate A002 report - Postgres major version
846-
*/
847-
export async function generateA002(client: Client, nodeName: string = "node-01"): Promise<Report> {
848-
const report = createBaseReport("A002", "Postgres major version", nodeName);
849-
const postgresVersion = await getPostgresVersion(client);
850-
851-
report.results[nodeName] = {
852-
data: {
853-
version: postgresVersion,
854-
},
855-
};
856-
857-
return report;
858-
}
844+
// ============================================================================
845+
// Unified Report Generator Helpers
846+
// ============================================================================
859847

860848
/**
861-
* Generate A003 report - Postgres settings
849+
* Generate a simple version report (A002, A013).
850+
* These reports only contain PostgreSQL version information.
862851
*/
863-
export async function generateA003(client: Client, nodeName: string = "node-01"): Promise<Report> {
864-
const report = createBaseReport("A003", "Postgres settings", nodeName);
852+
async function generateVersionReport(
853+
client: Client,
854+
nodeName: string,
855+
checkId: string,
856+
checkTitle: string
857+
): Promise<Report> {
858+
const report = createBaseReport(checkId, checkTitle, nodeName);
865859
const postgresVersion = await getPostgresVersion(client);
866-
const pgMajorVersion = parseInt(postgresVersion.server_major_ver, 10) || 16;
867-
const settings = await getSettings(client, pgMajorVersion);
868-
869-
report.results[nodeName] = {
870-
data: settings,
871-
postgres_version: postgresVersion,
872-
};
873-
860+
report.results[nodeName] = { data: { version: postgresVersion } };
874861
return report;
875862
}
876863

877864
/**
878-
* Generate A004 report - Cluster information
865+
* Generate a settings-based report (A003, A007).
866+
* Fetches settings using provided function and includes postgres_version.
879867
*/
880-
export async function generateA004(client: Client, nodeName: string = "node-01"): Promise<Report> {
881-
const report = createBaseReport("A004", "Cluster information", nodeName);
868+
async function generateSettingsReport(
869+
client: Client,
870+
nodeName: string,
871+
checkId: string,
872+
checkTitle: string,
873+
fetchSettings: (client: Client, pgMajorVersion: number) => Promise<Record<string, unknown>>
874+
): Promise<Report> {
875+
const report = createBaseReport(checkId, checkTitle, nodeName);
882876
const postgresVersion = await getPostgresVersion(client);
883877
const pgMajorVersion = parseInt(postgresVersion.server_major_ver, 10) || 16;
884-
const generalInfo = await getClusterInfo(client, pgMajorVersion);
885-
const databaseSizes = await getDatabaseSizes(client);
886-
887-
report.results[nodeName] = {
888-
data: {
889-
general_info: generalInfo,
890-
database_sizes: databaseSizes,
891-
},
892-
postgres_version: postgresVersion,
893-
};
894-
878+
const settings = await fetchSettings(client, pgMajorVersion);
879+
report.results[nodeName] = { data: settings, postgres_version: postgresVersion };
895880
return report;
896881
}
897882

898883
/**
899-
* Generate A007 report - Altered settings
884+
* Generate an index report (H001, H002, H004).
885+
* Common structure: index list + totals + database info, keyed by database name.
900886
*/
901-
export async function generateA007(client: Client, nodeName: string = "node-01"): Promise<Report> {
902-
const report = createBaseReport("A007", "Altered settings", nodeName);
887+
async function generateIndexReport<T extends { index_size_bytes: number }>(
888+
client: Client,
889+
nodeName: string,
890+
checkId: string,
891+
checkTitle: string,
892+
indexFieldName: string,
893+
fetchIndexes: (client: Client, pgMajorVersion: number) => Promise<T[]>,
894+
extraFields?: (client: Client, pgMajorVersion: number) => Promise<Record<string, unknown>>
895+
): Promise<Report> {
896+
const report = createBaseReport(checkId, checkTitle, nodeName);
903897
const postgresVersion = await getPostgresVersion(client);
904898
const pgMajorVersion = parseInt(postgresVersion.server_major_ver, 10) || 16;
905-
const alteredSettings = await getAlteredSettings(client, pgMajorVersion);
906-
907-
report.results[nodeName] = {
908-
data: alteredSettings,
909-
postgres_version: postgresVersion,
910-
};
911-
912-
return report;
913-
}
899+
const indexes = await fetchIndexes(client, pgMajorVersion);
900+
const { datname: dbName, size_bytes: dbSizeBytes } = await getCurrentDatabaseInfo(client, pgMajorVersion);
914901

915-
/**
916-
* Generate A013 report - Postgres minor version
917-
*/
918-
export async function generateA013(client: Client, nodeName: string = "node-01"): Promise<Report> {
919-
const report = createBaseReport("A013", "Postgres minor version", nodeName);
920-
const postgresVersion = await getPostgresVersion(client);
902+
const totalCount = indexes.length;
903+
const totalSizeBytes = indexes.reduce((sum, idx) => sum + idx.index_size_bytes, 0);
921904

922-
report.results[nodeName] = {
923-
data: {
924-
version: postgresVersion,
925-
},
905+
const dbEntry: Record<string, unknown> = {
906+
[indexFieldName]: indexes,
907+
total_count: totalCount,
908+
total_size_bytes: totalSizeBytes,
909+
total_size_pretty: formatBytes(totalSizeBytes),
910+
database_size_bytes: dbSizeBytes,
911+
database_size_pretty: formatBytes(dbSizeBytes),
926912
};
927913

914+
// Add extra fields if provided (e.g., stats_reset for H002)
915+
if (extraFields) {
916+
Object.assign(dbEntry, await extraFields(client, pgMajorVersion));
917+
}
918+
919+
report.results[nodeName] = { data: { [dbName]: dbEntry }, postgres_version: postgresVersion };
928920
return report;
929921
}
930922

931-
/**
932-
* Generate H001 report - Invalid indexes
933-
*/
934-
export async function generateH001(client: Client, nodeName: string = "node-01"): Promise<Report> {
935-
const report = createBaseReport("H001", "Invalid indexes", nodeName);
936-
const postgresVersion = await getPostgresVersion(client);
937-
const pgMajorVersion = parseInt(postgresVersion.server_major_ver, 10) || 16;
938-
const invalidIndexes = await getInvalidIndexes(client, pgMajorVersion);
939-
940-
// Get current database name and size
941-
const { datname: dbName, size_bytes: dbSizeBytes } = await getCurrentDatabaseInfo(client, pgMajorVersion);
923+
// ============================================================================
924+
// Report Generators (using unified helpers)
925+
// ============================================================================
942926

943-
// Calculate totals
944-
const totalCount = invalidIndexes.length;
945-
const totalSizeBytes = invalidIndexes.reduce((sum, idx) => sum + idx.index_size_bytes, 0);
927+
/** Generate A002 report - Postgres major version */
928+
export const generateA002 = (client: Client, nodeName = "node-01") =>
929+
generateVersionReport(client, nodeName, "A002", "Postgres major version");
946930

947-
// Structure data by database name per schema
948-
report.results[nodeName] = {
949-
data: {
950-
[dbName]: {
951-
invalid_indexes: invalidIndexes,
952-
total_count: totalCount,
953-
total_size_bytes: totalSizeBytes,
954-
total_size_pretty: formatBytes(totalSizeBytes),
955-
database_size_bytes: dbSizeBytes,
956-
database_size_pretty: formatBytes(dbSizeBytes),
957-
},
958-
},
959-
postgres_version: postgresVersion,
960-
};
931+
/** Generate A003 report - Postgres settings */
932+
export const generateA003 = (client: Client, nodeName = "node-01") =>
933+
generateSettingsReport(client, nodeName, "A003", "Postgres settings", getSettings);
961934

962-
return report;
963-
}
964-
965-
/**
966-
* Generate H002 report - Unused indexes
967-
*/
968-
export async function generateH002(client: Client, nodeName: string = "node-01"): Promise<Report> {
969-
const report = createBaseReport("H002", "Unused indexes", nodeName);
935+
/** Generate A004 report - Cluster information (custom structure) */
936+
export async function generateA004(client: Client, nodeName: string = "node-01"): Promise<Report> {
937+
const report = createBaseReport("A004", "Cluster information", nodeName);
970938
const postgresVersion = await getPostgresVersion(client);
971939
const pgMajorVersion = parseInt(postgresVersion.server_major_ver, 10) || 16;
972-
const unusedIndexes = await getUnusedIndexes(client, pgMajorVersion);
973-
const statsReset = await getStatsReset(client, pgMajorVersion);
974-
975-
// Get current database name and size
976-
const { datname: dbName, size_bytes: dbSizeBytes } = await getCurrentDatabaseInfo(client, pgMajorVersion);
977-
978-
// Calculate totals
979-
const totalCount = unusedIndexes.length;
980-
const totalSizeBytes = unusedIndexes.reduce((sum, idx) => sum + idx.index_size_bytes, 0);
981-
982-
// Structure data by database name per schema
983940
report.results[nodeName] = {
984941
data: {
985-
[dbName]: {
986-
unused_indexes: unusedIndexes,
987-
total_count: totalCount,
988-
total_size_bytes: totalSizeBytes,
989-
total_size_pretty: formatBytes(totalSizeBytes),
990-
database_size_bytes: dbSizeBytes,
991-
database_size_pretty: formatBytes(dbSizeBytes),
992-
stats_reset: statsReset,
993-
},
942+
general_info: await getClusterInfo(client, pgMajorVersion),
943+
database_sizes: await getDatabaseSizes(client),
994944
},
995945
postgres_version: postgresVersion,
996946
};
997-
998947
return report;
999948
}
1000949

1001-
/**
1002-
* Generate H004 report - Redundant indexes
1003-
*/
1004-
export async function generateH004(client: Client, nodeName: string = "node-01"): Promise<Report> {
1005-
const report = createBaseReport("H004", "Redundant indexes", nodeName);
1006-
const postgresVersion = await getPostgresVersion(client);
1007-
const pgMajorVersion = parseInt(postgresVersion.server_major_ver, 10) || 16;
1008-
const redundantIndexes = await getRedundantIndexes(client, pgMajorVersion);
1009-
1010-
// Get current database name and size
1011-
const { datname: dbName, size_bytes: dbSizeBytes } = await getCurrentDatabaseInfo(client, pgMajorVersion);
950+
/** Generate A007 report - Altered settings */
951+
export const generateA007 = (client: Client, nodeName = "node-01") =>
952+
generateSettingsReport(client, nodeName, "A007", "Altered settings", getAlteredSettings);
1012953

1013-
// Calculate totals
1014-
const totalCount = redundantIndexes.length;
1015-
const totalSizeBytes = redundantIndexes.reduce((sum, idx) => sum + idx.index_size_bytes, 0);
954+
/** Generate A013 report - Postgres minor version */
955+
export const generateA013 = (client: Client, nodeName = "node-01") =>
956+
generateVersionReport(client, nodeName, "A013", "Postgres minor version");
1016957

1017-
// Structure data by database name per schema
1018-
report.results[nodeName] = {
1019-
data: {
1020-
[dbName]: {
1021-
redundant_indexes: redundantIndexes,
1022-
total_count: totalCount,
1023-
total_size_bytes: totalSizeBytes,
1024-
total_size_pretty: formatBytes(totalSizeBytes),
1025-
database_size_bytes: dbSizeBytes,
1026-
database_size_pretty: formatBytes(dbSizeBytes),
1027-
},
1028-
},
1029-
postgres_version: postgresVersion,
1030-
};
958+
/** Generate H001 report - Invalid indexes */
959+
export const generateH001 = (client: Client, nodeName = "node-01") =>
960+
generateIndexReport(client, nodeName, "H001", "Invalid indexes", "invalid_indexes", getInvalidIndexes);
1031961

1032-
return report;
1033-
}
962+
/** Generate H002 report - Unused indexes (includes stats_reset) */
963+
export const generateH002 = (client: Client, nodeName = "node-01") =>
964+
generateIndexReport(client, nodeName, "H002", "Unused indexes", "unused_indexes", getUnusedIndexes,
965+
async (c, v) => ({ stats_reset: await getStatsReset(c, v) }));
966+
967+
/** Generate H004 report - Redundant indexes */
968+
export const generateH004 = (client: Client, nodeName = "node-01") =>
969+
generateIndexReport(client, nodeName, "H004", "Redundant indexes", "redundant_indexes", getRedundantIndexes);
1034970

1035971
/**
1036972
* Generate D004 report - pg_stat_statements and pg_stat_kcache settings.

0 commit comments

Comments
 (0)