From d183b82a7c3b962f82220d57150c04d17add2de9 Mon Sep 17 00:00:00 2001 From: Astrian Zheng Date: Sat, 11 Jan 2025 21:57:51 +1100 Subject: [PATCH] feat: implement createPayer function and enhance /payer route with error handling --- backend/src/app.ts | 33 +++++++++++++++++++------------- backend/src/func/createPayer.ts | 10 ++++++++++ backend/src/func/index.ts | 5 +++++ backend/src/types/HttpError.d.ts | 13 +++++++++++++ 4 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 backend/src/func/createPayer.ts create mode 100644 backend/src/func/index.ts create mode 100644 backend/src/types/HttpError.d.ts diff --git a/backend/src/app.ts b/backend/src/app.ts index 529e5a0..1150e5b 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -3,6 +3,7 @@ import dotenv from 'dotenv' import route from 'koa-route' import Debug from 'debug' import koaBody from 'koa-body' +import func from './func' dotenv.config() console.log = Debug('invoiceIssuer:app.ts') @@ -19,21 +20,27 @@ const getRoot = route.get('/', (ctx) => { ctx.body = 'Hello World' }) -/** - * POST /payer - * @summary 创建一个新的付款人。这个付款人与收据上标识的收款人信息分离,但内部数据库关联(以便检索)。 - * @param {Koa.Context} ctx - Koa context object - */ + const postPayer = route.post('/payer', async (ctx) => { - // TODO: 请求头验证 bearer token + // TODO: 请求头验证 bearer token + + const { name, address, email, abn } = ctx.request.body + if (!name || !address || !email) { + ctx.throw(400, 'required_fields_missing') + } - const { name, address, abn, email } = ctx.request.body - - if (!name || !address || !email) { - ctx.status = 400; - ctx.body = { error: 'required_fields_missing' } - return; - } + try { + const payer = await func.createPayer(name, address, email, abn) + ctx.body = payer + } catch (e) { + if (e instanceof HttpError) { + ctx.status = e.status + ctx.body = e.message + } else { + console.error(e) + ctx.throw(500, 'unknown_issues') + } + } }) // 导出路由 diff --git a/backend/src/func/createPayer.ts b/backend/src/func/createPayer.ts new file mode 100644 index 0000000..63e5729 --- /dev/null +++ b/backend/src/func/createPayer.ts @@ -0,0 +1,10 @@ +/** + * POST /payer + * @summary 创建一个新的付款人。这个付款人与收据上标识的收款人信息分离,但内部数据库关联(以便检索)。 + * @param {string} name - 付款人的名字 + * @param {string} address - 付款人的地址 + * @param {string} email - 付款人的电子邮件地址 + * @param {string} abn - 付款人的澳大利亚商业号码 + */ +export default async (name: string, address: string, email: string, abn?: string) => { +} \ No newline at end of file diff --git a/backend/src/func/index.ts b/backend/src/func/index.ts new file mode 100644 index 0000000..2a94fb1 --- /dev/null +++ b/backend/src/func/index.ts @@ -0,0 +1,5 @@ +import createPayer from "./createPayer" + +export default { + createPayer +} \ No newline at end of file diff --git a/backend/src/types/HttpError.d.ts b/backend/src/types/HttpError.d.ts new file mode 100644 index 0000000..4afcbff --- /dev/null +++ b/backend/src/types/HttpError.d.ts @@ -0,0 +1,13 @@ +/** + * 用于规范化向用户返回的错误信息。信息与状态码皆为枚举类型,以便前端进行 i18n、保证错误信息的准确性, + * 同时保证返回的格式符合 HTTP 规范。 + */ +class HttpError extends Error { + /** + * 创建一个新的 HTTP 错误。 + * @param message 错误的消息。 + * @param status 错误的状态码。 + */ + constructor(message: 'required_fields_missing' | 'unknown_issues', status: number); + status: 400 | 401 | 403 | 404 | 500; +} \ No newline at end of file