131 lines
3.9 KiB
TypeScript
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);
|
|
}
|
|
}),
|
|
);
|