← back to Dw Boardroom Governance
frontend/src/api.ts
61 lines
import type { Decision, DelegationContract, Initiative, Meeting, GovernanceStatus } from './types';
const BASE = '';
const AUTH = btoa('admin:DWSecure2024!');
async function fetchApi<T>(path: string, options?: RequestInit): Promise<T> {
const res = await fetch(`${BASE}${path}`, {
...options,
headers: {
'Authorization': `Basic ${AUTH}`,
'Content-Type': 'application/json',
...options?.headers,
},
});
if (!res.ok) {
const text = await res.text();
throw new Error(`API ${res.status}: ${text}`);
}
return res.json();
}
export const api = {
// Governance
getStatus: () => fetchApi<GovernanceStatus>('/api/governance/status'),
getConfig: () => fetchApi<Record<string, any>>('/api/governance/config'),
updateConfig: (data: Record<string, any>) => fetchApi<Record<string, any>>('/api/governance/config', { method: 'POST', body: JSON.stringify(data) }),
// Meetings
getMeetings: () => fetchApi<Meeting[]>('/api/meetings'),
getActiveMeeting: () => fetchApi<any>('/api/meetings/active'),
startMeeting: (type: string, agendaItems?: any[]) => fetchApi<Meeting>(`/api/meetings/${type}`, { method: 'POST', body: JSON.stringify({ agendaItems }) }),
haltMeeting: (id: string) => fetchApi<any>(`/api/meetings/${id}/halt`, { method: 'POST' }),
advanceMeeting: (id: string) => fetchApi<any>(`/api/meetings/${id}/advance`, { method: 'POST' }),
getMeetingMessages: (id: string) => fetchApi<any[]>(`/api/meetings/${id}/messages`),
// Decisions
getDecisions: (status?: string) => fetchApi<Decision[]>(`/api/decisions${status ? `?status=${status}` : ''}`),
getDecisionStats: () => fetchApi<Record<string, number>>('/api/decisions/stats'),
createDecision: (data: any) => fetchApi<Decision>('/api/decisions', { method: 'POST', body: JSON.stringify(data) }),
approveDecision: (id: string, notes?: string) => fetchApi<Decision>(`/api/decisions/${id}/approve`, { method: 'POST', body: JSON.stringify({ notes }) }),
rejectDecision: (id: string, notes?: string) => fetchApi<Decision>(`/api/decisions/${id}/reject`, { method: 'POST', body: JSON.stringify({ notes }) }),
deferDecision: (id: string, notes?: string) => fetchApi<Decision>(`/api/decisions/${id}/defer`, { method: 'POST', body: JSON.stringify({ notes }) }),
// Delegations
getDelegations: (status?: string) => fetchApi<DelegationContract[]>(`/api/delegations${status ? `?status=${status}` : ''}`),
createDelegation: (data: any) => fetchApi<DelegationContract>('/api/delegations', { method: 'POST', body: JSON.stringify(data) }),
suggestDelegate: (description: string) => fetchApi<any>('/api/delegations/suggest', { method: 'POST', body: JSON.stringify({ description }) }),
completeDelegation: (id: string) => fetchApi<DelegationContract>(`/api/delegations/${id}/complete`, { method: 'POST' }),
revokeDelegation: (id: string) => fetchApi<DelegationContract>(`/api/delegations/${id}/revoke`, { method: 'POST' }),
// Initiatives
getInitiatives: () => fetchApi<Initiative[]>('/api/initiatives'),
createInitiative: (data: any) => fetchApi<Initiative>('/api/initiatives', { method: 'POST', body: JSON.stringify(data) }),
updateInitiative: (id: string, data: any) => fetchApi<Initiative>(`/api/initiatives/${id}`, { method: 'PATCH', body: JSON.stringify(data) }),
// Escalations
getEscalations: () => fetchApi<any[]>('/api/escalations'),
getActiveEscalations: () => fetchApi<any[]>('/api/escalations/active'),
triggerEscalationCheck: () => fetchApi<any>('/api/escalations/check', { method: 'POST' }),
};