← 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' }),
};