# Identity Service

RWA用户身份上下文微服务 - 基于DDD架构的NestJS实现

## 技术栈

- **框架**: NestJS + TypeScript
- **ORM**: Prisma
- **消息队列**: Kafka
- **缓存**: Redis (ioredis)
- **区块链**: ethers.js + @scure/bip32 + bech32

## 项目结构

```
src/
├── api/                    # 表现层
│   ├── controllers/        # 控制器
│   └── dto/               # 请求/响应DTO
├── application/           # 应用层
│   ├── commands/          # 命令对象
│   └── services/          # 应用服务
├── domain/                # 领域层
│   ├── aggregates/        # 聚合根
│   ├── entities/          # 实体
│   ├── events/            # 领域事件
│   ├── repositories/      # 仓储接口
│   ├── services/          # 领域服务
│   └── value-objects/     # 值对象
├── infrastructure/        # 基础设施层
│   ├── persistence/       # 持久化
│   ├── redis/            # Redis服务
│   ├── kafka/            # Kafka事件发布
│   └── external/         # 外部服务
├── shared/               # 共享层
│   ├── decorators/       # 装饰器
│   ├── guards/           # 守卫
│   ├── filters/          # 过滤器
│   └── exceptions/       # 异常类
└── config/               # 配置
```

## 核心功能

- ✅ 用户账户自动创建(首次打开APP)
- ✅ 多设备管理与授权(最多5个设备)
- ✅ 三链钱包地址生成(KAVA/DST/BSC)
- ✅ 助记词生成与加密存储
- ✅ 序列号+助记词恢复账户
- ✅ 序列号+手机号恢复账户
- ✅ KYC实名认证
- ✅ 推荐码生成与验证
- ✅ Token自动刷新机制

## 快速开始

### 1. 安装依赖

```bash
npm install
```

### 2. 配置环境变量

```bash
cp .env.example .env
# 编辑 .env 文件配置数据库等信息
```

### 3. 初始化数据库

```bash
npm run prisma:generate
npm run prisma:migrate
```

### 4. 启动服务

```bash
# 开发模式
npm run start:dev

# 生产模式
npm run build
npm run start:prod
```

### 5. Docker部署

```bash
docker-compose up -d
```

## API文档

启动服务后访问: http://localhost:3000/api/docs

## 主要API

| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /user/auto-create | 自动创建账户 |
| POST | /user/recover-by-mnemonic | 助记词恢复 |
| POST | /user/recover-by-phone | 手机号恢复 |
| POST | /user/auto-login | 自动登录 |
| GET | /user/my-profile | 我的资料 |
| GET | /user/my-devices | 我的设备 |
| POST | /user/bind-phone | 绑定手机号 |
| POST | /user/submit-kyc | 提交KYC |

## 领域不变式

1. 手机号在系统内唯一(可为空)
2. 账户序列号全局唯一且递增
3. 每个账户最多5个设备同时登录
4. KYC认证通过后身份信息不可修改
5. 每个区块链地址只能绑定一个账户
6. 推荐人序列号一旦设置终生不可修改
7. 助记词必须加密存储,只在创建时返回一次
8. 三条链的钱包地址必须从同一个助记词派生

## License

Proprietary
