refactor(data): add I*Repository interfaces and depend on them in stores

为 /src/data/repositories/ 下每个仓库类增加对应的接口契约,
接口文件存放在独立的 interfaces/ 子目录中。

改动:
- 新建 4 个接口文件 (iauth_repository / ichat_repository /
  imetrics_repository / iuser_repository),纯 type-only,方法签名
  与实现类完全一致
- 4 个实现类加 implements I{Name}Repository 子句,编译器自动校验契约
- 3 个 stores 文件 (auth / chat / user state machines) 改为依赖接口
  类型:通过 `const xxxRepo: I{Name}Repository = xxxRepository` 局部别名,
  actor 内部调用全部走别名
- barrelsby.json 加入 interfaces/ 目录,让自动 barrel 能覆盖
- Auto-regenerated repositories/index.ts 与 interfaces/index.ts

参照 storage 层已有的 IAuthStorage / IChatStorage / IUserStorage 模式。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-06-11 17:00:47 +08:00
parent 1151a9a61b
commit 982d9ba790
14 changed files with 232 additions and 15 deletions
+8 -5
View File
@@ -14,6 +14,7 @@ import { signIn } from "next-auth/react";
import type { AuthProvider } from "@/lib/auth/auth_platform";
import type { LoginStatus } from "@/models/auth/login-status";
import { authRepository } from "@/data/repositories/auth_repository";
import type { IAuthRepository } from "@/data/repositories/interfaces";
import { AuthStorage } from "@/data/storage/auth/auth_storage";
import { deviceIdentifier } from "@/utils/device_identifier";
import { Result } from "@/utils/result";
@@ -40,11 +41,13 @@ async function readGuestId(): Promise<string | undefined> {
// ============================================================
// Actors(异步服务)
// ============================================================
// 仓库以接口类型注入:调用面只看接口,运行时仍是同一单例
const authRepo: IAuthRepository = authRepository;
const emailLoginActor = fromPromise<LoginStatus, { email: string; password: string }>(
async ({ input }) => {
const guestId = await readGuestId();
const result = await authRepository.emailLogin({ ...input, guestId });
const result = await authRepo.emailLogin({ ...input, guestId });
if (Result.isErr(result)) throw result.error;
return "email" as LoginStatus;
},
@@ -56,11 +59,11 @@ const emailRegisterThenLoginActor = fromPromise<
>(async ({ input }) => {
const guestId = await readGuestId();
const registerResult = await authRepository.register({ ...input, guestId });
const registerResult = await authRepo.register({ ...input, guestId });
if (Result.isErr(registerResult)) throw registerResult.error;
// 注册后自动登录(对齐 Dart 行为)
const loginResult = await authRepository.emailLogin({
const loginResult = await authRepo.emailLogin({
email: input.email,
password: input.password,
guestId,
@@ -84,7 +87,7 @@ const oauthSignInActor = fromPromise<void, AuthProvider>(async ({ input }) => {
const syncGoogleBackendActor = fromPromise<LoginStatus, { idToken: string }>(
async ({ input }) => {
const guestId = await readGuestId();
const result = await authRepository.googleLogin({
const result = await authRepo.googleLogin({
idToken: input.idToken,
guestId,
});
@@ -98,7 +101,7 @@ const syncFacebookBackendActor = fromPromise<
{ accessToken: string }
>(async ({ input }) => {
const guestId = await readGuestId();
const result = await authRepository.facebookLogin({
const result = await authRepo.facebookLogin({
accessToken: input.accessToken,
guestId,
});