189 lines
7.4 KiB
TypeScript
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;
|
|
}
|
|
}
|