banatie-service/src/routes/textToImage.ts

131 lines
3.9 KiB
TypeScript

import { Response, Router } from "express";
import type { Router as RouterType } from "express";
import { ImageGenService } from "../services/ImageGenService";
import {
validateTextToImageRequest,
logTextToImageRequest,
} from "../middleware/jsonValidation";
import {
autoEnhancePrompt,
logEnhancementResult,
} from "../middleware/promptEnhancement";
import { asyncHandler } from "../middleware/errorHandler";
import { GenerateImageResponse } from "../types/api";
export const textToImageRouter: RouterType = Router();
let imageGenService: ImageGenService;
/**
* POST /api/text-to-image - Generate image from text prompt only (JSON)
*/
textToImageRouter.post(
"/text-to-image",
// JSON validation middleware
logTextToImageRequest,
validateTextToImageRequest,
// Auto-enhancement middleware (optional)
autoEnhancePrompt,
logEnhancementResult,
// Main handler
asyncHandler(async (req: any, res: Response) => {
// Initialize service if not already done
if (!imageGenService) {
const apiKey = process.env["GEMINI_API_KEY"];
if (!apiKey) {
return res.status(500).json({
success: false,
message: "Server configuration error",
error: "GEMINI_API_KEY not configured",
} as GenerateImageResponse);
}
imageGenService = new ImageGenService(apiKey);
}
const timestamp = new Date().toISOString();
const requestId = req.requestId;
const { prompt, filename } = req.body;
console.log(
`[${timestamp}] [${requestId}] Starting text-to-image generation process`,
);
try {
// Generate the image (no reference images for this endpoint)
console.log(
`[${timestamp}] [${requestId}] Calling ImageGenService.generateImage() (text-only)`,
);
const result = await imageGenService.generateImage({
prompt,
filename,
});
// Log the result
console.log(
`[${timestamp}] [${requestId}] Text-to-image generation completed:`,
{
success: result.success,
model: result.model,
filename: result.filename,
hasError: !!result.error,
},
);
// Send response
if (result.success) {
const successResponse: GenerateImageResponse = {
success: true,
message: "Image generated successfully",
data: {
filename: result.filename!,
filepath: result.filepath!,
...(result.description && { description: result.description }),
model: result.model,
generatedAt: timestamp,
...(req.enhancedPrompt && {
promptEnhancement: {
originalPrompt: req.originalPrompt,
enhancedPrompt: req.enhancedPrompt,
detectedLanguage: req.enhancementMetadata?.detectedLanguage,
appliedTemplate: req.enhancementMetadata?.appliedTemplate,
enhancements: req.enhancementMetadata?.enhancements || [],
},
}),
},
};
console.log(`[${timestamp}] [${requestId}] Sending success response`);
return res.status(200).json(successResponse);
} else {
const errorResponse: GenerateImageResponse = {
success: false,
message: "Image generation failed",
error: result.error || "Unknown error occurred",
};
console.log(
`[${timestamp}] [${requestId}] Sending error response: ${result.error}`,
);
return res.status(500).json(errorResponse);
}
} catch (error) {
console.error(
`[${timestamp}] [${requestId}] Unhandled error in text-to-image endpoint:`,
error,
);
const errorResponse: GenerateImageResponse = {
success: false,
message: "Image generation failed",
error:
error instanceof Error ? error.message : "Unknown error occurred",
};
return res.status(500).json(errorResponse);
}
}),
);