Bot & Automation

AI Creator Studio Telegram

/root/hermes-projects/AI Creator Studio Telegram

apps/api/src/server.ts text
import cors from "@fastify/cors";
import helmet from "@fastify/helmet";
import Fastify from "fastify";
import {
  GENERATION_MODES,
  buildResourceEstimate,
  generationEstimateSchema,
  logger,
  providerStatusSnapshot,
  type GenerationEstimateInput,
  usageSnapshot,
} from "@ai-creator/core";
import { enhancePrompt } from "@ai-creator/prompts";

const port = Number(process.env.PORT ?? 8080);
const host = process.env.HOST ?? "0.0.0.0";

const app = Fastify({
  logger: false,
  genReqId: () => crypto.randomUUID(),
});

await app.register(helmet);
await app.register(cors, {
  origin: process.env.APP_BASE_URL ? [process.env.APP_BASE_URL] : true,
});

app.get("/health", async () => ({
  status: "ok",
  service: "ai-creator-studio-telegram-api",
  timestamp: new Date().toISOString(),
}));

app.get("/generation/modes", async () => ({
  modes: GENERATION_MODES,
}));

app.post("/generation/estimate", async (request, reply) => {
  const parsed = generationEstimateSchema.safeParse(request.body);

  if (!parsed.success) {
    return reply.status(400).send({
      error: {
        code: "VALIDATION_ERROR",
        message: "Request is not valid.",
        safeDetail: parsed.error.issues.map((issue) => issue.message).join(", "),
      },
    });
  }

  const enhancedPrompt = enhancePrompt({
    prompt: parsed.data.prompt,
    preset: parsed.data.preset,
    mode: parsed.data.mode,
  });
  const resourceEstimate = buildResourceEstimate(parsed.data as GenerationEstimateInput);

  return {
    estimateId: crypto.randomUUID(),
    enhancedPrompt,
    workflowPlan: {
      mode: parsed.data.mode,
      providerPreference: ["auto"],
      steps: ["prompt_enhancement", "provider_selection", "generation", "validation", "storage"],
    },
    resourceEstimate,
    confirmationRequired: true,
  };
});

app.get("/users/:id/usage", async () => usageSnapshot());

app.get("/users/:id/projects", async () => ({
  projects: [],
  emptyState: {
    title: "No projects yet",
    description: "Create your first image or video generation from Telegram.",
  },
}));

app.get("/providers/status", async () => ({
  providers: providerStatusSnapshot(),
}));

app.setErrorHandler((error: Error & { code?: string }, request, reply) => {
  logger.error("api_request_failed", {
    requestId: request.id,
    errorCode: error.code,
    message: error.message,
  });

  return reply.status(500).send({
    error: {
      code: "INTERNAL_ERROR",
      message: "Something went wrong.",
      safeDetail: "Please try again later or contact admin if the problem continues.",
    },
  });
});

try {
  await app.listen({ port, host });
  logger.info("api_started", { port, host });
} catch (error) {
  const message = error instanceof Error ? error.message : "Unknown startup error";
  logger.error("api_start_failed", { message });
  process.exit(1);
}