import { Injectable } from "@nestjs/common";
import axios, { AxiosInstance } from "axios";
// Hard-coded API key for prototype - replace with your actual Gamma API key
const GAMMA_API_KEY = process.env.GAMMA_API_KEY || "sk-gamma-your-api-key-here";
const BASE_URL = "https://public-api.gamma.app/v1.0";
export interface PaginatedResponse<T> {
data: T[];
hasMore: boolean;
nextCursor: string | null;
}
export interface Folder {
id: string;
name: string;
}
export interface Theme {
id: string;
name: string;
type: string;
colorKeywords?: string[];
toneKeywords?: string[];
}
export interface GenerationRequest {
inputText: string;
textMode: "generate" | "condense" | "preserve";
format?: "presentation" | "document" | "social" | "webpage";
numCards?: number;
themeId?: string;
folderIds?: string[];
exportAs?: "pptx" | "pdf";
[key: string]: any; // Allow additional options
}
export interface GenerationResponse {
generationId: string;
warnings?: string;
}
export interface GenerationStatus {
generationId: string;
status: "pending" | "completed" | "failed";
gammaUrl?: string;
exportUrl?: string;
credits?: {
deducted: number;
remaining: number;
};
error?: {
message: string;
statusCode: number;
};
}
@Injectable()
export class GammaApiService {
private client: AxiosInstance;
constructor() {
this.client = axios.create({
baseURL: BASE_URL,
headers: {
"X-API-KEY": GAMMA_API_KEY,
"Content-Type": "application/json",
},
});
}
async listFolders(params?: {
limit?: number;
after?: string;
query?: string;
}): Promise<PaginatedResponse<Folder>> {
const response = await this.client.get<PaginatedResponse<Folder>>(
"/folders",
{
params,
}
);
return response.data;
}
async listThemes(params?: {
limit?: number;
after?: string;
query?: string;
}): Promise<PaginatedResponse<Theme>> {
const response = await this.client.get<PaginatedResponse<Theme>>(
"/themes",
{
params,
}
);
return response.data;
}
async createGeneration(
request: GenerationRequest
): Promise<GenerationResponse> {
const response = await this.client.post<GenerationResponse>(
"/generations",
request
);
return response.data;
}
async getGenerationStatus(generationId: string): Promise<GenerationStatus> {
const response = await this.client.get<GenerationStatus>(
`/generations/${generationId}`
);
return response.data;
}
async pollGenerationUntilComplete(
generationId: string,
intervalMs: number = 5000
): Promise<GenerationStatus> {
while (true) {
const status = await this.getGenerationStatus(generationId);
if (status.status === "completed" || status.status === "failed") {
return status;
}
// Wait before polling again
await new Promise((resolve) => setTimeout(resolve, intervalMs));
}
}
}