feat: implement lazy singleton pattern for repository instances and update related imports
This commit is contained in:
@@ -1,17 +1,5 @@
|
||||
"use client";
|
||||
|
||||
/**
|
||||
* AuthRepository
|
||||
*
|
||||
* 认证仓库:编排远程 API + 本地 AuthStorage + UserStorage。
|
||||
* 行为对齐原 Dart `lib/data/repositories/auth_repository_impl.dart`:
|
||||
* - 登录成功后调 `_saveLoginData` 持久化 token + User
|
||||
* - 登出先调 API,再强制清本地态(无论 API 成败)
|
||||
* - `getCurrentUser` 成功后尽力写本地 User 缓存(不因缓存失败影响主流程)
|
||||
* - 写 storage 失败用 `Logger.warn` 记录,不让本地缓存失败影响主流程
|
||||
*
|
||||
*
|
||||
*/
|
||||
import { AuthApi, authApi } from "@/data/services/api";
|
||||
import {
|
||||
AppleLoginRequest,
|
||||
@@ -32,6 +20,7 @@ import { AppEnvUtil, Result, Logger } from "@/utils";
|
||||
import type { IAuthRepository } from "@/data/repositories/interfaces";
|
||||
import { AuthStorage, type IAuthStorage } from "@/data/storage/auth";
|
||||
import { UserStorage, type IUserStorage } from "@/data/storage/user";
|
||||
import { createLazySingleton } from "./lazy_singleton";
|
||||
|
||||
const log = new Logger("DataRepositoriesAuthRepository");
|
||||
|
||||
@@ -312,11 +301,14 @@ export class AuthRepository implements IAuthRepository {
|
||||
}
|
||||
}
|
||||
|
||||
/** 全局单例。 */
|
||||
export const authRepository = new AuthRepository(
|
||||
authApi,
|
||||
AuthStorage.getInstance(),
|
||||
UserStorage.getInstance(),
|
||||
/** 全局懒单例。 */
|
||||
export const getAuthRepository = createLazySingleton<IAuthRepository>(
|
||||
() =>
|
||||
new AuthRepository(
|
||||
authApi,
|
||||
AuthStorage.getInstance(),
|
||||
UserStorage.getInstance(),
|
||||
),
|
||||
);
|
||||
|
||||
function withTestAccountFlag<T extends Record<string, unknown>>(
|
||||
|
||||
@@ -13,6 +13,7 @@ import {
|
||||
import { Result } from "@/utils";
|
||||
import type { IChatRepository } from "@/data/repositories/interfaces";
|
||||
import { LocalChatStorage, LocalMessage } from "@/data/storage/chat";
|
||||
import { createLazySingleton } from "./lazy_singleton";
|
||||
|
||||
export class ChatRepository implements IChatRepository {
|
||||
constructor(
|
||||
@@ -186,8 +187,11 @@ export class ChatRepository implements IChatRepository {
|
||||
}
|
||||
}
|
||||
|
||||
/** 全局单例。 */
|
||||
export const chatRepository = new ChatRepository(
|
||||
chatApi,
|
||||
LocalChatStorage.getInstance(),
|
||||
/** 全局懒单例。 */
|
||||
export const getChatRepository = createLazySingleton<IChatRepository>(
|
||||
() =>
|
||||
new ChatRepository(
|
||||
chatApi,
|
||||
LocalChatStorage.getInstance(),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
export function createLazySingleton<T>(factory: () => T): () => T {
|
||||
let instance: T | null = null;
|
||||
return () => {
|
||||
instance ??= factory();
|
||||
return instance;
|
||||
};
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import { MetricsApi, metricsApi } from "@/data/services/api";
|
||||
import { AppEvent, PwaEvent } from "@/data/dto/metrics";
|
||||
import { Result } from "@/utils";
|
||||
import type { IMetricsRepository } from "@/data/repositories/interfaces";
|
||||
import { createLazySingleton } from "./lazy_singleton";
|
||||
|
||||
export class MetricsRepository implements IMetricsRepository {
|
||||
constructor(private readonly api: MetricsApi) {}
|
||||
@@ -56,5 +57,7 @@ export class MetricsRepository implements IMetricsRepository {
|
||||
}
|
||||
}
|
||||
|
||||
/** 全局单例。 */
|
||||
export const metricsRepository = new MetricsRepository(metricsApi);
|
||||
/** 全局懒单例。 */
|
||||
export const getMetricsRepository = createLazySingleton<IMetricsRepository>(
|
||||
() => new MetricsRepository(metricsApi),
|
||||
);
|
||||
|
||||
@@ -18,6 +18,7 @@ import { PaymentApi, paymentApi } from "@/data/services/api";
|
||||
import { PaymentPlansStorage } from "@/data/storage/payment";
|
||||
import type { IPaymentRepository } from "@/data/repositories/interfaces";
|
||||
import { Result } from "@/utils/result";
|
||||
import { createLazySingleton } from "./lazy_singleton";
|
||||
|
||||
export class PaymentRepository implements IPaymentRepository {
|
||||
constructor(private readonly api: PaymentApi) {}
|
||||
@@ -83,8 +84,10 @@ export class PaymentRepository implements IPaymentRepository {
|
||||
}
|
||||
}
|
||||
|
||||
/** 全局单例。 */
|
||||
export const paymentRepository = new PaymentRepository(paymentApi);
|
||||
/** 全局懒单例。 */
|
||||
export const getPaymentRepository = createLazySingleton<IPaymentRepository>(
|
||||
() => new PaymentRepository(paymentApi),
|
||||
);
|
||||
|
||||
export function isVipPaymentPlan(plan: PaymentPlan): boolean {
|
||||
return plan.vipDays !== null;
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
} from "@/data/dto/user";
|
||||
import { Result } from "@/utils";
|
||||
import type { IUserRepository } from "@/data/repositories/interfaces";
|
||||
import { createLazySingleton } from "./lazy_singleton";
|
||||
|
||||
export class UserRepository implements IUserRepository {
|
||||
constructor(private readonly api: UserApi) {}
|
||||
@@ -48,5 +49,7 @@ export class UserRepository implements IUserRepository {
|
||||
}
|
||||
}
|
||||
|
||||
/** 全局单例。 */
|
||||
export const userRepository = new UserRepository(userApi);
|
||||
/** 全局懒单例。 */
|
||||
export const getUserRepository = createLazySingleton<IUserRepository>(
|
||||
() => new UserRepository(userApi),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user