image / src /controllers /imageController.js
hadadrjt's picture
image: Migrate to Node.js.
c34c995
raw
history blame
2.73 kB
//
// SPDX-FileCopyrightText: Hadad <hadad@linuxmail.org>
// SPDX-License-Identifier: Apache-2.0
//
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
);
};