Files
kt-financial-system/apps/backend/api/finance/transactions.post.ts
你的用户名 b68511b2e2
Some checks failed
Deploy to Production / Build and Test (push) Successful in 10m51s
Deploy to Production / Deploy to Server (push) Failing after 6m41s
feat: migrate backend storage to postgres
2025-11-06 22:01:50 +08:00

92 lines
2.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { TransactionStatus } from '~/utils/finance-repository';
import { readBody } from 'h3';
import {
createTransaction,
getAccountById,
getCategoryById,
} from '~/utils/finance-repository';
import { useResponseError, useResponseSuccess } from '~/utils/response';
import { notifyTransaction } from '~/utils/telegram-bot';
import { notifyTransactionWebhook } from '~/utils/telegram-webhook';
const DEFAULT_CURRENCY = 'CNY';
const ALLOWED_STATUSES = new Set<TransactionStatus>([
'draft',
'pending',
'approved',
'rejected',
'paid',
]);
export default defineEventHandler(async (event) => {
const body = await readBody(event);
if (!body?.type || !body?.amount || !body?.transactionDate) {
return useResponseError('缺少必填字段', -1);
}
const amount = Number(body.amount);
if (Number.isNaN(amount)) {
return useResponseError('金额格式不正确', -1);
}
const status = (body.status as TransactionStatus | undefined) ?? 'approved';
if (!ALLOWED_STATUSES.has(status)) {
return useResponseError('状态值不合法', -1);
}
const transaction = await createTransaction({
type: body.type,
amount,
currency: body.currency ?? DEFAULT_CURRENCY,
categoryId: body.categoryId ?? null,
accountId: body.accountId ?? null,
transactionDate: body.transactionDate,
description: body.description ?? '',
project: body.project ?? null,
memo: body.memo ?? null,
status,
reimbursementBatch: body.reimbursementBatch ?? null,
reviewNotes: body.reviewNotes ?? null,
submittedBy: body.submittedBy ?? null,
approvedBy: body.approvedBy ?? null,
statusUpdatedAt: body.statusUpdatedAt ?? undefined,
approvedAt: body.approvedAt ?? undefined,
});
// 发送Webhook通知保留原有功能
notifyTransactionWebhook(transaction, { action: 'created' }).catch((error) =>
console.error('[finance][transactions.post] webhook notify failed', error),
);
// 发送Telegram通知新功能
try {
const category = transaction.categoryId
? await getCategoryById(transaction.categoryId)
: null;
const account = transaction.accountId
? await getAccountById(transaction.accountId)
: null;
await notifyTransaction(
{
id: transaction.id,
type: transaction.type,
amount: transaction.amount,
currency: transaction.currency,
categoryName: category?.name,
accountName: account?.name,
transactionDate: transaction.transactionDate,
description: transaction.description || undefined,
status: transaction.status,
},
'created',
);
} catch (error) {
console.error('[finance][transactions.post] telegram notify failed', error);
}
return useResponseSuccess(transaction);
});