tekru-labs/elfatoora-middleware

GitHub: tekru-labs/elfatoora-middleware

一个用于 TEIF 电子发票的中间件 API,封装从验证、生成、签名到提交与跟踪的完整流程。

Stars: 13 | Forks: 6

# Elfatoora API 一个用于 TEIF(突尼斯电子发票格式)电子发票的中间件 API。该服务提供 JSON 验证、TEIF XML 生成、通过 ngsign 的数字签名、TTN(税务机构)提交、状态轮询、签名验证以及第三方 invoicing 系统的 Webhook 集成。 ## 概述 Elfatoora API 作为第三方 invoicing 系统与突尼斯电子发票基础设施之间的桥梁。它处理电子发票的完整生命周期,从验证到提交和跟踪。 ### 主要特性 - **JSON Schema 验证**:根据预定义模式验证发票文档 - **TEIF XML 生成**:将验证后的 JSON 发票转换为 TEIF XML 格式 - **数字签名**:与 ngsign 集成,对文档进行加密签名 - **TTN 提交**:通过 Web 服务或 SFTP 将签名后的发票提交给突尼斯税务机构(TTN) - **SFTP 支持**:用于发票上传和下载的安全文件传输 - **状态轮询**:用于跟踪发票处理状态的后台任务 - **签名验证**:验证已提交文档的数字签名 - **Webhook 支持**:通知第三方系统发票处理结果 ## 技术栈 - **运行时**:Node.js 24+ - **语言**:TypeScript - **包管理器**:pnpm 10.28.0 - **框架**:Express.js 5.2.1 - **数据库**:PostgreSQL 与 Kysely ORM - **验证**:Zod - **调度**:node-cron - **XML 处理**:fast-xml-parser ## 项目结构 ``` src/ ├── index.ts # Entry point ├── business-logic/ # Core business logic │ ├── auth/ # Authentication & token management │ ├── document/ # Document calculations and processing │ ├── ngsign/ # Digital signing integration │ ├── teif/ # TEIF XML generation and type definitions │ └── ttn/ # TTN integration │ ├── ws/ # Web service submission │ ├── sftp/ # SFTP file transfer for TTN │ └── ...workers # Background workers ├── controllers/ # Request handlers ├── cron/ # Scheduled jobs ├── db/ # Database client, migrations, and schema ├── routes/ # API route definitions ├── schemas/ # Zod validation schemas └── utils/ # Utility functions tests/ # Test files (co-located with source) docs/ # Documentation and WSDL files ``` ## 先决条件 - Node.js 24.0.0 或更高版本 - pnpm 10.28.0 或更高版本 - PostgreSQL 数据库 - 可访问 TTN Web 服务(生产环境) - 用于文档签名的 ngsign 凭据 ## 安装 ### 1. 克隆并设置 ``` git clone git@gitlab.tekru.net:tekru/elfatoora-api.git cd elfatoora-api pnpm install ``` ### 2. 环境配置 在根目录中创建 `.env` 文件并包含以下变量: ``` # 服务器 PORT=3000 NODE_ENV=development # 数据库 DATABASE_URL=postgresql://postgres:postgres@localhost:5432/e_fatoura # 公共 URL PUBLIC_BASE_URL=http://localhost:3000 # 用于 /v1/clients 管理端点的全局 API 密钥 GLOBAL_API_KEY=replace-with-a-strong-secret ``` ### 3. 数据库设置 运行迁移以设置数据库模式: ``` pnpm run db:migrate ``` ## 用法 ### 开发 使用热重载启动开发服务器: ``` pnpm run dev ``` 服务器将在 http://localhost:3000 启动 ### 生产构建 ``` pnpm run build pnpm run start ``` ### 运行测试 ``` # 运行所有测试 pnpm test # 以监视模式运行测试 pnpm test:watch ``` ### 代码质量 ``` # 代码检查 pnpm run lint # 修复检查问题 pnpm run lint:fix ``` ## API 端点 ### 文档控制器 - `POST /v1/documents` - 提交新的发票文档以进行签名 - `POST /v1/documents/callback/:status` - ngSign 的回调端点(成功/失败) 请参阅 [docs/API.md](docs/API.md) 获取详细的端点规范。 ### 客户端管理控制器 - `POST /v1/clients` - 创建客户端并生成新的 API 令牌 - `PATCH /v1/clients/:taxId` - 更新客户端模式/ngsign/TTN 设置 - `DELETE /v1/clients/:taxId` - 移除客户端 这些端点使用 `GLOBAL_API_KEY` 通过 `x-api-key` 进行保护。 ### TTN 集成 该应用程序支持多种 TTN 提交方法: - **Web 服务**:向 TTN 服务器提交基于 SOAP 的请求 - **SFTP**:用于发票上传和下载的安全文件传输 请参阅 [src/business-logic/ttn/sftp/README.md](src/business-logic/ttn/sftp/README.md) 获取 SFTP 配置和使用说明。 ## 数据库迁移 迁移文件位于 `src/db/migrations/` 目录中: 1. `001_init_invoice_middleware.ts` - 初始模式设置 2. `002_add_ttn_reference.ts` - 添加 TTN 引用跟踪 3. `003_add_qr_code_base64.ts` - 添加二维码支持 4. `004_webhooks.ts` - Webhook 端点和投递(发件箱模式) ## 定时任务 应用程序包含以下定时任务: - **TTN 提交**:每 5 分钟提交待处理文档到 TTN - **TTN 文档咨询**:每 10 分钟轮询 TTN 获取文档状态更新 - **Webhook 工作器**:每分钟处理待处理的 Webhook 投递 在 [src/cron/index.ts](src/cron/index.ts) 中配置定时计划。 ## 开发流程 ### 添加新功能 1. 在适当的 `src/business-logic/` 子目录中创建业务逻辑 2. 在 `src/schemas/` 中添加验证模式 3. 在 `src/controllers/` 中实现控制器 4. 在 `src/routes/` 中定义路由 5. 附带实现编写全面测试 6. 更新文档 ### 测试 测试与源文件共同存放,使用 `__tests__/` 目录模式: ``` src/ ├── business-logic/ │ ├── document/ │ │ ├── calculations.ts │ │ └── __tests__/ │ │ └── calculations.test.ts ``` ## 配置 ### 环境变量 所有配置均通过环境变量管理。关键变量包括: - `NODE_ENV`:应用程序环境(development/production) - `PORT`:服务器端口(默认:3000) - `DB_*`:数据库连接参数 - `GLOBAL_API_KEY`:用于 `/v1/clients` 管理端点的共享密钥 ## 性能 - 数据库查询使用 Kysely 进行类型安全的 SQL 生成 - XML 处理使用 fast-xml-parser 以提高效率 - 后台任务使用 node-cron 进行调度操作 - Webhook 重试采用指数退避策略 ## 安全 - 使用环境变量存储敏感凭据 - 使用 Zod 模式验证所有输入 - 使用数字签名验证文档真实性 - 使用 HTTPS/TLS 进行外部服务通信 ## 故障排除 ### 数据库连接问题 ``` # 检查数据库连接 pnpm run db:migrate ``` ### TTN 服务错误 请查阅 `docs/ttn/ttn-ws-docs.md` 获取特定服务的文档和错误代码。 ### 构建问题 ``` # 清理构建产物 pnpm run clean # 重建 pnpm run build ``` ## 贡献 欢迎贡献!请遵循以下指南: 1. 为新功能编写测试 2. 确保所有测试通过:`pnpm test` 3. 运行代码检查:`pnpm run lint` 4. 遵循 TypeScript 最佳实践 5. 对重大更改更新 README ## 作者 - **Tekru** - 核心开发和架构 - **NGSign** - 数字签名集成和加密服务 ## 许可证 本项目采用 Apache License Version 2.0 开源许可。详细信息请参阅 LICENSE 文件。 ## 支持 如有疑问或问题,请联系开发团队。 **最后更新**:21/01/2026
标签:CVE, Express.js, fast-xml-parser, GNU通用公共许可证, JSON 校验, Kysely ORM, MITM代理, ngsign, node-cron, Node.js, PostgreSQL, SEO 关键词, TEIF, TTN 提交, TypeScript, Webhook, XML 生成, Zod, 中间件 API, 力导向图, 发票生命周期, 发票系统, 后台任务, 安全插件, 数字签名, 测试用例, 状态轮询, 电子 invoicing, 电子发票, 税务申报, 突尼斯电子发票, 第三方对接, 签名验证, 自动化攻击, 集成