diff --git a/backend/src/index.ts b/backend/src/index.ts index 6cc4ca4..e914451 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -249,7 +249,7 @@ app.listen(PORT, async () => { if (db) { await db.ensureInitialized?.(); try { - const schemaRow = await (db as any).queryOne<{ count: number }>( + const schemaRow = await (db.queryOne as (sql: string, params?: any[]) => Promise)<{ count: number }>( `SELECT COUNT(*) as count FROM schemas` ); hasSchemas = (schemaRow?.count || 0) > 0; diff --git a/backend/src/services/dataIntegrityService.ts b/backend/src/services/dataIntegrityService.ts index 284f828..9fff3da 100644 --- a/backend/src/services/dataIntegrityService.ts +++ b/backend/src/services/dataIntegrityService.ts @@ -8,6 +8,7 @@ import { logger } from './logger.js'; import { normalizedCacheStore as cacheStore } from './normalizedCacheStore.js'; import { jiraAssetsClient, JiraObjectNotFoundError } from './jiraAssetsClient.js'; import type { CMDBObject } from '../generated/jira-types.js'; +import type { DatabaseAdapter } from './database/interface.js'; export interface BrokenReference { object_id: string; @@ -150,7 +151,8 @@ class DataIntegrityService { // 1. Check cache first const db = (cacheStore as any).db; if (db) { - const objRow = await db.queryOne<{ + const typedDb = db as DatabaseAdapter; + const objRow = await typedDb.queryOne<{ id: string; object_type_name: string; }>(` diff --git a/backend/src/services/dataService.ts b/backend/src/services/dataService.ts index 06dab4d..b4428f8 100644 --- a/backend/src/services/dataService.ts +++ b/backend/src/services/dataService.ts @@ -12,6 +12,7 @@ import { normalizedCacheStore } from './normalizedCacheStore.js'; import { jiraAssetsClient } from './jiraAssetsClient.js'; import { jiraAssetsService } from './jiraAssets.js'; import { logger } from './logger.js'; +import type { DatabaseAdapter } from './database/interface.js'; import type { ApplicationComponent, IctGovernanceModel, @@ -126,7 +127,8 @@ async function getDescriptionFromDatabase(objectId: string): Promise(` + const typedDb = db as DatabaseAdapter; + const objRow = await typedDb.queryOne<{ object_type_name: string }>(` SELECT object_type_name FROM objects WHERE id = ? `, [objectId]); @@ -134,7 +136,7 @@ async function getDescriptionFromDatabase(objectId: string): Promise(` + const descRow = await typedDb.queryOne<{ text_value: string }>(` SELECT av.text_value FROM attribute_values av JOIN attributes a ON av.attribute_id = a.id @@ -173,7 +175,8 @@ async function toReferenceValue(ref: ObjectReference | null | undefined): Promis await db.ensureInitialized?.(); // Get basic object info from database - const objRow = await db.queryOne<{ + const typedDb = db as DatabaseAdapter; + const objRow = await typedDb.queryOne<{ id: string; object_key: string; label: string; diff --git a/backend/src/services/database/fix-object-types-constraints.ts b/backend/src/services/database/fix-object-types-constraints.ts index 49b011a..f821ace 100644 --- a/backend/src/services/database/fix-object-types-constraints.ts +++ b/backend/src/services/database/fix-object-types-constraints.ts @@ -7,14 +7,15 @@ import { logger } from '../logger.js'; import { normalizedCacheStore } from '../normalizedCacheStore.js'; +import type { DatabaseAdapter } from './interface.js'; export async function fixObjectTypesConstraints(): Promise { - const db = (normalizedCacheStore as any).db; + const db = (normalizedCacheStore as any).db as DatabaseAdapter; if (!db) { throw new Error('Database not available'); } - await db.ensureInitialized?.(); + await (db as any).ensureInitialized?.(); logger.info('Migration: Fixing UNIQUE constraints on object_types table...'); diff --git a/backend/src/services/jiraAssets.ts b/backend/src/services/jiraAssets.ts index a4d652a..a1e6185 100644 --- a/backend/src/services/jiraAssets.ts +++ b/backend/src/services/jiraAssets.ts @@ -16,6 +16,7 @@ import type { TeamDashboardData, } from '../types/index.js'; import type { CMDBObjectTypeName } from '../generated/jira-types.js'; +import type { DatabaseAdapter } from './database/interface.js'; // Attribute name mappings (these should match your Jira Assets schema) const ATTRIBUTE_NAMES = { @@ -126,7 +127,8 @@ class JiraAssetsService { if (!db) return null; await db.ensureInitialized?.(); - const schemaRow = await db.queryOne<{ jira_schema_id: string }>( + const typedDb = db as DatabaseAdapter; + const schemaRow = await typedDb.queryOne<{ jira_schema_id: string }>( `SELECT jira_schema_id FROM schemas ORDER BY jira_schema_id LIMIT 1` ); return schemaRow?.jira_schema_id || null; @@ -146,9 +148,10 @@ class JiraAssetsService { if (!db) return []; await db.ensureInitialized?.(); - const schemaRows = await db.query<{ jira_schema_id: string }>( + const typedDb = db as DatabaseAdapter; + const schemaRows = await typedDb.query<{ jira_schema_id: string }>( `SELECT DISTINCT jira_schema_id FROM schemas WHERE search_enabled = ? ORDER BY jira_schema_id`, - [db.isPostgres ? true : 1] + [typedDb.isPostgres ? true : 1] ); return schemaRows.map((row: { jira_schema_id: string }) => row.jira_schema_id); } catch (error) { diff --git a/backend/src/services/schemaMappingService.ts b/backend/src/services/schemaMappingService.ts index 2555048..f3e9fe7 100644 --- a/backend/src/services/schemaMappingService.ts +++ b/backend/src/services/schemaMappingService.ts @@ -9,6 +9,7 @@ import { logger } from './logger.js'; import { normalizedCacheStore } from './normalizedCacheStore.js'; import { config } from '../config/env.js'; import type { CMDBObjectTypeName } from '../generated/jira-types.js'; +import type { DatabaseAdapter } from './database/interface.js'; export interface SchemaMapping { objectTypeName: string; @@ -61,7 +62,8 @@ class SchemaMappingService { await db.ensureInitialized?.(); - const rows = await db.query<{ + const typedDb = db as DatabaseAdapter; + const rows = await typedDb.query<{ object_type_name: string; schema_id: string; enabled: boolean | number; @@ -158,7 +160,8 @@ class SchemaMappingService { const db = (normalizedCacheStore as any).db; if (db) { await db.ensureInitialized?.(); - const row = await db.queryOne<{ enabled: boolean | number }>(` + const typedDb = db as DatabaseAdapter; + const row = await typedDb.queryOne<{ enabled: boolean | number }>(` SELECT enabled FROM schema_mappings WHERE object_type_name = ? `, [objectTypeName]); @@ -195,7 +198,8 @@ class SchemaMappingService { await db.ensureInitialized?.(); // Use parameterized query to avoid boolean/integer comparison issues - const rows = await db.query<{ + const typedDb = db as DatabaseAdapter; + const rows = await typedDb.query<{ object_type_name: string; schema_id: string; enabled: boolean | number; @@ -243,7 +247,8 @@ class SchemaMappingService { try { // Get all object types with their mappings - const rows = await db.query<{ + const typedDb = db as DatabaseAdapter; + const rows = await typedDb.query<{ type_name: string; display_name: string; description: string | null; @@ -274,7 +279,8 @@ class SchemaMappingService { const db = (normalizedCacheStore as any).db; if (db) { await db.ensureInitialized?.(); - const schemaRow = await db.queryOne<{ jira_schema_id: string }>( + const typedDb = db as DatabaseAdapter; + const schemaRow = await typedDb.queryOne<{ jira_schema_id: string }>( `SELECT jira_schema_id FROM schemas ORDER BY jira_schema_id LIMIT 1` ); defaultSchemaId = schemaRow?.jira_schema_id || null; @@ -283,7 +289,7 @@ class SchemaMappingService { logger.warn('SchemaMapping: Failed to get default schema ID from database', error); } - return rows.map((row: { type_name: string; display_name: string; description: string | null; schema_id: string; enabled: boolean | number; created_at: string; updated_at: string }) => ({ + return rows.map((row: { type_name: string; display_name: string; description: string | null; object_count: number; sync_priority: number; schema_id: string | null; enabled: number | boolean | null }) => ({ typeName: row.type_name, displayName: row.display_name, description: row.description, @@ -291,8 +297,8 @@ class SchemaMappingService { enabled: row.enabled === null ? true // Default: enabled if no mapping exists : (typeof row.enabled === 'boolean' ? row.enabled : row.enabled === 1), - objectCount: (row as any).object_count || 0, - syncPriority: (row as any).sync_priority || 0, + objectCount: row.object_count || 0, + syncPriority: row.sync_priority || 0, })); } catch (error) { logger.error('SchemaMappingService: Failed to get object types with config', error); @@ -312,7 +318,8 @@ class SchemaMappingService { await db.ensureInitialized?.(); // Check if mapping exists - const existing = await db.queryOne<{ schema_id: string }>(` + const typedDb = db as DatabaseAdapter; + const existing = await typedDb.queryOne<{ schema_id: string }>(` SELECT schema_id FROM schema_mappings WHERE object_type_name = ? `, [objectTypeName]);