149 lines
3.9 KiB
TypeScript
149 lines
3.9 KiB
TypeScript
import logger from "@calcom/lib/logger";
|
|
import type { CalendarEvent } from "@calcom/types/Calendar";
|
|
import type { CredentialPayload } from "@calcom/types/Credential";
|
|
import type { PartialReference } from "@calcom/types/EventManager";
|
|
import type { VideoApiAdapter } from "@calcom/types/VideoApiAdapter";
|
|
|
|
import { getHuddle01Credential } from "../utils/storage";
|
|
|
|
const API_END_POINT = "https://platform-api.huddle01.workers.dev/api/v2/calendar";
|
|
|
|
const fetchHuddleAPI = async (userId: number) => {
|
|
const { identityToken } = await getHuddle01Credential(userId);
|
|
const apiKey = process.env.HUDDLE01_API_TOKEN;
|
|
|
|
if (!apiKey) {
|
|
log.error("[Huddle01 Error] -> app key not found");
|
|
throw new Error("Huddle01 app key not found");
|
|
}
|
|
|
|
const headers = {
|
|
"x-api-key": apiKey,
|
|
"x-identity-token": identityToken,
|
|
};
|
|
return (
|
|
endpoint: "subdomains" | "createMeeting" | "deleteMeeting" | "updateMeeting",
|
|
option?: RequestInit
|
|
) => {
|
|
return fetch(`${API_END_POINT}/${endpoint}`, {
|
|
...option,
|
|
headers: {
|
|
...option?.headers,
|
|
...headers,
|
|
},
|
|
});
|
|
};
|
|
};
|
|
|
|
const log = logger.getSubLogger({ prefix: ["app-store/huddle01video/lib/VideoApiAdapter"] });
|
|
|
|
const Huddle01ApiAdapter = (credential: CredentialPayload): VideoApiAdapter => {
|
|
return {
|
|
createMeeting: async (e: CalendarEvent) => {
|
|
if (!credential.userId) {
|
|
log.error("[Huddle01 Error] -> User is not logged in");
|
|
throw new Error("User is not logged in");
|
|
}
|
|
|
|
try {
|
|
const fetch = await fetchHuddleAPI(credential.userId);
|
|
|
|
const res = await fetch("createMeeting", {
|
|
method: "POST",
|
|
body: JSON.stringify({
|
|
title: e.title,
|
|
startTime: e.startTime,
|
|
endTime: e.endTime,
|
|
}),
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
|
|
const data = (await res.json()) as {
|
|
roomId: string;
|
|
meetingLink: string;
|
|
};
|
|
|
|
return {
|
|
type: "huddle01_video",
|
|
id: data.roomId,
|
|
password: "",
|
|
url: data.meetingLink,
|
|
};
|
|
} catch (e) {
|
|
log.error("[Huddle01 Error] -> Error while creating meeeting", e);
|
|
throw Error("Error while creating meeting");
|
|
}
|
|
},
|
|
updateMeeting: async (bookingRef: PartialReference, e: CalendarEvent) => {
|
|
if (!credential.userId) {
|
|
log.error("[Huddle01 Error] -> User is not logged in");
|
|
throw new Error("User is not logged in");
|
|
}
|
|
|
|
const fetch = await fetchHuddleAPI(credential.userId);
|
|
|
|
const res = await fetch("updateMeeting", {
|
|
method: "PUT",
|
|
body: JSON.stringify({
|
|
title: e.title,
|
|
startTime: e.startTime,
|
|
endTime: e.endTime,
|
|
meetingId: bookingRef.uid,
|
|
}),
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
|
|
const data = (await res.json()) as {
|
|
roomId: string;
|
|
meetingLink: string;
|
|
};
|
|
|
|
return {
|
|
type: "huddle01_video",
|
|
id: data.roomId,
|
|
password: "",
|
|
url: data.meetingLink,
|
|
};
|
|
},
|
|
deleteMeeting: async (meetingId: string) => {
|
|
if (!credential.userId) {
|
|
log.error("[Huddle01 Error] -> User is not logged in");
|
|
throw new Error("User is not logged in");
|
|
}
|
|
|
|
const fetch = await fetchHuddleAPI(credential.userId);
|
|
|
|
const res = await fetch("deleteMeeting", {
|
|
method: "DELETE",
|
|
body: JSON.stringify({
|
|
meetingId,
|
|
}),
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
|
|
const data = (await res.json()) as {
|
|
roomId: string;
|
|
meetingLink: string;
|
|
};
|
|
|
|
return {
|
|
type: "huddle01_video",
|
|
id: data.roomId,
|
|
password: "",
|
|
url: data.meetingLink,
|
|
};
|
|
},
|
|
getAvailability: async () => {
|
|
return [];
|
|
},
|
|
};
|
|
};
|
|
|
|
export default Huddle01ApiAdapter;
|