blog/frontend/src/lib/container.ts
2025-10-15 11:56:25 +08:00

189 lines
7.4 KiB
TypeScript

import type { AuthApiService } from '$lib/auth/adapter/gateway/authApiService';
import { AuthRepositoryImpl } from '$lib/auth/adapter/gateway/authRepositoryImpl';
import { AuthLoadedStore } from '$lib/auth/adapter/presenter/authLoadedStore';
import type { AuthRepository } from '$lib/auth/application/gateway/authRepository';
import { GetCurrentUserUseCase } from '$lib/auth/application/useCase/getCurrentUserUseCase';
import { AuthApiServiceImpl } from '$lib/auth/framework/api/authApiServiceImpl';
import type { LabelApiService } from '$lib/label/adapter/gateway/labelApiService';
import { LabelRepositoryImpl } from '$lib/label/adapter/gateway/labelRepositoryImpl';
import { LabelCreatedStore } from '$lib/label/adapter/presenter/labelCreatedStore';
import type { LabelViewModel } from '$lib/label/adapter/presenter/labelViewModel';
import { LabelsListedStore } from '$lib/label/adapter/presenter/labelsListedStore';
import type { LabelRepository } from '$lib/label/application/gateway/labelRepository';
import { CreateLabelUseCase } from '$lib/label/application/useCase/createLabelUseCase';
import { GetAllLabelsUseCase } from '$lib/label/application/useCase/getAllLabelsUseCase';
import { LabelApiServiceImpl } from '$lib/label/framework/api/labelApiServiceImpl';
import type { ImageApiService } from '$lib/image/adapter/gateway/imageApiService';
import { ImageRepositoryImpl } from '$lib/image/adapter/gateway/imageRepositoryImpl';
import { ImageUploadedStore } from '$lib/image/adapter/presenter/imageUploadedStore';
import type { ImageRepository } from '$lib/image/application/gateway/imageRepository';
import { UploadImageUseCase } from '$lib/image/application/useCase/uploadImageUseCase';
import { ImageApiServiceImpl } from '$lib/image/framework/api/imageApiServiceImpl';
import type { PostApiService } from '$lib/post/adapter/gateway/postApiService';
import { PostRepositoryImpl } from '$lib/post/adapter/gateway/postRepositoryImpl';
import { PostCreatedStore } from '$lib/post/adapter/presenter/postCreatedStore';
import type { PostInfoViewModel } from '$lib/post/adapter/presenter/postInfoViewModel';
import { PostsListedStore } from '$lib/post/adapter/presenter/postsListedStore';
import { PostLoadedStore } from '$lib/post/adapter/presenter/postLoadedStore';
import type { PostViewModel } from '$lib/post/adapter/presenter/postViewModel';
import type { PostRepository } from '$lib/post/application/gateway/postRepository';
import { CreatePostUseCase } from '$lib/post/application/useCase/createPostUseCase';
import { GetAllPostsUseCase } from '$lib/post/application/useCase/getAllPostsUseCase';
import { GetPostUseCase } from '$lib/post/application/useCase/getPostUseCase';
import { PostApiServiceImpl } from '$lib/post/framework/api/postApiServiceImpl';
export class Container {
private useCases: UseCases;
constructor(fetchFn: typeof fetch) {
const apiServices = new ApiServices(fetchFn);
const repositories = new Repositories(apiServices);
this.useCases = new UseCases(repositories);
}
createAuthLoadedStore(): AuthLoadedStore {
return new AuthLoadedStore(this.useCases.getCurrentUserUseCase);
}
createImageUploadedStore(): ImageUploadedStore {
return new ImageUploadedStore(this.useCases.uploadImageUseCase);
}
createPostsListedStore(initialData?: readonly PostInfoViewModel[]): PostsListedStore {
return new PostsListedStore(this.useCases.getAllPostsUseCase, initialData);
}
createPostLoadedStore(initialData?: PostViewModel): PostLoadedStore {
return new PostLoadedStore(this.useCases.getPostUseCase, initialData);
}
createPostCreatedStore(): PostCreatedStore {
return new PostCreatedStore(this.useCases.createPostUseCase);
}
createLabelsListedStore(initialData?: readonly LabelViewModel[]): LabelsListedStore {
return new LabelsListedStore(this.useCases.getAllLabelsUseCase, initialData);
}
createLabelCreatedStore(): LabelCreatedStore {
return new LabelCreatedStore(this.useCases.createLabelUseCase);
}
}
class ApiServices {
private fetchFn: typeof fetch;
private _authApiService?: AuthApiService;
private _imageApiService?: ImageApiService;
private _postApiService?: PostApiService;
private _labelApiService?: LabelApiService;
constructor(fetchFn: typeof fetch) {
this.fetchFn = fetchFn;
}
get authApiService(): AuthApiService {
this._authApiService ??= new AuthApiServiceImpl(this.fetchFn);
return this._authApiService;
}
get imageApiService(): ImageApiService {
this._imageApiService ??= new ImageApiServiceImpl(this.fetchFn);
return this._imageApiService;
}
get postApiService(): PostApiService {
this._postApiService ??= new PostApiServiceImpl(this.fetchFn);
return this._postApiService;
}
get labelApiService(): LabelApiService {
this._labelApiService ??= new LabelApiServiceImpl(this.fetchFn);
return this._labelApiService;
}
}
class Repositories {
private apiServices: ApiServices;
private _authRepository?: AuthRepository;
private _imageRepository?: ImageRepository;
private _postRepository?: PostRepository;
private _labelRepository?: LabelRepository;
constructor(apiServices: ApiServices) {
this.apiServices = apiServices;
}
get authRepository(): AuthRepository {
this._authRepository ??= new AuthRepositoryImpl(this.apiServices.authApiService);
return this._authRepository;
}
get imageRepository(): ImageRepository {
this._imageRepository ??= new ImageRepositoryImpl(this.apiServices.imageApiService);
return this._imageRepository;
}
get postRepository(): PostRepository {
this._postRepository ??= new PostRepositoryImpl(this.apiServices.postApiService);
return this._postRepository;
}
get labelRepository(): LabelRepository {
this._labelRepository ??= new LabelRepositoryImpl(this.apiServices.labelApiService);
return this._labelRepository;
}
}
class UseCases {
private repositories: Repositories;
private _getCurrentUserUseCase?: GetCurrentUserUseCase;
private _uploadImageUseCase?: UploadImageUseCase;
private _getAllPostsUseCase?: GetAllPostsUseCase;
private _getPostUseCase?: GetPostUseCase;
private _createPostUseCase?: CreatePostUseCase;
private _getAllLabelsUseCase?: GetAllLabelsUseCase;
private _createLabelUseCase?: CreateLabelUseCase;
constructor(repositories: Repositories) {
this.repositories = repositories;
}
get getCurrentUserUseCase(): GetCurrentUserUseCase {
this._getCurrentUserUseCase ??= new GetCurrentUserUseCase(this.repositories.authRepository);
return this._getCurrentUserUseCase;
}
get uploadImageUseCase(): UploadImageUseCase {
this._uploadImageUseCase ??= new UploadImageUseCase(this.repositories.imageRepository);
return this._uploadImageUseCase;
}
get getAllPostsUseCase(): GetAllPostsUseCase {
this._getAllPostsUseCase ??= new GetAllPostsUseCase(this.repositories.postRepository);
return this._getAllPostsUseCase;
}
get getPostUseCase(): GetPostUseCase {
this._getPostUseCase ??= new GetPostUseCase(this.repositories.postRepository);
return this._getPostUseCase;
}
get createPostUseCase(): CreatePostUseCase {
this._createPostUseCase ??= new CreatePostUseCase(this.repositories.postRepository);
return this._createPostUseCase;
}
get getAllLabelsUseCase(): GetAllLabelsUseCase {
this._getAllLabelsUseCase ??= new GetAllLabelsUseCase(this.repositories.labelRepository);
return this._getAllLabelsUseCase;
}
get createLabelUseCase(): CreateLabelUseCase {
this._createLabelUseCase ??= new CreateLabelUseCase(this.repositories.labelRepository);
return this._createLabelUseCase;
}
}