@@ -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