Add database adapter system, production deployment configs, and new dashboard components

- Add PostgreSQL and SQLite database adapters with factory pattern
- Add migration script for SQLite to PostgreSQL
- Add production Dockerfiles and docker-compose configs
- Add deployment documentation and scripts
- Add BIA sync dashboard and matching service
- Add data completeness configuration and components
- Add new dashboard components (BusinessImportanceComparison, ComplexityDynamics, etc.)
- Update various services and routes
- Remove deprecated management-parameters.json and taxonomy files
This commit is contained in:
2026-01-14 00:38:40 +01:00
parent ca21b9538d
commit a7f8301196
73 changed files with 12878 additions and 2003 deletions

View File

@@ -60,7 +60,7 @@ class CMDBService {
}
// Try cache first
const cached = cacheStore.getObject<T>(typeName, id);
const cached = await cacheStore.getObject<T>(typeName, id);
if (cached) {
return cached;
}
@@ -89,14 +89,14 @@ class CMDBService {
const parsed = jiraAssetsClient.parseObject<T>(result.objects[0]);
if (parsed) {
cacheStore.upsertObject(typeName, parsed);
cacheStore.extractAndStoreRelations(typeName, parsed);
await cacheStore.upsertObject(typeName, parsed);
await cacheStore.extractAndStoreRelations(typeName, parsed);
}
return parsed;
}
// Try cache first
const cached = cacheStore.getObjectByKey<T>(typeName, objectKey);
const cached = await cacheStore.getObjectByKey<T>(typeName, objectKey);
if (cached) {
return cached;
}
@@ -119,14 +119,14 @@ class CMDBService {
const parsed = jiraAssetsClient.parseObject<T>(jiraObj);
if (parsed) {
cacheStore.upsertObject(typeName, parsed);
cacheStore.extractAndStoreRelations(typeName, parsed);
await cacheStore.upsertObject(typeName, parsed);
await cacheStore.extractAndStoreRelations(typeName, parsed);
}
return parsed;
} catch (error) {
// If object was deleted from Jira, remove it from our cache
if (error instanceof JiraObjectNotFoundError) {
const deleted = cacheStore.deleteObject(typeName, id);
const deleted = await cacheStore.deleteObject(typeName, id);
if (deleted) {
logger.info(`CMDBService: Removed deleted object ${typeName}/${id} from cache`);
}
@@ -145,13 +145,13 @@ class CMDBService {
options?: SearchOptions
): Promise<T[]> {
if (options?.searchTerm) {
return cacheStore.searchByLabel<T>(typeName, options.searchTerm, {
return await cacheStore.searchByLabel<T>(typeName, options.searchTerm, {
limit: options.limit,
offset: options.offset,
});
}
return cacheStore.getObjects<T>(typeName, {
return await cacheStore.getObjects<T>(typeName, {
limit: options?.limit,
offset: options?.offset,
});
@@ -160,15 +160,15 @@ class CMDBService {
/**
* Count objects of a type in cache
*/
countObjects(typeName: CMDBObjectTypeName): number {
return cacheStore.countObjects(typeName);
async countObjects(typeName: CMDBObjectTypeName): Promise<number> {
return await cacheStore.countObjects(typeName);
}
/**
* Search across all object types
*/
async searchAllTypes(searchTerm: string, options?: { limit?: number }): Promise<CMDBObject[]> {
return cacheStore.searchAllTypes(searchTerm, { limit: options?.limit });
return await cacheStore.searchAllTypes(searchTerm, { limit: options?.limit });
}
/**
@@ -179,7 +179,7 @@ class CMDBService {
attributeName: string,
targetTypeName: CMDBObjectTypeName
): Promise<T[]> {
return cacheStore.getRelatedObjects<T>(sourceId, targetTypeName, attributeName);
return await cacheStore.getRelatedObjects<T>(sourceId, targetTypeName, attributeName);
}
/**
@@ -190,7 +190,7 @@ class CMDBService {
sourceTypeName: CMDBObjectTypeName,
attributeName?: string
): Promise<T[]> {
return cacheStore.getReferencingObjects<T>(targetId, sourceTypeName, attributeName);
return await cacheStore.getReferencingObjects<T>(targetId, sourceTypeName, attributeName);
}
// ==========================================================================
@@ -396,29 +396,29 @@ class CMDBService {
/**
* Get cache statistics
*/
getCacheStats(): CacheStats {
return cacheStore.getStats();
async getCacheStats(): Promise<CacheStats> {
return await cacheStore.getStats();
}
/**
* Check if cache has data
*/
isCacheWarm(): boolean {
return cacheStore.isWarm();
async isCacheWarm(): Promise<boolean> {
return await cacheStore.isWarm();
}
/**
* Clear cache for a specific type
*/
clearCacheForType(typeName: CMDBObjectTypeName): void {
cacheStore.clearObjectType(typeName);
async clearCacheForType(typeName: CMDBObjectTypeName): Promise<void> {
await cacheStore.clearObjectType(typeName);
}
/**
* Clear entire cache
*/
clearCache(): void {
cacheStore.clearAll();
async clearCache(): Promise<void> {
await cacheStore.clearAll();
}
// ==========================================================================
@@ -429,7 +429,11 @@ class CMDBService {
* Set user token for current request
*/
setUserToken(token: string | null): void {
jiraAssetsClient.setRequestToken(token);
if (token) {
jiraAssetsClient.setRequestToken(token);
} else {
jiraAssetsClient.clearRequestToken();
}
}
/**