File size: 5,664 Bytes
7fabf33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import type {
  ActivityType,
  DashboardResponse,
  EvaluatorSummary,
  GoalPeriod,
  PaginatedResponse,
  RegistrationCard,
  RegistrationDetail,
  TeamMemberOption,
  TimelineItem,
  TimelineEntry,
  TimelineEntryCreatePayload,
  WorkItemCard,
  WorkItemCreatePayload,
  WorkItemDetail,
  WorkItemFormOptions,
  WorkItemReopenPayload,
} from "./types";

const API_BASE_URL = import.meta.env.VITE_API_BASE_URL ?? (import.meta.env.DEV ? "http://127.0.0.1:8000" : "");

async function apiFetch<T>(path: string, init?: RequestInit): Promise<T> {
  const response = await fetch(`${API_BASE_URL}${path}`, {
    headers: {
      "Content-Type": "application/json",
      ...(init?.headers ?? {}),
    },
    ...init,
  });

  if (!response.ok) {
    const body = await response.text();
    throw new Error(body || `Falha ao acessar ${path}`);
  }

  return response.json() as Promise<T>;
}

export const api = {
  getDashboard: () => apiFetch<DashboardResponse>("/dashboard"),
  getWorkItems: (params?: { status?: string; evaluatorId?: number; priority?: string; q?: string; month?: string }) => {
    const search = new URLSearchParams();
    if (params?.status) search.set("status", params.status);
    if (params?.evaluatorId) search.set("evaluator_id", String(params.evaluatorId));
    if (params?.priority) search.set("priority", params.priority);
    if (params?.q) search.set("q", params.q);
    if (params?.month) search.set("month", params.month);
    const query = search.toString();
    return apiFetch<WorkItemCard[]>(`/work-items${query ? `?${query}` : ""}`);
  },
  getWorkItemsPage: (params?: { status?: string; evaluatorId?: number; priority?: string; q?: string; month?: string; page?: number }) => {
    const search = new URLSearchParams();
    if (params?.status) search.set("status", params.status);
    if (params?.evaluatorId) search.set("evaluator_id", String(params.evaluatorId));
    if (params?.priority) search.set("priority", params.priority);
    if (params?.q) search.set("q", params.q);
    if (params?.month) search.set("month", params.month);
    if (params?.page) search.set("page", String(params.page));
    const query = search.toString();
    return apiFetch<PaginatedResponse<WorkItemCard>>(`/work-items/paged${query ? `?${query}` : ""}`);
  },
  getRegistrations: (params?: { status?: string; evaluatorId?: number; priority?: string; q?: string; month?: string }) => {
    const search = new URLSearchParams();
    if (params?.status) search.set("status", params.status);
    if (params?.evaluatorId) search.set("evaluator_id", String(params.evaluatorId));
    if (params?.priority) search.set("priority", params.priority);
    if (params?.q) search.set("q", params.q);
    if (params?.month) search.set("month", params.month);
    const query = search.toString();
    return apiFetch<RegistrationCard[]>(`/registrations${query ? `?${query}` : ""}`);
  },
  getRegistrationsPage: (params?: { status?: string; evaluatorId?: number; priority?: string; q?: string; month?: string; page?: number }) => {
    const search = new URLSearchParams();
    if (params?.status) search.set("status", params.status);
    if (params?.evaluatorId) search.set("evaluator_id", String(params.evaluatorId));
    if (params?.priority) search.set("priority", params.priority);
    if (params?.q) search.set("q", params.q);
    if (params?.month) search.set("month", params.month);
    if (params?.page) search.set("page", String(params.page));
    const query = search.toString();
    return apiFetch<PaginatedResponse<RegistrationCard>>(`/registrations/paged${query ? `?${query}` : ""}`);
  },
  getRegistration: (propertyId: number) => apiFetch<RegistrationDetail>(`/registrations/${propertyId}`),
  getWorkItem: (id: number) => apiFetch<WorkItemDetail>(`/work-items/${id}`),
  createWorkItem: (payload: WorkItemCreatePayload) =>
    apiFetch<WorkItemDetail>("/work-items", {
      method: "POST",
      body: JSON.stringify(payload),
    }),
  updateWorkItem: (id: number, payload: WorkItemCreatePayload) =>
    apiFetch<WorkItemDetail>(`/work-items/${id}`, {
      method: "PUT",
      body: JSON.stringify(payload),
    }),
  reopenWorkItem: (id: number, payload: WorkItemReopenPayload) =>
    apiFetch<WorkItemDetail>(`/work-items/${id}/reopen`, {
      method: "POST",
      body: JSON.stringify(payload),
    }),
  createTimelineEntry: (id: number, payload: TimelineEntryCreatePayload) =>
    apiFetch<TimelineEntry>(`/work-items/${id}/timeline`, {
      method: "POST",
      body: JSON.stringify(payload),
    }),
  updateTimelineEntry: (workItemId: number, entryId: number, payload: TimelineEntryCreatePayload) =>
    apiFetch<TimelineEntry>(`/work-items/${workItemId}/timeline/${entryId}`, {
      method: "PUT",
      body: JSON.stringify(payload),
    }),
  deleteTimelineEntry: (workItemId: number, entryId: number) =>
    apiFetch<{ status: string }>(`/work-items/${workItemId}/timeline/${entryId}`, {
      method: "DELETE",
    }),
  getEvaluators: (params?: { month?: string }) => {
    const search = new URLSearchParams();
    if (params?.month) search.set("month", params.month);
    const query = search.toString();
    return apiFetch<EvaluatorSummary[]>(`/evaluators${query ? `?${query}` : ""}`);
  },
  getPriorityOptions: () => apiFetch<string[]>("/priority-options"),
  getTeamMembers: () => apiFetch<TeamMemberOption[]>("/team-members"),
  getTimeline: () => apiFetch<TimelineItem[]>("/timeline"),
  getGoals: () => apiFetch<GoalPeriod[]>("/goal-periods"),
  getActivityTypes: () => apiFetch<ActivityType[]>("/activity-types"),
  getWorkItemFormOptions: () => apiFetch<WorkItemFormOptions>("/work-item-form-options"),
};