feat(data): add repository layer with Auth/Chat/User/Metrics + shared Result<T>
引入仓库层(`src/data/repositories/`),对齐原 Dart `lib/data/repositories/`
的四个仓库:Auth(hybrid: API+AuthStorage+UserStorage)、Chat(hybrid:
API+LocalChatStorage via Dexie)、User(纯远程)、Metrics(纯远程)。
同步抽取 4 个 `*_api.ts` 中重复的 envelope-unwrap 代码到
`src/data/api/response_helper.ts`,失败时抛 `ApiError`(之前抛裸 Error)。
新建 `src/data/result.ts` 提供仓库层统一 `Result<T>`(`{success,data}` 形态),
与 `src/data/storage/result.ts`(`{kind,value}` 形态)并存。
更新 `barrelsby.json` 让 `src/data/repositories/` 加入 barrel 生成。
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
"use client";
|
||||
|
||||
/**
|
||||
* MetricsRepository
|
||||
*
|
||||
* 指标/埋点仓库:纯远程 fire-and-forget 上报,无本地状态。
|
||||
*
|
||||
* 原始 Dart: lib/data/repositories/metrics_repository_impl.dart
|
||||
*/
|
||||
import { MetricsApi, metricsApi } from "@/data/api";
|
||||
import { AppEvent } from "@/data/dto/metrics/app_event";
|
||||
import { PwaEvent } from "@/data/dto/metrics/pwa_event";
|
||||
import { Result } from "@/data/result";
|
||||
|
||||
export class MetricsRepository {
|
||||
constructor(private readonly api: MetricsApi) {}
|
||||
|
||||
/**
|
||||
* 上报 PWA 事件。
|
||||
* 自动注入当前秒级时间戳。
|
||||
*/
|
||||
async reportPwaEvent(input: {
|
||||
deviceId: string;
|
||||
deviceType: string;
|
||||
pwaInstalled: boolean;
|
||||
pwaSupported: boolean;
|
||||
}): Promise<Result<void>> {
|
||||
return Result.wrap(async () => {
|
||||
await this.api.reportPwaEvent(
|
||||
PwaEvent.from({
|
||||
deviceId: input.deviceId,
|
||||
deviceType: input.deviceType,
|
||||
timestamp: Math.floor(Date.now() / 1000),
|
||||
pwaInstalled: input.pwaInstalled,
|
||||
pwaSupported: input.pwaSupported,
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 上报用户环境信息(浏览器、UA 等)。
|
||||
*/
|
||||
async reportUserInfo(input: {
|
||||
userId: string;
|
||||
browser: string;
|
||||
userAgent: string;
|
||||
}): Promise<Result<void>> {
|
||||
return Result.wrap(async () => {
|
||||
await this.api.reportUserInfo(
|
||||
AppEvent.from({
|
||||
userId: input.userId,
|
||||
browser: input.browser,
|
||||
userAgent: input.userAgent,
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/** 全局单例。 */
|
||||
export const metricsRepository = new MetricsRepository(metricsApi);
|
||||
Reference in New Issue
Block a user