| | |
| | |
| | |
| | |
| |
|
| | import config from '../../config.js'; |
| | import { generateId } from '../utils/idGenerator.js'; |
| | import { |
| | validateGenerationParams, |
| | validateApiConfig, |
| | validateImageIndex |
| | } from '../utils/validators.js'; |
| | import { |
| | getStorage, |
| | setStorage, |
| | getDefaultData |
| | } from '../services/storageManager.js'; |
| | import { |
| | generateImage, |
| | cancelGeneration |
| | } from '../services/imageGenerator.js'; |
| | import { renderView } from '../utils/viewRenderer.js'; |
| | import { |
| | sendToSession |
| | } from '../services/websocketManager.js'; |
| |
|
| | export const renderHome = (req, res) => { |
| | const sessionId = generateId(); |
| | const data = getDefaultData(); |
| | |
| | renderView(res, { |
| | ...data, |
| | sessionId |
| | }); |
| | }; |
| |
|
| | export const handleAction = async (req, res) => { |
| | const sessionId = req.body.sessionId || generateId(); |
| | const { |
| | action, |
| | prompt, |
| | model, |
| | size, |
| | imageIndex |
| | } = req.body; |
| | |
| | let data = getStorage(sessionId) || getDefaultData(); |
| | |
| | switch(action) { |
| | case 'delete': |
| | return handleDelete( |
| | sessionId, |
| | imageIndex, |
| | data, |
| | res |
| | ); |
| | |
| | case 'cancel': |
| | return handleCancel(sessionId, res); |
| | |
| | case 'generate': |
| | return handleGenerate( |
| | sessionId, |
| | prompt, |
| | model, |
| | size, |
| | data, |
| | res |
| | ); |
| | |
| | default: |
| | return res.json({ |
| | success: false, |
| | error: 'Invalid action' |
| | }); |
| | } |
| | }; |
| |
|
| | const handleDelete = ( |
| | sessionId, |
| | imageIndex, |
| | data, |
| | res |
| | ) => { |
| | if (validateImageIndex( |
| | imageIndex, |
| | data.images.length |
| | )) { |
| | data.images.splice(parseInt(imageIndex), 1); |
| | setStorage(sessionId, data); |
| | |
| | sendToSession(sessionId, { |
| | type: 'imageDeleted', |
| | images: data.images |
| | }); |
| | } |
| | |
| | return res.json({ |
| | success: true, |
| | images: data.images |
| | }); |
| | }; |
| |
|
| | const handleCancel = (sessionId, res) => { |
| | cancelGeneration(sessionId); |
| | |
| | sendToSession(sessionId, { |
| | type: 'generationCancelled' |
| | }); |
| | |
| | return res.json({ |
| | success: true |
| | }); |
| | }; |
| |
|
| | const handleGenerate = async ( |
| | sessionId, |
| | prompt, |
| | model, |
| | size, |
| | data, |
| | res |
| | ) => { |
| | const trimmedPrompt = prompt?.trim() || ''; |
| | |
| | if (!validateGenerationParams( |
| | trimmedPrompt, |
| | model, |
| | size |
| | )) { |
| | return res.json({ |
| | success: false, |
| | error: 'Please fill in all required fields' |
| | }); |
| | } |
| | |
| | if (!validateApiConfig()) { |
| | return res.json({ |
| | success: false, |
| | error: 'API configuration missing' |
| | }); |
| | } |
| | |
| | data.isGenerating = true; |
| | data.progress = 0; |
| | data.error = null; |
| | setStorage(sessionId, data); |
| | |
| | sendToSession(sessionId, { |
| | type: 'generationStarted', |
| | progress: 0 |
| | }); |
| | |
| | res.json({ |
| | success: true, |
| | sessionId |
| | }); |
| | |
| | await generateImage( |
| | sessionId, |
| | trimmedPrompt, |
| | model, |
| | size |
| | ); |
| | }; |