mirror of
https://github.com/empayre/fleet.git
synced 2024-11-06 17:05:18 +00:00
253 lines
7.3 KiB
TypeScript
253 lines
7.3 KiB
TypeScript
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
|
import sendRequest from "services";
|
|
import endpoints from "utilities/endpoints";
|
|
import { IHost } from "interfaces/host";
|
|
|
|
export interface ISortOption {
|
|
key: string;
|
|
direction: string;
|
|
}
|
|
|
|
export interface ILoadHostsOptions {
|
|
page?: number;
|
|
perPage?: number;
|
|
selectedLabels?: string[];
|
|
globalFilter?: string;
|
|
sortBy?: ISortOption[];
|
|
teamId?: number;
|
|
policyId?: number;
|
|
policyResponse?: string;
|
|
softwareId?: number;
|
|
columns?: string;
|
|
}
|
|
|
|
export type ILoadHostDetailsExtension = "device_mapping" | "macadmins";
|
|
|
|
export default {
|
|
destroy: (host: IHost) => {
|
|
const { HOSTS } = endpoints;
|
|
const path = `${HOSTS}/${host.id}`;
|
|
|
|
return sendRequest("DELETE", path);
|
|
},
|
|
destroyBulk: (hostIds: number[]) => {
|
|
const { HOSTS_DELETE } = endpoints;
|
|
|
|
return sendRequest("POST", HOSTS_DELETE, { ids: hostIds });
|
|
},
|
|
destroyByFilter: (
|
|
teamId: number | null,
|
|
query: string,
|
|
status: string,
|
|
labelId: number | null
|
|
) => {
|
|
const { HOSTS_DELETE } = endpoints;
|
|
return sendRequest("POST", HOSTS_DELETE, {
|
|
filters: {
|
|
query,
|
|
status,
|
|
label_id: labelId,
|
|
team_id: teamId,
|
|
},
|
|
});
|
|
},
|
|
exportHosts: (options: ILoadHostsOptions | undefined) => {
|
|
const { HOSTS_REPORT, LABEL_HOSTS } = endpoints;
|
|
const selectedLabels = options?.selectedLabels || [];
|
|
const globalFilter = options?.globalFilter || "";
|
|
const sortBy = options?.sortBy || [];
|
|
const teamId = options?.teamId || null;
|
|
const policyId = options?.policyId || null;
|
|
const policyResponse = options?.policyResponse || null;
|
|
const softwareId = options?.softwareId || null;
|
|
const columns = options?.columns || null;
|
|
|
|
let orderKeyParam = "";
|
|
let orderDirection = "";
|
|
if (sortBy.length !== 0) {
|
|
const sortItem = sortBy[0];
|
|
orderKeyParam += `&order_key=${sortItem.key}`;
|
|
orderDirection = `&order_direction=${sortItem.direction}`;
|
|
}
|
|
|
|
let searchQuery = "";
|
|
if (globalFilter !== "") {
|
|
searchQuery = `&query=${globalFilter}`;
|
|
}
|
|
|
|
let path = "";
|
|
const labelPrefix = "labels/";
|
|
|
|
// Handle multiple filters
|
|
const label = selectedLabels.find((f) => f.includes(labelPrefix));
|
|
const status = selectedLabels.find((f) => !f.includes(labelPrefix));
|
|
const isValidStatus =
|
|
status === "new" ||
|
|
status === "online" ||
|
|
status === "offline" ||
|
|
status === "mia";
|
|
|
|
if (label) {
|
|
const lid = label.substr(labelPrefix.length);
|
|
path = `${LABEL_HOSTS(
|
|
parseInt(lid, 10)
|
|
)}?${searchQuery}${orderKeyParam}${orderDirection}`;
|
|
|
|
// connect status if applicable
|
|
if (status && isValidStatus) {
|
|
path += `&status=${status}`;
|
|
}
|
|
} else if (status && isValidStatus) {
|
|
path = `${HOSTS_REPORT}?&status=${status}${searchQuery}${orderKeyParam}${orderDirection}`;
|
|
} else {
|
|
path = `${HOSTS_REPORT}?${searchQuery}${orderKeyParam}${orderDirection}`;
|
|
}
|
|
|
|
if (teamId) {
|
|
path += `&team_id=${teamId}`;
|
|
}
|
|
|
|
if (!label && policyId) {
|
|
path += `&policy_id=${policyId}`;
|
|
path += `&policy_response=${policyResponse || "passing"}`; // TODO: confirm whether there should be a default if there is an id but no response sepcified
|
|
}
|
|
// TODO: consider how to check for mutually exclusive scenarios with label, policy and software
|
|
if (!label && !policyId && softwareId) {
|
|
path += `&software_id=${softwareId}`;
|
|
}
|
|
|
|
path += "&format=csv";
|
|
|
|
return sendRequest("GET", path);
|
|
},
|
|
loadHosts: (options: ILoadHostsOptions | undefined) => {
|
|
const { HOSTS, LABEL_HOSTS } = endpoints;
|
|
const page = options?.page || 0;
|
|
const perPage = options?.perPage || 100;
|
|
const selectedLabels = options?.selectedLabels || [];
|
|
const globalFilter = options?.globalFilter || "";
|
|
const sortBy = options?.sortBy || [];
|
|
const teamId = options?.teamId || null;
|
|
const policyId = options?.policyId || null;
|
|
const policyResponse = options?.policyResponse || null;
|
|
const softwareId = options?.softwareId || null;
|
|
const columns = options?.columns || null;
|
|
|
|
// TODO: add this query param logic to client class
|
|
const pagination = `page=${page}&per_page=${perPage}`;
|
|
|
|
let orderKeyParam = "";
|
|
let orderDirection = "";
|
|
if (sortBy.length !== 0) {
|
|
const sortItem = sortBy[0];
|
|
orderKeyParam += `&order_key=${sortItem.key}`;
|
|
orderDirection = `&order_direction=${sortItem.direction}`;
|
|
}
|
|
|
|
let searchQuery = "";
|
|
if (globalFilter !== "") {
|
|
searchQuery = `&query=${globalFilter}`;
|
|
}
|
|
|
|
let path = "";
|
|
const labelPrefix = "labels/";
|
|
|
|
// Handle multiple filters
|
|
const label = selectedLabels.find((f) => f.includes(labelPrefix));
|
|
const status = selectedLabels.find((f) => !f.includes(labelPrefix));
|
|
const isValidStatus =
|
|
status === "new" ||
|
|
status === "online" ||
|
|
status === "offline" ||
|
|
status === "mia";
|
|
|
|
if (label) {
|
|
const lid = label.substr(labelPrefix.length);
|
|
path = `${LABEL_HOSTS(
|
|
parseInt(lid, 10)
|
|
)}?${pagination}${searchQuery}${orderKeyParam}${orderDirection}`;
|
|
|
|
// connect status if applicable
|
|
if (status && isValidStatus) {
|
|
path += `&status=${status}`;
|
|
}
|
|
} else if (status && isValidStatus) {
|
|
path = `${HOSTS}?${pagination}&status=${status}${searchQuery}${orderKeyParam}${orderDirection}`;
|
|
} else {
|
|
path = `${HOSTS}?${pagination}${searchQuery}${orderKeyParam}${orderDirection}`;
|
|
}
|
|
|
|
if (teamId) {
|
|
path += `&team_id=${teamId}`;
|
|
}
|
|
|
|
if (!label && policyId) {
|
|
path += `&policy_id=${policyId}`;
|
|
path += `&policy_response=${policyResponse || "passing"}`; // TODO: confirm whether there should be a default if there is an id but no response sepcified
|
|
}
|
|
// TODO: consider how to check for mutually exclusive scenarios with label, policy and software
|
|
if (!label && !policyId && softwareId) {
|
|
path += `&software_id=${softwareId}`;
|
|
}
|
|
|
|
if (columns) {
|
|
path += `&columns=${columns}`;
|
|
}
|
|
|
|
return sendRequest("GET", path);
|
|
},
|
|
loadHostDetails: (hostID: number) => {
|
|
const { HOSTS } = endpoints;
|
|
const path = `${HOSTS}/${hostID}`;
|
|
|
|
return sendRequest("GET", path);
|
|
},
|
|
loadHostDetailsExtension: (
|
|
hostID: number,
|
|
extension: ILoadHostDetailsExtension
|
|
) => {
|
|
const { HOSTS } = endpoints;
|
|
const path = `${HOSTS}/${hostID}/${extension}`;
|
|
|
|
return sendRequest("GET", path);
|
|
},
|
|
refetch: (host: IHost) => {
|
|
const { HOSTS } = endpoints;
|
|
const path = `${HOSTS}/${host.id}/refetch`;
|
|
|
|
return sendRequest("POST", path);
|
|
},
|
|
search: (searchText: string) => {
|
|
const { HOSTS } = endpoints;
|
|
const path = `${HOSTS}?query=${searchText}`;
|
|
|
|
return sendRequest("GET", path);
|
|
},
|
|
transferToTeam: (teamId: number | null, hostIds: number[]) => {
|
|
const { HOSTS_TRANSFER } = endpoints;
|
|
|
|
return sendRequest("POST", HOSTS_TRANSFER, {
|
|
team_id: teamId,
|
|
hosts: hostIds,
|
|
});
|
|
},
|
|
|
|
// TODO confirm interplay with policies
|
|
transferToTeamByFilter: (
|
|
teamId: number | null,
|
|
query: string,
|
|
status: string,
|
|
labelId: number | null
|
|
) => {
|
|
const { HOSTS_TRANSFER_BY_FILTER } = endpoints;
|
|
return sendRequest("POST", HOSTS_TRANSFER_BY_FILTER, {
|
|
team_id: teamId,
|
|
filters: {
|
|
query,
|
|
status,
|
|
label_id: labelId,
|
|
},
|
|
});
|
|
},
|
|
};
|