Files
afilmory/.cursor/rules/builder-storage.mdc
2025-06-05 13:27:09 +08:00

128 lines
3.5 KiB
Plaintext
Raw 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.
---
description:
globs: src/core/**/*.ts
alwaysApply: false
---
# 存储抽象层
本模块使用适配器模式提供了统一的存储接口,支持多种存储提供商。目前已实现 S3 存储提供商,后续可以方便地扩展其他存储服务。
## 架构设计
- **`interfaces.ts`**: 定义通用的存储接口和数据结构
- **`providers/`**: 具体的存储提供商实现
- **`s3-provider.ts`**: S3 存储提供商实现
- **`factory.ts`**: 存储提供商工厂,负责创建具体的存储实例
- **`manager.ts`**: 存储管理器,提供统一的存储操作接口
- **`adapters.ts`**: 适配器函数,保持与原有 API 的兼容性
## 使用方式
### 推荐方式:使用 StorageManager
```typescript
import { defaultStorageManager, StorageManager } from '@/core/storage'
// 使用默认存储管理器(基于环境变量配置)
const buffer = await defaultStorageManager.getFile('path/to/image.jpg')
const images = await defaultStorageManager.listImages()
const allFiles = await defaultStorageManager.listAllFiles()
const publicUrl = defaultStorageManager.generatePublicUrl('path/to/image.jpg')
const livePhotos = await defaultStorageManager.detectLivePhotos()
// 或者创建自定义配置的存储管理器
const customManager = new StorageManager({
provider: 's3',
bucket: 'my-bucket',
region: 'us-east-1',
endpoint: 'https://s3.amazonaws.com',
prefix: 'photos/',
customDomain: 'https://cdn.example.com'
})
```
### 兼容性方式:使用原有 API
```typescript
// 这些函数仍然可用,但标记为 deprecated
import {
getImageFromS3,
listImagesFromS3,
listAllFilesFromS3,
detectLivePhotos,
generateS3Url
} from '@/core/s3/operations'
const buffer = await getImageFromS3('path/to/image.jpg')
const images = await listImagesFromS3()
```
### 直接使用存储提供商
```typescript
import { S3StorageProvider } from '@/core/storage'
const s3Provider = new S3StorageProvider({
provider: 's3',
bucket: 'my-bucket',
region: 'us-east-1',
// ... 其他配置
})
const buffer = await s3Provider.getFile('path/to/image.jpg')
```
## 扩展新的存储提供商
1. 实现 `StorageProvider` 接口:
```typescript
import { StorageProvider, StorageObject } from '@/core/storage/interfaces'
export class MyStorageProvider implements StorageProvider {
async getFile(key: string, logger?: Logger['s3']): Promise<Buffer | null> {
// 实现文件获取逻辑
}
async listImages(): Promise<StorageObject[]> {
// 实现图片列表逻辑
}
// ... 实现其他接口方法
}
```
2. 在工厂类中注册新的提供商:
```typescript
// 在 factory.ts 中添加新的 case
case 'my-storage':
return new MyStorageProvider(config)
```
3. 更新 `StorageConfig` 接口的 `provider` 类型。
## 优势
1. **解耦**: 业务逻辑与具体存储实现分离
2. **可扩展**: 轻松添加新的存储提供商
3. **统一接口**: 所有存储操作使用相同的 API
4. **向后兼容**: 保持原有 API 的兼容性
5. **类型安全**: 完整的 TypeScript 类型支持
6. **配置灵活**: 支持多种配置方式
## 迁移指南
现有代码可以继续使用原有的 S3 函数,无需立即修改。建议在新代码中使用 `StorageManager` API并逐步迁移现有代码。
旧代码:
```typescript
import { getImageFromS3 } from '@/core/s3/operations'
const buffer = await getImageFromS3('key')
```
新代码:
```typescript
import { defaultStorageManager } from '@/core/storage'
const buffer = await defaultStorageManager.getFile('key')
```