import api from './client';
// ─── 2FA ───────────────────────────────────────────────────────────────
export interface TwoFactorStatus {
enabled: boolean;
totp_enabled: boolean;
}
export interface TwoFactorSetupResponse {
secret: string;
qr_url: string;
otpauth_url: string;
user_email: string;
}
// ─── API Keys ──────────────────────────────────────────────────────────
export interface ApiKey {
id: string;
name: string;
masked_key: string;
key?: string; // Only present on creation
last_used_at: string | null;
created_at: string | null;
expires_at: string | null;
permissions: Record<string, boolean>;
}
export interface CreateApiKeyRequest {
name: string;
permissions?: Record<string, boolean>;
}
// ─── Connected Accounts ────────────────────────────────────────────────
export interface ConnectedAccount {
service: string;
display_name: string;
status: 'connected' | 'error' | 'inactive' | 'syncing';
connected_at: string | null;
last_sync: string | null;
icon: string;
providerUrl: string;
}
export const securityApi = {
// ─── 2FA ───────────────────────────────────────────────────────────
get2faStatus: async (): Promise<TwoFactorStatus> => {
const { data } = await api.get<TwoFactorStatus>('/api/security/2fa/status');
return data;
},
setup2fa: async (): Promise<TwoFactorSetupResponse> => {
const { data } = await api.post<TwoFactorSetupResponse>('/api/security/2fa/setup');
return data;
},
enable2fa: async (code: string, secret: string): Promise<{ success: boolean; message: string }> => {
const { data } = await api.post<{ success: boolean; message: string }>('/api/security/2fa/enable', {
code,
secret,
});
return data;
},
disable2fa: async (currentPassword: string): Promise<{ success: boolean; message: string }> => {
const { data } = await api.post<{ success: boolean; message: string }>('/api/security/2fa/disable', {
currentPassword,
});
return data;
},
// ─── API Keys ──────────────────────────────────────────────────────
listApiKeys: async (): Promise<ApiKey[]> => {
const { data } = await api.get<{ success: boolean; data: ApiKey[] }>('/api/security/api-keys');
return data.data;
},
createApiKey: async (request: CreateApiKeyRequest): Promise<ApiKey> => {
const { data } = await api.post<{ success: boolean; data: ApiKey }>('/api/security/api-keys', request);
return data.data;
},
updateApiKey: async (id: string, name: string): Promise<{ id: string; name: string }> => {
const { data } = await api.put<{ success: boolean; data: { id: string; name: string } }>(
`/api/security/api-keys/${id}`,
{ name },
);
return data.data;
},
revokeApiKey: async (id: string): Promise<{ success: boolean; message: string }> => {
const { data } = await api.delete<{ success: boolean; message: string }>(
`/api/security/api-keys/${id}`,
);
return data;
},
// ─── Connected Accounts ────────────────────────────────────────────
getConnectedAccounts: async (): Promise<ConnectedAccount[]> => {
const { data } = await api.get<{ success: boolean; data: ConnectedAccount[] }>(
'/api/security/connected-accounts',
);
return data.data;
},
disconnectAccount: async (service: string): Promise<{ success: boolean; message: string }> => {
const { data } = await api.post<{ success: boolean; message: string }>(
`/api/security/connected-accounts/${service}/disconnect`,
);
return data;
},
// ─── Active Sessions ───────────────────────────────────────────────
getSessions: async (): Promise<{ success: boolean; data: any[] }> => {
const { data } = await api.get<{ success: boolean; data: any[] }>('/api/security/sessions');
return data;
},
revokeSession: async (sessionId: string): Promise<{ success: boolean; message: string }> => {
const { data } = await api.post<{ success: boolean; message: string }>(
`/api/security/sessions/${sessionId}/revoke`,
);
return data;
},
revokeOtherSessions: async (): Promise<{ success: boolean; message: string; count: number }> => {
const { data } = await api.post<{ success: boolean; message: string; count: number }>(
'/api/security/sessions/revoke-other',
);
return data;
},
// ─── Login History ─────────────────────────────────────────────────
getLoginHistory: async (): Promise<{ success: boolean; data: any[] }> => {
const { data } = await api.get<{ success: boolean; data: any[] }>('/api/security/login-history');
return data;
},
};