diff --git a/server/migrations/versions/082fa608201c_add_room_background_information.py b/server/migrations/versions/082fa608201c_add_room_background_information.py
new file mode 100644
index 00000000..34779e39
--- /dev/null
+++ b/server/migrations/versions/082fa608201c_add_room_background_information.py
@@ -0,0 +1,26 @@
+"""add_room_background_information
+
+Revision ID: 082fa608201c
+Revises: b7df9609542c
+Create Date: 2025-07-29 01:41:37.912195
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision: str = '082fa608201c'
+down_revision: Union[str, None] = 'b7df9609542c'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+ op.add_column('room', sa.Column('background_information', sa.Text(), nullable=True))
+
+
+def downgrade() -> None:
+ op.drop_column('room', 'background_information')
diff --git a/server/reflector/db/rooms.py b/server/reflector/db/rooms.py
index 6e98acff..a06764c9 100644
--- a/server/reflector/db/rooms.py
+++ b/server/reflector/db/rooms.py
@@ -39,6 +39,7 @@ rooms = sqlalchemy.Table(
sqlalchemy.Column(
"is_shared", sqlalchemy.Boolean, nullable=False, server_default=false()
),
+ sqlalchemy.Column("background_information", sqlalchemy.Text),
sqlalchemy.Index("idx_room_is_shared", "is_shared"),
)
@@ -58,6 +59,7 @@ class Room(BaseModel):
"none", "prompt", "automatic", "automatic-2nd-participant"
] = "automatic-2nd-participant"
is_shared: bool = False
+ background_information: str = ""
class RoomController:
@@ -106,6 +108,7 @@ class RoomController:
recording_type: str,
recording_trigger: str,
is_shared: bool,
+ background_information: str = "",
):
"""
Add a new room
@@ -121,6 +124,7 @@ class RoomController:
recording_type=recording_type,
recording_trigger=recording_trigger,
is_shared=is_shared,
+ background_information=background_information,
)
query = rooms.insert().values(**room.model_dump())
try:
diff --git a/server/reflector/pipelines/main_live_pipeline.py b/server/reflector/pipelines/main_live_pipeline.py
index 3a4c36be..1a9a43bd 100644
--- a/server/reflector/pipelines/main_live_pipeline.py
+++ b/server/reflector/pipelines/main_live_pipeline.py
@@ -454,15 +454,47 @@ class PipelineMainFinalSummaries(PipelineMainFromTopics):
Generate summaries from the topics
"""
+ async def get_room(self):
+ """Get room information for the transcript"""
+ if not self._transcript.room_id:
+ return None
+ return await rooms_controller.get_by_id(self._transcript.room_id)
+
def get_processors(self) -> list:
return [
TranscriptFinalSummaryProcessor.as_threaded(
transcript=self._transcript,
+ room=getattr(self, '_room', None),
callback=self.on_long_summary,
on_short_summary=self.on_short_summary,
),
]
+ async def create(self) -> Pipeline:
+ self.prepare()
+
+ # get transcript
+ self._transcript = transcript = await self.get_transcript()
+
+ # get room information
+ self._room = await self.get_room()
+
+ # create pipeline
+ processors = self.get_processors()
+ pipeline = Pipeline(*processors)
+ pipeline.options = self
+ pipeline.logger.bind(transcript_id=transcript.id)
+ pipeline.logger.info(f"{self.__class__.__name__} pipeline created")
+
+ # push topics
+ topics = self.get_transcript_topics(transcript)
+ for topic in topics:
+ await self.push(topic)
+
+ await self.flush()
+
+ return pipeline
+
class PipelineMainWaveform(PipelineMainFromTopics):
"""
diff --git a/server/reflector/processors/summary/summary_builder.py b/server/reflector/processors/summary/summary_builder.py
index 9120f0a7..aa3605c7 100644
--- a/server/reflector/processors/summary/summary_builder.py
+++ b/server/reflector/processors/summary/summary_builder.py
@@ -135,7 +135,7 @@ class Messages:
class SummaryBuilder:
- def __init__(self, llm, filename: str | None = None, logger=None):
+ def __init__(self, llm, filename: str | None = None, logger=None, room=None):
self.transcript: str | None = None
self.recap: str | None = None
self.summaries: list[dict] = []
@@ -147,6 +147,7 @@ class SummaryBuilder:
self.llm_instance: LLM = llm
self.model_name: str = llm.model_name
self.logger = logger or structlog.get_logger()
+ self.room = room
self.m = Messages(model_name=self.model_name, logger=self.logger)
if filename:
self.read_transcript_from_file(filename)
@@ -465,26 +466,31 @@ class SummaryBuilder:
self.logger.debug("--- extract main subjects")
m = Messages(model_name=self.model_name, logger=self.logger)
- m.add_system(
- (
- "You are an advanced transcription summarization assistant."
- "Your task is to summarize discussions by focusing only on the main ideas contributed by participants."
- # Prevent generating another transcription
- "Exclude direct quotes and unnecessary details."
- # Do not mention others participants just because they didn't contributed
- "Only include participant names if they actively contribute to the subject."
- # Prevent generation of summary with "no others participants contributed" etc
- "Keep summaries concise and focused on main subjects without adding conclusions such as 'no other participant contributed'. "
- # Avoid: In the discussion, they talked about...
- "Do not include contextual preface. "
- # Prevention to have too long summary
- "Summary should fit in a single paragraph. "
- # Using other pronouns that the participants or the group
- 'Mention the participants or the group using "they".'
- # Avoid finishing the summary with "No conclusions were added by the summarizer"
- "Do not mention conclusion if there is no conclusion"
- )
+
+ system_prompt = (
+ "You are an advanced transcription summarization assistant."
+ "Your task is to summarize discussions by focusing only on the main ideas contributed by participants."
+ # Prevent generating another transcription
+ "Exclude direct quotes and unnecessary details."
+ # Do not mention others participants just because they didn't contributed
+ "Only include participant names if they actively contribute to the subject."
+ # Prevent generation of summary with "no others participants contributed" etc
+ "Keep summaries concise and focused on main subjects without adding conclusions such as 'no other participant contributed'. "
+ # Avoid: In the discussion, they talked about...
+ "Do not include contextual preface. "
+ # Prevention to have too long summary
+ "Summary should fit in a single paragraph. "
+ # Using other pronouns that the participants or the group
+ 'Mention the participants or the group using "they".'
+ # Avoid finishing the summary with "No conclusions were added by the summarizer"
+ "Do not mention conclusion if there is no conclusion"
)
+
+ # Add room context if available
+ if self.room and self.room.background_information:
+ system_prompt += f"\n\nContext about this meeting room: {self.room.background_information}"
+
+ m.add_system(system_prompt)
m.add_user(
f"# Transcript\n\n{self.transcript}\n\n"
+ (
diff --git a/server/reflector/processors/transcript_final_summary.py b/server/reflector/processors/transcript_final_summary.py
index daa52e56..1ca46950 100644
--- a/server/reflector/processors/transcript_final_summary.py
+++ b/server/reflector/processors/transcript_final_summary.py
@@ -12,9 +12,10 @@ class TranscriptFinalSummaryProcessor(Processor):
INPUT_TYPE = TitleSummary
OUTPUT_TYPE = FinalLongSummary
- def __init__(self, transcript=None, **kwargs):
+ def __init__(self, transcript=None, room=None, **kwargs):
super().__init__(**kwargs)
self.transcript = transcript
+ self.room = room
self.chunks: list[TitleSummary] = []
self.llm = LLM.get_instance(model_name="NousResearch/Hermes-3-Llama-3.1-8B")
self.builder = None
@@ -23,7 +24,7 @@ class TranscriptFinalSummaryProcessor(Processor):
self.chunks.append(data)
async def get_summary_builder(self, text) -> SummaryBuilder:
- builder = SummaryBuilder(self.llm)
+ builder = SummaryBuilder(self.llm, room=self.room)
builder.set_transcript(text)
await builder.identify_participants()
await builder.generate_summary()
diff --git a/server/reflector/views/rooms.py b/server/reflector/views/rooms.py
index d086040c..50e64edf 100644
--- a/server/reflector/views/rooms.py
+++ b/server/reflector/views/rooms.py
@@ -33,6 +33,7 @@ class Room(BaseModel):
recording_type: str
recording_trigger: str
is_shared: bool
+ background_information: str
class Meeting(BaseModel):
@@ -55,6 +56,7 @@ class CreateRoom(BaseModel):
recording_type: str
recording_trigger: str
is_shared: bool
+ background_information: str = ""
class UpdateRoom(BaseModel):
@@ -67,6 +69,7 @@ class UpdateRoom(BaseModel):
recording_type: str
recording_trigger: str
is_shared: bool
+ background_information: str = ""
class DeletionStatus(BaseModel):
@@ -108,6 +111,7 @@ async def rooms_create(
recording_type=room.recording_type,
recording_trigger=room.recording_trigger,
is_shared=room.is_shared,
+ background_information=room.background_information,
)
diff --git a/www/app/(app)/rooms/page.tsx b/www/app/(app)/rooms/page.tsx
index 03a4858b..1d6c76d8 100644
--- a/www/app/(app)/rooms/page.tsx
+++ b/www/app/(app)/rooms/page.tsx
@@ -11,13 +11,14 @@ import {
Input,
Select,
Spinner,
+ Textarea,
createListCollection,
useDisclosure,
} from "@chakra-ui/react";
import { useEffect, useState } from "react";
import useApi from "../../lib/useApi";
import useRoomList from "./useRoomList";
-import { ApiError, Room } from "../../api";
+import { Room } from "../../api";
import { RoomList } from "./_components/RoomList";
interface SelectOption {
@@ -54,6 +55,7 @@ const roomInitialState = {
recordingType: "cloud",
recordingTrigger: "automatic-2nd-participant",
isShared: false,
+ backgroundInformation: "",
};
export default function RoomsList() {
@@ -170,6 +172,7 @@ export default function RoomsList() {
recording_type: room.recordingType,
recording_trigger: room.recordingTrigger,
is_shared: room.isShared,
+ background_information: room.backgroundInformation,
};
if (isEditing) {
@@ -189,11 +192,10 @@ export default function RoomsList() {
setNameError("");
refetch();
onClose();
- } catch (err) {
+ } catch (err: any) {
if (
- err instanceof ApiError &&
err.status === 400 &&
- (err.body as any).detail == "Room name is not unique"
+ err.body?.detail === "Room name is not unique"
) {
setNameError(
"This room name is already taken. Please choose a different name.",
@@ -215,6 +217,7 @@ export default function RoomsList() {
recordingType: roomData.recording_type,
recordingTrigger: roomData.recording_trigger,
isShared: roomData.is_shared,
+ backgroundInformation: roomData.background_information || "",
});
setEditRoomId(roomId);
setIsEditing(true);
@@ -323,6 +326,20 @@ export default function RoomsList() {
{nameError && {nameError}}
+
+ Background Information
+
+
+ This information will be used to provide context for AI-generated summaries
+
+
+
void;
@@ -12,7 +12,7 @@ type RoomList = {
//always protected
const useRoomList = (page: number): RoomList => {
- const [response, setResponse] = useState(null);
+ const [response, setResponse] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setErrorState] = useState(null);
const { setError } = useError();
diff --git a/www/app/(app)/transcripts/useTranscriptList.ts b/www/app/(app)/transcripts/useTranscriptList.ts
index 3b449685..f2d52313 100644
--- a/www/app/(app)/transcripts/useTranscriptList.ts
+++ b/www/app/(app)/transcripts/useTranscriptList.ts
@@ -1,10 +1,10 @@
import { useEffect, useState } from "react";
import { useError } from "../../(errors)/errorContext";
import useApi from "../../lib/useApi";
-import { Page_GetTranscriptMinimal_, SourceKind } from "../../api";
+import { PageGetTranscriptMinimal, SourceKind } from "../../api";
type TranscriptList = {
- response: Page_GetTranscriptMinimal_ | null;
+ response: PageGetTranscriptMinimal | null;
loading: boolean;
error: Error | null;
refetch: () => void;
@@ -16,7 +16,7 @@ const useTranscriptList = (
roomId: string | null,
searchTerm: string | null,
): TranscriptList => {
- const [response, setResponse] = useState(
+ const [response, setResponse] = useState(
null,
);
const [loading, setLoading] = useState(true);
diff --git a/www/app/api/OpenApi.ts b/www/app/api/OpenApi.ts
deleted file mode 100644
index 23cc35f3..00000000
--- a/www/app/api/OpenApi.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import type { BaseHttpRequest } from "./core/BaseHttpRequest";
-import type { OpenAPIConfig } from "./core/OpenAPI";
-import { Interceptors } from "./core/OpenAPI";
-import { AxiosHttpRequest } from "./core/AxiosHttpRequest";
-
-import { DefaultService } from "./services.gen";
-
-type HttpRequestConstructor = new (config: OpenAPIConfig) => BaseHttpRequest;
-
-export class OpenApi {
- public readonly default: DefaultService;
-
- public readonly request: BaseHttpRequest;
-
- constructor(
- config?: Partial,
- HttpRequest: HttpRequestConstructor = AxiosHttpRequest,
- ) {
- this.request = new HttpRequest({
- BASE: config?.BASE ?? "",
- VERSION: config?.VERSION ?? "0.1.0",
- WITH_CREDENTIALS: config?.WITH_CREDENTIALS ?? false,
- CREDENTIALS: config?.CREDENTIALS ?? "include",
- TOKEN: config?.TOKEN,
- USERNAME: config?.USERNAME,
- PASSWORD: config?.PASSWORD,
- HEADERS: config?.HEADERS,
- ENCODE_PATH: config?.ENCODE_PATH,
- interceptors: {
- request: config?.interceptors?.request ?? new Interceptors(),
- response: config?.interceptors?.response ?? new Interceptors(),
- },
- });
-
- this.default = new DefaultService(this.request);
- }
-}
diff --git a/www/app/api/auth/[...nextauth]/route.ts b/www/app/api/auth/[...nextauth]/route.ts
deleted file mode 100644
index 915ed04d..00000000
--- a/www/app/api/auth/[...nextauth]/route.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-// NextAuth route handler for Authentik
-// Refresh rotation has been taken from https://next-auth.js.org/v3/tutorials/refresh-token-rotation even if we are using 4.x
-
-import NextAuth from "next-auth";
-import { authOptions } from "../../../lib/auth";
-
-const handler = NextAuth(authOptions);
-
-export { handler as GET, handler as POST };
diff --git a/www/app/api/client.gen.ts b/www/app/api/client.gen.ts
new file mode 100644
index 00000000..ac54ff9e
--- /dev/null
+++ b/www/app/api/client.gen.ts
@@ -0,0 +1,28 @@
+// This file is auto-generated by @hey-api/openapi-ts
+
+import type { ClientOptions } from "./types.gen";
+import {
+ type Config,
+ type ClientOptions as DefaultClientOptions,
+ createClient,
+ createConfig,
+} from "./client";
+
+/**
+ * The `createClientConfig()` function will be called on client initialization
+ * and the returned object will become the client's initial configuration.
+ *
+ * You may want to initialize your client this way instead of calling
+ * `setConfig()`. This is useful for example if you're using Next.js
+ * to ensure your client always has the correct values.
+ */
+export type CreateClientConfig =
+ (
+ override?: Config,
+ ) => Config & T>;
+
+export const client = createClient(
+ createConfig({
+ baseUrl: "http://127.0.0.1:1250",
+ }),
+);
diff --git a/www/app/api/client/client.ts b/www/app/api/client/client.ts
new file mode 100644
index 00000000..748558f5
--- /dev/null
+++ b/www/app/api/client/client.ts
@@ -0,0 +1,195 @@
+import type { Client, Config, RequestOptions } from "./types";
+import {
+ buildUrl,
+ createConfig,
+ createInterceptors,
+ getParseAs,
+ mergeConfigs,
+ mergeHeaders,
+ setAuthParams,
+} from "./utils";
+
+type ReqInit = Omit & {
+ body?: any;
+ headers: ReturnType;
+};
+
+export const createClient = (config: Config = {}): Client => {
+ let _config = mergeConfigs(createConfig(), config);
+
+ const getConfig = (): Config => ({ ..._config });
+
+ const setConfig = (config: Config): Config => {
+ _config = mergeConfigs(_config, config);
+ return getConfig();
+ };
+
+ const interceptors = createInterceptors<
+ Request,
+ Response,
+ unknown,
+ RequestOptions
+ >();
+
+ const request: Client["request"] = async (options) => {
+ const opts = {
+ ..._config,
+ ...options,
+ fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,
+ headers: mergeHeaders(_config.headers, options.headers),
+ };
+
+ if (opts.security) {
+ await setAuthParams({
+ ...opts,
+ security: opts.security,
+ });
+ }
+
+ if (opts.requestValidator) {
+ await opts.requestValidator(opts);
+ }
+
+ if (opts.body && opts.bodySerializer) {
+ opts.body = opts.bodySerializer(opts.body);
+ }
+
+ // remove Content-Type header if body is empty to avoid sending invalid requests
+ if (opts.body === undefined || opts.body === "") {
+ opts.headers.delete("Content-Type");
+ }
+
+ const url = buildUrl(opts);
+ const requestInit: ReqInit = {
+ redirect: "follow",
+ ...opts,
+ };
+
+ let request = new Request(url, requestInit);
+
+ for (const fn of interceptors.request._fns) {
+ if (fn) {
+ request = await fn(request, opts);
+ }
+ }
+
+ // fetch must be assigned here, otherwise it would throw the error:
+ // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation
+ const _fetch = opts.fetch!;
+ let response = await _fetch(request);
+
+ for (const fn of interceptors.response._fns) {
+ if (fn) {
+ response = await fn(response, request, opts);
+ }
+ }
+
+ const result = {
+ request,
+ response,
+ };
+
+ if (response.ok) {
+ if (
+ response.status === 204 ||
+ response.headers.get("Content-Length") === "0"
+ ) {
+ return opts.responseStyle === "data"
+ ? {}
+ : {
+ data: {},
+ ...result,
+ };
+ }
+
+ const parseAs =
+ (opts.parseAs === "auto"
+ ? getParseAs(response.headers.get("Content-Type"))
+ : opts.parseAs) ?? "json";
+
+ let data: any;
+ switch (parseAs) {
+ case "arrayBuffer":
+ case "blob":
+ case "formData":
+ case "json":
+ case "text":
+ data = await response[parseAs]();
+ break;
+ case "stream":
+ return opts.responseStyle === "data"
+ ? response.body
+ : {
+ data: response.body,
+ ...result,
+ };
+ }
+
+ if (parseAs === "json") {
+ if (opts.responseValidator) {
+ await opts.responseValidator(data);
+ }
+
+ if (opts.responseTransformer) {
+ data = await opts.responseTransformer(data);
+ }
+ }
+
+ return opts.responseStyle === "data"
+ ? data
+ : {
+ data,
+ ...result,
+ };
+ }
+
+ const textError = await response.text();
+ let jsonError: unknown;
+
+ try {
+ jsonError = JSON.parse(textError);
+ } catch {
+ // noop
+ }
+
+ const error = jsonError ?? textError;
+ let finalError = error;
+
+ for (const fn of interceptors.error._fns) {
+ if (fn) {
+ finalError = (await fn(error, response, request, opts)) as string;
+ }
+ }
+
+ finalError = finalError || ({} as string);
+
+ if (opts.throwOnError) {
+ throw finalError;
+ }
+
+ // TODO: we probably want to return error and improve types
+ return opts.responseStyle === "data"
+ ? undefined
+ : {
+ error: finalError,
+ ...result,
+ };
+ };
+
+ return {
+ buildUrl,
+ connect: (options) => request({ ...options, method: "CONNECT" }),
+ delete: (options) => request({ ...options, method: "DELETE" }),
+ get: (options) => request({ ...options, method: "GET" }),
+ getConfig,
+ head: (options) => request({ ...options, method: "HEAD" }),
+ interceptors,
+ options: (options) => request({ ...options, method: "OPTIONS" }),
+ patch: (options) => request({ ...options, method: "PATCH" }),
+ post: (options) => request({ ...options, method: "POST" }),
+ put: (options) => request({ ...options, method: "PUT" }),
+ request,
+ setConfig,
+ trace: (options) => request({ ...options, method: "TRACE" }),
+ };
+};
diff --git a/www/app/api/client/index.ts b/www/app/api/client/index.ts
new file mode 100644
index 00000000..7b4add41
--- /dev/null
+++ b/www/app/api/client/index.ts
@@ -0,0 +1,22 @@
+export type { Auth } from "../core/auth";
+export type { QuerySerializerOptions } from "../core/bodySerializer";
+export {
+ formDataBodySerializer,
+ jsonBodySerializer,
+ urlSearchParamsBodySerializer,
+} from "../core/bodySerializer";
+export { buildClientParams } from "../core/params";
+export { createClient } from "./client";
+export type {
+ Client,
+ ClientOptions,
+ Config,
+ CreateClientConfig,
+ Options,
+ OptionsLegacyParser,
+ RequestOptions,
+ RequestResult,
+ ResponseStyle,
+ TDataShape,
+} from "./types";
+export { createConfig, mergeHeaders } from "./utils";
diff --git a/www/app/api/client/types.ts b/www/app/api/client/types.ts
new file mode 100644
index 00000000..7c943b43
--- /dev/null
+++ b/www/app/api/client/types.ts
@@ -0,0 +1,216 @@
+import type { Auth } from "../core/auth";
+import type { Client as CoreClient, Config as CoreConfig } from "../core/types";
+import type { Middleware } from "./utils";
+
+export type ResponseStyle = "data" | "fields";
+
+export interface Config
+ extends Omit,
+ CoreConfig {
+ /**
+ * Base URL for all requests made by this client.
+ */
+ baseUrl?: T["baseUrl"];
+ /**
+ * Fetch API implementation. You can use this option to provide a custom
+ * fetch instance.
+ *
+ * @default globalThis.fetch
+ */
+ fetch?: (request: Request) => ReturnType;
+ /**
+ * Please don't use the Fetch client for Next.js applications. The `next`
+ * options won't have any effect.
+ *
+ * Install {@link https://www.npmjs.com/package/@hey-api/client-next `@hey-api/client-next`} instead.
+ */
+ next?: never;
+ /**
+ * Return the response data parsed in a specified format. By default, `auto`
+ * will infer the appropriate method from the `Content-Type` response header.
+ * You can override this behavior with any of the {@link Body} methods.
+ * Select `stream` if you don't want to parse response data at all.
+ *
+ * @default 'auto'
+ */
+ parseAs?:
+ | "arrayBuffer"
+ | "auto"
+ | "blob"
+ | "formData"
+ | "json"
+ | "stream"
+ | "text";
+ /**
+ * Should we return only data or multiple fields (data, error, response, etc.)?
+ *
+ * @default 'fields'
+ */
+ responseStyle?: ResponseStyle;
+ /**
+ * Throw an error instead of returning it in the response?
+ *
+ * @default false
+ */
+ throwOnError?: T["throwOnError"];
+}
+
+export interface RequestOptions<
+ TResponseStyle extends ResponseStyle = "fields",
+ ThrowOnError extends boolean = boolean,
+ Url extends string = string,
+> extends Config<{
+ responseStyle: TResponseStyle;
+ throwOnError: ThrowOnError;
+ }> {
+ /**
+ * Any body that you want to add to your request.
+ *
+ * {@link https://developer.mozilla.org/docs/Web/API/fetch#body}
+ */
+ body?: unknown;
+ path?: Record;
+ query?: Record;
+ /**
+ * Security mechanism(s) to use for the request.
+ */
+ security?: ReadonlyArray;
+ url: Url;
+}
+
+export type RequestResult<
+ TData = unknown,
+ TError = unknown,
+ ThrowOnError extends boolean = boolean,
+ TResponseStyle extends ResponseStyle = "fields",
+> = ThrowOnError extends true
+ ? Promise<
+ TResponseStyle extends "data"
+ ? TData extends Record
+ ? TData[keyof TData]
+ : TData
+ : {
+ data: TData extends Record
+ ? TData[keyof TData]
+ : TData;
+ request: Request;
+ response: Response;
+ }
+ >
+ : Promise<
+ TResponseStyle extends "data"
+ ?
+ | (TData extends Record
+ ? TData[keyof TData]
+ : TData)
+ | undefined
+ : (
+ | {
+ data: TData extends Record
+ ? TData[keyof TData]
+ : TData;
+ error: undefined;
+ }
+ | {
+ data: undefined;
+ error: TError extends Record
+ ? TError[keyof TError]
+ : TError;
+ }
+ ) & {
+ request: Request;
+ response: Response;
+ }
+ >;
+
+export interface ClientOptions {
+ baseUrl?: string;
+ responseStyle?: ResponseStyle;
+ throwOnError?: boolean;
+}
+
+type MethodFn = <
+ TData = unknown,
+ TError = unknown,
+ ThrowOnError extends boolean = false,
+ TResponseStyle extends ResponseStyle = "fields",
+>(
+ options: Omit, "method">,
+) => RequestResult;
+
+type RequestFn = <
+ TData = unknown,
+ TError = unknown,
+ ThrowOnError extends boolean = false,
+ TResponseStyle extends ResponseStyle = "fields",
+>(
+ options: Omit, "method"> &
+ Pick>, "method">,
+) => RequestResult;
+
+type BuildUrlFn = <
+ TData extends {
+ body?: unknown;
+ path?: Record;
+ query?: Record;
+ url: string;
+ },
+>(
+ options: Pick & Options,
+) => string;
+
+export type Client = CoreClient & {
+ interceptors: Middleware;
+};
+
+/**
+ * The `createClientConfig()` function will be called on client initialization
+ * and the returned object will become the client's initial configuration.
+ *
+ * You may want to initialize your client this way instead of calling
+ * `setConfig()`. This is useful for example if you're using Next.js
+ * to ensure your client always has the correct values.
+ */
+export type CreateClientConfig = (
+ override?: Config,
+) => Config & T>;
+
+export interface TDataShape {
+ body?: unknown;
+ headers?: unknown;
+ path?: unknown;
+ query?: unknown;
+ url: string;
+}
+
+type OmitKeys = Pick>;
+
+export type Options<
+ TData extends TDataShape = TDataShape,
+ ThrowOnError extends boolean = boolean,
+ TResponseStyle extends ResponseStyle = "fields",
+> = OmitKeys<
+ RequestOptions,
+ "body" | "path" | "query" | "url"
+> &
+ Omit;
+
+export type OptionsLegacyParser<
+ TData = unknown,
+ ThrowOnError extends boolean = boolean,
+ TResponseStyle extends ResponseStyle = "fields",
+> = TData extends { body?: any }
+ ? TData extends { headers?: any }
+ ? OmitKeys<
+ RequestOptions,
+ "body" | "headers" | "url"
+ > &
+ TData
+ : OmitKeys, "body" | "url"> &
+ TData &
+ Pick, "headers">
+ : TData extends { headers?: any }
+ ? OmitKeys, "headers" | "url"> &
+ TData &
+ Pick, "body">
+ : OmitKeys, "url"> & TData;
diff --git a/www/app/api/client/utils.ts b/www/app/api/client/utils.ts
new file mode 100644
index 00000000..ff8112bd
--- /dev/null
+++ b/www/app/api/client/utils.ts
@@ -0,0 +1,417 @@
+import { getAuthToken } from "../core/auth";
+import type {
+ QuerySerializer,
+ QuerySerializerOptions,
+} from "../core/bodySerializer";
+import { jsonBodySerializer } from "../core/bodySerializer";
+import {
+ serializeArrayParam,
+ serializeObjectParam,
+ serializePrimitiveParam,
+} from "../core/pathSerializer";
+import type { Client, ClientOptions, Config, RequestOptions } from "./types";
+
+interface PathSerializer {
+ path: Record;
+ url: string;
+}
+
+const PATH_PARAM_RE = /\{[^{}]+\}/g;
+
+type ArrayStyle = "form" | "spaceDelimited" | "pipeDelimited";
+type MatrixStyle = "label" | "matrix" | "simple";
+type ArraySeparatorStyle = ArrayStyle | MatrixStyle;
+
+const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {
+ let url = _url;
+ const matches = _url.match(PATH_PARAM_RE);
+ if (matches) {
+ for (const match of matches) {
+ let explode = false;
+ let name = match.substring(1, match.length - 1);
+ let style: ArraySeparatorStyle = "simple";
+
+ if (name.endsWith("*")) {
+ explode = true;
+ name = name.substring(0, name.length - 1);
+ }
+
+ if (name.startsWith(".")) {
+ name = name.substring(1);
+ style = "label";
+ } else if (name.startsWith(";")) {
+ name = name.substring(1);
+ style = "matrix";
+ }
+
+ const value = path[name];
+
+ if (value === undefined || value === null) {
+ continue;
+ }
+
+ if (Array.isArray(value)) {
+ url = url.replace(
+ match,
+ serializeArrayParam({ explode, name, style, value }),
+ );
+ continue;
+ }
+
+ if (typeof value === "object") {
+ url = url.replace(
+ match,
+ serializeObjectParam({
+ explode,
+ name,
+ style,
+ value: value as Record,
+ valueOnly: true,
+ }),
+ );
+ continue;
+ }
+
+ if (style === "matrix") {
+ url = url.replace(
+ match,
+ `;${serializePrimitiveParam({
+ name,
+ value: value as string,
+ })}`,
+ );
+ continue;
+ }
+
+ const replaceValue = encodeURIComponent(
+ style === "label" ? `.${value as string}` : (value as string),
+ );
+ url = url.replace(match, replaceValue);
+ }
+ }
+ return url;
+};
+
+export const createQuerySerializer = ({
+ allowReserved,
+ array,
+ object,
+}: QuerySerializerOptions = {}) => {
+ const querySerializer = (queryParams: T) => {
+ const search: string[] = [];
+ if (queryParams && typeof queryParams === "object") {
+ for (const name in queryParams) {
+ const value = queryParams[name];
+
+ if (value === undefined || value === null) {
+ continue;
+ }
+
+ if (Array.isArray(value)) {
+ const serializedArray = serializeArrayParam({
+ allowReserved,
+ explode: true,
+ name,
+ style: "form",
+ value,
+ ...array,
+ });
+ if (serializedArray) search.push(serializedArray);
+ } else if (typeof value === "object") {
+ const serializedObject = serializeObjectParam({
+ allowReserved,
+ explode: true,
+ name,
+ style: "deepObject",
+ value: value as Record,
+ ...object,
+ });
+ if (serializedObject) search.push(serializedObject);
+ } else {
+ const serializedPrimitive = serializePrimitiveParam({
+ allowReserved,
+ name,
+ value: value as string,
+ });
+ if (serializedPrimitive) search.push(serializedPrimitive);
+ }
+ }
+ }
+ return search.join("&");
+ };
+ return querySerializer;
+};
+
+/**
+ * Infers parseAs value from provided Content-Type header.
+ */
+export const getParseAs = (
+ contentType: string | null,
+): Exclude => {
+ if (!contentType) {
+ // If no Content-Type header is provided, the best we can do is return the raw response body,
+ // which is effectively the same as the 'stream' option.
+ return "stream";
+ }
+
+ const cleanContent = contentType.split(";")[0]?.trim();
+
+ if (!cleanContent) {
+ return;
+ }
+
+ if (
+ cleanContent.startsWith("application/json") ||
+ cleanContent.endsWith("+json")
+ ) {
+ return "json";
+ }
+
+ if (cleanContent === "multipart/form-data") {
+ return "formData";
+ }
+
+ if (
+ ["application/", "audio/", "image/", "video/"].some((type) =>
+ cleanContent.startsWith(type),
+ )
+ ) {
+ return "blob";
+ }
+
+ if (cleanContent.startsWith("text/")) {
+ return "text";
+ }
+
+ return;
+};
+
+export const setAuthParams = async ({
+ security,
+ ...options
+}: Pick, "security"> &
+ Pick & {
+ headers: Headers;
+ }) => {
+ for (const auth of security) {
+ const token = await getAuthToken(auth, options.auth);
+
+ if (!token) {
+ continue;
+ }
+
+ const name = auth.name ?? "Authorization";
+
+ switch (auth.in) {
+ case "query":
+ if (!options.query) {
+ options.query = {};
+ }
+ options.query[name] = token;
+ break;
+ case "cookie":
+ options.headers.append("Cookie", `${name}=${token}`);
+ break;
+ case "header":
+ default:
+ options.headers.set(name, token);
+ break;
+ }
+
+ return;
+ }
+};
+
+export const buildUrl: Client["buildUrl"] = (options) => {
+ const url = getUrl({
+ baseUrl: options.baseUrl as string,
+ path: options.path,
+ query: options.query,
+ querySerializer:
+ typeof options.querySerializer === "function"
+ ? options.querySerializer
+ : createQuerySerializer(options.querySerializer),
+ url: options.url,
+ });
+ return url;
+};
+
+export const getUrl = ({
+ baseUrl,
+ path,
+ query,
+ querySerializer,
+ url: _url,
+}: {
+ baseUrl?: string;
+ path?: Record;
+ query?: Record;
+ querySerializer: QuerySerializer;
+ url: string;
+}) => {
+ const pathUrl = _url.startsWith("/") ? _url : `/${_url}`;
+ let url = (baseUrl ?? "") + pathUrl;
+ if (path) {
+ url = defaultPathSerializer({ path, url });
+ }
+ let search = query ? querySerializer(query) : "";
+ if (search.startsWith("?")) {
+ search = search.substring(1);
+ }
+ if (search) {
+ url += `?${search}`;
+ }
+ return url;
+};
+
+export const mergeConfigs = (a: Config, b: Config): Config => {
+ const config = { ...a, ...b };
+ if (config.baseUrl?.endsWith("/")) {
+ config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);
+ }
+ config.headers = mergeHeaders(a.headers, b.headers);
+ return config;
+};
+
+export const mergeHeaders = (
+ ...headers: Array["headers"] | undefined>
+): Headers => {
+ const mergedHeaders = new Headers();
+ for (const header of headers) {
+ if (!header || typeof header !== "object") {
+ continue;
+ }
+
+ const iterator =
+ header instanceof Headers ? header.entries() : Object.entries(header);
+
+ for (const [key, value] of iterator) {
+ if (value === null) {
+ mergedHeaders.delete(key);
+ } else if (Array.isArray(value)) {
+ for (const v of value) {
+ mergedHeaders.append(key, v as string);
+ }
+ } else if (value !== undefined) {
+ // assume object headers are meant to be JSON stringified, i.e. their
+ // content value in OpenAPI specification is 'application/json'
+ mergedHeaders.set(
+ key,
+ typeof value === "object" ? JSON.stringify(value) : (value as string),
+ );
+ }
+ }
+ }
+ return mergedHeaders;
+};
+
+type ErrInterceptor = (
+ error: Err,
+ response: Res,
+ request: Req,
+ options: Options,
+) => Err | Promise;
+
+type ReqInterceptor = (
+ request: Req,
+ options: Options,
+) => Req | Promise;
+
+type ResInterceptor = (
+ response: Res,
+ request: Req,
+ options: Options,
+) => Res | Promise;
+
+class Interceptors {
+ _fns: (Interceptor | null)[];
+
+ constructor() {
+ this._fns = [];
+ }
+
+ clear() {
+ this._fns = [];
+ }
+
+ getInterceptorIndex(id: number | Interceptor): number {
+ if (typeof id === "number") {
+ return this._fns[id] ? id : -1;
+ } else {
+ return this._fns.indexOf(id);
+ }
+ }
+ exists(id: number | Interceptor) {
+ const index = this.getInterceptorIndex(id);
+ return !!this._fns[index];
+ }
+
+ eject(id: number | Interceptor) {
+ const index = this.getInterceptorIndex(id);
+ if (this._fns[index]) {
+ this._fns[index] = null;
+ }
+ }
+
+ update(id: number | Interceptor, fn: Interceptor) {
+ const index = this.getInterceptorIndex(id);
+ if (this._fns[index]) {
+ this._fns[index] = fn;
+ return id;
+ } else {
+ return false;
+ }
+ }
+
+ use(fn: Interceptor) {
+ this._fns = [...this._fns, fn];
+ return this._fns.length - 1;
+ }
+}
+
+// `createInterceptors()` response, meant for external use as it does not
+// expose internals
+export interface Middleware {
+ error: Pick<
+ Interceptors>,
+ "eject" | "use"
+ >;
+ request: Pick>, "eject" | "use">;
+ response: Pick<
+ Interceptors>,
+ "eject" | "use"
+ >;
+}
+
+// do not add `Middleware` as return type so we can use _fns internally
+export const createInterceptors = () => ({
+ error: new Interceptors>(),
+ request: new Interceptors>(),
+ response: new Interceptors>(),
+});
+
+const defaultQuerySerializer = createQuerySerializer({
+ allowReserved: false,
+ array: {
+ explode: true,
+ style: "form",
+ },
+ object: {
+ explode: true,
+ style: "deepObject",
+ },
+});
+
+const defaultHeaders = {
+ "Content-Type": "application/json",
+};
+
+export const createConfig = (
+ override: Config & T> = {},
+): Config & T> => ({
+ ...jsonBodySerializer,
+ headers: defaultHeaders,
+ parseAs: "auto",
+ querySerializer: defaultQuerySerializer,
+ ...override,
+});
diff --git a/www/app/api/core/ApiError.ts b/www/app/api/core/ApiError.ts
deleted file mode 100644
index 1d07bb31..00000000
--- a/www/app/api/core/ApiError.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import type { ApiRequestOptions } from "./ApiRequestOptions";
-import type { ApiResult } from "./ApiResult";
-
-export class ApiError extends Error {
- public readonly url: string;
- public readonly status: number;
- public readonly statusText: string;
- public readonly body: unknown;
- public readonly request: ApiRequestOptions;
-
- constructor(
- request: ApiRequestOptions,
- response: ApiResult,
- message: string,
- ) {
- super(message);
-
- this.name = "ApiError";
- this.url = response.url;
- this.status = response.status;
- this.statusText = response.statusText;
- this.body = response.body;
- this.request = request;
- }
-}
diff --git a/www/app/api/core/ApiRequestOptions.ts b/www/app/api/core/ApiRequestOptions.ts
deleted file mode 100644
index 57fbb095..00000000
--- a/www/app/api/core/ApiRequestOptions.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-export type ApiRequestOptions = {
- readonly method:
- | "GET"
- | "PUT"
- | "POST"
- | "DELETE"
- | "OPTIONS"
- | "HEAD"
- | "PATCH";
- readonly url: string;
- readonly path?: Record;
- readonly cookies?: Record;
- readonly headers?: Record;
- readonly query?: Record;
- readonly formData?: Record;
- readonly body?: any;
- readonly mediaType?: string;
- readonly responseHeader?: string;
- readonly responseTransformer?: (data: unknown) => Promise;
- readonly errors?: Record;
-};
diff --git a/www/app/api/core/ApiResult.ts b/www/app/api/core/ApiResult.ts
deleted file mode 100644
index 05040ba8..00000000
--- a/www/app/api/core/ApiResult.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export type ApiResult = {
- readonly body: TData;
- readonly ok: boolean;
- readonly status: number;
- readonly statusText: string;
- readonly url: string;
-};
diff --git a/www/app/api/core/AxiosHttpRequest.ts b/www/app/api/core/AxiosHttpRequest.ts
deleted file mode 100644
index aba5096e..00000000
--- a/www/app/api/core/AxiosHttpRequest.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import type { ApiRequestOptions } from "./ApiRequestOptions";
-import { BaseHttpRequest } from "./BaseHttpRequest";
-import type { CancelablePromise } from "./CancelablePromise";
-import type { OpenAPIConfig } from "./OpenAPI";
-import { request as __request } from "./request";
-
-export class AxiosHttpRequest extends BaseHttpRequest {
- constructor(config: OpenAPIConfig) {
- super(config);
- }
-
- /**
- * Request method
- * @param options The request options from the service
- * @returns CancelablePromise
- * @throws ApiError
- */
- public override request(
- options: ApiRequestOptions,
- ): CancelablePromise {
- return __request(this.config, options);
- }
-}
diff --git a/www/app/api/core/BaseHttpRequest.ts b/www/app/api/core/BaseHttpRequest.ts
deleted file mode 100644
index 3f89861c..00000000
--- a/www/app/api/core/BaseHttpRequest.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import type { ApiRequestOptions } from "./ApiRequestOptions";
-import type { CancelablePromise } from "./CancelablePromise";
-import type { OpenAPIConfig } from "./OpenAPI";
-
-export abstract class BaseHttpRequest {
- constructor(public readonly config: OpenAPIConfig) {}
-
- public abstract request(
- options: ApiRequestOptions,
- ): CancelablePromise;
-}
diff --git a/www/app/api/core/CancelablePromise.ts b/www/app/api/core/CancelablePromise.ts
deleted file mode 100644
index 0640e989..00000000
--- a/www/app/api/core/CancelablePromise.ts
+++ /dev/null
@@ -1,126 +0,0 @@
-export class CancelError extends Error {
- constructor(message: string) {
- super(message);
- this.name = "CancelError";
- }
-
- public get isCancelled(): boolean {
- return true;
- }
-}
-
-export interface OnCancel {
- readonly isResolved: boolean;
- readonly isRejected: boolean;
- readonly isCancelled: boolean;
-
- (cancelHandler: () => void): void;
-}
-
-export class CancelablePromise implements Promise {
- private _isResolved: boolean;
- private _isRejected: boolean;
- private _isCancelled: boolean;
- readonly cancelHandlers: (() => void)[];
- readonly promise: Promise;
- private _resolve?: (value: T | PromiseLike) => void;
- private _reject?: (reason?: unknown) => void;
-
- constructor(
- executor: (
- resolve: (value: T | PromiseLike) => void,
- reject: (reason?: unknown) => void,
- onCancel: OnCancel,
- ) => void,
- ) {
- this._isResolved = false;
- this._isRejected = false;
- this._isCancelled = false;
- this.cancelHandlers = [];
- this.promise = new Promise((resolve, reject) => {
- this._resolve = resolve;
- this._reject = reject;
-
- const onResolve = (value: T | PromiseLike): void => {
- if (this._isResolved || this._isRejected || this._isCancelled) {
- return;
- }
- this._isResolved = true;
- if (this._resolve) this._resolve(value);
- };
-
- const onReject = (reason?: unknown): void => {
- if (this._isResolved || this._isRejected || this._isCancelled) {
- return;
- }
- this._isRejected = true;
- if (this._reject) this._reject(reason);
- };
-
- const onCancel = (cancelHandler: () => void): void => {
- if (this._isResolved || this._isRejected || this._isCancelled) {
- return;
- }
- this.cancelHandlers.push(cancelHandler);
- };
-
- Object.defineProperty(onCancel, "isResolved", {
- get: (): boolean => this._isResolved,
- });
-
- Object.defineProperty(onCancel, "isRejected", {
- get: (): boolean => this._isRejected,
- });
-
- Object.defineProperty(onCancel, "isCancelled", {
- get: (): boolean => this._isCancelled,
- });
-
- return executor(onResolve, onReject, onCancel as OnCancel);
- });
- }
-
- get [Symbol.toStringTag]() {
- return "Cancellable Promise";
- }
-
- public then(
- onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null,
- onRejected?: ((reason: unknown) => TResult2 | PromiseLike) | null,
- ): Promise {
- return this.promise.then(onFulfilled, onRejected);
- }
-
- public catch(
- onRejected?: ((reason: unknown) => TResult | PromiseLike) | null,
- ): Promise {
- return this.promise.catch(onRejected);
- }
-
- public finally(onFinally?: (() => void) | null): Promise {
- return this.promise.finally(onFinally);
- }
-
- public cancel(): void {
- if (this._isResolved || this._isRejected || this._isCancelled) {
- return;
- }
- this._isCancelled = true;
- if (this.cancelHandlers.length) {
- try {
- for (const cancelHandler of this.cancelHandlers) {
- cancelHandler();
- }
- } catch (error) {
- console.warn("Cancellation threw an error", error);
- return;
- }
- }
- this.cancelHandlers.length = 0;
- if (this._reject) this._reject(new CancelError("Request aborted"));
- }
-
- public get isCancelled(): boolean {
- return this._isCancelled;
- }
-}
diff --git a/www/app/api/core/OpenAPI.ts b/www/app/api/core/OpenAPI.ts
deleted file mode 100644
index 20ea0ed9..00000000
--- a/www/app/api/core/OpenAPI.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import type { AxiosRequestConfig, AxiosResponse } from "axios";
-import type { ApiRequestOptions } from "./ApiRequestOptions";
-
-type Headers = Record;
-type Middleware = (value: T) => T | Promise;
-type Resolver = (options: ApiRequestOptions) => Promise;
-
-export class Interceptors {
- _fns: Middleware[];
-
- constructor() {
- this._fns = [];
- }
-
- eject(fn: Middleware): void {
- const index = this._fns.indexOf(fn);
- if (index !== -1) {
- this._fns = [...this._fns.slice(0, index), ...this._fns.slice(index + 1)];
- }
- }
-
- use(fn: Middleware): void {
- this._fns = [...this._fns, fn];
- }
-}
-
-export type OpenAPIConfig = {
- BASE: string;
- CREDENTIALS: "include" | "omit" | "same-origin";
- ENCODE_PATH?: ((path: string) => string) | undefined;
- HEADERS?: Headers | Resolver | undefined;
- PASSWORD?: string | Resolver | undefined;
- TOKEN?: string | Resolver | undefined;
- USERNAME?: string | Resolver | undefined;
- VERSION: string;
- WITH_CREDENTIALS: boolean;
- interceptors: {
- request: Interceptors;
- response: Interceptors;
- };
-};
-
-export const OpenAPI: OpenAPIConfig = {
- BASE: "",
- CREDENTIALS: "include",
- ENCODE_PATH: undefined,
- HEADERS: undefined,
- PASSWORD: undefined,
- TOKEN: undefined,
- USERNAME: undefined,
- VERSION: "0.1.0",
- WITH_CREDENTIALS: false,
- interceptors: {
- request: new Interceptors(),
- response: new Interceptors(),
- },
-};
diff --git a/www/app/api/core/auth.ts b/www/app/api/core/auth.ts
new file mode 100644
index 00000000..70e9d5db
--- /dev/null
+++ b/www/app/api/core/auth.ts
@@ -0,0 +1,40 @@
+export type AuthToken = string | undefined;
+
+export interface Auth {
+ /**
+ * Which part of the request do we use to send the auth?
+ *
+ * @default 'header'
+ */
+ in?: "header" | "query" | "cookie";
+ /**
+ * Header or query parameter name.
+ *
+ * @default 'Authorization'
+ */
+ name?: string;
+ scheme?: "basic" | "bearer";
+ type: "apiKey" | "http";
+}
+
+export const getAuthToken = async (
+ auth: Auth,
+ callback: ((auth: Auth) => Promise | AuthToken) | AuthToken,
+): Promise => {
+ const token =
+ typeof callback === "function" ? await callback(auth) : callback;
+
+ if (!token) {
+ return;
+ }
+
+ if (auth.scheme === "bearer") {
+ return `Bearer ${token}`;
+ }
+
+ if (auth.scheme === "basic") {
+ return `Basic ${btoa(token)}`;
+ }
+
+ return token;
+};
diff --git a/www/app/api/core/bodySerializer.ts b/www/app/api/core/bodySerializer.ts
new file mode 100644
index 00000000..35e2a17e
--- /dev/null
+++ b/www/app/api/core/bodySerializer.ts
@@ -0,0 +1,88 @@
+import type {
+ ArrayStyle,
+ ObjectStyle,
+ SerializerOptions,
+} from "./pathSerializer";
+
+export type QuerySerializer = (query: Record) => string;
+
+export type BodySerializer = (body: any) => any;
+
+export interface QuerySerializerOptions {
+ allowReserved?: boolean;
+ array?: SerializerOptions;
+ object?: SerializerOptions;
+}
+
+const serializeFormDataPair = (
+ data: FormData,
+ key: string,
+ value: unknown,
+): void => {
+ if (typeof value === "string" || value instanceof Blob) {
+ data.append(key, value);
+ } else {
+ data.append(key, JSON.stringify(value));
+ }
+};
+
+const serializeUrlSearchParamsPair = (
+ data: URLSearchParams,
+ key: string,
+ value: unknown,
+): void => {
+ if (typeof value === "string") {
+ data.append(key, value);
+ } else {
+ data.append(key, JSON.stringify(value));
+ }
+};
+
+export const formDataBodySerializer = {
+ bodySerializer: | Array>>(
+ body: T,
+ ): FormData => {
+ const data = new FormData();
+
+ Object.entries(body).forEach(([key, value]) => {
+ if (value === undefined || value === null) {
+ return;
+ }
+ if (Array.isArray(value)) {
+ value.forEach((v) => serializeFormDataPair(data, key, v));
+ } else {
+ serializeFormDataPair(data, key, value);
+ }
+ });
+
+ return data;
+ },
+};
+
+export const jsonBodySerializer = {
+ bodySerializer: (body: T): string =>
+ JSON.stringify(body, (_key, value) =>
+ typeof value === "bigint" ? value.toString() : value,
+ ),
+};
+
+export const urlSearchParamsBodySerializer = {
+ bodySerializer: | Array>>(
+ body: T,
+ ): string => {
+ const data = new URLSearchParams();
+
+ Object.entries(body).forEach(([key, value]) => {
+ if (value === undefined || value === null) {
+ return;
+ }
+ if (Array.isArray(value)) {
+ value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));
+ } else {
+ serializeUrlSearchParamsPair(data, key, value);
+ }
+ });
+
+ return data.toString();
+ },
+};
diff --git a/www/app/api/core/params.ts b/www/app/api/core/params.ts
new file mode 100644
index 00000000..efb0ff49
--- /dev/null
+++ b/www/app/api/core/params.ts
@@ -0,0 +1,151 @@
+type Slot = "body" | "headers" | "path" | "query";
+
+export type Field =
+ | {
+ in: Exclude;
+ /**
+ * Field name. This is the name we want the user to see and use.
+ */
+ key: string;
+ /**
+ * Field mapped name. This is the name we want to use in the request.
+ * If omitted, we use the same value as `key`.
+ */
+ map?: string;
+ }
+ | {
+ in: Extract;
+ /**
+ * Key isn't required for bodies.
+ */
+ key?: string;
+ map?: string;
+ };
+
+export interface Fields {
+ allowExtra?: Partial>;
+ args?: ReadonlyArray;
+}
+
+export type FieldsConfig = ReadonlyArray;
+
+const extraPrefixesMap: Record = {
+ $body_: "body",
+ $headers_: "headers",
+ $path_: "path",
+ $query_: "query",
+};
+const extraPrefixes = Object.entries(extraPrefixesMap);
+
+type KeyMap = Map<
+ string,
+ {
+ in: Slot;
+ map?: string;
+ }
+>;
+
+const buildKeyMap = (fields: FieldsConfig, map?: KeyMap): KeyMap => {
+ if (!map) {
+ map = new Map();
+ }
+
+ for (const config of fields) {
+ if ("in" in config) {
+ if (config.key) {
+ map.set(config.key, {
+ in: config.in,
+ map: config.map,
+ });
+ }
+ } else if (config.args) {
+ buildKeyMap(config.args, map);
+ }
+ }
+
+ return map;
+};
+
+interface Params {
+ body: unknown;
+ headers: Record;
+ path: Record;
+ query: Record;
+}
+
+const stripEmptySlots = (params: Params) => {
+ for (const [slot, value] of Object.entries(params)) {
+ if (value && typeof value === "object" && !Object.keys(value).length) {
+ delete params[slot as Slot];
+ }
+ }
+};
+
+export const buildClientParams = (
+ args: ReadonlyArray,
+ fields: FieldsConfig,
+) => {
+ const params: Params = {
+ body: {},
+ headers: {},
+ path: {},
+ query: {},
+ };
+
+ const map = buildKeyMap(fields);
+
+ let config: FieldsConfig[number] | undefined;
+
+ for (const [index, arg] of args.entries()) {
+ if (fields[index]) {
+ config = fields[index];
+ }
+
+ if (!config) {
+ continue;
+ }
+
+ if ("in" in config) {
+ if (config.key) {
+ const field = map.get(config.key)!;
+ const name = field.map || config.key;
+ (params[field.in] as Record)[name] = arg;
+ } else {
+ params.body = arg;
+ }
+ } else {
+ for (const [key, value] of Object.entries(arg ?? {})) {
+ const field = map.get(key);
+
+ if (field) {
+ const name = field.map || key;
+ (params[field.in] as Record)[name] = value;
+ } else {
+ const extra = extraPrefixes.find(([prefix]) =>
+ key.startsWith(prefix),
+ );
+
+ if (extra) {
+ const [prefix, slot] = extra;
+ (params[slot] as Record)[
+ key.slice(prefix.length)
+ ] = value;
+ } else {
+ for (const [slot, allowed] of Object.entries(
+ config.allowExtra ?? {},
+ )) {
+ if (allowed) {
+ (params[slot as Slot] as Record)[key] = value;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ stripEmptySlots(params);
+
+ return params;
+};
diff --git a/www/app/api/core/pathSerializer.ts b/www/app/api/core/pathSerializer.ts
new file mode 100644
index 00000000..4052ad12
--- /dev/null
+++ b/www/app/api/core/pathSerializer.ts
@@ -0,0 +1,179 @@
+interface SerializeOptions
+ extends SerializePrimitiveOptions,
+ SerializerOptions {}
+
+interface SerializePrimitiveOptions {
+ allowReserved?: boolean;
+ name: string;
+}
+
+export interface SerializerOptions {
+ /**
+ * @default true
+ */
+ explode: boolean;
+ style: T;
+}
+
+export type ArrayStyle = "form" | "spaceDelimited" | "pipeDelimited";
+export type ArraySeparatorStyle = ArrayStyle | MatrixStyle;
+type MatrixStyle = "label" | "matrix" | "simple";
+export type ObjectStyle = "form" | "deepObject";
+type ObjectSeparatorStyle = ObjectStyle | MatrixStyle;
+
+interface SerializePrimitiveParam extends SerializePrimitiveOptions {
+ value: string;
+}
+
+export const separatorArrayExplode = (style: ArraySeparatorStyle) => {
+ switch (style) {
+ case "label":
+ return ".";
+ case "matrix":
+ return ";";
+ case "simple":
+ return ",";
+ default:
+ return "&";
+ }
+};
+
+export const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {
+ switch (style) {
+ case "form":
+ return ",";
+ case "pipeDelimited":
+ return "|";
+ case "spaceDelimited":
+ return "%20";
+ default:
+ return ",";
+ }
+};
+
+export const separatorObjectExplode = (style: ObjectSeparatorStyle) => {
+ switch (style) {
+ case "label":
+ return ".";
+ case "matrix":
+ return ";";
+ case "simple":
+ return ",";
+ default:
+ return "&";
+ }
+};
+
+export const serializeArrayParam = ({
+ allowReserved,
+ explode,
+ name,
+ style,
+ value,
+}: SerializeOptions & {
+ value: unknown[];
+}) => {
+ if (!explode) {
+ const joinedValues = (
+ allowReserved ? value : value.map((v) => encodeURIComponent(v as string))
+ ).join(separatorArrayNoExplode(style));
+ switch (style) {
+ case "label":
+ return `.${joinedValues}`;
+ case "matrix":
+ return `;${name}=${joinedValues}`;
+ case "simple":
+ return joinedValues;
+ default:
+ return `${name}=${joinedValues}`;
+ }
+ }
+
+ const separator = separatorArrayExplode(style);
+ const joinedValues = value
+ .map((v) => {
+ if (style === "label" || style === "simple") {
+ return allowReserved ? v : encodeURIComponent(v as string);
+ }
+
+ return serializePrimitiveParam({
+ allowReserved,
+ name,
+ value: v as string,
+ });
+ })
+ .join(separator);
+ return style === "label" || style === "matrix"
+ ? separator + joinedValues
+ : joinedValues;
+};
+
+export const serializePrimitiveParam = ({
+ allowReserved,
+ name,
+ value,
+}: SerializePrimitiveParam) => {
+ if (value === undefined || value === null) {
+ return "";
+ }
+
+ if (typeof value === "object") {
+ throw new Error(
+ "Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.",
+ );
+ }
+
+ return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;
+};
+
+export const serializeObjectParam = ({
+ allowReserved,
+ explode,
+ name,
+ style,
+ value,
+ valueOnly,
+}: SerializeOptions & {
+ value: Record | Date;
+ valueOnly?: boolean;
+}) => {
+ if (value instanceof Date) {
+ return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;
+ }
+
+ if (style !== "deepObject" && !explode) {
+ let values: string[] = [];
+ Object.entries(value).forEach(([key, v]) => {
+ values = [
+ ...values,
+ key,
+ allowReserved ? (v as string) : encodeURIComponent(v as string),
+ ];
+ });
+ const joinedValues = values.join(",");
+ switch (style) {
+ case "form":
+ return `${name}=${joinedValues}`;
+ case "label":
+ return `.${joinedValues}`;
+ case "matrix":
+ return `;${name}=${joinedValues}`;
+ default:
+ return joinedValues;
+ }
+ }
+
+ const separator = separatorObjectExplode(style);
+ const joinedValues = Object.entries(value)
+ .map(([key, v]) =>
+ serializePrimitiveParam({
+ allowReserved,
+ name: style === "deepObject" ? `${name}[${key}]` : key,
+ value: v as string,
+ }),
+ )
+ .join(separator);
+ return style === "label" || style === "matrix"
+ ? separator + joinedValues
+ : joinedValues;
+};
diff --git a/www/app/api/core/request.ts b/www/app/api/core/request.ts
deleted file mode 100644
index b576207e..00000000
--- a/www/app/api/core/request.ts
+++ /dev/null
@@ -1,387 +0,0 @@
-import axios from "axios";
-import type {
- AxiosError,
- AxiosRequestConfig,
- AxiosResponse,
- AxiosInstance,
-} from "axios";
-
-import { ApiError } from "./ApiError";
-import type { ApiRequestOptions } from "./ApiRequestOptions";
-import type { ApiResult } from "./ApiResult";
-import { CancelablePromise } from "./CancelablePromise";
-import type { OnCancel } from "./CancelablePromise";
-import type { OpenAPIConfig } from "./OpenAPI";
-
-export const isString = (value: unknown): value is string => {
- return typeof value === "string";
-};
-
-export const isStringWithValue = (value: unknown): value is string => {
- return isString(value) && value !== "";
-};
-
-export const isBlob = (value: any): value is Blob => {
- return value instanceof Blob;
-};
-
-export const isFormData = (value: unknown): value is FormData => {
- return value instanceof FormData;
-};
-
-export const isSuccess = (status: number): boolean => {
- return status >= 200 && status < 300;
-};
-
-export const base64 = (str: string): string => {
- try {
- return btoa(str);
- } catch (err) {
- // @ts-ignore
- return Buffer.from(str).toString("base64");
- }
-};
-
-export const getQueryString = (params: Record): string => {
- const qs: string[] = [];
-
- const append = (key: string, value: unknown) => {
- qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
- };
-
- const encodePair = (key: string, value: unknown) => {
- if (value === undefined || value === null) {
- return;
- }
-
- if (value instanceof Date) {
- append(key, value.toISOString());
- } else if (Array.isArray(value)) {
- value.forEach((v) => encodePair(key, v));
- } else if (typeof value === "object") {
- Object.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v));
- } else {
- append(key, value);
- }
- };
-
- Object.entries(params).forEach(([key, value]) => encodePair(key, value));
-
- return qs.length ? `?${qs.join("&")}` : "";
-};
-
-const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => {
- const encoder = config.ENCODE_PATH || encodeURI;
-
- const path = options.url
- .replace("{api-version}", config.VERSION)
- .replace(/{(.*?)}/g, (substring: string, group: string) => {
- if (options.path?.hasOwnProperty(group)) {
- return encoder(String(options.path[group]));
- }
- return substring;
- });
-
- const url = config.BASE + path;
- return options.query ? url + getQueryString(options.query) : url;
-};
-
-export const getFormData = (
- options: ApiRequestOptions,
-): FormData | undefined => {
- if (options.formData) {
- const formData = new FormData();
-
- const process = (key: string, value: unknown) => {
- if (isString(value) || isBlob(value)) {
- formData.append(key, value);
- } else {
- formData.append(key, JSON.stringify(value));
- }
- };
-
- Object.entries(options.formData)
- .filter(([, value]) => value !== undefined && value !== null)
- .forEach(([key, value]) => {
- if (Array.isArray(value)) {
- value.forEach((v) => process(key, v));
- } else {
- process(key, value);
- }
- });
-
- return formData;
- }
- return undefined;
-};
-
-type Resolver = (options: ApiRequestOptions) => Promise;
-
-export const resolve = async (
- options: ApiRequestOptions,
- resolver?: T | Resolver,
-): Promise => {
- if (typeof resolver === "function") {
- return (resolver as Resolver)(options);
- }
- return resolver;
-};
-
-export const getHeaders = async (
- config: OpenAPIConfig,
- options: ApiRequestOptions,
-): Promise> => {
- const [token, username, password, additionalHeaders] = await Promise.all([
- // @ts-ignore
- resolve(options, config.TOKEN),
- // @ts-ignore
- resolve(options, config.USERNAME),
- // @ts-ignore
- resolve(options, config.PASSWORD),
- // @ts-ignore
- resolve(options, config.HEADERS),
- ]);
-
- const headers = Object.entries({
- Accept: "application/json",
- ...additionalHeaders,
- ...options.headers,
- })
- .filter(([, value]) => value !== undefined && value !== null)
- .reduce(
- (headers, [key, value]) => ({
- ...headers,
- [key]: String(value),
- }),
- {} as Record,
- );
-
- if (isStringWithValue(token)) {
- headers["Authorization"] = `Bearer ${token}`;
- }
-
- if (isStringWithValue(username) && isStringWithValue(password)) {
- const credentials = base64(`${username}:${password}`);
- headers["Authorization"] = `Basic ${credentials}`;
- }
-
- if (options.body !== undefined) {
- if (options.mediaType) {
- headers["Content-Type"] = options.mediaType;
- } else if (isBlob(options.body)) {
- headers["Content-Type"] = options.body.type || "application/octet-stream";
- } else if (isString(options.body)) {
- headers["Content-Type"] = "text/plain";
- } else if (!isFormData(options.body)) {
- headers["Content-Type"] = "application/json";
- }
- } else if (options.formData !== undefined) {
- if (options.mediaType) {
- headers["Content-Type"] = options.mediaType;
- }
- }
-
- return headers;
-};
-
-export const getRequestBody = (options: ApiRequestOptions): unknown => {
- if (options.body) {
- return options.body;
- }
- return undefined;
-};
-
-export const sendRequest = async (
- config: OpenAPIConfig,
- options: ApiRequestOptions,
- url: string,
- body: unknown,
- formData: FormData | undefined,
- headers: Record,
- onCancel: OnCancel,
- axiosClient: AxiosInstance,
-): Promise> => {
- const controller = new AbortController();
-
- let requestConfig: AxiosRequestConfig = {
- data: body ?? formData,
- headers,
- method: options.method,
- signal: controller.signal,
- url,
- withCredentials: config.WITH_CREDENTIALS,
- };
-
- onCancel(() => controller.abort());
-
- for (const fn of config.interceptors.request._fns) {
- requestConfig = await fn(requestConfig);
- }
-
- try {
- return await axiosClient.request(requestConfig);
- } catch (error) {
- const axiosError = error as AxiosError;
- if (axiosError.response) {
- return axiosError.response;
- }
- throw error;
- }
-};
-
-export const getResponseHeader = (
- response: AxiosResponse,
- responseHeader?: string,
-): string | undefined => {
- if (responseHeader) {
- const content = response.headers[responseHeader];
- if (isString(content)) {
- return content;
- }
- }
- return undefined;
-};
-
-export const getResponseBody = (response: AxiosResponse): unknown => {
- if (response.status !== 204) {
- return response.data;
- }
- return undefined;
-};
-
-export const catchErrorCodes = (
- options: ApiRequestOptions,
- result: ApiResult,
-): void => {
- const errors: Record = {
- 400: "Bad Request",
- 401: "Unauthorized",
- 402: "Payment Required",
- 403: "Forbidden",
- 404: "Not Found",
- 405: "Method Not Allowed",
- 406: "Not Acceptable",
- 407: "Proxy Authentication Required",
- 408: "Request Timeout",
- 409: "Conflict",
- 410: "Gone",
- 411: "Length Required",
- 412: "Precondition Failed",
- 413: "Payload Too Large",
- 414: "URI Too Long",
- 415: "Unsupported Media Type",
- 416: "Range Not Satisfiable",
- 417: "Expectation Failed",
- 418: "Im a teapot",
- 421: "Misdirected Request",
- 422: "Unprocessable Content",
- 423: "Locked",
- 424: "Failed Dependency",
- 425: "Too Early",
- 426: "Upgrade Required",
- 428: "Precondition Required",
- 429: "Too Many Requests",
- 431: "Request Header Fields Too Large",
- 451: "Unavailable For Legal Reasons",
- 500: "Internal Server Error",
- 501: "Not Implemented",
- 502: "Bad Gateway",
- 503: "Service Unavailable",
- 504: "Gateway Timeout",
- 505: "HTTP Version Not Supported",
- 506: "Variant Also Negotiates",
- 507: "Insufficient Storage",
- 508: "Loop Detected",
- 510: "Not Extended",
- 511: "Network Authentication Required",
- ...options.errors,
- };
-
- const error = errors[result.status];
- if (error) {
- throw new ApiError(options, result, error);
- }
-
- if (!result.ok) {
- const errorStatus = result.status ?? "unknown";
- const errorStatusText = result.statusText ?? "unknown";
- const errorBody = (() => {
- try {
- return JSON.stringify(result.body, null, 2);
- } catch (e) {
- return undefined;
- }
- })();
-
- throw new ApiError(
- options,
- result,
- `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`,
- );
- }
-};
-
-/**
- * Request method
- * @param config The OpenAPI configuration object
- * @param options The request options from the service
- * @param axiosClient The axios client instance to use
- * @returns CancelablePromise
- * @throws ApiError
- */
-export const request = (
- config: OpenAPIConfig,
- options: ApiRequestOptions,
- axiosClient: AxiosInstance = axios,
-): CancelablePromise => {
- return new CancelablePromise(async (resolve, reject, onCancel) => {
- try {
- const url = getUrl(config, options);
- const formData = getFormData(options);
- const body = getRequestBody(options);
- const headers = await getHeaders(config, options);
-
- if (!onCancel.isCancelled) {
- let response = await sendRequest(
- config,
- options,
- url,
- body,
- formData,
- headers,
- onCancel,
- axiosClient,
- );
-
- for (const fn of config.interceptors.response._fns) {
- response = await fn(response);
- }
-
- const responseBody = getResponseBody(response);
- const responseHeader = getResponseHeader(
- response,
- options.responseHeader,
- );
-
- let transformedBody = responseBody;
- if (options.responseTransformer && isSuccess(response.status)) {
- transformedBody = await options.responseTransformer(responseBody);
- }
-
- const result: ApiResult = {
- url,
- ok: isSuccess(response.status),
- status: response.status,
- statusText: response.statusText,
- body: responseHeader ?? transformedBody,
- };
-
- catchErrorCodes(options, result);
-
- resolve(result.body);
- }
- } catch (error) {
- reject(error);
- }
- });
-};
diff --git a/www/app/api/core/types.ts b/www/app/api/core/types.ts
new file mode 100644
index 00000000..13c5ec21
--- /dev/null
+++ b/www/app/api/core/types.ts
@@ -0,0 +1,118 @@
+import type { Auth, AuthToken } from "./auth";
+import type {
+ BodySerializer,
+ QuerySerializer,
+ QuerySerializerOptions,
+} from "./bodySerializer";
+
+export interface Client<
+ RequestFn = never,
+ Config = unknown,
+ MethodFn = never,
+ BuildUrlFn = never,
+> {
+ /**
+ * Returns the final request URL.
+ */
+ buildUrl: BuildUrlFn;
+ connect: MethodFn;
+ delete: MethodFn;
+ get: MethodFn;
+ getConfig: () => Config;
+ head: MethodFn;
+ options: MethodFn;
+ patch: MethodFn;
+ post: MethodFn;
+ put: MethodFn;
+ request: RequestFn;
+ setConfig: (config: Config) => Config;
+ trace: MethodFn;
+}
+
+export interface Config {
+ /**
+ * Auth token or a function returning auth token. The resolved value will be
+ * added to the request payload as defined by its `security` array.
+ */
+ auth?: ((auth: Auth) => Promise | AuthToken) | AuthToken;
+ /**
+ * A function for serializing request body parameter. By default,
+ * {@link JSON.stringify()} will be used.
+ */
+ bodySerializer?: BodySerializer | null;
+ /**
+ * An object containing any HTTP headers that you want to pre-populate your
+ * `Headers` object with.
+ *
+ * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more}
+ */
+ headers?:
+ | RequestInit["headers"]
+ | Record<
+ string,
+ | string
+ | number
+ | boolean
+ | (string | number | boolean)[]
+ | null
+ | undefined
+ | unknown
+ >;
+ /**
+ * The request method.
+ *
+ * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more}
+ */
+ method?:
+ | "CONNECT"
+ | "DELETE"
+ | "GET"
+ | "HEAD"
+ | "OPTIONS"
+ | "PATCH"
+ | "POST"
+ | "PUT"
+ | "TRACE";
+ /**
+ * A function for serializing request query parameters. By default, arrays
+ * will be exploded in form style, objects will be exploded in deepObject
+ * style, and reserved characters are percent-encoded.
+ *
+ * This method will have no effect if the native `paramsSerializer()` Axios
+ * API function is used.
+ *
+ * {@link https://swagger.io/docs/specification/serialization/#query View examples}
+ */
+ querySerializer?: QuerySerializer | QuerySerializerOptions;
+ /**
+ * A function validating request data. This is useful if you want to ensure
+ * the request conforms to the desired shape, so it can be safely sent to
+ * the server.
+ */
+ requestValidator?: (data: unknown) => Promise;
+ /**
+ * A function transforming response data before it's returned. This is useful
+ * for post-processing data, e.g. converting ISO strings into Date objects.
+ */
+ responseTransformer?: (data: unknown) => Promise;
+ /**
+ * A function validating response data. This is useful if you want to ensure
+ * the response conforms to the desired shape, so it can be safely passed to
+ * the transformers and returned to the user.
+ */
+ responseValidator?: (data: unknown) => Promise;
+}
+
+type IsExactlyNeverOrNeverUndefined = [T] extends [never]
+ ? true
+ : [T] extends [never | undefined]
+ ? [undefined] extends [T]
+ ? false
+ : true
+ : false;
+
+export type OmitNever> = {
+ [K in keyof T as IsExactlyNeverOrNeverUndefined extends true
+ ? never
+ : K]: T[K];
+};
diff --git a/www/app/api/index.ts b/www/app/api/index.ts
index 27fbb57d..da870793 100644
--- a/www/app/api/index.ts
+++ b/www/app/api/index.ts
@@ -1,9 +1,3 @@
// This file is auto-generated by @hey-api/openapi-ts
-export { OpenApi } from "./OpenApi";
-export { ApiError } from "./core/ApiError";
-export { BaseHttpRequest } from "./core/BaseHttpRequest";
-export { CancelablePromise, CancelError } from "./core/CancelablePromise";
-export { OpenAPI, type OpenAPIConfig } from "./core/OpenAPI";
-export * from "./schemas.gen";
-export * from "./services.gen";
export * from "./types.gen";
+export * from "./sdk.gen";
diff --git a/www/app/api/schemas.gen.ts b/www/app/api/schemas.gen.ts
deleted file mode 100644
index fdaf3271..00000000
--- a/www/app/api/schemas.gen.ts
+++ /dev/null
@@ -1,1432 +0,0 @@
-// This file is auto-generated by @hey-api/openapi-ts
-
-export const $AudioWaveform = {
- properties: {
- data: {
- items: {
- type: "number",
- },
- type: "array",
- title: "Data",
- },
- },
- type: "object",
- required: ["data"],
- title: "AudioWaveform",
-} as const;
-
-export const $Body_transcript_record_upload_v1_transcripts__transcript_id__record_upload_post =
- {
- properties: {
- chunk: {
- type: "string",
- format: "binary",
- title: "Chunk",
- },
- },
- type: "object",
- required: ["chunk"],
- title:
- "Body_transcript_record_upload_v1_transcripts__transcript_id__record_upload_post",
- } as const;
-
-export const $CreateParticipant = {
- properties: {
- speaker: {
- anyOf: [
- {
- type: "integer",
- },
- {
- type: "null",
- },
- ],
- title: "Speaker",
- },
- name: {
- type: "string",
- title: "Name",
- },
- },
- type: "object",
- required: ["name"],
- title: "CreateParticipant",
-} as const;
-
-export const $CreateRoom = {
- properties: {
- name: {
- type: "string",
- title: "Name",
- },
- zulip_auto_post: {
- type: "boolean",
- title: "Zulip Auto Post",
- },
- zulip_stream: {
- type: "string",
- title: "Zulip Stream",
- },
- zulip_topic: {
- type: "string",
- title: "Zulip Topic",
- },
- is_locked: {
- type: "boolean",
- title: "Is Locked",
- },
- room_mode: {
- type: "string",
- title: "Room Mode",
- },
- recording_type: {
- type: "string",
- title: "Recording Type",
- },
- recording_trigger: {
- type: "string",
- title: "Recording Trigger",
- },
- is_shared: {
- type: "boolean",
- title: "Is Shared",
- },
- },
- type: "object",
- required: [
- "name",
- "zulip_auto_post",
- "zulip_stream",
- "zulip_topic",
- "is_locked",
- "room_mode",
- "recording_type",
- "recording_trigger",
- "is_shared",
- ],
- title: "CreateRoom",
-} as const;
-
-export const $CreateTranscript = {
- properties: {
- name: {
- type: "string",
- title: "Name",
- },
- source_language: {
- type: "string",
- title: "Source Language",
- default: "en",
- },
- target_language: {
- type: "string",
- title: "Target Language",
- default: "en",
- },
- },
- type: "object",
- required: ["name"],
- title: "CreateTranscript",
-} as const;
-
-export const $DeletionStatus = {
- properties: {
- status: {
- type: "string",
- title: "Status",
- },
- },
- type: "object",
- required: ["status"],
- title: "DeletionStatus",
-} as const;
-
-export const $GetTranscript = {
- properties: {
- id: {
- type: "string",
- title: "Id",
- },
- user_id: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "User Id",
- },
- name: {
- type: "string",
- title: "Name",
- },
- status: {
- type: "string",
- title: "Status",
- },
- locked: {
- type: "boolean",
- title: "Locked",
- },
- duration: {
- type: "number",
- title: "Duration",
- },
- title: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Title",
- },
- short_summary: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Short Summary",
- },
- long_summary: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Long Summary",
- },
- created_at: {
- type: "string",
- format: "date-time",
- title: "Created At",
- },
- share_mode: {
- type: "string",
- title: "Share Mode",
- default: "private",
- },
- source_language: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Source Language",
- },
- target_language: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Target Language",
- },
- reviewed: {
- type: "boolean",
- title: "Reviewed",
- },
- meeting_id: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Meeting Id",
- },
- source_kind: {
- $ref: "#/components/schemas/SourceKind",
- },
- room_id: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Room Id",
- },
- room_name: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Room Name",
- },
- audio_deleted: {
- anyOf: [
- {
- type: "boolean",
- },
- {
- type: "null",
- },
- ],
- title: "Audio Deleted",
- },
- participants: {
- anyOf: [
- {
- items: {
- $ref: "#/components/schemas/TranscriptParticipant",
- },
- type: "array",
- },
- {
- type: "null",
- },
- ],
- title: "Participants",
- },
- },
- type: "object",
- required: [
- "id",
- "user_id",
- "name",
- "status",
- "locked",
- "duration",
- "title",
- "short_summary",
- "long_summary",
- "created_at",
- "source_language",
- "target_language",
- "reviewed",
- "meeting_id",
- "source_kind",
- "participants",
- ],
- title: "GetTranscript",
-} as const;
-
-export const $GetTranscriptMinimal = {
- properties: {
- id: {
- type: "string",
- title: "Id",
- },
- user_id: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "User Id",
- },
- name: {
- type: "string",
- title: "Name",
- },
- status: {
- type: "string",
- title: "Status",
- },
- locked: {
- type: "boolean",
- title: "Locked",
- },
- duration: {
- type: "number",
- title: "Duration",
- },
- title: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Title",
- },
- short_summary: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Short Summary",
- },
- long_summary: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Long Summary",
- },
- created_at: {
- type: "string",
- format: "date-time",
- title: "Created At",
- },
- share_mode: {
- type: "string",
- title: "Share Mode",
- default: "private",
- },
- source_language: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Source Language",
- },
- target_language: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Target Language",
- },
- reviewed: {
- type: "boolean",
- title: "Reviewed",
- },
- meeting_id: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Meeting Id",
- },
- source_kind: {
- $ref: "#/components/schemas/SourceKind",
- },
- room_id: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Room Id",
- },
- room_name: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Room Name",
- },
- audio_deleted: {
- anyOf: [
- {
- type: "boolean",
- },
- {
- type: "null",
- },
- ],
- title: "Audio Deleted",
- },
- },
- type: "object",
- required: [
- "id",
- "user_id",
- "name",
- "status",
- "locked",
- "duration",
- "title",
- "short_summary",
- "long_summary",
- "created_at",
- "source_language",
- "target_language",
- "reviewed",
- "meeting_id",
- "source_kind",
- ],
- title: "GetTranscriptMinimal",
-} as const;
-
-export const $GetTranscriptSegmentTopic = {
- properties: {
- text: {
- type: "string",
- title: "Text",
- },
- start: {
- type: "number",
- title: "Start",
- },
- speaker: {
- type: "integer",
- title: "Speaker",
- },
- },
- type: "object",
- required: ["text", "start", "speaker"],
- title: "GetTranscriptSegmentTopic",
-} as const;
-
-export const $GetTranscriptTopic = {
- properties: {
- id: {
- type: "string",
- title: "Id",
- },
- title: {
- type: "string",
- title: "Title",
- },
- summary: {
- type: "string",
- title: "Summary",
- },
- timestamp: {
- type: "number",
- title: "Timestamp",
- },
- duration: {
- anyOf: [
- {
- type: "number",
- },
- {
- type: "null",
- },
- ],
- title: "Duration",
- },
- transcript: {
- type: "string",
- title: "Transcript",
- },
- segments: {
- items: {
- $ref: "#/components/schemas/GetTranscriptSegmentTopic",
- },
- type: "array",
- title: "Segments",
- default: [],
- },
- },
- type: "object",
- required: ["id", "title", "summary", "timestamp", "duration", "transcript"],
- title: "GetTranscriptTopic",
-} as const;
-
-export const $GetTranscriptTopicWithWords = {
- properties: {
- id: {
- type: "string",
- title: "Id",
- },
- title: {
- type: "string",
- title: "Title",
- },
- summary: {
- type: "string",
- title: "Summary",
- },
- timestamp: {
- type: "number",
- title: "Timestamp",
- },
- duration: {
- anyOf: [
- {
- type: "number",
- },
- {
- type: "null",
- },
- ],
- title: "Duration",
- },
- transcript: {
- type: "string",
- title: "Transcript",
- },
- segments: {
- items: {
- $ref: "#/components/schemas/GetTranscriptSegmentTopic",
- },
- type: "array",
- title: "Segments",
- default: [],
- },
- words: {
- items: {
- $ref: "#/components/schemas/Word",
- },
- type: "array",
- title: "Words",
- default: [],
- },
- },
- type: "object",
- required: ["id", "title", "summary", "timestamp", "duration", "transcript"],
- title: "GetTranscriptTopicWithWords",
-} as const;
-
-export const $GetTranscriptTopicWithWordsPerSpeaker = {
- properties: {
- id: {
- type: "string",
- title: "Id",
- },
- title: {
- type: "string",
- title: "Title",
- },
- summary: {
- type: "string",
- title: "Summary",
- },
- timestamp: {
- type: "number",
- title: "Timestamp",
- },
- duration: {
- anyOf: [
- {
- type: "number",
- },
- {
- type: "null",
- },
- ],
- title: "Duration",
- },
- transcript: {
- type: "string",
- title: "Transcript",
- },
- segments: {
- items: {
- $ref: "#/components/schemas/GetTranscriptSegmentTopic",
- },
- type: "array",
- title: "Segments",
- default: [],
- },
- words_per_speaker: {
- items: {
- $ref: "#/components/schemas/SpeakerWords",
- },
- type: "array",
- title: "Words Per Speaker",
- default: [],
- },
- },
- type: "object",
- required: ["id", "title", "summary", "timestamp", "duration", "transcript"],
- title: "GetTranscriptTopicWithWordsPerSpeaker",
-} as const;
-
-export const $HTTPValidationError = {
- properties: {
- detail: {
- items: {
- $ref: "#/components/schemas/ValidationError",
- },
- type: "array",
- title: "Detail",
- },
- },
- type: "object",
- title: "HTTPValidationError",
-} as const;
-
-export const $Meeting = {
- properties: {
- id: {
- type: "string",
- title: "Id",
- },
- room_name: {
- type: "string",
- title: "Room Name",
- },
- room_url: {
- type: "string",
- title: "Room Url",
- },
- host_room_url: {
- type: "string",
- title: "Host Room Url",
- },
- start_date: {
- type: "string",
- format: "date-time",
- title: "Start Date",
- },
- end_date: {
- type: "string",
- format: "date-time",
- title: "End Date",
- },
- recording_type: {
- type: "string",
- enum: ["none", "local", "cloud"],
- title: "Recording Type",
- default: "cloud",
- },
- },
- type: "object",
- required: [
- "id",
- "room_name",
- "room_url",
- "host_room_url",
- "start_date",
- "end_date",
- ],
- title: "Meeting",
-} as const;
-
-export const $MeetingConsentRequest = {
- properties: {
- consent_given: {
- type: "boolean",
- title: "Consent Given",
- },
- },
- type: "object",
- required: ["consent_given"],
- title: "MeetingConsentRequest",
-} as const;
-
-export const $Page_GetTranscriptMinimal_ = {
- properties: {
- items: {
- items: {
- $ref: "#/components/schemas/GetTranscriptMinimal",
- },
- type: "array",
- title: "Items",
- },
- total: {
- type: "integer",
- minimum: 0,
- title: "Total",
- },
- page: {
- anyOf: [
- {
- type: "integer",
- minimum: 1,
- },
- {
- type: "null",
- },
- ],
- title: "Page",
- },
- size: {
- anyOf: [
- {
- type: "integer",
- minimum: 1,
- },
- {
- type: "null",
- },
- ],
- title: "Size",
- },
- pages: {
- anyOf: [
- {
- type: "integer",
- minimum: 0,
- },
- {
- type: "null",
- },
- ],
- title: "Pages",
- },
- },
- type: "object",
- required: ["items", "total", "page", "size"],
- title: "Page[GetTranscriptMinimal]",
-} as const;
-
-export const $Page_Room_ = {
- properties: {
- items: {
- items: {
- $ref: "#/components/schemas/Room",
- },
- type: "array",
- title: "Items",
- },
- total: {
- type: "integer",
- minimum: 0,
- title: "Total",
- },
- page: {
- anyOf: [
- {
- type: "integer",
- minimum: 1,
- },
- {
- type: "null",
- },
- ],
- title: "Page",
- },
- size: {
- anyOf: [
- {
- type: "integer",
- minimum: 1,
- },
- {
- type: "null",
- },
- ],
- title: "Size",
- },
- pages: {
- anyOf: [
- {
- type: "integer",
- minimum: 0,
- },
- {
- type: "null",
- },
- ],
- title: "Pages",
- },
- },
- type: "object",
- required: ["items", "total", "page", "size"],
- title: "Page[Room]",
-} as const;
-
-export const $Participant = {
- properties: {
- id: {
- type: "string",
- title: "Id",
- },
- speaker: {
- anyOf: [
- {
- type: "integer",
- },
- {
- type: "null",
- },
- ],
- title: "Speaker",
- },
- name: {
- type: "string",
- title: "Name",
- },
- },
- type: "object",
- required: ["id", "speaker", "name"],
- title: "Participant",
-} as const;
-
-export const $Room = {
- properties: {
- id: {
- type: "string",
- title: "Id",
- },
- name: {
- type: "string",
- title: "Name",
- },
- user_id: {
- type: "string",
- title: "User Id",
- },
- created_at: {
- type: "string",
- format: "date-time",
- title: "Created At",
- },
- zulip_auto_post: {
- type: "boolean",
- title: "Zulip Auto Post",
- },
- zulip_stream: {
- type: "string",
- title: "Zulip Stream",
- },
- zulip_topic: {
- type: "string",
- title: "Zulip Topic",
- },
- is_locked: {
- type: "boolean",
- title: "Is Locked",
- },
- room_mode: {
- type: "string",
- title: "Room Mode",
- },
- recording_type: {
- type: "string",
- title: "Recording Type",
- },
- recording_trigger: {
- type: "string",
- title: "Recording Trigger",
- },
- is_shared: {
- type: "boolean",
- title: "Is Shared",
- },
- },
- type: "object",
- required: [
- "id",
- "name",
- "user_id",
- "created_at",
- "zulip_auto_post",
- "zulip_stream",
- "zulip_topic",
- "is_locked",
- "room_mode",
- "recording_type",
- "recording_trigger",
- "is_shared",
- ],
- title: "Room",
-} as const;
-
-export const $RtcOffer = {
- properties: {
- sdp: {
- type: "string",
- title: "Sdp",
- },
- type: {
- type: "string",
- title: "Type",
- },
- },
- type: "object",
- required: ["sdp", "type"],
- title: "RtcOffer",
-} as const;
-
-export const $SourceKind = {
- type: "string",
- enum: ["room", "live", "file"],
- title: "SourceKind",
-} as const;
-
-export const $SpeakerAssignment = {
- properties: {
- speaker: {
- anyOf: [
- {
- type: "integer",
- minimum: 0,
- },
- {
- type: "null",
- },
- ],
- title: "Speaker",
- },
- participant: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Participant",
- },
- timestamp_from: {
- type: "number",
- title: "Timestamp From",
- },
- timestamp_to: {
- type: "number",
- title: "Timestamp To",
- },
- },
- type: "object",
- required: ["timestamp_from", "timestamp_to"],
- title: "SpeakerAssignment",
-} as const;
-
-export const $SpeakerAssignmentStatus = {
- properties: {
- status: {
- type: "string",
- title: "Status",
- },
- },
- type: "object",
- required: ["status"],
- title: "SpeakerAssignmentStatus",
-} as const;
-
-export const $SpeakerMerge = {
- properties: {
- speaker_from: {
- type: "integer",
- title: "Speaker From",
- },
- speaker_to: {
- type: "integer",
- title: "Speaker To",
- },
- },
- type: "object",
- required: ["speaker_from", "speaker_to"],
- title: "SpeakerMerge",
-} as const;
-
-export const $SpeakerWords = {
- properties: {
- speaker: {
- type: "integer",
- title: "Speaker",
- },
- words: {
- items: {
- $ref: "#/components/schemas/Word",
- },
- type: "array",
- title: "Words",
- },
- },
- type: "object",
- required: ["speaker", "words"],
- title: "SpeakerWords",
-} as const;
-
-export const $Stream = {
- properties: {
- stream_id: {
- type: "integer",
- title: "Stream Id",
- },
- name: {
- type: "string",
- title: "Name",
- },
- },
- type: "object",
- required: ["stream_id", "name"],
- title: "Stream",
-} as const;
-
-export const $Topic = {
- properties: {
- name: {
- type: "string",
- title: "Name",
- },
- },
- type: "object",
- required: ["name"],
- title: "Topic",
-} as const;
-
-export const $TranscriptParticipant = {
- properties: {
- id: {
- type: "string",
- title: "Id",
- },
- speaker: {
- anyOf: [
- {
- type: "integer",
- },
- {
- type: "null",
- },
- ],
- title: "Speaker",
- },
- name: {
- type: "string",
- title: "Name",
- },
- },
- type: "object",
- required: ["speaker", "name"],
- title: "TranscriptParticipant",
-} as const;
-
-export const $UpdateParticipant = {
- properties: {
- speaker: {
- anyOf: [
- {
- type: "integer",
- },
- {
- type: "null",
- },
- ],
- title: "Speaker",
- },
- name: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Name",
- },
- },
- type: "object",
- title: "UpdateParticipant",
-} as const;
-
-export const $UpdateRoom = {
- properties: {
- name: {
- type: "string",
- title: "Name",
- },
- zulip_auto_post: {
- type: "boolean",
- title: "Zulip Auto Post",
- },
- zulip_stream: {
- type: "string",
- title: "Zulip Stream",
- },
- zulip_topic: {
- type: "string",
- title: "Zulip Topic",
- },
- is_locked: {
- type: "boolean",
- title: "Is Locked",
- },
- room_mode: {
- type: "string",
- title: "Room Mode",
- },
- recording_type: {
- type: "string",
- title: "Recording Type",
- },
- recording_trigger: {
- type: "string",
- title: "Recording Trigger",
- },
- is_shared: {
- type: "boolean",
- title: "Is Shared",
- },
- },
- type: "object",
- required: [
- "name",
- "zulip_auto_post",
- "zulip_stream",
- "zulip_topic",
- "is_locked",
- "room_mode",
- "recording_type",
- "recording_trigger",
- "is_shared",
- ],
- title: "UpdateRoom",
-} as const;
-
-export const $UpdateTranscript = {
- properties: {
- name: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Name",
- },
- locked: {
- anyOf: [
- {
- type: "boolean",
- },
- {
- type: "null",
- },
- ],
- title: "Locked",
- },
- title: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Title",
- },
- short_summary: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Short Summary",
- },
- long_summary: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Long Summary",
- },
- share_mode: {
- anyOf: [
- {
- type: "string",
- enum: ["public", "semi-private", "private"],
- },
- {
- type: "null",
- },
- ],
- title: "Share Mode",
- },
- participants: {
- anyOf: [
- {
- items: {
- $ref: "#/components/schemas/TranscriptParticipant",
- },
- type: "array",
- },
- {
- type: "null",
- },
- ],
- title: "Participants",
- },
- reviewed: {
- anyOf: [
- {
- type: "boolean",
- },
- {
- type: "null",
- },
- ],
- title: "Reviewed",
- },
- audio_deleted: {
- anyOf: [
- {
- type: "boolean",
- },
- {
- type: "null",
- },
- ],
- title: "Audio Deleted",
- },
- },
- type: "object",
- title: "UpdateTranscript",
-} as const;
-
-export const $UserInfo = {
- properties: {
- sub: {
- type: "string",
- title: "Sub",
- },
- email: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "null",
- },
- ],
- title: "Email",
- },
- email_verified: {
- anyOf: [
- {
- type: "boolean",
- },
- {
- type: "null",
- },
- ],
- title: "Email Verified",
- },
- },
- type: "object",
- required: ["sub", "email", "email_verified"],
- title: "UserInfo",
-} as const;
-
-export const $ValidationError = {
- properties: {
- loc: {
- items: {
- anyOf: [
- {
- type: "string",
- },
- {
- type: "integer",
- },
- ],
- },
- type: "array",
- title: "Location",
- },
- msg: {
- type: "string",
- title: "Message",
- },
- type: {
- type: "string",
- title: "Error Type",
- },
- },
- type: "object",
- required: ["loc", "msg", "type"],
- title: "ValidationError",
-} as const;
-
-export const $WherebyWebhookEvent = {
- properties: {
- apiVersion: {
- type: "string",
- title: "Apiversion",
- },
- id: {
- type: "string",
- title: "Id",
- },
- createdAt: {
- type: "string",
- format: "date-time",
- title: "Createdat",
- },
- type: {
- type: "string",
- title: "Type",
- },
- data: {
- type: "object",
- title: "Data",
- },
- },
- type: "object",
- required: ["apiVersion", "id", "createdAt", "type", "data"],
- title: "WherebyWebhookEvent",
-} as const;
-
-export const $Word = {
- properties: {
- text: {
- type: "string",
- title: "Text",
- },
- start: {
- type: "number",
- title: "Start",
- },
- end: {
- type: "number",
- title: "End",
- },
- speaker: {
- type: "integer",
- title: "Speaker",
- default: 0,
- },
- },
- type: "object",
- required: ["text", "start", "end"],
- title: "Word",
-} as const;
diff --git a/www/app/api/sdk.gen.ts b/www/app/api/sdk.gen.ts
new file mode 100644
index 00000000..40e9c140
--- /dev/null
+++ b/www/app/api/sdk.gen.ts
@@ -0,0 +1,927 @@
+// This file is auto-generated by @hey-api/openapi-ts
+
+import {
+ type Options as ClientOptions,
+ type TDataShape,
+ type Client,
+ formDataBodySerializer,
+} from "./client";
+import type {
+ MetricsData,
+ MetricsResponses,
+ V1MeetingAudioConsentData,
+ V1MeetingAudioConsentResponses,
+ V1MeetingAudioConsentErrors,
+ V1RoomsListData,
+ V1RoomsListResponses,
+ V1RoomsListErrors,
+ V1RoomsCreateData,
+ V1RoomsCreateResponses,
+ V1RoomsCreateErrors,
+ V1RoomsDeleteData,
+ V1RoomsDeleteResponses,
+ V1RoomsDeleteErrors,
+ V1RoomsUpdateData,
+ V1RoomsUpdateResponses,
+ V1RoomsUpdateErrors,
+ V1RoomsCreateMeetingData,
+ V1RoomsCreateMeetingResponses,
+ V1RoomsCreateMeetingErrors,
+ V1TranscriptsListData,
+ V1TranscriptsListResponses,
+ V1TranscriptsListErrors,
+ V1TranscriptsCreateData,
+ V1TranscriptsCreateResponses,
+ V1TranscriptsCreateErrors,
+ V1TranscriptDeleteData,
+ V1TranscriptDeleteResponses,
+ V1TranscriptDeleteErrors,
+ V1TranscriptGetData,
+ V1TranscriptGetResponses,
+ V1TranscriptGetErrors,
+ V1TranscriptUpdateData,
+ V1TranscriptUpdateResponses,
+ V1TranscriptUpdateErrors,
+ V1TranscriptGetTopicsData,
+ V1TranscriptGetTopicsResponses,
+ V1TranscriptGetTopicsErrors,
+ V1TranscriptGetTopicsWithWordsData,
+ V1TranscriptGetTopicsWithWordsResponses,
+ V1TranscriptGetTopicsWithWordsErrors,
+ V1TranscriptGetTopicsWithWordsPerSpeakerData,
+ V1TranscriptGetTopicsWithWordsPerSpeakerResponses,
+ V1TranscriptGetTopicsWithWordsPerSpeakerErrors,
+ V1TranscriptPostToZulipData,
+ V1TranscriptPostToZulipResponses,
+ V1TranscriptPostToZulipErrors,
+ V1TranscriptGetAudioMp3Data,
+ V1TranscriptGetAudioMp3Responses,
+ V1TranscriptGetAudioMp3Errors,
+ V1TranscriptHeadAudioMp3Data,
+ V1TranscriptHeadAudioMp3Responses,
+ V1TranscriptHeadAudioMp3Errors,
+ V1TranscriptGetAudioWaveformData,
+ V1TranscriptGetAudioWaveformResponses,
+ V1TranscriptGetAudioWaveformErrors,
+ V1TranscriptGetParticipantsData,
+ V1TranscriptGetParticipantsResponses,
+ V1TranscriptGetParticipantsErrors,
+ V1TranscriptAddParticipantData,
+ V1TranscriptAddParticipantResponses,
+ V1TranscriptAddParticipantErrors,
+ V1TranscriptDeleteParticipantData,
+ V1TranscriptDeleteParticipantResponses,
+ V1TranscriptDeleteParticipantErrors,
+ V1TranscriptGetParticipantData,
+ V1TranscriptGetParticipantResponses,
+ V1TranscriptGetParticipantErrors,
+ V1TranscriptUpdateParticipantData,
+ V1TranscriptUpdateParticipantResponses,
+ V1TranscriptUpdateParticipantErrors,
+ V1TranscriptAssignSpeakerData,
+ V1TranscriptAssignSpeakerResponses,
+ V1TranscriptAssignSpeakerErrors,
+ V1TranscriptMergeSpeakerData,
+ V1TranscriptMergeSpeakerResponses,
+ V1TranscriptMergeSpeakerErrors,
+ V1TranscriptRecordUploadData,
+ V1TranscriptRecordUploadResponses,
+ V1TranscriptRecordUploadErrors,
+ V1TranscriptGetWebsocketEventsData,
+ V1TranscriptGetWebsocketEventsResponses,
+ V1TranscriptGetWebsocketEventsErrors,
+ V1TranscriptRecordWebrtcData,
+ V1TranscriptRecordWebrtcResponses,
+ V1TranscriptRecordWebrtcErrors,
+ V1TranscriptProcessData,
+ V1TranscriptProcessResponses,
+ V1TranscriptProcessErrors,
+ V1UserMeData,
+ V1UserMeResponses,
+ V1ZulipGetStreamsData,
+ V1ZulipGetStreamsResponses,
+ V1ZulipGetTopicsData,
+ V1ZulipGetTopicsResponses,
+ V1ZulipGetTopicsErrors,
+ V1WherebyWebhookData,
+ V1WherebyWebhookResponses,
+ V1WherebyWebhookErrors,
+} from "./types.gen";
+import { client as _heyApiClient } from "./client.gen";
+
+export type Options<
+ TData extends TDataShape = TDataShape,
+ ThrowOnError extends boolean = boolean,
+> = ClientOptions & {
+ /**
+ * You can provide a client instance returned by `createClient()` instead of
+ * individual options. This might be also useful if you want to implement a
+ * custom client.
+ */
+ client?: Client;
+ /**
+ * You can pass arbitrary values through the `meta` object. This can be
+ * used to access values that aren't defined as part of the SDK function.
+ */
+ meta?: Record;
+};
+
+/**
+ * Metrics
+ * Endpoint that serves Prometheus metrics.
+ */
+export const metrics = (
+ options?: Options,
+) => {
+ return (options?.client ?? _heyApiClient).get<
+ MetricsResponses,
+ unknown,
+ ThrowOnError
+ >({
+ url: "/metrics",
+ ...options,
+ });
+};
+
+/**
+ * Meeting Audio Consent
+ */
+export const v1MeetingAudioConsent = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).post<
+ V1MeetingAudioConsentResponses,
+ V1MeetingAudioConsentErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/meetings/{meeting_id}/consent",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Rooms List
+ */
+export const v1RoomsList = (
+ options?: Options,
+) => {
+ return (options?.client ?? _heyApiClient).get<
+ V1RoomsListResponses,
+ V1RoomsListErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/rooms",
+ ...options,
+ });
+};
+
+/**
+ * Rooms Create
+ */
+export const v1RoomsCreate = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).post<
+ V1RoomsCreateResponses,
+ V1RoomsCreateErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/rooms",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Rooms Delete
+ */
+export const v1RoomsDelete = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).delete<
+ V1RoomsDeleteResponses,
+ V1RoomsDeleteErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/rooms/{room_id}",
+ ...options,
+ });
+};
+
+/**
+ * Rooms Update
+ */
+export const v1RoomsUpdate = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).patch<
+ V1RoomsUpdateResponses,
+ V1RoomsUpdateErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/rooms/{room_id}",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Rooms Create Meeting
+ */
+export const v1RoomsCreateMeeting = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).post<
+ V1RoomsCreateMeetingResponses,
+ V1RoomsCreateMeetingErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/rooms/{room_name}/meeting",
+ ...options,
+ });
+};
+
+/**
+ * Transcripts List
+ */
+export const v1TranscriptsList = (
+ options?: Options,
+) => {
+ return (options?.client ?? _heyApiClient).get<
+ V1TranscriptsListResponses,
+ V1TranscriptsListErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts",
+ ...options,
+ });
+};
+
+/**
+ * Transcripts Create
+ */
+export const v1TranscriptsCreate = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).post<
+ V1TranscriptsCreateResponses,
+ V1TranscriptsCreateErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Transcript Delete
+ */
+export const v1TranscriptDelete = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).delete<
+ V1TranscriptDeleteResponses,
+ V1TranscriptDeleteErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Get
+ */
+export const v1TranscriptGet = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).get<
+ V1TranscriptGetResponses,
+ V1TranscriptGetErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Update
+ */
+export const v1TranscriptUpdate = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).patch<
+ V1TranscriptUpdateResponses,
+ V1TranscriptUpdateErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Transcript Get Topics
+ */
+export const v1TranscriptGetTopics = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).get<
+ V1TranscriptGetTopicsResponses,
+ V1TranscriptGetTopicsErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/topics",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Get Topics With Words
+ */
+export const v1TranscriptGetTopicsWithWords = <
+ ThrowOnError extends boolean = false,
+>(
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).get<
+ V1TranscriptGetTopicsWithWordsResponses,
+ V1TranscriptGetTopicsWithWordsErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/topics/with-words",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Get Topics With Words Per Speaker
+ */
+export const v1TranscriptGetTopicsWithWordsPerSpeaker = <
+ ThrowOnError extends boolean = false,
+>(
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).get<
+ V1TranscriptGetTopicsWithWordsPerSpeakerResponses,
+ V1TranscriptGetTopicsWithWordsPerSpeakerErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/topics/{topic_id}/words-per-speaker",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Post To Zulip
+ */
+export const v1TranscriptPostToZulip = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).post<
+ V1TranscriptPostToZulipResponses,
+ V1TranscriptPostToZulipErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/zulip",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Get Audio Mp3
+ */
+export const v1TranscriptGetAudioMp3 = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).get<
+ V1TranscriptGetAudioMp3Responses,
+ V1TranscriptGetAudioMp3Errors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/audio/mp3",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Get Audio Mp3
+ */
+export const v1TranscriptHeadAudioMp3 = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).head<
+ V1TranscriptHeadAudioMp3Responses,
+ V1TranscriptHeadAudioMp3Errors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/audio/mp3",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Get Audio Waveform
+ */
+export const v1TranscriptGetAudioWaveform = <
+ ThrowOnError extends boolean = false,
+>(
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).get<
+ V1TranscriptGetAudioWaveformResponses,
+ V1TranscriptGetAudioWaveformErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/audio/waveform",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Get Participants
+ */
+export const v1TranscriptGetParticipants = <
+ ThrowOnError extends boolean = false,
+>(
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).get<
+ V1TranscriptGetParticipantsResponses,
+ V1TranscriptGetParticipantsErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/participants",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Add Participant
+ */
+export const v1TranscriptAddParticipant = <
+ ThrowOnError extends boolean = false,
+>(
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).post<
+ V1TranscriptAddParticipantResponses,
+ V1TranscriptAddParticipantErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/participants",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Transcript Delete Participant
+ */
+export const v1TranscriptDeleteParticipant = <
+ ThrowOnError extends boolean = false,
+>(
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).delete<
+ V1TranscriptDeleteParticipantResponses,
+ V1TranscriptDeleteParticipantErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/participants/{participant_id}",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Get Participant
+ */
+export const v1TranscriptGetParticipant = <
+ ThrowOnError extends boolean = false,
+>(
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).get<
+ V1TranscriptGetParticipantResponses,
+ V1TranscriptGetParticipantErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/participants/{participant_id}",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Update Participant
+ */
+export const v1TranscriptUpdateParticipant = <
+ ThrowOnError extends boolean = false,
+>(
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).patch<
+ V1TranscriptUpdateParticipantResponses,
+ V1TranscriptUpdateParticipantErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/participants/{participant_id}",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Transcript Assign Speaker
+ */
+export const v1TranscriptAssignSpeaker = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).patch<
+ V1TranscriptAssignSpeakerResponses,
+ V1TranscriptAssignSpeakerErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/speaker/assign",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Transcript Merge Speaker
+ */
+export const v1TranscriptMergeSpeaker = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).patch<
+ V1TranscriptMergeSpeakerResponses,
+ V1TranscriptMergeSpeakerErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/speaker/merge",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Transcript Record Upload
+ */
+export const v1TranscriptRecordUpload = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).post<
+ V1TranscriptRecordUploadResponses,
+ V1TranscriptRecordUploadErrors,
+ ThrowOnError
+ >({
+ ...formDataBodySerializer,
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/record/upload",
+ ...options,
+ headers: {
+ "Content-Type": null,
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Transcript Get Websocket Events
+ */
+export const v1TranscriptGetWebsocketEvents = <
+ ThrowOnError extends boolean = false,
+>(
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).get<
+ V1TranscriptGetWebsocketEventsResponses,
+ V1TranscriptGetWebsocketEventsErrors,
+ ThrowOnError
+ >({
+ url: "/v1/transcripts/{transcript_id}/events",
+ ...options,
+ });
+};
+
+/**
+ * Transcript Record Webrtc
+ */
+export const v1TranscriptRecordWebrtc = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).post<
+ V1TranscriptRecordWebrtcResponses,
+ V1TranscriptRecordWebrtcErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/record/webrtc",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
+
+/**
+ * Transcript Process
+ */
+export const v1TranscriptProcess = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).post<
+ V1TranscriptProcessResponses,
+ V1TranscriptProcessErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/transcripts/{transcript_id}/process",
+ ...options,
+ });
+};
+
+/**
+ * User Me
+ */
+export const v1UserMe = (
+ options?: Options,
+) => {
+ return (options?.client ?? _heyApiClient).get<
+ V1UserMeResponses,
+ unknown,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/me",
+ ...options,
+ });
+};
+
+/**
+ * Zulip Get Streams
+ * Get all Zulip streams.
+ */
+export const v1ZulipGetStreams = (
+ options?: Options,
+) => {
+ return (options?.client ?? _heyApiClient).get<
+ V1ZulipGetStreamsResponses,
+ unknown,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/zulip/streams",
+ ...options,
+ });
+};
+
+/**
+ * Zulip Get Topics
+ * Get all topics for a specific Zulip stream.
+ */
+export const v1ZulipGetTopics = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).get<
+ V1ZulipGetTopicsResponses,
+ V1ZulipGetTopicsErrors,
+ ThrowOnError
+ >({
+ security: [
+ {
+ scheme: "bearer",
+ type: "http",
+ },
+ ],
+ url: "/v1/zulip/streams/{stream_id}/topics",
+ ...options,
+ });
+};
+
+/**
+ * Whereby Webhook
+ */
+export const v1WherebyWebhook = (
+ options: Options,
+) => {
+ return (options.client ?? _heyApiClient).post<
+ V1WherebyWebhookResponses,
+ V1WherebyWebhookErrors,
+ ThrowOnError
+ >({
+ url: "/v1/whereby",
+ ...options,
+ headers: {
+ "Content-Type": "application/json",
+ ...options.headers,
+ },
+ });
+};
diff --git a/www/app/api/services.gen.ts b/www/app/api/services.gen.ts
deleted file mode 100644
index 68d606c1..00000000
--- a/www/app/api/services.gen.ts
+++ /dev/null
@@ -1,860 +0,0 @@
-// This file is auto-generated by @hey-api/openapi-ts
-
-import type { CancelablePromise } from "./core/CancelablePromise";
-import type { BaseHttpRequest } from "./core/BaseHttpRequest";
-import type {
- MetricsResponse,
- V1MeetingAudioConsentData,
- V1MeetingAudioConsentResponse,
- V1RoomsListData,
- V1RoomsListResponse,
- V1RoomsCreateData,
- V1RoomsCreateResponse,
- V1RoomsUpdateData,
- V1RoomsUpdateResponse,
- V1RoomsDeleteData,
- V1RoomsDeleteResponse,
- V1RoomsCreateMeetingData,
- V1RoomsCreateMeetingResponse,
- V1TranscriptsListData,
- V1TranscriptsListResponse,
- V1TranscriptsCreateData,
- V1TranscriptsCreateResponse,
- V1TranscriptGetData,
- V1TranscriptGetResponse,
- V1TranscriptUpdateData,
- V1TranscriptUpdateResponse,
- V1TranscriptDeleteData,
- V1TranscriptDeleteResponse,
- V1TranscriptGetTopicsData,
- V1TranscriptGetTopicsResponse,
- V1TranscriptGetTopicsWithWordsData,
- V1TranscriptGetTopicsWithWordsResponse,
- V1TranscriptGetTopicsWithWordsPerSpeakerData,
- V1TranscriptGetTopicsWithWordsPerSpeakerResponse,
- V1TranscriptPostToZulipData,
- V1TranscriptPostToZulipResponse,
- V1TranscriptHeadAudioMp3Data,
- V1TranscriptHeadAudioMp3Response,
- V1TranscriptGetAudioMp3Data,
- V1TranscriptGetAudioMp3Response,
- V1TranscriptGetAudioWaveformData,
- V1TranscriptGetAudioWaveformResponse,
- V1TranscriptGetParticipantsData,
- V1TranscriptGetParticipantsResponse,
- V1TranscriptAddParticipantData,
- V1TranscriptAddParticipantResponse,
- V1TranscriptGetParticipantData,
- V1TranscriptGetParticipantResponse,
- V1TranscriptUpdateParticipantData,
- V1TranscriptUpdateParticipantResponse,
- V1TranscriptDeleteParticipantData,
- V1TranscriptDeleteParticipantResponse,
- V1TranscriptAssignSpeakerData,
- V1TranscriptAssignSpeakerResponse,
- V1TranscriptMergeSpeakerData,
- V1TranscriptMergeSpeakerResponse,
- V1TranscriptRecordUploadData,
- V1TranscriptRecordUploadResponse,
- V1TranscriptGetWebsocketEventsData,
- V1TranscriptGetWebsocketEventsResponse,
- V1TranscriptRecordWebrtcData,
- V1TranscriptRecordWebrtcResponse,
- V1TranscriptProcessData,
- V1TranscriptProcessResponse,
- V1UserMeResponse,
- V1ZulipGetStreamsResponse,
- V1ZulipGetTopicsData,
- V1ZulipGetTopicsResponse,
- V1WherebyWebhookData,
- V1WherebyWebhookResponse,
-} from "./types.gen";
-
-export class DefaultService {
- constructor(public readonly httpRequest: BaseHttpRequest) {}
-
- /**
- * Metrics
- * Endpoint that serves Prometheus metrics.
- * @returns unknown Successful Response
- * @throws ApiError
- */
- public metrics(): CancelablePromise {
- return this.httpRequest.request({
- method: "GET",
- url: "/metrics",
- });
- }
-
- /**
- * Meeting Audio Consent
- * @param data The data for the request.
- * @param data.meetingId
- * @param data.requestBody
- * @returns unknown Successful Response
- * @throws ApiError
- */
- public v1MeetingAudioConsent(
- data: V1MeetingAudioConsentData,
- ): CancelablePromise {
- return this.httpRequest.request({
- method: "POST",
- url: "/v1/meetings/{meeting_id}/consent",
- path: {
- meeting_id: data.meetingId,
- },
- body: data.requestBody,
- mediaType: "application/json",
- errors: {
- 422: "Validation Error",
- },
- });
- }
-
- /**
- * Rooms List
- * @param data The data for the request.
- * @param data.page Page number
- * @param data.size Page size
- * @returns Page_Room_ Successful Response
- * @throws ApiError
- */
- public v1RoomsList(
- data: V1RoomsListData = {},
- ): CancelablePromise {
- return this.httpRequest.request({
- method: "GET",
- url: "/v1/rooms",
- query: {
- page: data.page,
- size: data.size,
- },
- errors: {
- 422: "Validation Error",
- },
- });
- }
-
- /**
- * Rooms Create
- * @param data The data for the request.
- * @param data.requestBody
- * @returns Room Successful Response
- * @throws ApiError
- */
- public v1RoomsCreate(
- data: V1RoomsCreateData,
- ): CancelablePromise {
- return this.httpRequest.request({
- method: "POST",
- url: "/v1/rooms",
- body: data.requestBody,
- mediaType: "application/json",
- errors: {
- 422: "Validation Error",
- },
- });
- }
-
- /**
- * Rooms Update
- * @param data The data for the request.
- * @param data.roomId
- * @param data.requestBody
- * @returns Room Successful Response
- * @throws ApiError
- */
- public v1RoomsUpdate(
- data: V1RoomsUpdateData,
- ): CancelablePromise