|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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'; |
|
|
|
|
|
export const renderHome = (req, res) => { |
|
|
const requestId = req.query.rid || generateId(); |
|
|
const data = getStorage(requestId) || getDefaultData(); |
|
|
|
|
|
renderView(res, { |
|
|
...data, |
|
|
requestId |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const handleAction = async (req, res) => { |
|
|
const requestId = req.body.requestId || generateId(); |
|
|
const { |
|
|
action, |
|
|
prompt, |
|
|
model, |
|
|
size, |
|
|
imageIndex |
|
|
} = req.body; |
|
|
|
|
|
let data = getStorage(requestId) || getDefaultData(); |
|
|
|
|
|
switch(action) { |
|
|
case 'delete': |
|
|
return handleDelete( |
|
|
requestId, |
|
|
imageIndex, |
|
|
data, |
|
|
res |
|
|
); |
|
|
|
|
|
case 'cancel': |
|
|
return handleCancel(requestId, res); |
|
|
|
|
|
case 'generate': |
|
|
return handleGenerate( |
|
|
requestId, |
|
|
prompt, |
|
|
model, |
|
|
size, |
|
|
data, |
|
|
res |
|
|
); |
|
|
|
|
|
default: |
|
|
return res.redirect(`/?rid=${requestId}`); |
|
|
} |
|
|
}; |
|
|
|
|
|
const handleDelete = ( |
|
|
requestId, |
|
|
imageIndex, |
|
|
data, |
|
|
res |
|
|
) => { |
|
|
if (validateImageIndex( |
|
|
imageIndex, |
|
|
data.images.length |
|
|
)) { |
|
|
data.images.splice(parseInt(imageIndex), 1); |
|
|
setStorage(requestId, data); |
|
|
} |
|
|
return res.redirect(`/?rid=${requestId}`); |
|
|
}; |
|
|
|
|
|
const handleCancel = (requestId, res) => { |
|
|
cancelGeneration(requestId); |
|
|
return res.redirect(`/?rid=${requestId}`); |
|
|
}; |
|
|
|
|
|
const handleGenerate = async ( |
|
|
requestId, |
|
|
prompt, |
|
|
model, |
|
|
size, |
|
|
data, |
|
|
res |
|
|
) => { |
|
|
const trimmedPrompt = prompt?.trim() || ''; |
|
|
|
|
|
if (!validateGenerationParams( |
|
|
trimmedPrompt, |
|
|
model, |
|
|
size |
|
|
)) { |
|
|
data.error = 'Please fill in all required fields'; |
|
|
setStorage(requestId, data); |
|
|
return renderView(res, { |
|
|
...data, |
|
|
requestId |
|
|
}); |
|
|
} |
|
|
|
|
|
if (!validateApiConfig()) { |
|
|
data.error = 'The server is currently busy. ' + |
|
|
'Please try again later.'; |
|
|
setStorage(requestId, data); |
|
|
return renderView(res, { |
|
|
...data, |
|
|
requestId |
|
|
}); |
|
|
} |
|
|
|
|
|
data.isGenerating = true; |
|
|
data.progress = 50; |
|
|
data.error = null; |
|
|
setStorage(requestId, data); |
|
|
|
|
|
res.redirect(`/?rid=${requestId}`); |
|
|
|
|
|
await generateImage( |
|
|
requestId, |
|
|
trimmedPrompt, |
|
|
model, |
|
|
size |
|
|
); |
|
|
}; |