rhombus-node-mcp
Version:
MCP server for Rhombus API
140 lines (139 loc) • 5.28 kB
JavaScript
import { postApi } from "../network/network.js";
import { formatTimestamp } from "../util.js";
import { removeNulls } from "../utils/remove-nulls.js";
export async function getFaceEvents(args, timeZone, requestModifiers, sessionId) {
// OptionalNullable so that we can remove some fields before sending to the API
let filteredArgs = { ...args };
if (filteredArgs.pageRequest && filteredArgs.pageRequest.lastEvaluatedKey === "") {
delete filteredArgs.pageRequest.lastEvaluatedKey;
}
if (filteredArgs.searchFilter) {
if (filteredArgs.searchFilter.faceNames &&
filteredArgs.searchFilter.faceNames.length === 0) {
// @ts-expect-error - we can break typing
delete filteredArgs.searchFilter.faceNames;
}
if (filteredArgs.searchFilter.labels &&
filteredArgs.searchFilter.labels.length === 0) {
// @ts-expect-error - we can break typing
delete filteredArgs.searchFilter.labels;
}
if (filteredArgs.searchFilter.hasEmbedding === false) {
delete filteredArgs.searchFilter.hasEmbedding;
}
if (filteredArgs.searchFilter.hasName === false) {
delete filteredArgs.searchFilter.hasName;
}
if (filteredArgs.searchFilter.timestampFilter) {
if (filteredArgs.searchFilter.timestampFilter.rangeEnd === null) {
delete filteredArgs.searchFilter.timestampFilter.rangeEnd;
}
if (filteredArgs.searchFilter.timestampFilter.rangeStart === null) {
delete filteredArgs.searchFilter.timestampFilter.rangeStart;
}
}
}
filteredArgs = removeNulls(filteredArgs);
const response = await postApi({
route: "/faceRecognition/faceEvent/findFaceEventsByOrg",
body: filteredArgs,
modifiers: requestModifiers,
sessionId,
});
const faceEvents = (response?.faceEvents ?? []).map((event) => ({
deviceUuid: event.deviceUuid,
eventTimestampMs: event.eventTimestamp,
eventTimestamp: formatTimestamp(event.eventTimestamp, timeZone),
faceName: event.faceName,
locationUuid: event.locationUuid,
personUuid: event.personUuid,
thumbnailS3Key: event.thumbnailS3Key,
uuid: event.uuid,
}));
return {
faceEvents,
lastEvaluatedKey: response?.lastEvaluatedKey,
};
}
export async function getRegisteredFaces(_args, requestModifiers, sessionId) {
return await postApi({
route: "/faceRecognition/person/findPeopleByOrg",
body: {},
modifiers: requestModifiers,
sessionId,
});
}
export async function getPersonLabels(requestModifiers, sessionId) {
return await postApi({
route: "/faceRecognition/person/findPersonLabelsByOrg",
body: {},
modifiers: requestModifiers,
sessionId,
});
}
export async function searchSimilarFaces(faceEventUuid, timeZone, requestModifiers, sessionId) {
const res = await postApi({
route: "/faceRecognition/faceEvent/findSimilarFaceEvents",
body: { faceEventUuid },
modifiers: requestModifiers,
sessionId,
});
if (res.error)
throw new Error(JSON.stringify(res));
return (res.faceEvents || []).map((event) => ({
uuid: event.uuid ?? undefined,
deviceUuid: event.deviceUuid ?? undefined,
personUuid: event.personUuid ?? undefined,
similarity: event.similarity ?? undefined,
eventTimestampMs: event.eventTimestamp ?? undefined,
eventTimestamp: event.eventTimestamp
? formatTimestamp(event.eventTimestamp, timeZone)
: undefined,
}));
}
export async function getFaceMatchmakers(requestModifiers, sessionId) {
const res = await postApi({
route: "/faceRecognition/matchmaker/findFaceMatchmakersByOrg",
body: {},
modifiers: requestModifiers,
sessionId,
});
if (res.error)
throw new Error(JSON.stringify(res));
return (res.faceMatchmakers || []).map((m) => ({
uuid: m.uuid ?? undefined,
personUuid: m.personUuid ?? undefined,
name: m.name ?? undefined,
}));
}
export async function getFaceEventsByPerson(personUuid, timeZone, requestModifiers, sessionId) {
const res = await postApi({
route: "/faceRecognition/faceEvent/findFaceEventsByOrg",
body: {
pageRequest: { maxPageSize: 75 },
searchFilter: {
personUuids: [personUuid],
deviceUuids: [],
faceNames: [],
labels: [],
locationUuids: [],
},
},
modifiers: requestModifiers,
sessionId,
});
if (res.error)
throw new Error(JSON.stringify(res));
const faceEvents = (res.faceEvents || []).map((event) => ({
uuid: event.uuid ?? undefined,
personUuid: event.personUuid ?? undefined,
eventTimestamp: event.eventTimestamp
? formatTimestamp(event.eventTimestamp, timeZone)
: undefined,
deviceUuid: event.deviceUuid ?? undefined,
}));
return {
faceEvents,
lastEvaluatedKey: res.lastEvaluatedKey,
};
}