Sparser use of .error

a5399b6614705b6db138526d9cc492890c4169c8

Eradev <admin@eradev.com>

15 files changed, +119 -119Showing whitespace changes
src/endpoints/anthropic.js+1 -1
@@ -46,7 +46,7 @@ router.post('/caption-image', jsonParser, async (request, response) => {
4646
47 if (!result.ok) {47 if (!result.ok) {
48 const text = await result.text();48 const text = await result.text();
49 console.error(`Claude API returned error: ${result.status} ${result.statusText}`, text);49 console.warn(`Claude API returned error: ${result.status} ${result.statusText}`, text);
50 return response.status(result.status).send({ error: true });50 return response.status(result.status).send({ error: true });
51 }51 }
5252
src/endpoints/azure.js+6 -6
@@ -11,14 +11,14 @@ router.post('/list', jsonParser, async (req, res) => {
11 const key = readSecret(req.user.directories, SECRET_KEYS.AZURE_TTS);11 const key = readSecret(req.user.directories, SECRET_KEYS.AZURE_TTS);
1212
13 if (!key) {13 if (!key) {
14 console.error('Azure TTS API Key not set');14 console.warn('Azure TTS API Key not set');
15 return res.sendStatus(403);15 return res.sendStatus(403);
16 }16 }
1717
18 const region = req.body.region;18 const region = req.body.region;
1919
20 if (!region) {20 if (!region) {
21 console.error('Azure TTS region not set');21 console.warn('Azure TTS region not set');
22 return res.sendStatus(400);22 return res.sendStatus(400);
23 }23 }
2424
@@ -32,7 +32,7 @@ router.post('/list', jsonParser, async (req, res) => {
32 });32 });
3333
34 if (!response.ok) {34 if (!response.ok) {
35 console.error('Azure Request failed', response.status, response.statusText);35 console.warn('Azure Request failed', response.status, response.statusText);
36 return res.sendStatus(500);36 return res.sendStatus(500);
37 }37 }
3838
@@ -49,13 +49,13 @@ router.post('/generate', jsonParser, async (req, res) => {
49 const key = readSecret(req.user.directories, SECRET_KEYS.AZURE_TTS);49 const key = readSecret(req.user.directories, SECRET_KEYS.AZURE_TTS);
5050
51 if (!key) {51 if (!key) {
52 console.error('Azure TTS API Key not set');52 console.warn('Azure TTS API Key not set');
53 return res.sendStatus(403);53 return res.sendStatus(403);
54 }54 }
5555
56 const { text, voice, region } = req.body;56 const { text, voice, region } = req.body;
57 if (!text || !voice || !region) {57 if (!text || !voice || !region) {
58 console.error('Missing required parameters');58 console.warn('Missing required parameters');
59 return res.sendStatus(400);59 return res.sendStatus(400);
60 }60 }
6161
@@ -75,7 +75,7 @@ router.post('/generate', jsonParser, async (req, res) => {
75 });75 });
7676
77 if (!response.ok) {77 if (!response.ok) {
78 console.error('Azure Request failed', response.status, response.statusText);78 console.warn('Azure Request failed', response.status, response.statusText);
79 return res.sendStatus(500);79 return res.sendStatus(500);
80 }80 }
8181
src/endpoints/backends/chat-completions.js+17 -17
@@ -114,7 +114,7 @@ async function sendClaudeRequest(request, response) {
114 }114 }
115115
116 if (!apiKey) {116 if (!apiKey) {
117 console.log(color.red(`Claude API key is missing.\n${divider}`));117 console.warn(color.red(`Claude API key is missing.\n${divider}`));
118 return response.status(400).send({ error: true });118 return response.status(400).send({ error: true });
119 }119 }
120120
@@ -230,7 +230,7 @@ async function sendScaleRequest(request, response) {
230 const apiKey = readSecret(request.user.directories, SECRET_KEYS.SCALE);230 const apiKey = readSecret(request.user.directories, SECRET_KEYS.SCALE);
231231
232 if (!apiKey) {232 if (!apiKey) {
233 console.log('Scale API key is missing.');233 console.warn('Scale API key is missing.');
234 return response.status(400).send({ error: true });234 return response.status(400).send({ error: true });
235 }235 }
236236
@@ -254,7 +254,7 @@ async function sendScaleRequest(request, response) {
254 });254 });
255255
256 if (!generateResponse.ok) {256 if (!generateResponse.ok) {
257 console.error(`Scale API returned error: ${generateResponse.status} ${generateResponse.statusText} ${await generateResponse.text()}`);257 console.warn(`Scale API returned error: ${generateResponse.status} ${generateResponse.statusText} ${await generateResponse.text()}`);
258 return response.status(500).send({ error: true });258 return response.status(500).send({ error: true });
259 }259 }
260260
@@ -282,7 +282,7 @@ async function sendMakerSuiteRequest(request, response) {
282 const apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MAKERSUITE);282 const apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MAKERSUITE);
283283
284 if (!request.body.reverse_proxy && !apiKey) {284 if (!request.body.reverse_proxy && !apiKey) {
285 console.error('Google AI Studio API key is missing.');285 console.warn('Google AI Studio API key is missing.');
286 return response.status(400).send({ error: true });286 return response.status(400).send({ error: true });
287 }287 }
288288
@@ -373,7 +373,7 @@ async function sendMakerSuiteRequest(request, response) {
373 }373 }
374 } else {374 } else {
375 if (!generateResponse.ok) {375 if (!generateResponse.ok) {
376 console.error(`Google AI Studio API returned error: ${generateResponse.status} ${generateResponse.statusText} ${await generateResponse.text()}`);376 console.warn(`Google AI Studio API returned error: ${generateResponse.status} ${generateResponse.statusText} ${await generateResponse.text()}`);
377 return response.status(generateResponse.status).send({ error: true });377 return response.status(generateResponse.status).send({ error: true });
378 }378 }
379379
@@ -391,12 +391,12 @@ async function sendMakerSuiteRequest(request, response) {
391 }391 }
392392
393 const responseContent = candidates[0].content ?? candidates[0].output;393 const responseContent = candidates[0].content ?? candidates[0].output;
394 console.error('Google AI Studio response:', responseContent);394 console.warn('Google AI Studio response:', responseContent);
395395
396 const responseText = typeof responseContent === 'string' ? responseContent : responseContent?.parts?.filter(part => !part.thought)?.map(part => part.text)?.join('\n\n');396 const responseText = typeof responseContent === 'string' ? responseContent : responseContent?.parts?.filter(part => !part.thought)?.map(part => part.text)?.join('\n\n');
397 if (!responseText) {397 if (!responseText) {
398 let message = 'Google AI Studio Candidate text empty';398 let message = 'Google AI Studio Candidate text empty';
399 console.error(message, generateResponseJson);399 console.warn(message, generateResponseJson);
400 return response.send({ error: { message } });400 return response.send({ error: { message } });
401 }401 }
402402
@@ -456,7 +456,7 @@ async function sendAI21Request(request, response) {
456 } else {456 } else {
457 if (!generateResponse.ok) {457 if (!generateResponse.ok) {
458 const errorText = await generateResponse.text();458 const errorText = await generateResponse.text();
459 console.error(`AI21 API returned error: ${generateResponse.status} ${generateResponse.statusText} ${errorText}`);459 console.warn(`AI21 API returned error: ${generateResponse.status} ${generateResponse.statusText} ${errorText}`);
460 const errorJson = tryParse(errorText) ?? { error: true };460 const errorJson = tryParse(errorText) ?? { error: true };
461 return response.status(500).send(errorJson);461 return response.status(500).send(errorJson);
462 }462 }
@@ -484,7 +484,7 @@ async function sendMistralAIRequest(request, response) {
484 const apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MISTRALAI);484 const apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MISTRALAI);
485485
486 if (!apiKey) {486 if (!apiKey) {
487 console.error('MistralAI API key is missing.');487 console.warn('MistralAI API key is missing.');
488 return response.status(400).send({ error: true });488 return response.status(400).send({ error: true });
489 }489 }
490490
@@ -533,7 +533,7 @@ async function sendMistralAIRequest(request, response) {
533 } else {533 } else {
534 if (!generateResponse.ok) {534 if (!generateResponse.ok) {
535 const errorText = await generateResponse.text();535 const errorText = await generateResponse.text();
536 console.error(`MistralAI API returned error: ${generateResponse.status} ${generateResponse.statusText} ${errorText}`);536 console.warn(`MistralAI API returned error: ${generateResponse.status} ${generateResponse.statusText} ${errorText}`);
537 const errorJson = tryParse(errorText) ?? { error: true };537 const errorJson = tryParse(errorText) ?? { error: true };
538 return response.status(500).send(errorJson);538 return response.status(500).send(errorJson);
539 }539 }
@@ -565,7 +565,7 @@ async function sendCohereRequest(request, response) {
565 });565 });
566566
567 if (!apiKey) {567 if (!apiKey) {
568 console.error('Cohere API key is missing.');568 console.warn('Cohere API key is missing.');
569 return response.status(400).send({ error: true });569 return response.status(400).send({ error: true });
570 }570 }
571571
@@ -626,7 +626,7 @@ async function sendCohereRequest(request, response) {
626 const generateResponse = await fetch(apiUrl, config);626 const generateResponse = await fetch(apiUrl, config);
627 if (!generateResponse.ok) {627 if (!generateResponse.ok) {
628 const errorText = await generateResponse.text();628 const errorText = await generateResponse.text();
629 console.error(`Cohere API returned error: ${generateResponse.status} ${generateResponse.statusText} ${errorText}`);629 console.warn(`Cohere API returned error: ${generateResponse.status} ${generateResponse.statusText} ${errorText}`);
630 const errorJson = tryParse(errorText) ?? { error: true };630 const errorJson = tryParse(errorText) ?? { error: true };
631 return response.status(500).send(errorJson);631 return response.status(500).send(errorJson);
632 }632 }
@@ -654,7 +654,7 @@ async function sendDeepSeekRequest(request, response) {
654 const apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.DEEPSEEK);654 const apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.DEEPSEEK);
655655
656 if (!apiKey && !request.body.reverse_proxy) {656 if (!apiKey && !request.body.reverse_proxy) {
657 console.log('DeepSeek API key is missing.');657 console.warn('DeepSeek API key is missing.');
658 return response.status(400).send({ error: true });658 return response.status(400).send({ error: true });
659 }659 }
660660
@@ -775,12 +775,12 @@ router.post('/status', jsonParser, async function (request, response_getstatus_o
775 api_key_openai = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.DEEPSEEK);775 api_key_openai = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.DEEPSEEK);
776 headers = {};776 headers = {};
777 } else {777 } else {
778 console.error('This chat completion source is not supported yet.');778 console.warn('This chat completion source is not supported yet.');
779 return response_getstatus_openai.status(400).send({ error: true });779 return response_getstatus_openai.status(400).send({ error: true });
780 }780 }
781781
782 if (!api_key_openai && !request.body.reverse_proxy && request.body.chat_completion_source !== CHAT_COMPLETION_SOURCES.CUSTOM) {782 if (!api_key_openai && !request.body.reverse_proxy && request.body.chat_completion_source !== CHAT_COMPLETION_SOURCES.CUSTOM) {
783 console.error('Chat Completion API key is missing.');783 console.warn('Chat Completion API key is missing.');
784 return response_getstatus_openai.status(400).send({ error: true });784 return response_getstatus_openai.status(400).send({ error: true });
785 }785 }
786786
@@ -1059,12 +1059,12 @@ router.post('/generate', jsonParser, function (request, response) {
1059 headers = {};1059 headers = {};
1060 bodyParams = {};1060 bodyParams = {};
1061 } else {1061 } else {
1062 console.error('This chat completion source is not supported yet.');1062 console.warn('This chat completion source is not supported yet.');
1063 return response.status(400).send({ error: true });1063 return response.status(400).send({ error: true });
1064 }1064 }
10651065
1066 if (!apiKey && !request.body.reverse_proxy && request.body.chat_completion_source !== CHAT_COMPLETION_SOURCES.CUSTOM) {1066 if (!apiKey && !request.body.reverse_proxy && request.body.chat_completion_source !== CHAT_COMPLETION_SOURCES.CUSTOM) {
1067 console.error('OpenAI API key is missing.');1067 console.warn('OpenAI API key is missing.');
1068 return response.status(400).send({ error: true });1068 return response.status(400).send({ error: true });
1069 }1069 }
10701070
src/endpoints/backends/kobold.js+1 -1
@@ -105,7 +105,7 @@ router.post('/generate', jsonParser, async function (request, response_generate)
105 } else {105 } else {
106 if (!response.ok) {106 if (!response.ok) {
107 const errorText = await response.text();107 const errorText = await response.text();
108 console.error(`Kobold returned error: ${response.status} ${response.statusText} ${errorText}`);108 console.warn(`Kobold returned error: ${response.status} ${response.statusText} ${errorText}`);
109109
110 try {110 try {
111 const errorJson = JSON.parse(errorText);111 const errorJson = JSON.parse(errorText);
src/endpoints/caption.js+1 -1
@@ -13,7 +13,7 @@ router.post('/', jsonParser, async (req, res) => {
13 const rawImage = await getRawImage(image);13 const rawImage = await getRawImage(image);
1414
15 if (!rawImage) {15 if (!rawImage) {
16 console.error('Failed to parse captioned image');16 console.warn('Failed to parse captioned image');
17 return res.sendStatus(400);17 return res.sendStatus(400);
18 }18 }
1919
src/endpoints/characters.js+8 -8
@@ -812,13 +812,13 @@ router.post('/rename', jsonParser, validateAvatarUrlMiddleware, async function (
812812
813router.post('/edit', urlencodedParser, validateAvatarUrlMiddleware, async function (request, response) {813router.post('/edit', urlencodedParser, validateAvatarUrlMiddleware, async function (request, response) {
814 if (!request.body) {814 if (!request.body) {
815 console.error('Error: no response body detected');815 console.warn('Error: no response body detected');
816 response.status(400).send('Error: no response body detected');816 response.status(400).send('Error: no response body detected');
817 return;817 return;
818 }818 }
819819
820 if (request.body.ch_name === '' || request.body.ch_name === undefined || request.body.ch_name === '.') {820 if (request.body.ch_name === '' || request.body.ch_name === undefined || request.body.ch_name === '.') {
821 console.error('Error: invalid name.');821 console.warn('Error: invalid name.');
822 response.status(400).send('Error: invalid name.');822 response.status(400).send('Error: invalid name.');
823 return;823 return;
824 }824 }
@@ -862,12 +862,12 @@ router.post('/edit', urlencodedParser, validateAvatarUrlMiddleware, async functi
862router.post('/edit-attribute', jsonParser, validateAvatarUrlMiddleware, async function (request, response) {862router.post('/edit-attribute', jsonParser, validateAvatarUrlMiddleware, async function (request, response) {
863 console.debug(request.body);863 console.debug(request.body);
864 if (!request.body) {864 if (!request.body) {
865 console.error('Error: no response body detected');865 console.warn('Error: no response body detected');
866 return response.status(400).send('Error: no response body detected');866 return response.status(400).send('Error: no response body detected');
867 }867 }
868868
869 if (request.body.ch_name === '' || request.body.ch_name === undefined || request.body.ch_name === '.') {869 if (request.body.ch_name === '' || request.body.ch_name === undefined || request.body.ch_name === '.') {
870 console.error('Error: invalid name.');870 console.warn('Error: invalid name.');
871 return response.status(400).send('Error: invalid name.');871 return response.status(400).send('Error: invalid name.');
872 }872 }
873873
@@ -879,7 +879,7 @@ router.post('/edit-attribute', jsonParser, validateAvatarUrlMiddleware, async fu
879 const char = JSON.parse(charJSON);879 const char = JSON.parse(charJSON);
880 //check if the field exists880 //check if the field exists
881 if (char[request.body.field] === undefined && char.data[request.body.field] === undefined) {881 if (char[request.body.field] === undefined && char.data[request.body.field] === undefined) {
882 console.error('Error: invalid field.');882 console.warn('Error: invalid field.');
883 response.status(400).send('Error: invalid field.');883 response.status(400).send('Error: invalid field.');
884 return;884 return;
885 }885 }
@@ -928,7 +928,7 @@ router.post('/merge-attributes', jsonParser, getFileNameValidationFunction('avat
928 await writeCharacterData(avatarPath, JSON.stringify(character), targetImg, request);928 await writeCharacterData(avatarPath, JSON.stringify(character), targetImg, request);
929 response.sendStatus(200);929 response.sendStatus(200);
930 } else {930 } else {
931 console.error(validator.lastValidationError);931 console.warn(validator.lastValidationError);
932 response.status(400).send({ message: `Validation failed for ${character.name}`, error: validator.lastValidationError });932 response.status(400).send({ message: `Validation failed for ${character.name}`, error: validator.lastValidationError });
933 }933 }
934 } catch (exception) {934 } catch (exception) {
@@ -1152,7 +1152,7 @@ router.post('/import', urlencodedParser, async function (request, response) {
1152 const fileName = await importFunction(uploadPath, { request, response }, preservedFileName);1152 const fileName = await importFunction(uploadPath, { request, response }, preservedFileName);
11531153
1154 if (!fileName) {1154 if (!fileName) {
1155 console.error('Failed to import character');1155 console.warn('Failed to import character');
1156 return response.sendStatus(400);1156 return response.sendStatus(400);
1157 }1157 }
11581158
@@ -1170,7 +1170,7 @@ router.post('/import', urlencodedParser, async function (request, response) {
1170router.post('/duplicate', jsonParser, validateAvatarUrlMiddleware, async function (request, response) {1170router.post('/duplicate', jsonParser, validateAvatarUrlMiddleware, async function (request, response) {
1171 try {1171 try {
1172 if (!request.body.avatar_url) {1172 if (!request.body.avatar_url) {
1173 console.error('avatar URL not found in request body');1173 console.warn('avatar URL not found in request body');
1174 console.debug(request.body);1174 console.debug(request.body);
1175 return response.sendStatus(400);1175 return response.sendStatus(400);
1176 }1176 }
src/endpoints/horde.js+1 -1
@@ -360,7 +360,7 @@ router.post('/generate-image', jsonParser, async (request, response) => {
360 { token: api_key_horde });360 { token: api_key_horde });
361361
362 if (!generation.id) {362 if (!generation.id) {
363 console.error('Image generation request is not satisfyable:', generation.message || 'unknown error');363 console.warn('Image generation request is not satisfyable:', generation.message || 'unknown error');
364 return response.sendStatus(400);364 return response.sendStatus(400);
365 }365 }
366366
src/endpoints/novelai.js+6 -6
@@ -120,7 +120,7 @@ router.post('/status', jsonParser, async function (req, res) {
120 const api_key_novel = readSecret(req.user.directories, SECRET_KEYS.NOVEL);120 const api_key_novel = readSecret(req.user.directories, SECRET_KEYS.NOVEL);
121121
122 if (!api_key_novel) {122 if (!api_key_novel) {
123 console.error('NovelAI Access Token is missing.');123 console.warn('NovelAI Access Token is missing.');
124 return res.sendStatus(400);124 return res.sendStatus(400);
125 }125 }
126126
@@ -141,7 +141,7 @@ router.post('/status', jsonParser, async function (req, res) {
141 return res.send({ error: true });141 return res.send({ error: true });
142 }142 }
143 else {143 else {
144 console.error('NovelAI returned an error:', response.statusText);144 console.warn('NovelAI returned an error:', response.statusText);
145 return res.send({ error: true });145 return res.send({ error: true });
146 }146 }
147 } catch (error) {147 } catch (error) {
@@ -156,7 +156,7 @@ router.post('/generate', jsonParser, async function (req, res) {
156 const api_key_novel = readSecret(req.user.directories, SECRET_KEYS.NOVEL);156 const api_key_novel = readSecret(req.user.directories, SECRET_KEYS.NOVEL);
157157
158 if (!api_key_novel) {158 if (!api_key_novel) {
159 console.error('NovelAI Access Token is missing.');159 console.warn('NovelAI Access Token is missing.');
160 return res.sendStatus(400);160 return res.sendStatus(400);
161 }161 }
162162
@@ -261,7 +261,7 @@ router.post('/generate', jsonParser, async function (req, res) {
261 if (!response.ok) {261 if (!response.ok) {
262 const text = await response.text();262 const text = await response.text();
263 let message = text;263 let message = text;
264 console.error(`Novel API returned error: ${response.status} ${response.statusText} ${text}`);264 console.warn(`Novel API returned error: ${response.status} ${response.statusText} ${text}`);
265265
266 try {266 try {
267 const data = JSON.parse(text);267 const data = JSON.parse(text);
@@ -292,7 +292,7 @@ router.post('/generate-image', jsonParser, async (request, response) => {
292 const key = readSecret(request.user.directories, SECRET_KEYS.NOVEL);292 const key = readSecret(request.user.directories, SECRET_KEYS.NOVEL);
293293
294 if (!key) {294 if (!key) {
295 console.error('NovelAI Access Token is missing.');295 console.warn('NovelAI Access Token is missing.');
296 return response.sendStatus(400);296 return response.sendStatus(400);
297 }297 }
298298
@@ -358,7 +358,7 @@ router.post('/generate-image', jsonParser, async (request, response) => {
358358
359 if (!generateResult.ok) {359 if (!generateResult.ok) {
360 const text = await generateResult.text();360 const text = await generateResult.text();
361 console.error('NovelAI returned an error.', generateResult.statusText, text);361 console.warn('NovelAI returned an error.', generateResult.statusText, text);
362 return response.sendStatus(500);362 return response.sendStatus(500);
363 }363 }
364364
src/endpoints/openai.js+12 -12
@@ -63,7 +63,7 @@ router.post('/caption-image', jsonParser, async (request, response) => {
63 }63 }
6464
65 if (!key && !request.body.reverse_proxy && ['custom', 'ooba', 'koboldcpp', 'vllm'].includes(request.body.api) === false) {65 if (!key && !request.body.reverse_proxy && ['custom', 'ooba', 'koboldcpp', 'vllm'].includes(request.body.api) === false) {
66 console.error('No key found for API', request.body.api);66 console.warn('No key found for API', request.body.api);
67 return response.sendStatus(400);67 return response.sendStatus(400);
68 }68 }
6969
@@ -93,7 +93,7 @@ router.post('/caption-image', jsonParser, async (request, response) => {
93 excludeKeysByYaml(body, request.body.custom_exclude_body);93 excludeKeysByYaml(body, request.body.custom_exclude_body);
94 }94 }
9595
96 console.error('Multimodal captioning request', body);96 console.debug('Multimodal captioning request', body);
9797
98 let apiUrl = '';98 let apiUrl = '';
9999
@@ -158,7 +158,7 @@ router.post('/caption-image', jsonParser, async (request, response) => {
158158
159 if (!result.ok) {159 if (!result.ok) {
160 const text = await result.text();160 const text = await result.text();
161 console.error('Multimodal captioning request failed', result.statusText, text);161 console.warn('Multimodal captioning request failed', result.statusText, text);
162 return response.status(500).send(text);162 return response.status(500).send(text);
163 }163 }
164164
@@ -184,12 +184,12 @@ router.post('/transcribe-audio', urlencodedParser, async (request, response) =>
184 const key = readSecret(request.user.directories, SECRET_KEYS.OPENAI);184 const key = readSecret(request.user.directories, SECRET_KEYS.OPENAI);
185185
186 if (!key) {186 if (!key) {
187 console.error('No OpenAI key found');187 console.warn('No OpenAI key found');
188 return response.sendStatus(400);188 return response.sendStatus(400);
189 }189 }
190190
191 if (!request.file) {191 if (!request.file) {
192 console.error('No audio file found');192 console.warn('No audio file found');
193 return response.sendStatus(400);193 return response.sendStatus(400);
194 }194 }
195195
@@ -213,7 +213,7 @@ router.post('/transcribe-audio', urlencodedParser, async (request, response) =>
213213
214 if (!result.ok) {214 if (!result.ok) {
215 const text = await result.text();215 const text = await result.text();
216 console.error('OpenAI request failed', result.statusText, text);216 console.warn('OpenAI request failed', result.statusText, text);
217 return response.status(500).send(text);217 return response.status(500).send(text);
218 }218 }
219219
@@ -232,7 +232,7 @@ router.post('/generate-voice', jsonParser, async (request, response) => {
232 const key = readSecret(request.user.directories, SECRET_KEYS.OPENAI);232 const key = readSecret(request.user.directories, SECRET_KEYS.OPENAI);
233233
234 if (!key) {234 if (!key) {
235 console.error('No OpenAI key found');235 console.warn('No OpenAI key found');
236 return response.sendStatus(400);236 return response.sendStatus(400);
237 }237 }
238238
@@ -253,7 +253,7 @@ router.post('/generate-voice', jsonParser, async (request, response) => {
253253
254 if (!result.ok) {254 if (!result.ok) {
255 const text = await result.text();255 const text = await result.text();
256 console.error('OpenAI request failed', result.statusText, text);256 console.warn('OpenAI request failed', result.statusText, text);
257 return response.status(500).send(text);257 return response.status(500).send(text);
258 }258 }
259259
@@ -271,7 +271,7 @@ router.post('/generate-image', jsonParser, async (request, response) => {
271 const key = readSecret(request.user.directories, SECRET_KEYS.OPENAI);271 const key = readSecret(request.user.directories, SECRET_KEYS.OPENAI);
272272
273 if (!key) {273 if (!key) {
274 console.error('No OpenAI key found');274 console.warn('No OpenAI key found');
275 return response.sendStatus(400);275 return response.sendStatus(400);
276 }276 }
277277
@@ -288,7 +288,7 @@ router.post('/generate-image', jsonParser, async (request, response) => {
288288
289 if (!result.ok) {289 if (!result.ok) {
290 const text = await result.text();290 const text = await result.text();
291 console.error('OpenAI request failed', result.statusText, text);291 console.warn('OpenAI request failed', result.statusText, text);
292 return response.status(500).send(text);292 return response.status(500).send(text);
293 }293 }
294294
@@ -308,7 +308,7 @@ custom.post('/generate-voice', jsonParser, async (request, response) => {
308 const { input, provider_endpoint, response_format, voice, speed, model } = request.body;308 const { input, provider_endpoint, response_format, voice, speed, model } = request.body;
309309
310 if (!provider_endpoint) {310 if (!provider_endpoint) {
311 console.error('No OpenAI-compatible TTS provider endpoint provided');311 console.warn('No OpenAI-compatible TTS provider endpoint provided');
312 return response.sendStatus(400);312 return response.sendStatus(400);
313 }313 }
314314
@@ -329,7 +329,7 @@ custom.post('/generate-voice', jsonParser, async (request, response) => {
329329
330 if (!result.ok) {330 if (!result.ok) {
331 const text = await result.text();331 const text = await result.text();
332 console.error('OpenAI request failed', result.statusText, text);332 console.warn('OpenAI request failed', result.statusText, text);
333 return response.status(500).send(text);333 return response.status(500).send(text);
334 }334 }
335335
src/endpoints/stable-diffusion.js+26 -26
@@ -604,7 +604,7 @@ together.post('/models', jsonParser, async (request, response) => {
604 const key = readSecret(request.user.directories, SECRET_KEYS.TOGETHERAI);604 const key = readSecret(request.user.directories, SECRET_KEYS.TOGETHERAI);
605605
606 if (!key) {606 if (!key) {
607 console.error('TogetherAI key not found.');607 console.warn('TogetherAI key not found.');
608 return response.sendStatus(400);608 return response.sendStatus(400);
609 }609 }
610610
@@ -616,14 +616,14 @@ together.post('/models', jsonParser, async (request, response) => {
616 });616 });
617617
618 if (!modelsResponse.ok) {618 if (!modelsResponse.ok) {
619 console.error('TogetherAI returned an error.');619 console.warn('TogetherAI returned an error.');
620 return response.sendStatus(500);620 return response.sendStatus(500);
621 }621 }
622622
623 const data = await modelsResponse.json();623 const data = await modelsResponse.json();
624624
625 if (!Array.isArray(data)) {625 if (!Array.isArray(data)) {
626 console.error('TogetherAI returned invalid data.');626 console.warn('TogetherAI returned invalid data.');
627 return response.sendStatus(500);627 return response.sendStatus(500);
628 }628 }
629629
@@ -643,7 +643,7 @@ together.post('/generate', jsonParser, async (request, response) => {
643 const key = readSecret(request.user.directories, SECRET_KEYS.TOGETHERAI);643 const key = readSecret(request.user.directories, SECRET_KEYS.TOGETHERAI);
644644
645 if (!key) {645 if (!key) {
646 console.error('TogetherAI key not found.');646 console.warn('TogetherAI key not found.');
647 return response.sendStatus(400);647 return response.sendStatus(400);
648 }648 }
649649
@@ -669,7 +669,7 @@ together.post('/generate', jsonParser, async (request, response) => {
669 });669 });
670670
671 if (!result.ok) {671 if (!result.ok) {
672 console.error('TogetherAI returned an error.', { body: await result.text() });672 console.warn('TogetherAI returned an error.', { body: await result.text() });
673 return response.sendStatus(500);673 return response.sendStatus(500);
674 }674 }
675675
@@ -794,14 +794,14 @@ pollinations.post('/models', jsonParser, async (_request, response) => {
794 const result = await fetch(modelsUrl);794 const result = await fetch(modelsUrl);
795795
796 if (!result.ok) {796 if (!result.ok) {
797 console.error('Pollinations returned an error.', result.status, result.statusText);797 console.warn('Pollinations returned an error.', result.status, result.statusText);
798 throw new Error('Pollinations request failed.');798 throw new Error('Pollinations request failed.');
799 }799 }
800800
801 const data = await result.json();801 const data = await result.json();
802802
803 if (!Array.isArray(data)) {803 if (!Array.isArray(data)) {
804 console.error('Pollinations returned invalid data.');804 console.warn('Pollinations returned invalid data.');
805 throw new Error('Pollinations request failed.');805 throw new Error('Pollinations request failed.');
806 }806 }
807807
@@ -834,7 +834,7 @@ pollinations.post('/generate', jsonParser, async (request, response) => {
834 const result = await fetch(promptUrl);834 const result = await fetch(promptUrl);
835835
836 if (!result.ok) {836 if (!result.ok) {
837 console.error('Pollinations returned an error.', result.status, result.statusText);837 console.warn('Pollinations returned an error.', result.status, result.statusText);
838 throw new Error('Pollinations request failed.');838 throw new Error('Pollinations request failed.');
839 }839 }
840840
@@ -855,7 +855,7 @@ stability.post('/generate', jsonParser, async (request, response) => {
855 const key = readSecret(request.user.directories, SECRET_KEYS.STABILITY);855 const key = readSecret(request.user.directories, SECRET_KEYS.STABILITY);
856856
857 if (!key) {857 if (!key) {
858 console.error('Stability AI key not found.');858 console.warn('Stability AI key not found.');
859 return response.sendStatus(400);859 return response.sendStatus(400);
860 }860 }
861861
@@ -896,7 +896,7 @@ stability.post('/generate', jsonParser, async (request, response) => {
896896
897 if (!result.ok) {897 if (!result.ok) {
898 const text = await result.text();898 const text = await result.text();
899 console.error('Stability AI returned an error.', result.status, result.statusText, text);899 console.warn('Stability AI returned an error.', result.status, result.statusText, text);
900 return response.sendStatus(500);900 return response.sendStatus(500);
901 }901 }
902902
@@ -915,7 +915,7 @@ blockentropy.post('/models', jsonParser, async (request, response) => {
915 const key = readSecret(request.user.directories, SECRET_KEYS.BLOCKENTROPY);915 const key = readSecret(request.user.directories, SECRET_KEYS.BLOCKENTROPY);
916916
917 if (!key) {917 if (!key) {
918 console.error('Block Entropy key not found.');918 console.warn('Block Entropy key not found.');
919 return response.sendStatus(400);919 return response.sendStatus(400);
920 }920 }
921921
@@ -927,14 +927,14 @@ blockentropy.post('/models', jsonParser, async (request, response) => {
927 });927 });
928928
929 if (!modelsResponse.ok) {929 if (!modelsResponse.ok) {
930 console.error('Block Entropy returned an error.');930 console.warn('Block Entropy returned an error.');
931 return response.sendStatus(500);931 return response.sendStatus(500);
932 }932 }
933933
934 const data = await modelsResponse.json();934 const data = await modelsResponse.json();
935935
936 if (!Array.isArray(data)) {936 if (!Array.isArray(data)) {
937 console.error('Block Entropy returned invalid data.');937 console.warn('Block Entropy returned invalid data.');
938 return response.sendStatus(500);938 return response.sendStatus(500);
939 }939 }
940 const models = data.map(x => ({ value: x.name, text: x.name }));940 const models = data.map(x => ({ value: x.name, text: x.name }));
@@ -951,7 +951,7 @@ blockentropy.post('/generate', jsonParser, async (request, response) => {
951 const key = readSecret(request.user.directories, SECRET_KEYS.BLOCKENTROPY);951 const key = readSecret(request.user.directories, SECRET_KEYS.BLOCKENTROPY);
952952
953 if (!key) {953 if (!key) {
954 console.error('Block Entropy key not found.');954 console.warn('Block Entropy key not found.');
955 return response.sendStatus(400);955 return response.sendStatus(400);
956 }956 }
957957
@@ -976,7 +976,7 @@ blockentropy.post('/generate', jsonParser, async (request, response) => {
976 });976 });
977977
978 if (!result.ok) {978 if (!result.ok) {
979 console.error('Block Entropy returned an error.');979 console.warn('Block Entropy returned an error.');
980 return response.sendStatus(500);980 return response.sendStatus(500);
981 }981 }
982982
@@ -998,7 +998,7 @@ huggingface.post('/generate', jsonParser, async (request, response) => {
998 const key = readSecret(request.user.directories, SECRET_KEYS.HUGGINGFACE);998 const key = readSecret(request.user.directories, SECRET_KEYS.HUGGINGFACE);
999999
1000 if (!key) {1000 if (!key) {
1001 console.error('Hugging Face key not found.');1001 console.warn('Hugging Face key not found.');
1002 return response.sendStatus(400);1002 return response.sendStatus(400);
1003 }1003 }
10041004
@@ -1016,7 +1016,7 @@ huggingface.post('/generate', jsonParser, async (request, response) => {
1016 });1016 });
10171017
1018 if (!result.ok) {1018 if (!result.ok) {
1019 console.error('Hugging Face returned an error.');1019 console.warn('Hugging Face returned an error.');
1020 return response.sendStatus(500);1020 return response.sendStatus(500);
1021 }1021 }
10221022
@@ -1037,7 +1037,7 @@ nanogpt.post('/models', jsonParser, async (request, response) => {
1037 const key = readSecret(request.user.directories, SECRET_KEYS.NANOGPT);1037 const key = readSecret(request.user.directories, SECRET_KEYS.NANOGPT);
10381038
1039 if (!key) {1039 if (!key) {
1040 console.error('NanoGPT key not found.');1040 console.warn('NanoGPT key not found.');
1041 return response.sendStatus(400);1041 return response.sendStatus(400);
1042 }1042 }
10431043
@@ -1050,7 +1050,7 @@ nanogpt.post('/models', jsonParser, async (request, response) => {
1050 });1050 });
10511051
1052 if (!modelsResponse.ok) {1052 if (!modelsResponse.ok) {
1053 console.error('NanoGPT returned an error.');1053 console.warn('NanoGPT returned an error.');
1054 return response.sendStatus(500);1054 return response.sendStatus(500);
1055 }1055 }
10561056
@@ -1059,7 +1059,7 @@ nanogpt.post('/models', jsonParser, async (request, response) => {
1059 const imageModels = data?.models?.image;1059 const imageModels = data?.models?.image;
10601060
1061 if (!imageModels || typeof imageModels !== 'object') {1061 if (!imageModels || typeof imageModels !== 'object') {
1062 console.error('NanoGPT returned invalid data.');1062 console.warn('NanoGPT returned invalid data.');
1063 return response.sendStatus(500);1063 return response.sendStatus(500);
1064 }1064 }
10651065
@@ -1077,7 +1077,7 @@ nanogpt.post('/generate', jsonParser, async (request, response) => {
1077 const key = readSecret(request.user.directories, SECRET_KEYS.NANOGPT);1077 const key = readSecret(request.user.directories, SECRET_KEYS.NANOGPT);
10781078
1079 if (!key) {1079 if (!key) {
1080 console.error('NanoGPT key not found.');1080 console.warn('NanoGPT key not found.');
1081 return response.sendStatus(400);1081 return response.sendStatus(400);
1082 }1082 }
10831083
@@ -1093,7 +1093,7 @@ nanogpt.post('/generate', jsonParser, async (request, response) => {
1093 });1093 });
10941094
1095 if (!result.ok) {1095 if (!result.ok) {
1096 console.error('NanoGPT returned an error.');1096 console.warn('NanoGPT returned an error.');
1097 return response.sendStatus(500);1097 return response.sendStatus(500);
1098 }1098 }
10991099
@@ -1102,7 +1102,7 @@ nanogpt.post('/generate', jsonParser, async (request, response) => {
11021102
1103 const image = data?.data?.[0]?.b64_json;1103 const image = data?.data?.[0]?.b64_json;
1104 if (!image) {1104 if (!image) {
1105 console.error('NanoGPT returned invalid data.');1105 console.warn('NanoGPT returned invalid data.');
1106 return response.sendStatus(500);1106 return response.sendStatus(500);
1107 }1107 }
11081108
@@ -1121,7 +1121,7 @@ bfl.post('/generate', jsonParser, async (request, response) => {
1121 const key = readSecret(request.user.directories, SECRET_KEYS.BFL);1121 const key = readSecret(request.user.directories, SECRET_KEYS.BFL);
11221122
1123 if (!key) {1123 if (!key) {
1124 console.error('BFL key not found.');1124 console.warn('BFL key not found.');
1125 return response.sendStatus(400);1125 return response.sendStatus(400);
1126 }1126 }
11271127
@@ -1185,7 +1185,7 @@ bfl.post('/generate', jsonParser, async (request, response) => {
1185 });1185 });
11861186
1187 if (!result.ok) {1187 if (!result.ok) {
1188 console.error('BFL returned an error.');1188 console.warn('BFL returned an error.');
1189 return response.sendStatus(500);1189 return response.sendStatus(500);
1190 }1190 }
11911191
@@ -1201,7 +1201,7 @@ bfl.post('/generate', jsonParser, async (request, response) => {
12011201
1202 if (!statusResult.ok) {1202 if (!statusResult.ok) {
1203 const text = await statusResult.text();1203 const text = await statusResult.text();
1204 console.error('BFL returned an error.', text);1204 console.warn('BFL returned an error.', text);
1205 return response.sendStatus(500);1205 return response.sendStatus(500);
1206 }1206 }
12071207
src/endpoints/tokenizers.js+2 -2
@@ -988,7 +988,7 @@ router.post('/remote/kobold/count', jsonParser, async function (request, respons
988 const result = await fetch(url, args);988 const result = await fetch(url, args);
989989
990 if (!result.ok) {990 if (!result.ok) {
991 console.error(`API returned error: ${result.status} ${result.statusText}`);991 console.warn(`API returned error: ${result.status} ${result.statusText}`);
992 return response.send({ error: true });992 return response.send({ error: true });
993 }993 }
994994
@@ -1052,7 +1052,7 @@ router.post('/remote/textgenerationwebui/encode', jsonParser, async function (re
1052 const result = await fetch(url, args);1052 const result = await fetch(url, args);
10531053
1054 if (!result.ok) {1054 if (!result.ok) {
1055 console.error(`API returned error: ${result.status} ${result.statusText}`);1055 console.warn(`API returned error: ${result.status} ${result.statusText}`);
1056 return response.send({ error: true });1056 return response.send({ error: true });
1057 }1057 }
10581058
src/endpoints/translate.js+8 -8
@@ -46,7 +46,7 @@ router.post('/libre', jsonParser, async (request, response) => {
46 const url = readSecret(request.user.directories, SECRET_KEYS.LIBRE_URL);46 const url = readSecret(request.user.directories, SECRET_KEYS.LIBRE_URL);
4747
48 if (!url) {48 if (!url) {
49 console.error('LibreTranslate URL is not configured.');49 console.warn('LibreTranslate URL is not configured.');
50 return response.sendStatus(400);50 return response.sendStatus(400);
51 }51 }
5252
@@ -85,7 +85,7 @@ router.post('/libre', jsonParser, async (request, response) => {
8585
86 if (!result.ok) {86 if (!result.ok) {
87 const error = await result.text();87 const error = await result.text();
88 console.error('LibreTranslate error: ', result.statusText, error);88 console.warn('LibreTranslate error: ', result.statusText, error);
89 return response.sendStatus(500);89 return response.sendStatus(500);
90 }90 }
9191
@@ -116,7 +116,7 @@ router.post('/google', jsonParser, async (request, response) => {
116 const result = await fetch(requestUrl);116 const result = await fetch(requestUrl);
117117
118 if (!result.ok) {118 if (!result.ok) {
119 console.error('Google Translate error: ', result.statusText);119 console.warn('Google Translate error: ', result.statusText);
120 return response.sendStatus(500);120 return response.sendStatus(500);
121 }121 }
122122
@@ -173,7 +173,7 @@ router.post('/yandex', jsonParser, async (request, response) => {
173173
174 if (!result.ok) {174 if (!result.ok) {
175 const error = await result.text();175 const error = await result.text();
176 console.error('Yandex error: ', result.statusText, error);176 console.warn('Yandex error: ', result.statusText, error);
177 return response.sendStatus(500);177 return response.sendStatus(500);
178 }178 }
179179
@@ -220,7 +220,7 @@ router.post('/lingva', jsonParser, async (request, response) => {
220220
221 if (!result.ok) {221 if (!result.ok) {
222 const error = await result.text();222 const error = await result.text();
223 console.error('Lingva error: ', result.statusText, error);223 console.warn('Lingva error: ', result.statusText, error);
224 }224 }
225225
226 /** @type {any} */226 /** @type {any} */
@@ -238,7 +238,7 @@ router.post('/deepl', jsonParser, async (request, response) => {
238 const key = readSecret(request.user.directories, SECRET_KEYS.DEEPL);238 const key = readSecret(request.user.directories, SECRET_KEYS.DEEPL);
239239
240 if (!key) {240 if (!key) {
241 console.error('DeepL key is not configured.');241 console.warn('DeepL key is not configured.');
242 return response.sendStatus(400);242 return response.sendStatus(400);
243 }243 }
244244
@@ -280,7 +280,7 @@ router.post('/deepl', jsonParser, async (request, response) => {
280280
281 if (!result.ok) {281 if (!result.ok) {
282 const error = await result.text();282 const error = await result.text();
283 console.error('DeepL error: ', result.statusText, error);283 console.warn('DeepL error: ', result.statusText, error);
284 return response.sendStatus(500);284 return response.sendStatus(500);
285 }285 }
286286
@@ -393,7 +393,7 @@ router.post('/deeplx', jsonParser, async (request, response) => {
393393
394 if (!result.ok) {394 if (!result.ok) {
395 const error = await result.text();395 const error = await result.text();
396 console.error('DeepLX error: ', result.statusText, error);396 console.warn('DeepLX error: ', result.statusText, error);
397 return response.sendStatus(500);397 return response.sendStatus(500);
398 }398 }
399399
src/endpoints/users-admin.js+13 -13
@@ -53,12 +53,12 @@ router.post('/get', requireAdminMiddleware, jsonParser, async (_request, respons
53router.post('/disable', requireAdminMiddleware, jsonParser, async (request, response) => {53router.post('/disable', requireAdminMiddleware, jsonParser, async (request, response) => {
54 try {54 try {
55 if (!request.body.handle) {55 if (!request.body.handle) {
56 console.error('Disable user failed: Missing required fields');56 console.warn('Disable user failed: Missing required fields');
57 return response.status(400).json({ error: 'Missing required fields' });57 return response.status(400).json({ error: 'Missing required fields' });
58 }58 }
5959
60 if (request.body.handle === request.user.profile.handle) {60 if (request.body.handle === request.user.profile.handle) {
61 console.error('Disable user failed: Cannot disable yourself');61 console.warn('Disable user failed: Cannot disable yourself');
62 return response.status(400).json({ error: 'Cannot disable yourself' });62 return response.status(400).json({ error: 'Cannot disable yourself' });
63 }63 }
6464
@@ -82,7 +82,7 @@ router.post('/disable', requireAdminMiddleware, jsonParser, async (request, resp
82router.post('/enable', requireAdminMiddleware, jsonParser, async (request, response) => {82router.post('/enable', requireAdminMiddleware, jsonParser, async (request, response) => {
83 try {83 try {
84 if (!request.body.handle) {84 if (!request.body.handle) {
85 console.error('Enable user failed: Missing required fields');85 console.warn('Enable user failed: Missing required fields');
86 return response.status(400).json({ error: 'Missing required fields' });86 return response.status(400).json({ error: 'Missing required fields' });
87 }87 }
8888
@@ -106,7 +106,7 @@ router.post('/enable', requireAdminMiddleware, jsonParser, async (request, respo
106router.post('/promote', requireAdminMiddleware, jsonParser, async (request, response) => {106router.post('/promote', requireAdminMiddleware, jsonParser, async (request, response) => {
107 try {107 try {
108 if (!request.body.handle) {108 if (!request.body.handle) {
109 console.error('Promote user failed: Missing required fields');109 console.warn('Promote user failed: Missing required fields');
110 return response.status(400).json({ error: 'Missing required fields' });110 return response.status(400).json({ error: 'Missing required fields' });
111 }111 }
112112
@@ -130,12 +130,12 @@ router.post('/promote', requireAdminMiddleware, jsonParser, async (request, resp
130router.post('/demote', requireAdminMiddleware, jsonParser, async (request, response) => {130router.post('/demote', requireAdminMiddleware, jsonParser, async (request, response) => {
131 try {131 try {
132 if (!request.body.handle) {132 if (!request.body.handle) {
133 console.error('Demote user failed: Missing required fields');133 console.warn('Demote user failed: Missing required fields');
134 return response.status(400).json({ error: 'Missing required fields' });134 return response.status(400).json({ error: 'Missing required fields' });
135 }135 }
136136
137 if (request.body.handle === request.user.profile.handle) {137 if (request.body.handle === request.user.profile.handle) {
138 console.error('Demote user failed: Cannot demote yourself');138 console.warn('Demote user failed: Cannot demote yourself');
139 return response.status(400).json({ error: 'Cannot demote yourself' });139 return response.status(400).json({ error: 'Cannot demote yourself' });
140 }140 }
141141
@@ -159,7 +159,7 @@ router.post('/demote', requireAdminMiddleware, jsonParser, async (request, respo
159router.post('/create', requireAdminMiddleware, jsonParser, async (request, response) => {159router.post('/create', requireAdminMiddleware, jsonParser, async (request, response) => {
160 try {160 try {
161 if (!request.body.handle || !request.body.name) {161 if (!request.body.handle || !request.body.name) {
162 console.error('Create user failed: Missing required fields');162 console.warn('Create user failed: Missing required fields');
163 return response.status(400).json({ error: 'Missing required fields' });163 return response.status(400).json({ error: 'Missing required fields' });
164 }164 }
165165
@@ -167,12 +167,12 @@ router.post('/create', requireAdminMiddleware, jsonParser, async (request, respo
167 const handle = lodash.kebabCase(String(request.body.handle).toLowerCase().trim());167 const handle = lodash.kebabCase(String(request.body.handle).toLowerCase().trim());
168168
169 if (!handle) {169 if (!handle) {
170 console.error('Create user failed: Invalid handle');170 console.warn('Create user failed: Invalid handle');
171 return response.status(400).json({ error: 'Invalid handle' });171 return response.status(400).json({ error: 'Invalid handle' });
172 }172 }
173173
174 if (handles.some(x => x === handle)) {174 if (handles.some(x => x === handle)) {
175 console.error('Create user failed: User with that handle already exists');175 console.warn('Create user failed: User with that handle already exists');
176 return response.status(409).json({ error: 'User already exists' });176 return response.status(409).json({ error: 'User already exists' });
177 }177 }
178178
@@ -206,17 +206,17 @@ router.post('/create', requireAdminMiddleware, jsonParser, async (request, respo
206router.post('/delete', requireAdminMiddleware, jsonParser, async (request, response) => {206router.post('/delete', requireAdminMiddleware, jsonParser, async (request, response) => {
207 try {207 try {
208 if (!request.body.handle) {208 if (!request.body.handle) {
209 console.error('Delete user failed: Missing required fields');209 console.warn('Delete user failed: Missing required fields');
210 return response.status(400).json({ error: 'Missing required fields' });210 return response.status(400).json({ error: 'Missing required fields' });
211 }211 }
212212
213 if (request.body.handle === request.user.profile.handle) {213 if (request.body.handle === request.user.profile.handle) {
214 console.error('Delete user failed: Cannot delete yourself');214 console.warn('Delete user failed: Cannot delete yourself');
215 return response.status(400).json({ error: 'Cannot delete yourself' });215 return response.status(400).json({ error: 'Cannot delete yourself' });
216 }216 }
217217
218 if (request.body.handle === DEFAULT_USER.handle) {218 if (request.body.handle === DEFAULT_USER.handle) {
219 console.error('Delete user failed: Cannot delete default user');219 console.warn('Delete user failed: Cannot delete default user');
220 return response.status(400).json({ error: 'Sorry, but the default user cannot be deleted. It is required as a fallback.' });220 return response.status(400).json({ error: 'Sorry, but the default user cannot be deleted. It is required as a fallback.' });
221 }221 }
222222
@@ -238,7 +238,7 @@ router.post('/delete', requireAdminMiddleware, jsonParser, async (request, respo
238router.post('/slugify', requireAdminMiddleware, jsonParser, async (request, response) => {238router.post('/slugify', requireAdminMiddleware, jsonParser, async (request, response) => {
239 try {239 try {
240 if (!request.body.text) {240 if (!request.body.text) {
241 console.error('Slugify failed: Missing required fields');241 console.warn('Slugify failed: Missing required fields');
242 return response.status(400).json({ error: 'Missing required fields' });242 return response.status(400).json({ error: 'Missing required fields' });
243 }243 }
244244
src/endpoints/users-private.js+10 -10
@@ -58,7 +58,7 @@ router.get('/me', async (request, response) => {
58router.post('/change-avatar', jsonParser, async (request, response) => {58router.post('/change-avatar', jsonParser, async (request, response) => {
59 try {59 try {
60 if (!request.body.handle) {60 if (!request.body.handle) {
61 console.error('Change avatar failed: Missing required fields');61 console.warn('Change avatar failed: Missing required fields');
62 return response.status(400).json({ error: 'Missing required fields' });62 return response.status(400).json({ error: 'Missing required fields' });
63 }63 }
6464
@@ -69,7 +69,7 @@ router.post('/change-avatar', jsonParser, async (request, response) => {
6969
70 // Avatar is not a data URL or not an empty string70 // Avatar is not a data URL or not an empty string
71 if (!request.body.avatar.startsWith('data:image/') && request.body.avatar !== '') {71 if (!request.body.avatar.startsWith('data:image/') && request.body.avatar !== '') {
72 console.error('Change avatar failed: Invalid data URL');72 console.warn('Change avatar failed: Invalid data URL');
73 return response.status(400).json({ error: 'Invalid data URL' });73 return response.status(400).json({ error: 'Invalid data URL' });
74 }74 }
7575
@@ -93,7 +93,7 @@ router.post('/change-avatar', jsonParser, async (request, response) => {
93router.post('/change-password', jsonParser, async (request, response) => {93router.post('/change-password', jsonParser, async (request, response) => {
94 try {94 try {
95 if (!request.body.handle) {95 if (!request.body.handle) {
96 console.error('Change password failed: Missing required fields');96 console.warn('Change password failed: Missing required fields');
97 return response.status(400).json({ error: 'Missing required fields' });97 return response.status(400).json({ error: 'Missing required fields' });
98 }98 }
9999
@@ -142,7 +142,7 @@ router.post('/backup', jsonParser, async (request, response) => {
142 const handle = request.body.handle;142 const handle = request.body.handle;
143143
144 if (!handle) {144 if (!handle) {
145 console.error('Backup failed: Missing required fields');145 console.warn('Backup failed: Missing required fields');
146 return response.status(400).json({ error: 'Missing required fields' });146 return response.status(400).json({ error: 'Missing required fields' });
147 }147 }
148148
@@ -163,7 +163,7 @@ router.post('/reset-settings', jsonParser, async (request, response) => {
163 const password = request.body.password;163 const password = request.body.password;
164164
165 if (request.user.profile.password && request.user.profile.password !== getPasswordHash(password, request.user.profile.salt)) {165 if (request.user.profile.password && request.user.profile.password !== getPasswordHash(password, request.user.profile.salt)) {
166 console.error('Reset settings failed: Incorrect password');166 console.warn('Reset settings failed: Incorrect password');
167 return response.status(403).json({ error: 'Incorrect password' });167 return response.status(403).json({ error: 'Incorrect password' });
168 }168 }
169169
@@ -181,7 +181,7 @@ router.post('/reset-settings', jsonParser, async (request, response) => {
181router.post('/change-name', jsonParser, async (request, response) => {181router.post('/change-name', jsonParser, async (request, response) => {
182 try {182 try {
183 if (!request.body.name || !request.body.handle) {183 if (!request.body.name || !request.body.handle) {
184 console.error('Change name failed: Missing required fields');184 console.warn('Change name failed: Missing required fields');
185 return response.status(400).json({ error: 'Missing required fields' });185 return response.status(400).json({ error: 'Missing required fields' });
186 }186 }
187187
@@ -194,7 +194,7 @@ router.post('/change-name', jsonParser, async (request, response) => {
194 const user = await storage.getItem(toKey(request.body.handle));194 const user = await storage.getItem(toKey(request.body.handle));
195195
196 if (!user) {196 if (!user) {
197 console.error('Change name failed: User not found');197 console.warn('Change name failed: User not found');
198 return response.status(404).json({ error: 'User not found' });198 return response.status(404).json({ error: 'User not found' });
199 }199 }
200200
@@ -225,19 +225,19 @@ router.post('/reset-step1', jsonParser, async (request, response) => {
225router.post('/reset-step2', jsonParser, async (request, response) => {225router.post('/reset-step2', jsonParser, async (request, response) => {
226 try {226 try {
227 if (!request.body.code) {227 if (!request.body.code) {
228 console.error('Recover step 2 failed: Missing required fields');228 console.warn('Recover step 2 failed: Missing required fields');
229 return response.status(400).json({ error: 'Missing required fields' });229 return response.status(400).json({ error: 'Missing required fields' });
230 }230 }
231231
232 if (request.user.profile.password && request.user.profile.password !== getPasswordHash(request.body.password, request.user.profile.salt)) {232 if (request.user.profile.password && request.user.profile.password !== getPasswordHash(request.body.password, request.user.profile.salt)) {
233 console.error('Recover step 2 failed: Incorrect password');233 console.warn('Recover step 2 failed: Incorrect password');
234 return response.status(400).json({ error: 'Incorrect password' });234 return response.status(400).json({ error: 'Incorrect password' });
235 }235 }
236236
237 const code = RESET_CACHE.get(request.user.profile.handle);237 const code = RESET_CACHE.get(request.user.profile.handle);
238238
239 if (!code || code !== request.body.code) {239 if (!code || code !== request.body.code) {
240 console.error('Recover step 2 failed: Incorrect code');240 console.warn('Recover step 2 failed: Incorrect code');
241 return response.status(400).json({ error: 'Incorrect code' });241 return response.status(400).json({ error: 'Incorrect code' });
242 }242 }
243243
src/endpoints/users-public.js+7 -7
@@ -56,7 +56,7 @@ router.post('/list', async (_request, response) => {
56router.post('/login', jsonParser, async (request, response) => {56router.post('/login', jsonParser, async (request, response) => {
57 try {57 try {
58 if (!request.body.handle) {58 if (!request.body.handle) {
59 console.error('Login failed: Missing required fields');59 console.warn('Login failed: Missing required fields');
60 return response.status(400).json({ error: 'Missing required fields' });60 return response.status(400).json({ error: 'Missing required fields' });
61 }61 }
6262
@@ -72,12 +72,12 @@ router.post('/login', jsonParser, async (request, response) => {
72 }72 }
7373
74 if (!user.enabled) {74 if (!user.enabled) {
75 console.error('Login failed: User', user.handle, 'is disabled');75 console.warn('Login failed: User', user.handle, 'is disabled');
76 return response.status(403).json({ error: 'User is disabled' });76 return response.status(403).json({ error: 'User is disabled' });
77 }77 }
7878
79 if (user.password && user.password !== getPasswordHash(request.body.password, user.salt)) {79 if (user.password && user.password !== getPasswordHash(request.body.password, user.salt)) {
80 console.error('Login failed: Incorrect password for', user.handle);80 console.warn('Login failed: Incorrect password for', user.handle);
81 return response.status(403).json({ error: 'Incorrect credentials' });81 return response.status(403).json({ error: 'Incorrect credentials' });
82 }82 }
8383
@@ -104,7 +104,7 @@ router.post('/login', jsonParser, async (request, response) => {
104router.post('/recover-step1', jsonParser, async (request, response) => {104router.post('/recover-step1', jsonParser, async (request, response) => {
105 try {105 try {
106 if (!request.body.handle) {106 if (!request.body.handle) {
107 console.error('Recover step 1 failed: Missing required fields');107 console.warn('Recover step 1 failed: Missing required fields');
108 return response.status(400).json({ error: 'Missing required fields' });108 return response.status(400).json({ error: 'Missing required fields' });
109 }109 }
110110
@@ -144,7 +144,7 @@ router.post('/recover-step1', jsonParser, async (request, response) => {
144router.post('/recover-step2', jsonParser, async (request, response) => {144router.post('/recover-step2', jsonParser, async (request, response) => {
145 try {145 try {
146 if (!request.body.handle || !request.body.code) {146 if (!request.body.handle || !request.body.code) {
147 console.error('Recover step 2 failed: Missing required fields');147 console.warn('Recover step 2 failed: Missing required fields');
148 return response.status(400).json({ error: 'Missing required fields' });148 return response.status(400).json({ error: 'Missing required fields' });
149 }149 }
150150
@@ -158,7 +158,7 @@ router.post('/recover-step2', jsonParser, async (request, response) => {
158 }158 }
159159
160 if (!user.enabled) {160 if (!user.enabled) {
161 console.error('Recover step 2 failed: User', user.handle, 'is disabled');161 console.warn('Recover step 2 failed: User', user.handle, 'is disabled');
162 return response.status(403).json({ error: 'User is disabled' });162 return response.status(403).json({ error: 'User is disabled' });
163 }163 }
164164
@@ -166,7 +166,7 @@ router.post('/recover-step2', jsonParser, async (request, response) => {
166166
167 if (request.body.code !== mfaCode) {167 if (request.body.code !== mfaCode) {
168 await recoverLimiter.consume(ip);168 await recoverLimiter.consume(ip);
169 console.error('Recover step 2 failed: Incorrect code');169 console.warn('Recover step 2 failed: Incorrect code');
170 return response.status(403).json({ error: 'Incorrect code' });170 return response.status(403).json({ error: 'Incorrect code' });
171 }171 }
172172