/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import { DeaCaseFile } from '@aws/dea-app/lib/models/case-file'; import { CaseUser } from '@aws/dea-app/lib/models/case-user'; import { DeaUser } from '@aws/dea-app/lib/models/user'; import useSWR from 'swr'; import { httpApiDelete, httpApiGet, httpApiPost, httpApiPut } from '../helpers/apiHelper'; import { CompleteUploadForm, DownloadFileForm, DownloadFileResult, InitiateUploadForm, RestoreFileForm, } from '../models/CaseFiles'; import {CreateCaseForm, EditCaseForm, UpdateCaseStatusForm} from '../models/Cases'; import { CaseUserForm } from '../models/CaseUser'; import { CaseFileDTO, CaseOwnerDTO, DeaCaseDTO, ScopedDeaCaseDTO } from './models/case'; export interface DeaListResult { data: T[]; isLoading: boolean; // eslint-disable-next-line @typescript-eslint/no-explicit-any mutate?: any; } export interface DeaSingleResult { data: T; isLoading: boolean; // eslint-disable-next-line @typescript-eslint/no-explicit-any mutate?: any; } enum QueryStatus { Cancelled = "Cancelled", Complete = "Complete", Failed = "Failed", Running = "Running", Scheduled = "Scheduled", Timeout = "Timeout", Unknown = "Unknown" } const progressStatus = [QueryStatus.Running, QueryStatus.Scheduled] export interface DeaAuditStatus { status: QueryStatus; } export interface DeaAuditStartResponse { auditId: string; } interface CaseListReponse { cases: DeaCaseDTO[] } export const useListAllCases = (): DeaListResult => { const { data, error } = useSWR(() => `cases/all-cases?limit=10000`, httpApiGet ); const cases: DeaCaseDTO[] = data?.cases ?? []; return { data: cases, isLoading: !data && !error }; }; export const useListMyCases = (): DeaListResult => { const { data, error, mutate } = useSWR(() => `cases/my-cases?limit=10000`, (httpApiGet) ); const cases: DeaCaseDTO[] = data?.cases ?? []; return { data: cases, isLoading: !data && !error, mutate }; }; export const useGetCaseById = (id: string): DeaSingleResult => { const { data, error } = useSWR(() => `cases/${id}/details`, httpApiGet); return { data, isLoading: !data && !error }; }; export const useGetFileDetailsById = (caseId: string, fileId: string): DeaSingleResult => { const { data, error } = useSWR(() => `cases/${caseId}/files/${fileId}/info`, httpApiGet); return { data, isLoading: !data && !error }; } export const useGetScopedCaseInfoById = (id: string): DeaSingleResult => { const { data, error } = useSWR(() => `cases/${id}/scopedInformation`, httpApiGet); return { data, isLoading: !data && !error }; }; export const createCase = async (createCaseForm: CreateCaseForm): Promise => { await httpApiPost(`cases`, { ...createCaseForm }); }; export const updateCase = async (editCaseForm: EditCaseForm): Promise => { await httpApiPut(`/cases/${editCaseForm.ulid}/details`, { ...editCaseForm }); }; export const useListCaseFiles = (id: string, filePath = '/'): DeaListResult => { const { data, error } = useSWR(() => `cases/${id}/files?filePath=${filePath}&limit=10000`, httpApiGet<{files: DeaCaseFile[]}>); const caseFiles: DeaCaseFile[] = data?.files ?? []; return { data: caseFiles, isLoading: !error && !data }; }; export const initiateUpload = async (apiInput: InitiateUploadForm): Promise => { return httpApiPost(`cases/${apiInput.caseUlid}/files`, { ...apiInput }); }; export const completeUpload = async (apiInput: CompleteUploadForm): Promise => { return httpApiPut(`cases/${apiInput.caseUlid}/files/${apiInput.ulid}/contents`, { ...apiInput }); }; export const getPresignedUrl = async (apiInput: DownloadFileForm): Promise => { return httpApiGet(`cases/${apiInput.caseUlid}/files/${apiInput.ulid}/contents`, undefined); }; export const restoreFile = async (apiInput: RestoreFileForm): Promise => { return httpApiPut(`cases/${apiInput.caseUlid}/files/${apiInput.ulid}/restore`, undefined); }; export const useGetUsers = (nameBeginsWith: string): DeaListResult => { const { data, error } = useSWR(() => `users?nameBeginsWith=${nameBeginsWith}&limit=10000`, httpApiGet<{users: DeaUser[]}>); const users: DeaUser[] = data?.users ?? []; return { data: users, isLoading: !data && !error }; }; export const addCaseMember = async (caseUserForm: CaseUserForm): Promise => { await httpApiPost(`cases/${caseUserForm.caseUlid}/userMemberships`, { ...caseUserForm }); }; export const addCaseOwner = async (caseOwner: CaseOwnerDTO): Promise => { await httpApiPost(`cases/${caseOwner.caseUlid}/owner`, { ...caseOwner }); }; export const useGetCaseMembers = (id: string): DeaListResult => { const { data, error, mutate } = useSWR(() => `cases/${id}/userMemberships`, httpApiGet<{caseUsers: CaseUser[]}>); const cases: CaseUser[] = data?.caseUsers ?? []; return { data: cases, isLoading: !error && !data, mutate }; }; export const removeCaseMember = async (caseUser: CaseUserForm): Promise => { await httpApiDelete(`cases/${caseUser.caseUlid}/users/${caseUser.userUlid}/memberships`, { ...caseUser }); }; export const updateCaseMember = async (caseUser: CaseUserForm): Promise => { await httpApiPut(`cases/${caseUser.caseUlid}/users/${caseUser.userUlid}/memberships`, { ...caseUser }); }; export const updateCaseStatus = async (apiInput: UpdateCaseStatusForm): Promise => { const {caseId, ...data} = apiInput; await httpApiPut(`cases/${caseId}/status`, data); }; export const getCaseAuditCSV = async (caseId: string): Promise => { const auditId = await startCaseAuditQuery(caseId); let auditResponse = await retrieveCaseAuditResult(caseId, auditId); let maxRetries = 60; while (typeof(auditResponse) !== 'string') { if (!progressStatus.includes(auditResponse.status) || maxRetries === 0) { throw new Error(`Audit request was empty or experienced a failure. Status: ${auditResponse.status}`); } --maxRetries; await delay(1000); auditResponse = await retrieveCaseAuditResult(caseId, auditId); } return auditResponse; } export const startCaseAuditQuery = async (caseId: string): Promise => { const data: DeaAuditStartResponse = await httpApiPost(`cases/${caseId}/audit`, undefined); return data.auditId; } export const retrieveCaseAuditResult = async (caseId: string, auditId: string): Promise => { return await httpApiGet(`cases/${caseId}/audit/${auditId}/csv`, undefined); } export const getCaseFileAuditCSV = async (caseId: string, fileId: string): Promise => { const auditId = await startCaseFileAuditQuery(caseId, fileId); let auditResponse = await retrieveCaseFileAuditResult(caseId, fileId, auditId); let maxRetries = 60; while (typeof(auditResponse) !== 'string') { if (!progressStatus.includes(auditResponse.status) || maxRetries === 0) { throw new Error(`Audit request was empty or experienced a failure. Status: ${auditResponse.status}`); } --maxRetries; await delay(1000); auditResponse = await retrieveCaseFileAuditResult(caseId, fileId, auditId); } return auditResponse; } export const startCaseFileAuditQuery = async (caseId: string, fileId: string): Promise => { const data: DeaAuditStartResponse = await httpApiPost(`cases/${caseId}/files/${fileId}/audit`, undefined); return data.auditId; } export const retrieveCaseFileAuditResult = async (caseId: string, fileId: string, auditId: string): Promise => { return await httpApiGet(`cases/${caseId}/files/${fileId}/audit/${auditId}/csv`, undefined); } export function delay(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } export const useGetCaseActions = (id: string): DeaSingleResult => { const { data, error, mutate } = useSWR(() => `cases/${id}/actions`, httpApiGet); return { data, isLoading: !data && !error, mutate }; }; export const getSystemAuditCSV = async (): Promise => { const auditId = await startSystemAuditQuery(); let auditResponse = await retrieveSystemAuditResult(auditId); let maxRetries = 60; while (typeof(auditResponse) !== 'string') { if (!progressStatus.includes(auditResponse.status) || maxRetries === 0) { throw new Error(`Audit request was empty or experienced a failure. Status: ${auditResponse.status}`); } --maxRetries; await delay(1000); auditResponse = await retrieveSystemAuditResult(auditId); } return auditResponse; } export const startSystemAuditQuery = async (): Promise => { const data: DeaAuditStartResponse = await httpApiPost(`system/audit`, undefined); return data.auditId; } export const retrieveSystemAuditResult = async (auditId: string): Promise => { return await httpApiGet(`system/audit/${auditId}/csv`, undefined); }