# @buka/nestjs-kit

实现符合 Buka API 规范的 NestJS 开发套件。

## 安装

```bash
pnpm install @buka/nestjs-kit
```

## 快速开始

```typescript
import { Module } from "@nestjs/common";
import {
  BukaModule,
  LoggerModule,
  ExceptionModule,
  BlindIndexModule,
  SaltedHashModule,
} from "@buka/nestjs-kit";

@Module({
  imports: [
    // 核心模块（全局验证管道）
    BukaModule.register({}),

    // 统一日志（Grafana/Loki 友好 JSON 格式）
    LoggerModule.register({ serviceName: "my-service" }),

    // 异常处理（systemId 支持十进制数字或 Crockford Base32 字符串）
    ExceptionModule.register({ systemId: "Z9" }),

    // 盲索引和加盐哈希无需配置
    BlindIndexModule,
    SaltedHashModule,
  ],
})
export class AppModule {}
```

## 模块一览

| 模块                       | 简介                                                                            | 文档                                               |
| -------------------------- | ------------------------------------------------------------------------------- | -------------------------------------------------- |
| **Core**                   | 全局验证管道、UUIDv7 校验管道、Model 装饰器、分页查询、类型转换工具、URN 工具类 | [core/index.md](./core/index.md)                   |
| **MikroORM**               | MikroORM 实体装饰器、基础实体类、类型工具                                       | [mikro-orm.md](./mikro-orm.md)                     |
| `ExceptionModule`          | 统一异常处理，基于错误码体系                                                    | [exception.md](./exception.md)                     |
| `OpenBaoModule`            | OpenBao（Vault 兼容）客户端集成                                                 | [open-bao.md](./open-bao.md)                       |
| `EnvelopeEncryptionModule` | KEK/DEK 两层信封加密                                                            | [envelope-encryption.md](./envelope-encryption.md) |
| `BlindIndexModule`         | 对加密数据生成可搜索的哈希索引                                                  | [blind-index.md](./blind-index.md)                 |
| `SaltedHashModule`         | 密码安全存储与校验（bcrypt）                                                    | [salted-hash.md](./salted-hash.md)                 |
| `ObjectStorageModule`      | S3 兼容的对象存储客户端                                                         | [object-storage.md](./object-storage.md)           |
| `LoggerModule`        | 统一日志方案，基于 nestjs-pino，Grafana/Loki 友好格式                          | [logger.md](./logger.md)                         |
| **SwaggerPatcher**         | Swagger 文档后处理工具                                                          | [swagger-patcher.md](./swagger-patcher.md)         |
| **Keq**                    | keq HTTP 请求中间件，自动处理响应错误                                          | [keq.md](./keq.md)                                 |

## 模块依赖关系

```
BukaModule               (独立，建议所有项目引入)
ExceptionModule           (独立)
LoggerModule          (独立)
OpenBaoModule             (独立)
EnvelopeEncryptionModule  ──依赖──▶ OpenBaoModule
BlindIndexModule          (独立)
SaltedHashModule          (独立)
ObjectStorageModule       (独立)
MikroORM 工具集           (独立，需安装 @mikro-orm/core)
SwaggerPatcher            (独立，需安装 @nestjs/swagger)
Keq                       (独立，需安装 keq)
Urn                       (Core 模块内置，无需单独注册)
```

> `EnvelopeEncryptionModule` 内部通过 `KmsProvider` 调用 `OpenBaoHttpClient`，因此必须先注册 `OpenBaoModule`。

## 子包导入

除主入口 `@buka/nestjs-kit` 外，MikroORM 相关功能通过子路径导入：

```typescript
// 主入口：Core 模块 + 功能模块
import { BukaModule, Model, Property, PickType, Slice } from "@buka/nestjs-kit";

// MikroORM 子包
import {
  Column,
  Cardinality,
  DiscreteEntity,
} from "@buka/nestjs-kit/mikro-orm";
```
