|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
); |
|
|
}; |