dnsweeper
Version:
Advanced CLI tool for DNS record risk analysis and cleanup. Features CSV import for Cloudflare/Route53, automated risk assessment, and parallel DNS validation.
161 lines (139 loc) • 5.17 kB
text/typescript
import api from './api';
import type { ApiResponse } from '../types';
// エクスポート関連の型定義
export interface ExportRequest {
type: 'dns_records' | 'change_history' | 'analysis_results' | 'statistics';
format: 'csv' | 'excel' | 'pdf';
filter?: {
domain?: string;
recordType?: string;
riskLevel?: 'high' | 'medium' | 'low';
changeType?: 'create' | 'update' | 'delete';
source?: 'manual' | 'import' | 'api' | 'monitoring';
dateFrom?: Date;
dateTo?: Date;
analysisId?: string;
limit?: number;
};
options?: {
includeCharts?: boolean;
worksheetName?: string;
includeHeader?: boolean;
includeFooter?: boolean;
orientation?: 'portrait' | 'landscape';
pageSize?: 'A4' | 'Letter' | 'Legal';
delimiter?: string;
encoding?: 'utf8' | 'shift_jis';
includeBOM?: boolean;
includeMetadata?: boolean;
customFileName?: string;
};
}
export interface ExportResult {
success: boolean;
downloadUrl?: string;
fileName: string;
fileSize: number;
format: string;
recordCount: number;
generatedAt: Date;
expiresAt: Date;
error?: string;
}
export interface ExportTemplate {
name: string;
description: string;
type: ExportRequest['type'];
format: ExportRequest['format'];
defaultFilter: ExportRequest['filter'];
defaultOptions: ExportRequest['options'];
}
// エクスポート関連API
export const exportApi = {
// エクスポートテンプレート一覧の取得
getTemplates: async (): Promise<ApiResponse<ExportTemplate[]>> => {
return api.get('/export/templates');
},
// エクスポート実行
createExport: async (request: ExportRequest): Promise<ApiResponse<ExportResult>> => {
// Date オブジェクトを ISO 文字列に変換
const requestWithStringDates = {
...request,
filter: request.filter ? {
...request.filter,
dateFrom: request.filter.dateFrom?.toISOString(),
dateTo: request.filter.dateTo?.toISOString()
} : undefined
};
const response = await api.post('/export', requestWithStringDates);
// レスポンスの日付文字列をDateオブジェクトに変換
if (response.data) {
response.data.generatedAt = new Date(response.data.generatedAt);
response.data.expiresAt = new Date(response.data.expiresAt);
}
return response.data;
},
// DNS レコードのクイックエクスポート
exportDnsRecords: async (params: {
format?: string;
domain?: string;
recordType?: string;
limit?: number;
filename?: string;
}): Promise<ApiResponse<ExportResult>> => {
const queryParams = new URLSearchParams();
if (params.format) queryParams.append('format', params.format);
if (params.domain) queryParams.append('domain', params.domain);
if (params.recordType) queryParams.append('recordType', params.recordType);
if (params.limit) queryParams.append('limit', params.limit.toString());
if (params.filename) queryParams.append('filename', params.filename);
const response = await api.get(`/export/dns-records?${queryParams.toString()}`);
if (response.data) {
response.data.generatedAt = new Date(response.data.generatedAt);
response.data.expiresAt = new Date(response.data.expiresAt);
}
return response.data;
},
// 変更履歴のクイックエクスポート
exportChangeHistory: async (params: {
format?: string;
days?: number;
domain?: string;
changeType?: string;
source?: string;
filename?: string;
}): Promise<ApiResponse<ExportResult>> => {
const queryParams = new URLSearchParams();
if (params.format) queryParams.append('format', params.format);
if (params.days) queryParams.append('days', params.days.toString());
if (params.domain) queryParams.append('domain', params.domain);
if (params.changeType) queryParams.append('changeType', params.changeType);
if (params.source) queryParams.append('source', params.source);
if (params.filename) queryParams.append('filename', params.filename);
const response = await api.get(`/export/change-history?${queryParams.toString()}`);
if (response.data) {
response.data.generatedAt = new Date(response.data.generatedAt);
response.data.expiresAt = new Date(response.data.expiresAt);
}
return response.data;
},
// ファイルダウンロード(ブラウザでの直接ダウンロード)
downloadFile: (downloadUrl: string): void => {
// 新しいタブでダウンロードURLを開く
const link = document.createElement('a');
link.href = downloadUrl;
link.target = '_blank';
link.rel = 'noopener noreferrer';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
},
// ファイルダウンロード(fetch APIを使用)
downloadFileAsBlob: async (downloadUrl: string): Promise<Blob> => {
const response = await fetch(downloadUrl);
if (!response.ok) {
throw new Error(`ダウンロードに失敗しました: ${response.statusText}`);
}
return response.blob();
}
};