port-nimara-client-portal/server/utils/service-checks.ts

163 lines
3.6 KiB
TypeScript

import { getNocoDbConfiguration } from './nocodb';
import { getMinioClient } from './minio';
interface ServiceCheckResult {
status: 'up' | 'down' | 'slow';
responseTime?: number;
error?: string;
}
export async function checkNocoDB(): Promise<ServiceCheckResult> {
const startTime = Date.now();
try {
const config = getNocoDbConfiguration();
if (!config.url || !config.token) {
return {
status: 'down',
error: 'Missing NocoDB configuration'
};
}
const response = await fetch(`${config.url}/api/v1/health`, {
headers: {
'xc-token': config.token
},
signal: AbortSignal.timeout(5000)
});
const responseTime = Date.now() - startTime;
if (response.ok) {
return {
status: responseTime > 3000 ? 'slow' : 'up',
responseTime
};
}
return {
status: 'down',
responseTime,
error: `HTTP ${response.status}`
};
} catch (error) {
return {
status: 'down',
error: error instanceof Error ? error.message : 'Unknown error'
};
}
}
export async function checkDirectus(): Promise<ServiceCheckResult> {
const startTime = Date.now();
try {
const directusUrl = useRuntimeConfig().public.directus?.url;
if (!directusUrl) {
return {
status: 'down',
error: 'Missing Directus configuration'
};
}
const response = await fetch(`${directusUrl}/server/health`, {
signal: AbortSignal.timeout(5000)
});
const responseTime = Date.now() - startTime;
if (response.ok) {
return {
status: responseTime > 3000 ? 'slow' : 'up',
responseTime
};
}
return {
status: 'down',
responseTime,
error: `HTTP ${response.status}`
};
} catch (error) {
return {
status: 'down',
error: error instanceof Error ? error.message : 'Unknown error'
};
}
}
export async function checkMinIO(): Promise<ServiceCheckResult> {
const startTime = Date.now();
try {
const minioClient = getMinioClient();
const bucketName = useRuntimeConfig().minio.bucketName;
const bucketExists = await minioClient.bucketExists(bucketName);
const responseTime = Date.now() - startTime;
if (bucketExists) {
return {
status: responseTime > 3000 ? 'slow' : 'up',
responseTime
};
}
return {
status: 'down',
responseTime,
error: 'Bucket not found'
};
} catch (error) {
return {
status: 'down',
error: error instanceof Error ? error.message : 'Unknown error'
};
}
}
export async function checkDocumenso(): Promise<ServiceCheckResult> {
const startTime = Date.now();
try {
const documensoUrl = process.env.NUXT_DOCUMENSO_BASE_URL;
const documensoKey = process.env.NUXT_DOCUMENSO_API_KEY;
if (!documensoUrl || !documensoKey) {
return {
status: 'down',
error: 'Missing Documenso configuration'
};
}
const response = await fetch(`${documensoUrl}/api/health`, {
headers: {
'Authorization': `Bearer ${documensoKey}`
},
signal: AbortSignal.timeout(5000)
});
const responseTime = Date.now() - startTime;
if (response.ok || response.status === 401) {
return {
status: responseTime > 3000 ? 'slow' : 'up',
responseTime
};
}
return {
status: 'down',
responseTime,
error: `HTTP ${response.status}`
};
} catch (error) {
return {
status: 'down',
error: error instanceof Error ? error.message : 'Unknown error'
};
}
}