// src/lib/server/integrations/plugins/example.ts
import { BaseIntegration } from '../BaseIntegration';
import type {
IntegrationCredentials,
TestConnectionResult,
FetchMetricsOptions,
FetchMetricsResult
} from '../types';
export class ExampleIntegration extends BaseIntegration {
id = 'example';
name = 'Example Service';
category = 'analytics' as const;
icon = 'example-icon';
authType = 'api_key' as const;
credentialsSchema = {
apiKey: {
label: 'API Key',
placeholder: 'Enter your Example API key',
type: 'password' as const,
required: true,
helpText: 'Find your API key in Example Settings → API'
}
};
metrics = [
{
id: 'example_users',
name: 'Total Users',
description: 'Total number of users',
unit: 'count',
category: 'users',
widgetType: 'metric' as const
},
{
id: 'example_revenue',
name: 'Revenue',
description: 'Total revenue',
unit: 'USD',
category: 'revenue',
widgetType: 'chart' as const
}
];
async testConnection(credentials: IntegrationCredentials): Promise<TestConnectionResult> {
try {
// Test the API key by making a simple request
const response = await this.makeRequest<{ account: any }>(
'https://api.example.com/v1/account',
{
headers: {
'Authorization': `Bearer ${credentials.apiKey}`
}
}
);
return {
success: true,
accountInfo: {
accountId: response.account.id,
accountName: response.account.name
}
};
} catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : 'Connection failed'
};
}
}
async fetchMetrics(
credentials: IntegrationCredentials,
options: FetchMetricsOptions
): Promise<FetchMetricsResult> {
const metrics: FetchMetricsResult['metrics'] = [];
// Fetch each requested metric
for (const metricId of options.metricIds) {
try {
const data = await this.fetchMetric(credentials, metricId, options);
metrics.push(...data);
} catch (error) {
console.error(`Failed to fetch ${metricId}:`, error);
// Continue with other metrics
}
}
return { metrics };
}
private async fetchMetric(
credentials: IntegrationCredentials,
metricId: string,
options: FetchMetricsOptions
): Promise<FetchMetricsResult['metrics']> {
switch (metricId) {
case 'example_users':
return this.fetchUsers(credentials, options);
case 'example_revenue':
return this.fetchRevenue(credentials, options);
default:
throw new Error(`Unknown metric: ${metricId}`);
}
}
private async fetchUsers(
credentials: IntegrationCredentials,
options: FetchMetricsOptions
): Promise<FetchMetricsResult['metrics']> {
const response = await this.makeRequest<{ users: number }>(
'https://api.example.com/v1/stats/users',
{
headers: {
'Authorization': `Bearer ${credentials.apiKey}`
}
}
);
return [{
metricId: 'example_users',
value: response.users,
timestamp: Date.now(),
metadata: {}
}];
}
private async fetchRevenue(
credentials: IntegrationCredentials,
options: FetchMetricsOptions
): Promise<FetchMetricsResult['metrics']> {
// Fetch time series data
const response = await this.makeRequest<{ data: Array<{ date: string, amount: number }> }>(
`https://api.example.com/v1/stats/revenue?start=${options.startDate.toISOString()}&end=${options.endDate.toISOString()}`,
{
headers: {
'Authorization': `Bearer ${credentials.apiKey}`
}
}
);
return response.data.map(item => ({
metricId: 'example_revenue',
value: item.amount,
timestamp: new Date(item.date).getTime(),
metadata: {}
}));
}
}