From 7da35777223b4c09b8805572d08e95bda7066034 Mon Sep 17 00:00:00 2001 From: Alexander Alemayhu Date: Tue, 31 Dec 2024 05:32:11 +0100 Subject: [PATCH] refactor: remove the deprecated sendError Logging the error inline makes it more clear and what is happening. Signed-off-by: Alexander Alemayhu --- .../CardOptionsController.ts | 10 ++++---- src/controllers/DownloadController.ts | 4 ++-- src/controllers/JobController.ts | 4 ++-- src/controllers/NotionController.ts | 11 +++++---- src/controllers/ParserRulesController.ts | 7 +++--- src/controllers/Upload/UploadController.ts | 10 ++++---- src/controllers/UsersControllers.ts | 24 ++++++++++++------- src/lib/anki/CardGenerator.ts | 4 ++-- src/lib/error/sendError.ts | 11 --------- src/lib/parser/DeckParser.ts | 7 +++--- src/lib/parser/Settings/CardOption.ts | 4 ++-- .../Settings/loadSettingsFromDatabase.ts | 4 ++-- src/lib/storage/StorageHandler.ts | 10 ++++---- src/lib/storage/jobs/ConversionJob.ts | 3 +-- src/routes/middleware/ErrorHandler.tsx | 4 ++-- src/server.ts | 7 +++--- src/services/AuthenticationService.ts | 3 +-- .../BlockHandler/BlockHandler.ts | 4 ++-- src/services/NotionService/NotionService.ts | 4 ++-- src/services/UploadService.ts | 3 +-- 20 files changed, 69 insertions(+), 69 deletions(-) delete mode 100644 src/lib/error/sendError.ts diff --git a/src/controllers/CardOptionsController/CardOptionsController.ts b/src/controllers/CardOptionsController/CardOptionsController.ts index f4839f8c9..c33e8b89f 100644 --- a/src/controllers/CardOptionsController/CardOptionsController.ts +++ b/src/controllers/CardOptionsController/CardOptionsController.ts @@ -1,5 +1,4 @@ import { Request, Response } from 'express'; -import { sendError } from '../../lib/error/sendError'; import { IServiceSettings } from '../../services/SettingsService'; import { getOwner } from '../../lib/User/getOwner'; import supportedOptions from './supportedOptions'; @@ -22,7 +21,8 @@ class CardOptionsController { }); res.status(200).send(); } catch (error) { - sendError(error); + console.info('Create setting failed'); + console.error(error); res.status(400).send(); } } @@ -35,7 +35,8 @@ class CardOptionsController { await this.service.delete(owner, id); res.status(200).send(); } catch (error) { - sendError(error); + console.info('Delete setting failed'); + console.error(error); res.status(400).send(); } } @@ -52,7 +53,8 @@ class CardOptionsController { const storedSettings = await this.service.getById(id); return res.json({ payload: storedSettings }); } catch (error) { - sendError(error); + console.info('Get setting failed'); + console.error(error); res.status(400).send(); } } diff --git a/src/controllers/DownloadController.ts b/src/controllers/DownloadController.ts index 175ecbb7c..a96322e8a 100644 --- a/src/controllers/DownloadController.ts +++ b/src/controllers/DownloadController.ts @@ -3,7 +3,6 @@ import fs from 'fs'; import { Request, Response } from 'express'; import path from 'path'; -import { sendError } from '../lib/error/sendError'; import StorageHandler from '../lib/storage/StorageHandler'; import DownloadService from '../services/DownloadService'; import { canAccess } from '../lib/misc/canAccess'; @@ -34,7 +33,8 @@ class DownloadController { this.service.deleteMissingFile(owner, key); res.redirect('/uploads'); } else { - sendError(error); + console.info('Download failed'); + console.error(error); res .status(404) .send( diff --git a/src/controllers/JobController.ts b/src/controllers/JobController.ts index d7987c729..7fc0941a1 100644 --- a/src/controllers/JobController.ts +++ b/src/controllers/JobController.ts @@ -1,6 +1,5 @@ import express from 'express'; -import { sendError } from '../lib/error/sendError'; import JobService from '../services/JobService'; import { getOwner } from '../lib/User/getOwner'; @@ -20,7 +19,8 @@ class JobController { res.status(200).send(); } catch (error) { res.status(500).send(); - sendError(error); + console.info('Delete job failed'); + console.error(error); } } } diff --git a/src/controllers/NotionController.ts b/src/controllers/NotionController.ts index e0d17617e..60f8ee105 100644 --- a/src/controllers/NotionController.ts +++ b/src/controllers/NotionController.ts @@ -1,6 +1,5 @@ import { Request, Response } from 'express'; -import { sendError } from '../lib/error/sendError'; import performConversion from '../lib/storage/jobs/helpers/performConversion'; import CardOption from '../lib/parser/Settings'; import BlockHandler from '../services/NotionService/BlockHandler/BlockHandler'; @@ -30,7 +29,8 @@ class NotionController { await this.service.connectToNotion(authorizationCode, res.locals.owner); return res.redirect('/search'); } catch (err) { - sendError(err); + console.info('Connect to Notion failed'); + console.error(err); return res.redirect('/search'); } } @@ -175,7 +175,8 @@ class NotionController { ); return res.json(database); } catch (error) { - sendError(error); + console.info('Get database failed'); + console.error(error); res.status(500).send(); } } @@ -195,8 +196,8 @@ class NotionController { const deletion = await this.service.disconnect(res.locals.owner); res.status(200).send({ didDelete: deletion }); } catch (err) { - sendError(err); - console.debug('Failed to disconnect'); + console.info('Disconnect from Notion failed'); + console.error(err); res.status(500).send({ didDelete: false }); } } diff --git a/src/controllers/ParserRulesController.ts b/src/controllers/ParserRulesController.ts index 1cbe9d006..dc6fd9cf3 100644 --- a/src/controllers/ParserRulesController.ts +++ b/src/controllers/ParserRulesController.ts @@ -1,6 +1,5 @@ import { Request, Response } from 'express'; -import { sendError } from '../lib/error/sendError'; import ParserRulesService from '../services/ParserRulesService'; import { getOwner } from '../lib/User/getOwner'; @@ -22,7 +21,8 @@ class RulesController { ); res.status(200).send(result); } catch (error) { - sendError(error); + console.info('Create rule failed'); + console.error(error); res.status(400).send(); } } @@ -38,7 +38,8 @@ class RulesController { const rule = await this.service.getById(id); res.status(200).json(rule); } catch (err) { - sendError(err); + console.info('Get rule failed'); + console.error(err); res.status(200).json(); } } diff --git a/src/controllers/Upload/UploadController.ts b/src/controllers/Upload/UploadController.ts index 930a57e85..4eafe618c 100644 --- a/src/controllers/Upload/UploadController.ts +++ b/src/controllers/Upload/UploadController.ts @@ -1,7 +1,6 @@ import express from 'express'; import { getOwner } from '../../lib/User/getOwner'; -import { sendError } from '../../lib/error/sendError'; import NotionService from '../../services/NotionService'; import UploadService from '../../services/UploadService'; import { getUploadHandler } from '../../lib/misc/GetUploadHandler'; @@ -28,7 +27,8 @@ class UploadController { await this.service.deleteUpload(owner, key); await this.notionService.purgeBlockCache(owner); } catch (error) { - sendError(error); + console.info('Delete upload failed'); + console.error(error); return res.status(500).send(); } @@ -41,7 +41,8 @@ class UploadController { const uploads = await this.service.getUploadsByOwner(owner); res.json(uploads); } catch (error) { - sendError(error); + console.info('Get uploads failed'); + console.error(error); res.status(400); } } @@ -58,7 +59,8 @@ class UploadController { await this.service.handleUpload(req, res); }); } catch (error) { - sendError(error); + console.info('Upload file failed'); + console.error(error); res.status(400); } } diff --git a/src/controllers/UsersControllers.ts b/src/controllers/UsersControllers.ts index d0b5e4c4a..a56337fc6 100644 --- a/src/controllers/UsersControllers.ts +++ b/src/controllers/UsersControllers.ts @@ -1,6 +1,5 @@ import express from 'express'; -import { sendError } from '../lib/error/sendError'; import AuthenticationService from '../services/AuthenticationService'; import UsersService from '../services/UsersService'; import { getRedirect } from './helpers/getRedirect'; @@ -35,7 +34,8 @@ class UsersController { ); res.status(200).send({ message: 'ok' }); } catch (error) { - sendError(error); + console.info('Update password failed'); + console.error(error); next(new Error('Failed to create new password.')); } } @@ -56,7 +56,8 @@ class UsersController { await this.userService.sendResetEmail(email, this.authService); return res.status(200).json({ message: 'ok' }); } catch (error) { - sendError(error); + console.info('Send reset email failed'); + console.error(error); next(error); } } @@ -72,7 +73,8 @@ class UsersController { res.clearCookie('token'); res.redirect('/'); } catch (error) { - sendError(error); + console.info('Log out failed'); + console.error(error); next(error); } } @@ -111,7 +113,8 @@ class UsersController { res.status(200).json({ token, redirect: getRedirect(req) }); } } catch (error) { - sendError(error); + console.info('Login failed'); + console.error(error); next( new Error('Failed to login, please try again or register your account.') ); @@ -144,7 +147,8 @@ class UsersController { ); res.status(200).json({ message: 'ok' }); } catch (error) { - sendError(error); + console.info('Register failed'); + console.error(error); return next(error); } } @@ -162,7 +166,8 @@ class UsersController { } return res.redirect('/login'); } catch (err) { - sendError(err); + console.info('Reset password failed'); + console.error(err); next(err); } } @@ -209,8 +214,8 @@ class UsersController { await this.userService.updateSubscriptionLinkedEmail(owner, email); return res.status(200).json({}); } catch (error) { + console.info('Link email failed'); console.error(error); - sendError(error); return res.status(500).json({ message: 'Failed to link email' }); } } @@ -225,7 +230,8 @@ class UsersController { await this.userService.deleteUser(owner); res.status(200).json({}); } catch (error) { - sendError(error); + console.info('Delete account failed'); + console.error(error); return res.status(500).json({ message: 'Failed to delete account' }); } } diff --git a/src/lib/anki/CardGenerator.ts b/src/lib/anki/CardGenerator.ts index e848b7507..6a0f4000d 100644 --- a/src/lib/anki/CardGenerator.ts +++ b/src/lib/anki/CardGenerator.ts @@ -3,7 +3,6 @@ import { homedir } from 'os'; import path from 'path'; import { CREATE_DECK_SCRIPT_PATH, resolvePath } from '../constants'; -import { sendError } from '../error/sendError'; function PYTHON() { const os = process.platform; @@ -36,7 +35,8 @@ class CardGenerator { }); process.on('error', (err) => { - sendError(err); + console.info('Create deck failed'); + console.error(err); reject(err); }); diff --git a/src/lib/error/sendError.ts b/src/lib/error/sendError.ts deleted file mode 100644 index c3b7b60e6..000000000 --- a/src/lib/error/sendError.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const sendError = (error: unknown) => { - console.warn( - 'sendError is deprecated, instead handle the error on the callsite' - ); - console.error(error); - if (error instanceof Error) { - console.error(error); - } else { - console.log('unknown error ' + error); - } -}; diff --git a/src/lib/parser/DeckParser.ts b/src/lib/parser/DeckParser.ts index cf8dfd66b..c8c69a170 100644 --- a/src/lib/parser/DeckParser.ts +++ b/src/lib/parser/DeckParser.ts @@ -13,7 +13,6 @@ import replaceAll from './helpers/replaceAll'; import get16DigitRandomId from '../../shared/helpers/get16DigitRandomId'; import { isValidAudioFile } from '../anki/format'; -import { sendError } from '../error/sendError'; import FallbackParser from './experimental/FallbackParser'; import { embedFile } from './exporters/embedFile'; import getYouTubeEmbedLink from './helpers/getYouTubeEmbedLink'; @@ -164,7 +163,7 @@ export class DeckParser { `; } catch (error) { console.info('experienced error while getting link'); - sendError(error); + console.error(error); return null; } } @@ -275,7 +274,7 @@ export class DeckParser { return getYouTubeID(input); } catch (error) { console.debug('error in getYouTubeID'); - sendError(error); + console.error(error); return null; } }); @@ -299,7 +298,7 @@ export class DeckParser { return m[0].split('">')[0]; } catch (error) { console.debug('error in getSoundCloudURL'); - sendError(error); + console.error(error); return null; } }); diff --git a/src/lib/parser/Settings/CardOption.ts b/src/lib/parser/Settings/CardOption.ts index e900bfbe6..401d640f3 100644 --- a/src/lib/parser/Settings/CardOption.ts +++ b/src/lib/parser/Settings/CardOption.ts @@ -1,7 +1,6 @@ import { parseTemplate } from './helpers/parseTemplate'; import { UserSuppliedTemplateFile } from './types'; -import { sendError } from '../../error/sendError'; class CardOption { readonly deckName: string | undefined; @@ -121,7 +120,8 @@ class CardOption { this.n2aCloze = parseTemplate(input['n2a-cloze']); this.n2aInput = parseTemplate(input['n2a-input']); } catch (error) { - sendError(error); + console.info('Retrieve templates failed'); + console.error(error); } } diff --git a/src/lib/parser/Settings/loadSettingsFromDatabase.ts b/src/lib/parser/Settings/loadSettingsFromDatabase.ts index 116e1aaef..a3467ec8d 100644 --- a/src/lib/parser/Settings/loadSettingsFromDatabase.ts +++ b/src/lib/parser/Settings/loadSettingsFromDatabase.ts @@ -1,7 +1,6 @@ import { Knex } from 'knex'; import { getCustomTemplate } from './helpers/getCustomTemplate'; -import { sendError } from '../../error/sendError'; import CardOption from './CardOption'; export const loadSettingsFromDatabase = async ( @@ -42,7 +41,8 @@ export const loadSettingsFromDatabase = async ( } return settings; } catch (error: unknown) { - sendError(error); + console.info('Load settings from database failed'); + console.error(error); } return new CardOption(CardOption.LoadDefaultOptions()); }; diff --git a/src/lib/storage/StorageHandler.ts b/src/lib/storage/StorageHandler.ts index d02d6eb1f..d2dd3f4ee 100644 --- a/src/lib/storage/StorageHandler.ts +++ b/src/lib/storage/StorageHandler.ts @@ -1,6 +1,5 @@ import aws from 'aws-sdk'; import { ObjectList } from 'aws-sdk/clients/s3'; -import { sendError } from '../error/sendError'; class StorageHandler { s3: aws.S3; @@ -42,7 +41,8 @@ class StorageHandler { .promise(); return true; } catch (err) { - sendError(err); + console.info('Delete file failed'); + console.error(err); return false; } } @@ -68,7 +68,8 @@ class StorageHandler { } } catch (err) { if (err) { - sendError(err); + console.info('Get contents failed'); + console.error(err); return reject(err); } } @@ -108,7 +109,8 @@ class StorageHandler { }, (err, response) => { if (err) { - sendError(err); + console.info('Upload file failed'); + console.error(err); reject(err); } else { resolve(response); diff --git a/src/lib/storage/jobs/ConversionJob.ts b/src/lib/storage/jobs/ConversionJob.ts index 13a0d6cfa..2f815f536 100644 --- a/src/lib/storage/jobs/ConversionJob.ts +++ b/src/lib/storage/jobs/ConversionJob.ts @@ -11,7 +11,6 @@ import { addDeckNameSuffix, isValidDeckName, } from '../../anki/format'; -import { sendError } from '../../error/sendError'; import { FileSizeInMegaBytes } from '../../misc/file'; import CustomExporter from '../../parser/exporters/CustomExporter'; import Deck from '../../parser/Deck'; @@ -85,8 +84,8 @@ export default class ConversionJob { .merge(); return true; } catch (error) { + console.info('Set status failed'); console.error(error); - sendError(error); } } diff --git a/src/routes/middleware/ErrorHandler.tsx b/src/routes/middleware/ErrorHandler.tsx index 091dec9d2..01544102b 100644 --- a/src/routes/middleware/ErrorHandler.tsx +++ b/src/routes/middleware/ErrorHandler.tsx @@ -1,5 +1,4 @@ import express from 'express'; -import { sendError } from '../../lib/error/sendError'; import { UploadedFile } from '../../lib/storage/types'; import { isLimitError } from '../../lib/misc/isLimitError'; import { isEmptyPayload } from '../../lib/misc/isEmptyPayload'; @@ -14,7 +13,8 @@ export default function ErrorHandler( const skipError = isLimitError(err); if (!skipError) { - sendError(err); + console.info('Send error'); + console.error(err); if (!isEmptyPayload(uploadedFiles)) { perserveFilesForDebugging(req.files as UploadedFile[], err); } diff --git a/src/server.ts b/src/server.ts index c79c88805..f826677c2 100644 --- a/src/server.ts +++ b/src/server.ts @@ -29,12 +29,13 @@ import templatesRouter from './routes/TemplatesRouter'; import defaultRouter from './routes/DefaultRouter'; import webhookRouter from './routes/WebhookRouter'; -import { sendError } from './lib/error/sendError'; - import { getDatabase, setupDatabase } from './data_layer'; function registerSignalHandlers(server: http.Server) { - process.on('uncaughtException', sendError); + process.on('uncaughtException', (error) => { + console.error('Uncaught Exception:', error); + process.exit(1); + }); process.on('SIGTERM', () => { console.debug('SIGTERM signal received: closing HTTP server'); server.close(() => { diff --git a/src/services/AuthenticationService.ts b/src/services/AuthenticationService.ts index 692491603..84626a28c 100644 --- a/src/services/AuthenticationService.ts +++ b/src/services/AuthenticationService.ts @@ -9,7 +9,6 @@ import UsersRepository from '../data_layer/UsersRepository'; import Users from '../data_layer/public/Users'; import { Knex } from 'knex'; import axios from 'axios'; -import { sendError } from '../lib/error/sendError'; export interface UserWithOwner extends Users { owner: number; @@ -163,7 +162,7 @@ class AuthenticationService { }; } catch (error) { console.info("Couldn't login with Google"); - sendError(error); + console.error(error); } } } diff --git a/src/services/NotionService/BlockHandler/BlockHandler.ts b/src/services/NotionService/BlockHandler/BlockHandler.ts index 1e479425b..744261f94 100644 --- a/src/services/NotionService/BlockHandler/BlockHandler.ts +++ b/src/services/NotionService/BlockHandler/BlockHandler.ts @@ -12,7 +12,6 @@ import axios from 'axios'; import getDeckName from '../../../lib/anki/getDeckname'; import sanitizeTags from '../../../lib/anki/sanitizeTags'; -import { sendError } from '../../../lib/error/sendError'; import { S3FileName, SuffixFrom } from '../../../lib/misc/file'; import getUniqueFileName from '../../../lib/misc/getUniqueFileName'; import Deck from '../../../lib/parser/Deck'; @@ -135,7 +134,8 @@ class BlockHandler { const requestChildren = response2.results; return await renderBack(this, requestChildren, response2, handleChildren); } catch (e: unknown) { - sendError(e); + console.info('Get back side failed'); + console.error(e); return null; } } diff --git a/src/services/NotionService/NotionService.ts b/src/services/NotionService/NotionService.ts index b65983106..2ae3c9c97 100644 --- a/src/services/NotionService/NotionService.ts +++ b/src/services/NotionService/NotionService.ts @@ -2,7 +2,6 @@ import { APIErrorCode } from '@notionhq/client'; import axios from 'axios'; import { INotionRepository } from '../../data_layer/NotionRespository'; -import { sendError } from '../../lib/error/sendError'; import hashToken from '../../lib/misc/hashToken'; import NotionAPIWrapper from './NotionAPIWrapper'; import { getNotionId } from './getNotionId'; @@ -119,7 +118,8 @@ export class NotionService { resolve(res.data); } } catch (err) { - sendError(err); + console.info('Get access data failed'); + console.error(err); reject(err); } }); diff --git a/src/services/UploadService.ts b/src/services/UploadService.ts index c0fa53edb..8585f675a 100644 --- a/src/services/UploadService.ts +++ b/src/services/UploadService.ts @@ -1,7 +1,6 @@ import express from 'express'; import { IUploadRepository } from '../data_layer/UploadRespository'; -import { sendError } from '../lib/error/sendError'; import ErrorHandler from '../routes/middleware/ErrorHandler'; import CardOption from '../lib/parser/Settings'; import Workspace from '../lib/parser/WorkSpace'; @@ -59,8 +58,8 @@ class UploadService { try { res.set('File-Name', encodeURIComponent(first.name)); } catch (err) { - sendError(err); console.info(`failed to set name ${first.name}`); + console.error(err); } res.attachment(`/${first.name}`);