frontend/app/CommissionsList/helpers.ts (154 lines of code) (raw):
import Axios from "axios";
import { getProjectsOnPage } from "../ProjectEntryList/helpers";
const API = "/api/pluto";
const API_COMMISSION = `${API}/commission`;
const API_COMMISSION_FILTER = `${API_COMMISSION}/list`;
const API_WORKING_GROUP = `${API}/workinggroup`;
/**
* Returns a Map of working group IDs -> working group names
*
* @param commissions a list of Commission objects
*/
export const getWorkingGroupNameMap = async (
commissions: Commission[]
): Promise<Map<number, string>> =>
new Map(
await Promise.all(
commissions.map(async (commission) => {
try {
const {
status,
data: {
result: { name: workingGroupName },
},
} = await Axios.get<PlutoApiResponse<WorkingGroup>>(
`${API_WORKING_GROUP}/${commission.workingGroupId}`
);
if (status === 200) {
return [commission.workingGroupId, workingGroupName] as const;
} else {
throw new Error(
`could not fetch working group name (HTTP status: ${status})`
);
}
} catch (error) {
console.error(
"could not fetch working group name for WG with id:",
commission.workingGroupId
);
throw error;
}
})
)
);
interface GetCommissionsOnPageParams {
page?: number;
pageSize?: number;
filterTerms?: FilterTerms;
order?: string;
orderBy?: string | number | symbol;
}
/**
* Returns the commissions for a particular pagination offset.
*
* @param params parameters to support pagination
*/
export const getCommissionsOnPage = async ({
page = 0,
pageSize = 25,
filterTerms,
order,
orderBy,
}: GetCommissionsOnPageParams): Promise<Commission[]> => {
const itemOffset = page * pageSize;
const {
status,
data: { result: commissions = [] },
} = await (filterTerms
? // TODO: filter terms formatting?
Axios.put(
`${API_COMMISSION_FILTER}?startAt=${itemOffset}&length=${pageSize}&sort=${String(
orderBy
)}&sortDirection=${order}`,
filterTerms
)
: Axios.get(`${API_COMMISSION}?startAt=${itemOffset}&length=${pageSize}`));
if (status !== 200) {
throw new Error("unable to fetch commissions");
}
return commissions;
};
// TODO: for use later?
// const loadDependencies = async ({ setIsAdmin, setUid }) => {
// try {
// const response = await Axios.get("/api/isLoggedIn");
// if (response.data.status !== "ok") {
// return;
// }
//
// setIsAdmin(response.data.isAdmin);
// setUid(response.data.uid);
// } catch (error) {
// setIsAdmin(false);
//
// if (response?.data?.status === 403) {
// // 403 -- simply no access, not necessarily an "error".
// return;
// }
//
// throw error;
// }
// };
export const loadCommissionData: (
id: number
) => Promise<CommissionFullRecord> = async (commissionId: number) => {
const url = `/api/pluto/commission/${commissionId}`;
const response = await Axios.get(url);
//if response is not a 200 then we don't get here, an exception has been thrown. Caller should catch this failed promise.
return response.data.result as CommissionFullRecord;
};
export const updateCommissionData: (
record: CommissionFullRecord
) => Promise<void> = async (record: CommissionFullRecord) => {
const url = `/api/pluto/commission/${record.id}`;
const response = await Axios.put(url, record);
return;
};
export const projectsForCommission: (
commissionId: number,
page: number,
pageSize: number,
filterTerms: ProjectFilterTerms,
order: string,
orderBy: string | number | symbol
) => Promise<[Project[], number]> = async (
commissionId: number,
page: number,
pageSize: number,
filterTerms: ProjectFilterTerms,
order: string,
orderBy: string | number | symbol
) => {
filterTerms["commissionId"] = commissionId;
return getProjectsOnPage({
page: page,
pageSize: pageSize,
filterTerms: filterTerms,
order: order,
orderBy: orderBy,
});
};
export const startDelete = async (
id: number,
commission: boolean,
pluto: boolean,
file: boolean,
backups: boolean,
pTR: boolean,
deliverables: boolean,
sAN: boolean,
matrix: boolean,
s3: boolean,
buckets: string[],
bucketBooleans: boolean[]
): Promise<void> => {
try {
let bucketsArray = `[`;
for (const bucket of buckets) {
bucketsArray = bucketsArray + `"${bucket}",`;
}
bucketsArray = bucketsArray.slice(0, -1);
bucketsArray = bucketsArray + `]`;
let booleansArray = `[`;
for (const boolean of bucketBooleans) {
booleansArray = booleansArray + `${boolean},`;
}
booleansArray = booleansArray.slice(0, -1);
booleansArray = booleansArray + `]`;
const { status } = await Axios.put<PlutoApiResponse<void>>(
`${API_COMMISSION}/${id}/deleteData`,
`{"commission":${commission},"pluto":${pluto},"file":${file},"backups":${backups},"PTR":${pTR},"deliverables":${deliverables},"SAN":${sAN},"matrix":${matrix},"S3":${s3},"buckets":${bucketsArray},"bucketBooleans":${booleansArray}}`,
{
headers: {
"Content-Type": "application/json",
},
}
);
if (status !== 200) {
throw new Error(
`Could not start deletion of data for commission ${id}: server said ${status}`
);
}
} catch (error) {
console.error(error);
throw error;
}
};