SurfSense/surfsense_web/lib/apis/podcasts-api.service.ts

122 lines
3.7 KiB
TypeScript
Raw Normal View History

2025-11-19 08:19:43 +02:00
import z from "zod";
2025-11-18 11:32:29 +02:00
import {
2025-11-18 19:32:24 +02:00
type DeletePodcastRequest,
deletePodcastRequest,
deletePodcastResponse,
2025-11-18 11:35:06 +02:00
type GeneratePodcastRequest,
type GetPodcastByChatIdRequest,
2025-11-19 08:29:33 +02:00
type GetPodcastsRequest,
2025-11-18 11:35:06 +02:00
generatePodcastRequest,
2025-11-18 19:32:24 +02:00
getPodcastByChaIdResponse,
2025-11-18 11:35:06 +02:00
getPodcastByChatIdRequest,
2025-11-19 08:29:33 +02:00
getPodcastsRequest,
2025-11-18 19:32:24 +02:00
type LoadPodcastRequest,
loadPodcastRequest,
2025-11-19 08:19:43 +02:00
podcast,
2025-11-18 11:32:29 +02:00
} from "@/contracts/types/podcast.types";
import { ValidationError } from "../error";
2025-11-18 11:35:06 +02:00
import { baseApiService } from "./base-api.service";
2025-11-18 11:32:29 +02:00
class PodcastsApiService {
2025-11-19 08:29:33 +02:00
getPodcasts = async (request: GetPodcastsRequest) => {
// Validate the request
const parsedRequest = getPodcastsRequest.safeParse(request);
if (!parsedRequest.success) {
console.error("Invalid request:", parsedRequest.error);
// Format a user frendly error message
const errorMessage = parsedRequest.error.errors.map((err) => err.message).join(", ");
throw new ValidationError(`Invalid request: ${errorMessage}`);
}
// Transform queries params to be string values
const transformedQueryParams = parsedRequest.data.queryParams
? Object.fromEntries(
Object.entries(parsedRequest.data.queryParams).map(([k, v]) => [k, String(v)])
)
: undefined;
const queryParams = transformedQueryParams
? new URLSearchParams(transformedQueryParams).toString()
: undefined;
return baseApiService.get(`/api/v1/podcasts?${queryParams}`, z.array(podcast));
2025-11-19 08:19:43 +02:00
};
2025-11-18 11:35:06 +02:00
getPodcastByChatId = async (request: GetPodcastByChatIdRequest) => {
// Validate the request
const parsedRequest = getPodcastByChatIdRequest.safeParse(request);
if (!parsedRequest.success) {
console.error("Invalid request:", parsedRequest.error);
// Format a user frendly error message
const errorMessage = parsedRequest.error.errors.map((err) => err.message).join(", ");
throw new ValidationError(`Invalid request: ${errorMessage}`);
}
2025-11-18 18:35:48 +02:00
return baseApiService.get(
`/api/v1/podcasts/by-chat/${request.chat_id}`,
2025-11-18 19:32:24 +02:00
getPodcastByChaIdResponse
2025-11-18 18:35:48 +02:00
);
2025-11-18 11:35:06 +02:00
};
generatePodcast = async (request: GeneratePodcastRequest) => {
// Validate the request
const parsedRequest = generatePodcastRequest.safeParse(request);
if (!parsedRequest.success) {
console.error("Invalid request:", parsedRequest.error);
// Format a user frendly error message
const errorMessage = parsedRequest.error.errors.map((err) => err.message).join(", ");
throw new ValidationError(`Invalid request: ${errorMessage}`);
}
return baseApiService.post(`/api/v1/podcasts/generate`, undefined, {
2025-11-18 18:35:48 +02:00
body: parsedRequest.data,
2025-11-18 11:35:06 +02:00
});
};
loadPodcast = async ({
2025-11-18 19:32:24 +02:00
request,
2025-11-18 11:35:06 +02:00
controller,
}: {
2025-11-18 19:32:24 +02:00
request: LoadPodcastRequest;
2025-11-18 11:35:06 +02:00
controller?: AbortController;
}) => {
2025-11-18 19:32:24 +02:00
// Validate the request
const parsedRequest = loadPodcastRequest.safeParse(request);
if (!parsedRequest.success) {
console.error("Invalid request:", parsedRequest.error);
// Format a user frendly error message
const errorMessage = parsedRequest.error.errors.map((err) => err.message).join(", ");
throw new ValidationError(`Invalid request: ${errorMessage}`);
}
return await baseApiService.getBlob(`/api/v1/podcasts/${request.id}/stream`, {
2025-11-18 11:35:06 +02:00
signal: controller?.signal,
});
};
2025-11-18 19:32:24 +02:00
deletePodcast = async (request: DeletePodcastRequest) => {
// Validate the request
const parsedRequest = deletePodcastRequest.safeParse(request);
if (!parsedRequest.success) {
console.error("Invalid request:", parsedRequest.error);
// Format a user frendly error message
const errorMessage = parsedRequest.error.errors.map((err) => err.message).join(", ");
throw new ValidationError(`Invalid request: ${errorMessage}`);
}
return baseApiService.delete(`/api/v1/podcasts/${request.id}`, deletePodcastResponse);
};
2025-11-18 11:32:29 +02:00
}
export const podcastsApiService = new PodcastsApiService();