main
ts 170 lines 5.15 KB
Raw
1 import type { FlaskBaseResponse } from "@/types/flask.d"
2 import type { SocAlert, SocAlertCaseResponse } from "@/types/soc/alert.d"
3 import type { SocAlertAsset, SocCaseAsset, SocCaseAssetsState } from "@/types/soc/asset.d"
4 import type { SocCase, SocCaseExt } from "@/types/soc/case.d"
5 import type { SocNewNote, SocNote } from "@/types/soc/note.d"
6 import type { SocUser } from "@/types/soc/user.d"
7 import { HttpClient } from "../httpClient"
8
9 export interface CasesFilter {
10 olderThan: number
11 unit: TimeUnit
12 }
13
14 export interface AlertsFilter {
15 pageSize: number
16 page: number
17 sort: "desc" | "asc"
18 alertTitle: string
19 }
20
21 type TimeUnit = "hours" | "days" | "weeks"
22
23 export default {
24 // #region Alerts
25 getAlerts(filters?: Partial<AlertsFilter>, signal?: AbortSignal) {
26 return HttpClient.post<FlaskBaseResponse & { alerts: SocAlert[] }>(
27 `/soc/alerts`,
28 {
29 per_page: filters?.pageSize || 1000,
30 page: filters?.page || 1,
31 sort: filters?.sort || "desc",
32 alert_title: filters?.alertTitle || ""
33 },
34 signal ? { signal } : {}
35 )
36 },
37 getAlert(alertId: string) {
38 return HttpClient.get<FlaskBaseResponse & { alert: SocAlert }>(`/soc/alerts/${alertId}`)
39 },
40 getAlertsBookmark(signal?: AbortSignal) {
41 return HttpClient.get<FlaskBaseResponse & { bookmarked_alerts: SocAlert[] }>(
42 `/soc/alerts/bookmark`,
43 signal ? { signal } : {}
44 )
45 },
46 getAlertsByUser(userId: string, signal?: AbortSignal) {
47 return HttpClient.get<FlaskBaseResponse & { alerts: SocAlert[] }>(
48 `/soc/alerts/alerts_by_user/${userId}`,
49 signal ? { signal } : {}
50 )
51 },
52 getAssetsByAlert(alertId: string) {
53 return HttpClient.get<FlaskBaseResponse & { assets: SocAlertAsset[] }>(`/soc/alerts/assets/${alertId}`)
54 },
55 addAlertBookmark(alertId: string) {
56 return HttpClient.post<FlaskBaseResponse & { alert: SocAlert }>(`/soc/alerts/bookmark/${alertId}`)
57 },
58 removeAlertBookmark(alertId: string) {
59 return HttpClient.delete<FlaskBaseResponse & { alert: SocAlert }>(`/soc/alerts/bookmark/${alertId}`)
60 },
61 deleteAlert(alertId: string) {
62 return HttpClient.delete<FlaskBaseResponse>(`/soc/alerts/${alertId}`)
63 },
64 deleteMultipleAlerts(alertIds: string[]) {
65 return HttpClient.post<FlaskBaseResponse>(`/soc/alerts/delete_multiple`, {
66 alert_ids: alertIds
67 })
68 },
69 /** Delete all alerts (up to 1000 per time) */
70 purgeAlerts() {
71 return HttpClient.delete<FlaskBaseResponse>(`/soc/alerts/purge`)
72 },
73 createCase(alertId: string) {
74 return HttpClient.post<FlaskBaseResponse & { case: SocAlertCaseResponse }>(`/soc/alerts/create_case/${alertId}`)
75 },
76 // #endregion
77
78 // #region Assets
79 getAssetsByCase(caseId: string) {
80 return HttpClient.get<FlaskBaseResponse & { assets: SocCaseAsset[]; state: SocCaseAssetsState }>(
81 `/soc/assets/${caseId}`
82 )
83 },
84 // #endregion
85
86 // #region Notes
87 getNotesByCase(caseId: string | number, payload: { searchTerm?: string }, signal?: AbortSignal) {
88 return HttpClient.get<FlaskBaseResponse & { notes: SocNote[] }>(`/soc/notes/${caseId}`, {
89 params: {
90 search_term: payload.searchTerm || "%"
91 },
92 signal
93 })
94 },
95 createCaseNote(caseId: string | number, payload?: { title?: string; content?: string }) {
96 return HttpClient.post<FlaskBaseResponse & { note: SocNewNote }>(`/soc/notes/${caseId}`, {
97 note_title: payload?.title || "",
98 note_content: payload?.content || ""
99 })
100 },
101 // #endregion
102
103 // #region Users
104 getUsers() {
105 return HttpClient.get<FlaskBaseResponse & { users: SocUser[] }>(`/soc/users`)
106 },
107 assignUserToAlert(alertId: string, userId: string) {
108 return HttpClient.post<FlaskBaseResponse & { alert: SocAlert }>(`/soc/users/assign/${alertId}/${userId}`)
109 },
110 removeUserAlertAssign(alertId: string, userId: string) {
111 return HttpClient.delete<FlaskBaseResponse & { alert: SocAlert }>(`/soc/users/assign/${alertId}/${userId}`)
112 },
113 // #endregion
114
115 // #region Cases
116 getCases(payload?: string | CasesFilter) {
117 let apiMethod: "get" | "post" = "get"
118 let url = `/soc/cases`
119
120 if (payload) {
121 if (typeof payload === "string") {
122 url = `/soc/cases/${payload}`
123 } else {
124 apiMethod = "post"
125 url = `/soc/cases/older_than`
126 }
127 }
128
129 return HttpClient[apiMethod]<
130 FlaskBaseResponse & { cases?: SocCase[]; case?: SocCaseExt; cases_breached?: SocCase[] }
131 >(
132 url,
133 {},
134 apiMethod === "post" && typeof payload !== "string"
135 ? {
136 params: {
137 older_than: payload?.olderThan || 1,
138 time_unit: payload?.unit || "days"
139 }
140 /* eslint no-mixed-spaces-and-tabs: "off" */
141 }
142 : undefined
143 )
144 },
145 getCasesOlder(payload: CasesFilter) {
146 return HttpClient.post<FlaskBaseResponse & { cases_breached: SocCase[] }>(
147 `/soc/cases/older_than`,
148 {},
149 {
150 params: {
151 older_than: payload.olderThan || 1,
152 time_unit: payload.unit || "days"
153 }
154 }
155 )
156 },
157 closeCase(caseId: string) {
158 return HttpClient.put<FlaskBaseResponse & { case: SocAlertCaseResponse }>(`/soc/cases/close/${caseId}`)
159 },
160 reopenCase(caseId: string) {
161 return HttpClient.put<FlaskBaseResponse & { case: SocAlertCaseResponse }>(`/soc/cases/open/${caseId}`)
162 },
163 deleteCase(caseId: string) {
164 return HttpClient.delete<FlaskBaseResponse>(`/soc/cases/purge/${caseId}`)
165 },
166 purgeAllCases() {
167 return HttpClient.delete<FlaskBaseResponse>(`/soc/cases/purge`)
168 }
169 // #endregion
170 }