diff --git a/FLINT/FLINT/Dependency/DIContainer.swift b/FLINT/FLINT/Dependency/DIContainer.swift index 45446cd8..b47cf314 100644 --- a/FLINT/FLINT/Dependency/DIContainer.swift +++ b/FLINT/FLINT/Dependency/DIContainer.swift @@ -15,51 +15,63 @@ import Data import Domain import Presentation -typealias AppFactory = ViewControllerFactory & OnboardingViewModelFactory & ExploreViewModelFactory & CreateCollectionFactory & AddContentSelectViewModelFactory & ProfileFactory & HomeFactory & CollectionDetailFactory & LoginViewModelFactory +typealias DependencyFactory = ViewControllerFactory & + + LoginViewModelFactory & + OnboardingViewModelFactory & + + HomeViewModelFactory & + ExploreViewModelFactory & + ProfileViewModelFactory & + + CreateCollectionViewModelFactory & + AddContentSelectViewModelFactory & + CollectionFolderListViewModelFactory & + CollectionDetailViewModelFactory -final class DIContainer: AppFactory { +final class DIContainer: DependencyFactory { // MARK: - Root Dependency -// private lazy var tokenStorage: TokenStorage = DefaultTokenStorage() - private lazy var tokenStorage: TokenStorage = TestTokenStorage() +// lazy var tokenStorage: TokenStorage = DefaultTokenStorage() + lazy var tokenStorage: TokenStorage = TestTokenStorage() private lazy var authInterceptor: AuthInterceptor = AuthInterceptor(tokenStorage: tokenStorage) private lazy var networkLoggerPlugin: NetworkLoggerPlugin = NetworkLoggerPlugin() - private lazy var userAPIProvider = MoyaProvider( + lazy var userAPIProvider = MoyaProvider( session: Session(interceptor: authInterceptor), plugins: [ networkLoggerPlugin ] ) - private lazy var collectionAPIProvider = MoyaProvider( + lazy var collectionAPIProvider = MoyaProvider( session: Session(interceptor: authInterceptor), plugins: [ networkLoggerPlugin ] ) - private lazy var searchAPIProvider = MoyaProvider( + lazy var searchAPIProvider = MoyaProvider( session: Session(interceptor: authInterceptor), plugins: [ networkLoggerPlugin ] ) - private lazy var bookmarkAPIProvider = MoyaProvider( + lazy var bookmarkAPIProvider = MoyaProvider( session: Session(interceptor: authInterceptor), plugins: [ networkLoggerPlugin ] ) - private lazy var authAPIProvider = MoyaProvider( + lazy var authAPIProvider = MoyaProvider( session: Session(interceptor: authInterceptor), plugins: [ networkLoggerPlugin ] ) - private lazy var homeAPIProvider = MoyaProvider( + lazy var homeAPIProvider = MoyaProvider( session: Session(interceptor: authInterceptor), plugins: [ networkLoggerPlugin @@ -69,117 +81,6 @@ final class DIContainer: AppFactory { // MARK: - Init init() { - tokenStorage.clearAll() - } - - // MARK: - ViewControllerFactory - - func makeSplashViewController() -> SplashViewController { - return SplashViewController(viewControllerFactory: self) - } - - func makeLoginViewController() -> LoginViewController { - return LoginViewController(loginViewModel: makeLoginViewModel(), viewControllerFactory: self) - } - - func makeTabBarViewController() -> TabBarViewController { - return TabBarViewController(viewControllerFactory: self) - } - - func makeNicknameViewController() -> NicknameViewController { - return NicknameViewController(onboardingViewModel: makeOnboardingViewModel(), viewControllerFactory: self) - } - - func makeAddContentSelectViewController() -> AddContentSelectViewController { - let vm = makeAddContentSelectViewModel() - return AddContentSelectViewController(viewModel: vm, viewControllerFactory: self) - } - - func makeCreateCollectionViewController() -> CreateCollectionViewController { - let vm = makeCreateCollectionViewModel() - return CreateCollectionViewController(viewModel: vm, viewControllerFactory: self) - } - - func makeHomeViewController() -> HomeViewController { - let vm = makeHomeViewModel() - return HomeViewController(viewModel: vm, viewControllerFactory: self) - } - - func makeFilmSelectViewController(onboardingViewModel: OnboardingViewModel) -> FilmSelectViewController { - return FilmSelectViewController(onboardingViewModel: onboardingViewModel, viewControllerFactory: self) - } - - func makeOttSelectViewController(onboardingViewModel: OnboardingViewModel) -> OttSelectViewController { - return OttSelectViewController(onboardingViewModel: onboardingViewModel, viewControllerFactory: self) - } - - func makeOnboardingDoneViewController(onboardingViewModel: OnboardingViewModel) -> OnboardingDoneViewController { - return OnboardingDoneViewController(onboardingViewModel: onboardingViewModel, viewControllerFactory: self) - } - - func makeExploreViewController() -> ViewController.ExploreViewController { - return ExploreViewController(exploreViewModel: makeExploreViewModel(), viewControllerFactory: self) - } - - - func makeProfileViewController() -> ProfileViewController { - makeProfileViewController(target: .me) - } - - func makeProfileViewController( - target: ProfileViewModel.Target = .me - ) -> ProfileViewController { - return ProfileViewController( - profileViewModel: makeProfileViewModel(target: target), - viewControllerFactory: self - ) - } - - -// func makeCollectionDetailViewController(collectionId: Int64) -> CollectionDetailViewController { -// let vm = makeCollectionDetailViewModel(collectionId: collectionId) -// return CollectionDetailViewController(viewModel: vm) -// } - func makeCollectionDetailViewController(collectionId: Int64) -> CollectionDetailViewController { - let vm = makeCollectionDetailViewModel(collectionId: collectionId) - return CollectionDetailViewController(viewModel: vm, viewControllerFactory: self) - } - - - func makeCollectionFolderListViewController() -> CollectionFolderListViewController { - let vm = CollectionFolderListViewModel(fetchWatchingCollectionsUseCase: makeFetchWatchingCollectionsUseCase()) - return CollectionFolderListViewController(viewModel: vm, viewControllerFactory: self) - } - - - - // MARK: - Root Dependency Injection - - func makeTokenStorage() -> TokenStorage { - return tokenStorage - } - - func makeUserAPIProvider() -> MoyaProvider { - return userAPIProvider - } - - func makeSearchAPIProvider() -> MoyaProvider { - return searchAPIProvider - } - - func makeCollectionAPIProvider() -> MoyaProvider { - return collectionAPIProvider - } - - func makeBookmarkAPIProvider() -> MoyaProvider { - return bookmarkAPIProvider - } - - func makeAuthAPIProvider() -> MoyaProvider { - return authAPIProvider - } - - func makeHomeAPIProvider() -> MoyaProvider { - return homeAPIProvider +// tokenStorage.clearAll() } } diff --git a/FLINT/FLINT/Dependency/Factory/APIProvider/AuthAPIFactory.swift b/FLINT/FLINT/Dependency/Factory/APIProvider/AuthAPIFactory.swift index 082fe532..911f5198 100644 --- a/FLINT/FLINT/Dependency/Factory/APIProvider/AuthAPIFactory.swift +++ b/FLINT/FLINT/Dependency/Factory/APIProvider/AuthAPIFactory.swift @@ -12,5 +12,13 @@ import Moya import Data protocol AuthAPIFactory { + var authAPIProvider: MoyaProvider { get set } + func makeAuthAPIProvider() -> MoyaProvider } + +extension AuthAPIFactory { + func makeAuthAPIProvider() -> MoyaProvider { + return authAPIProvider + } +} diff --git a/FLINT/FLINT/Dependency/Factory/APIProvider/BookmarkAPIProviderFactory.swift b/FLINT/FLINT/Dependency/Factory/APIProvider/BookmarkAPIProviderFactory.swift new file mode 100644 index 00000000..95341bfc --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/APIProvider/BookmarkAPIProviderFactory.swift @@ -0,0 +1,23 @@ +// +// BookmarkAPIProviderFactory.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation +import Moya + +import Data + +protocol BookmarkAPIProviderFactory { + var bookmarkAPIProvider: MoyaProvider { get set } + + func makeBookmarkAPIProvider() -> MoyaProvider +} + +extension BookmarkAPIProviderFactory { + func makeBookmarkAPIProvider() -> MoyaProvider { + return bookmarkAPIProvider + } +} diff --git a/FLINT/FLINT/Dependency/Factory/APIProvider/CollectionAPIFactory.swift b/FLINT/FLINT/Dependency/Factory/APIProvider/CollectionAPIFactory.swift index c4ac4e1a..5d8840ff 100644 --- a/FLINT/FLINT/Dependency/Factory/APIProvider/CollectionAPIFactory.swift +++ b/FLINT/FLINT/Dependency/Factory/APIProvider/CollectionAPIFactory.swift @@ -12,5 +12,13 @@ import Moya import Data protocol CollectionAPIFactory { + var collectionAPIProvider: MoyaProvider { get set } + func makeCollectionAPIProvider() -> MoyaProvider } + +extension CollectionAPIFactory { + func makeCollectionAPIProvider() -> MoyaProvider { + return collectionAPIProvider + } +} diff --git a/FLINT/FLINT/Dependency/Factory/APIProvider/HomeAPIFactory.swift b/FLINT/FLINT/Dependency/Factory/APIProvider/HomeAPIFactory.swift new file mode 100644 index 00000000..fa8bd8af --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/APIProvider/HomeAPIFactory.swift @@ -0,0 +1,24 @@ +// +// HomeAPIFactory.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Moya + +import Data + +protocol HomeAPIFactory { + var homeAPIProvider: MoyaProvider { get set } + + func makeHomeAPIProvider() -> MoyaProvider +} + +extension HomeAPIFactory { + func makeHomeAPIProvider() -> MoyaProvider { + return homeAPIProvider + } +} diff --git a/FLINT/FLINT/Dependency/Factory/APIProvider/SearchAPIFactory.swift b/FLINT/FLINT/Dependency/Factory/APIProvider/SearchAPIFactory.swift index 1f56a58b..86c289e9 100644 --- a/FLINT/FLINT/Dependency/Factory/APIProvider/SearchAPIFactory.swift +++ b/FLINT/FLINT/Dependency/Factory/APIProvider/SearchAPIFactory.swift @@ -12,5 +12,13 @@ import Moya import Data protocol SearchAPIFactory { + var searchAPIProvider: MoyaProvider { get set } + func makeSearchAPIProvider() -> MoyaProvider } + +extension SearchAPIFactory { + func makeSearchAPIProvider() -> MoyaProvider { + return searchAPIProvider + } +} diff --git a/FLINT/FLINT/Dependency/Factory/APIProvider/UserAPIFactory.swift b/FLINT/FLINT/Dependency/Factory/APIProvider/UserAPIFactory.swift index 92430ff5..f29fb4a5 100644 --- a/FLINT/FLINT/Dependency/Factory/APIProvider/UserAPIFactory.swift +++ b/FLINT/FLINT/Dependency/Factory/APIProvider/UserAPIFactory.swift @@ -12,5 +12,13 @@ import Moya import Data protocol UserAPIFactory { + var userAPIProvider: MoyaProvider { get set } + func makeUserAPIProvider() -> MoyaProvider } + +extension UserAPIFactory { + func makeUserAPIProvider() -> MoyaProvider { + return userAPIProvider + } +} diff --git a/FLINT/FLINT/Dependency/Factory/CreateCollectionFactory.swift b/FLINT/FLINT/Dependency/Factory/CreateCollectionFactory.swift deleted file mode 100644 index 3868bace..00000000 --- a/FLINT/FLINT/Dependency/Factory/CreateCollectionFactory.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// CreateCollectionFactory.swift -// FLINT -// - -import Foundation -import Moya - -import Data -import Domain -import Presentation - -protocol CreateCollectionFactory: CollectionRepositoryFactory { - - // UseCase - func makeCreateCollectionUseCase() -> CreateCollectionUseCase - func makeCreateCollectionUseCase(collectionRepository: CollectionRepository) -> CreateCollectionUseCase - - // ViewModel - func makeCreateCollectionViewModel() -> CreateCollectionViewModel - func makeCreateCollectionViewModel(createCollectionUseCase: CreateCollectionUseCase) -> CreateCollectionViewModel -} - -extension CreateCollectionFactory { - - func makeCreateCollectionUseCase() -> CreateCollectionUseCase { - return makeCreateCollectionUseCase(collectionRepository: makeCollectionRepository()) - } - - func makeCreateCollectionUseCase(collectionRepository: CollectionRepository) -> CreateCollectionUseCase { - return DefaultCreateCollectionUseCase(collectionRepository: collectionRepository) - } - - func makeCreateCollectionViewModel() -> CreateCollectionViewModel { - return makeCreateCollectionViewModel(createCollectionUseCase: makeCreateCollectionUseCase()) - } - - func makeCreateCollectionViewModel(createCollectionUseCase: CreateCollectionUseCase) -> CreateCollectionViewModel { - return DefaultCreateCollectionViewModel(createCollectionUseCase: createCollectionUseCase) - } -} diff --git a/FLINT/FLINT/Dependency/Factory/HomeFactory.swift b/FLINT/FLINT/Dependency/Factory/HomeFactory.swift deleted file mode 100644 index e12126f1..00000000 --- a/FLINT/FLINT/Dependency/Factory/HomeFactory.swift +++ /dev/null @@ -1,112 +0,0 @@ -// -// HomeFactory.swift -// FLINT -// - -import Foundation -import Moya - -import Data -import Domain -import Presentation - -// MARK: - HomeFactory - -protocol HomeFactory: ProfileFactory, CreateCollectionFactory { - - // MARK: - Home (Recommended) - - // Root Dependency - func makeHomeAPIProvider() -> MoyaProvider - - // Service - func makeHomeService() -> HomeService - func makeHomeService(homeAPIProvider: MoyaProvider) -> HomeService - - // Repository - func makeHomeRepository() -> HomeRepository - func makeHomeRepository(homeService: HomeService) -> HomeRepository - - // UseCase - func makeHomeUseCase() -> HomeUseCase - func makeHomeUseCase(homeRepository: HomeRepository) -> HomeUseCase - - // MARK: - Watching Collections (Collection Swagger) - - // UseCase - func makeFetchWatchingCollectionsUseCase() -> FetchWatchingCollectionsUseCase - func makeFetchWatchingCollectionsUseCase(collectionRepository: CollectionRepository) -> FetchWatchingCollectionsUseCase - - // MARK: - ViewModel - - func makeHomeViewModel() -> HomeViewModel - func makeHomeViewModel( - homeUseCase: HomeUseCase, - userProfileUseCase: UserProfileUseCase, - fetchWatchingCollectionsUseCase: FetchWatchingCollectionsUseCase - ) -> HomeViewModel -} - -// MARK: - Default Implementations - -extension HomeFactory { - - // MARK: - Home (Recommended) - - func makeHomeService() -> HomeService { - makeHomeService(homeAPIProvider: makeHomeAPIProvider()) - } - - func makeHomeService(homeAPIProvider: MoyaProvider) -> HomeService { - DefaultHomeService(provider: homeAPIProvider) - } - - func makeHomeRepository() -> HomeRepository { - makeHomeRepository(homeService: makeHomeService()) - } - - func makeHomeRepository(homeService: HomeService) -> HomeRepository { - DefaultHomeRepository(homeService: homeService) - } - - func makeHomeUseCase() -> HomeUseCase { - makeHomeUseCase(homeRepository: makeHomeRepository()) - } - - func makeHomeUseCase(homeRepository: HomeRepository) -> HomeUseCase { - DefaultHomeUseCase(homeRepository: homeRepository) - } - - // MARK: - Watching Collections (Collection Swagger) - - func makeFetchWatchingCollectionsUseCase() -> FetchWatchingCollectionsUseCase { - makeFetchWatchingCollectionsUseCase(collectionRepository: makeCollectionRepository()) - } - - func makeFetchWatchingCollectionsUseCase(collectionRepository: CollectionRepository) -> FetchWatchingCollectionsUseCase { - DefaultFetchWatchingCollectionsUseCase(collectionRepository: collectionRepository) - } - - // MARK: - ViewModel - - func makeHomeViewModel() -> HomeViewModel { - makeHomeViewModel( - homeUseCase: makeHomeUseCase(), - userProfileUseCase: makeUserProfileUseCase(), - fetchWatchingCollectionsUseCase: makeFetchWatchingCollectionsUseCase() - ) - } - - func makeHomeViewModel( - homeUseCase: HomeUseCase, - userProfileUseCase: UserProfileUseCase, - fetchWatchingCollectionsUseCase: FetchWatchingCollectionsUseCase - ) -> HomeViewModel { - HomeViewModel( - homeUseCase: homeUseCase, - userProfileUseCase: userProfileUseCase, - fetchWatchingCollectionsUseCase: fetchWatchingCollectionsUseCase, - initialUserName: "얀비" - ) - } -} diff --git a/FLINT/FLINT/Dependency/Factory/ProfileFactory.swift b/FLINT/FLINT/Dependency/Factory/ProfileFactory.swift deleted file mode 100644 index e6ab9290..00000000 --- a/FLINT/FLINT/Dependency/Factory/ProfileFactory.swift +++ /dev/null @@ -1,53 +0,0 @@ -// -// ProfileFactory.swift -// FLINT -// -// Created by 진소은 on 1/22/26. -// -import Foundation - -import Moya - -import Data -import Domain -import Presentation - -protocol ProfileFactory: UserRepositoryFactory { - - // MARK: - UseCase - func makeUserProfileUseCase() -> UserProfileUseCase - func makeUserProfileUseCase(userRepository: UserRepository) -> UserProfileUseCase - - // MARK: - ViewModel - func makeProfileViewModel() -> ProfileViewModel - func makeProfileViewModel( - target: ProfileViewModel.Target - ) -> ProfileViewModel -} - -extension ProfileFactory { - - // MARK: - UseCase - func makeUserProfileUseCase() -> UserProfileUseCase { - return makeUserProfileUseCase(userRepository: makeUserRepository()) - } - - func makeUserProfileUseCase(userRepository: UserRepository) -> UserProfileUseCase { - return DefaultUserProfileUseCase(userRepository: userRepository) - } - - // MARK: - ViewModel - - func makeProfileViewModel() -> ProfileViewModel { - makeProfileViewModel(target: .me) - } - - func makeProfileViewModel( - target: ProfileViewModel.Target - ) -> ProfileViewModel { - ProfileViewModel( - target: target, - userProfileUseCase: makeUserProfileUseCase() - ) - } -} diff --git a/FLINT/FLINT/Dependency/Factory/Repository/BookmarkRepositoryFactory.swift b/FLINT/FLINT/Dependency/Factory/Repository/BookmarkRepositoryFactory.swift index e2d25e69..e17dd987 100644 --- a/FLINT/FLINT/Dependency/Factory/Repository/BookmarkRepositoryFactory.swift +++ b/FLINT/FLINT/Dependency/Factory/Repository/BookmarkRepositoryFactory.swift @@ -6,39 +6,19 @@ // import Foundation -import Moya import Data import Domain -protocol BookmarkRepositoryFactory { - func makeBookmarkAPIProvider() -> MoyaProvider - - // Service - func makeBookmarkService() -> BookmarkService - func makeBookmarkService(provider: MoyaProvider) -> BookmarkService - - // Repository +protocol BookmarkRepositoryFactory: BookmarkServiceFactory { func makeBookmarkRepository() -> BookmarkRepository func makeBookmarkRepository(bookmarkService: BookmarkService) -> BookmarkRepository } extension BookmarkRepositoryFactory { - - // Service - func makeBookmarkService() -> BookmarkService { - return makeBookmarkService(provider: makeBookmarkAPIProvider()) - } - - func makeBookmarkService(provider: MoyaProvider) -> BookmarkService { - return DefaultBookmarkService(provider: provider) - } - - // Repository func makeBookmarkRepository() -> BookmarkRepository { return makeBookmarkRepository(bookmarkService: makeBookmarkService()) } - func makeBookmarkRepository(bookmarkService: BookmarkService) -> BookmarkRepository { return DefaultBookmarkRepository(bookmarkService: bookmarkService) } diff --git a/FLINT/FLINT/Dependency/Factory/Repository/HomeRepositoryFactory.swift b/FLINT/FLINT/Dependency/Factory/Repository/HomeRepositoryFactory.swift new file mode 100644 index 00000000..50e03173 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/Repository/HomeRepositoryFactory.swift @@ -0,0 +1,25 @@ +// +// HomeRepositoryFactory.swift +// FLINT +// +// Created by 김호성 on 2026.02.02. +// + +import Foundation + +import Data +import Domain + +protocol HomeRepositoryFactory: HomeServiceFactory { + func makeHomeRepository() -> HomeRepository + func makeHomeRepository(homeService: HomeService) -> HomeRepository +} + +extension HomeRepositoryFactory { + func makeHomeRepository() -> HomeRepository { + return makeHomeRepository(homeService: makeHomeService()) + } + func makeHomeRepository(homeService: HomeService) -> HomeRepository { + return DefaultHomeRepository(homeService: homeService) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/Service/BookmarkServiceFactory.swift b/FLINT/FLINT/Dependency/Factory/Service/BookmarkServiceFactory.swift new file mode 100644 index 00000000..307559dd --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/Service/BookmarkServiceFactory.swift @@ -0,0 +1,26 @@ +// +// BookmarkServiceFactory.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Moya + +import Data + +protocol BookmarkServiceFactory: BookmarkAPIProviderFactory { + func makeBookmarkService() -> BookmarkService + func makeBookmarkService(provider: MoyaProvider) -> BookmarkService +} + +extension BookmarkServiceFactory { + func makeBookmarkService() -> BookmarkService { + return makeBookmarkService(provider: makeBookmarkAPIProvider()) + } + func makeBookmarkService(provider: MoyaProvider) -> BookmarkService { + return DefaultBookmarkService(provider: provider) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/Service/HomeServiceFactory.swift b/FLINT/FLINT/Dependency/Factory/Service/HomeServiceFactory.swift new file mode 100644 index 00000000..26afd2ac --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/Service/HomeServiceFactory.swift @@ -0,0 +1,26 @@ +// +// HomeServiceFactory.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Moya + +import Data + +protocol HomeServiceFactory: HomeAPIFactory { + func makeHomeService() -> HomeService + func makeHomeService(homeAPIProvider: MoyaProvider) -> HomeService +} + +extension HomeServiceFactory { + func makeHomeService() -> HomeService { + return makeHomeService(homeAPIProvider: makeHomeAPIProvider()) + } + func makeHomeService(homeAPIProvider: MoyaProvider) -> HomeService { + return DefaultHomeService(provider: homeAPIProvider) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/TokenStorage/TokenStorageFactory.swift b/FLINT/FLINT/Dependency/Factory/TokenStorage/TokenStorageFactory.swift index 6bc916f5..66d70f7d 100644 --- a/FLINT/FLINT/Dependency/Factory/TokenStorage/TokenStorageFactory.swift +++ b/FLINT/FLINT/Dependency/Factory/TokenStorage/TokenStorageFactory.swift @@ -10,5 +10,13 @@ import Foundation import Data protocol TokenStorageFactory { + var tokenStorage: TokenStorage { get set } + func makeTokenStorage() -> TokenStorage } + +extension TokenStorageFactory { + func makeTokenStorage() -> TokenStorage { + return tokenStorage + } +} diff --git a/FLINT/FLINT/Dependency/Factory/UseCase/CollectionDetailUseCaseFactory.swift b/FLINT/FLINT/Dependency/Factory/UseCase/CollectionDetailUseCaseFactory.swift new file mode 100644 index 00000000..2fb3a9e6 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/UseCase/CollectionDetailUseCaseFactory.swift @@ -0,0 +1,24 @@ +// +// CollectionDetailUseCaseFactory.swift +// FLINT +// +// Created by 김호성 on 2026.02.02. +// + +import Foundation + +import Domain + +protocol CollectionDetailUseCaseFactory: CollectionRepositoryFactory { + func makeCollectionDetailUseCase(collectionRepository: CollectionRepository) -> CollectionDetailUseCase + func makeCollectionDetailUseCase() -> CollectionDetailUseCase +} + +extension CollectionDetailUseCaseFactory { + func makeCollectionDetailUseCase() -> CollectionDetailUseCase { + return makeCollectionDetailUseCase(collectionRepository: makeCollectionRepository()) + } + func makeCollectionDetailUseCase(collectionRepository: CollectionRepository) -> CollectionDetailUseCase { + return DefaultCollectionDetailUseCase(collectionRepository: collectionRepository) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/UseCase/CreateCollectionUseCaseFactory.swift b/FLINT/FLINT/Dependency/Factory/UseCase/CreateCollectionUseCaseFactory.swift new file mode 100644 index 00000000..2b78012c --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/UseCase/CreateCollectionUseCaseFactory.swift @@ -0,0 +1,24 @@ +// +// CreateCollectionUseCaseFactory.swift +// FLINT +// +// Created by 김호성 on 2026.02.02. +// + +import Foundation + +import Domain + +protocol CreateCollectionUseCaseFactory: CollectionRepositoryFactory { + func makeCreateCollectionUseCase() -> CreateCollectionUseCase + func makeCreateCollectionUseCase(collectionRepository: CollectionRepository) -> CreateCollectionUseCase +} + +extension CreateCollectionUseCaseFactory { + func makeCreateCollectionUseCase() -> CreateCollectionUseCase { + return makeCreateCollectionUseCase(collectionRepository: makeCollectionRepository()) + } + func makeCreateCollectionUseCase(collectionRepository: CollectionRepository) -> CreateCollectionUseCase { + return DefaultCreateCollectionUseCase(collectionRepository: collectionRepository) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/BookmarkFactory.swift b/FLINT/FLINT/Dependency/Factory/UseCase/FetchBookmarkedUserUseCaseFactory.swift similarity index 86% rename from FLINT/FLINT/Dependency/Factory/BookmarkFactory.swift rename to FLINT/FLINT/Dependency/Factory/UseCase/FetchBookmarkedUserUseCaseFactory.swift index 89b4f38d..84dd9db7 100644 --- a/FLINT/FLINT/Dependency/Factory/BookmarkFactory.swift +++ b/FLINT/FLINT/Dependency/Factory/UseCase/FetchBookmarkedUserUseCaseFactory.swift @@ -12,19 +12,15 @@ import Data import Domain import Presentation -protocol BookmarkFactory: BookmarkRepositoryFactory { - - // UseCase +protocol FetchBookmarkedUserUseCaseFactory: BookmarkRepositoryFactory { func makeFetchBookmarkedUserUseCase() -> FetchBookmarkedUserUseCase func makeFetchBookmarkedUserUseCase(bookmarkRepository: BookmarkRepository) -> FetchBookmarkedUserUseCase } -extension BookmarkFactory { - +extension FetchBookmarkedUserUseCaseFactory { func makeFetchBookmarkedUserUseCase() -> FetchBookmarkedUserUseCase { return makeFetchBookmarkedUserUseCase(bookmarkRepository: makeBookmarkRepository()) } - func makeFetchBookmarkedUserUseCase(bookmarkRepository: BookmarkRepository) -> FetchBookmarkedUserUseCase { return DefaultFetchBookmarkedUserUseCase(bookmarkRepository: bookmarkRepository) } diff --git a/FLINT/FLINT/Dependency/Factory/UseCase/FetchWatchingCollectionsUseCaseFactory.swift b/FLINT/FLINT/Dependency/Factory/UseCase/FetchWatchingCollectionsUseCaseFactory.swift new file mode 100644 index 00000000..c3dcb30c --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/UseCase/FetchWatchingCollectionsUseCaseFactory.swift @@ -0,0 +1,24 @@ +// +// FetchWatchingCollectionsUseCaseFactory.swift +// FLINT +// +// Created by 김호성 on 2026.02.02. +// + +import Foundation + +import Domain + +protocol FetchWatchingCollectionsUseCaseFactory: CollectionRepositoryFactory { + func makeFetchWatchingCollectionsUseCase() -> FetchWatchingCollectionsUseCase + func makeFetchWatchingCollectionsUseCase(collectionRepository: CollectionRepository) -> FetchWatchingCollectionsUseCase +} + +extension FetchWatchingCollectionsUseCaseFactory { + func makeFetchWatchingCollectionsUseCase() -> FetchWatchingCollectionsUseCase { + return makeFetchWatchingCollectionsUseCase(collectionRepository: makeCollectionRepository()) + } + func makeFetchWatchingCollectionsUseCase(collectionRepository: CollectionRepository) -> FetchWatchingCollectionsUseCase { + return DefaultFetchWatchingCollectionsUseCase(collectionRepository: collectionRepository) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/UseCase/HomeUseCaseFactory.swift b/FLINT/FLINT/Dependency/Factory/UseCase/HomeUseCaseFactory.swift new file mode 100644 index 00000000..e2db3a5a --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/UseCase/HomeUseCaseFactory.swift @@ -0,0 +1,24 @@ +// +// HomeUseCaseFactory.swift +// FLINT +// +// Created by 김호성 on 2026.02.02. +// + +import Foundation + +import Domain + +protocol HomeUseCaseFactory: HomeRepositoryFactory { + func makeHomeUseCase() -> HomeUseCase + func makeHomeUseCase(homeRepository: HomeRepository) -> HomeUseCase +} + +extension HomeUseCaseFactory { + func makeHomeUseCase() -> HomeUseCase { + return makeHomeUseCase(homeRepository: makeHomeRepository()) + } + func makeHomeUseCase(homeRepository: HomeRepository) -> HomeUseCase { + return DefaultHomeUseCase(homeRepository: homeRepository) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/UseCase/UserProfileUseCaseFactory.swift b/FLINT/FLINT/Dependency/Factory/UseCase/UserProfileUseCaseFactory.swift new file mode 100644 index 00000000..f0f08ed6 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/UseCase/UserProfileUseCaseFactory.swift @@ -0,0 +1,24 @@ +// +// UserProfileUseCaseFactory.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Domain + +protocol UserProfileUseCaseFactory: UserRepositoryFactory { + func makeUserProfileUseCase() -> UserProfileUseCase + func makeUserProfileUseCase(userRepository: UserRepository) -> UserProfileUseCase +} + +extension UserProfileUseCaseFactory { + func makeUserProfileUseCase() -> UserProfileUseCase { + return makeUserProfileUseCase(userRepository: makeUserRepository()) + } + func makeUserProfileUseCase(userRepository: UserRepository) -> UserProfileUseCase { + return DefaultUserProfileUseCase(userRepository: userRepository) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/AddContentSelectViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/AddContentSelectViewControllerFactory+.swift new file mode 100644 index 00000000..4052eb7c --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/AddContentSelectViewControllerFactory+.swift @@ -0,0 +1,17 @@ +// +// AddContentSelectViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Presentation + +extension AddContentSelectViewControllerFactory where Self: AddContentSelectViewModelFactory & ViewControllerFactory { + func makeAddContentSelectViewController() -> AddContentSelectViewController { + let vm = makeAddContentSelectViewModel() + return AddContentSelectViewController(viewModel: vm, viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/CollectionDetailViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/CollectionDetailViewControllerFactory+.swift new file mode 100644 index 00000000..40ee1c14 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/CollectionDetailViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// CollectionDetailViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Presentation + +extension CollectionDetailViewControllerFactory where Self: CollectionDetailViewModelFactory & ViewControllerFactory { + func makeCollectionDetailViewController(collectionId: Int64) -> CollectionDetailViewController { + return CollectionDetailViewController(viewModel: makeCollectionDetailViewModel(collectionId: collectionId), viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/CollectionFolderListViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/CollectionFolderListViewControllerFactory+.swift new file mode 100644 index 00000000..adace326 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/CollectionFolderListViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// CollectionFolderListViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Presentation + +extension CollectionFolderListViewControllerFactory where Self: CollectionFolderListViewModelFactory & ViewControllerFactory { + func makeCollectionFolderListViewController() -> CollectionFolderListViewController { + return CollectionFolderListViewController(viewModel: makeCollectionFolderListViewModel(), viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/CreateCollectionViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/CreateCollectionViewControllerFactory+.swift new file mode 100644 index 00000000..5a83079a --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/CreateCollectionViewControllerFactory+.swift @@ -0,0 +1,17 @@ +// +// CreateCollectionViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Presentation + +extension CreateCollectionViewControllerFactory where Self: CreateCollectionViewModelFactory & ViewControllerFactory { + func makeCreateCollectionViewController() -> CreateCollectionViewController { + let vm = makeCreateCollectionViewModel() + return CreateCollectionViewController(viewModel: vm, viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/ExploreViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/ExploreViewControllerFactory+.swift new file mode 100644 index 00000000..86e55d61 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/ExploreViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// ExploreViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Presentation + +extension ExploreViewControllerFactory where Self: ExploreViewModelFactory & ViewControllerFactory { + func makeExploreViewController() -> ExploreViewController { + return ExploreViewController(exploreViewModel: makeExploreViewModel(), viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/FilmSelectViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/FilmSelectViewControllerFactory+.swift new file mode 100644 index 00000000..2fa43ae6 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/FilmSelectViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// FilmSelectViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.30. +// + +import Foundation + +import Presentation + +extension FilmSelectViewControllerFactory where Self: ViewControllerFactory { + func makeFilmSelectViewController(onboardingViewModel: OnboardingViewModel) -> FilmSelectViewController { + return FilmSelectViewController(onboardingViewModel: onboardingViewModel, viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/HomeViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/HomeViewControllerFactory+.swift new file mode 100644 index 00000000..bcb7768c --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/HomeViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// HomeViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Presentation + +extension HomeViewControllerFactory where Self: HomeViewModelFactory & ViewControllerFactory { + func makeHomeViewController() -> HomeViewController { + return HomeViewController(viewModel: makeHomeViewModel(), viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/LoginViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/LoginViewControllerFactory+.swift new file mode 100644 index 00000000..1fc0dae4 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/LoginViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// SplashViewControllerFactory.swift +// FLINT +// +// Created by 김호성 on 2026.01.30. +// + +import Foundation + +import Presentation + +extension LoginViewControllerFactory where Self: LoginViewModelFactory & ViewControllerFactory { + func makeLoginViewController() -> LoginViewController { + return LoginViewController(loginViewModel: makeLoginViewModel(), viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/NicknameViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/NicknameViewControllerFactory+.swift new file mode 100644 index 00000000..89c8fcda --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/NicknameViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// NicknameViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.30. +// + +import Foundation + +import Presentation + +extension NicknameViewControllerFactory where Self: OnboardingViewModelFactory & ViewControllerFactory { + func makeNicknameViewController() -> NicknameViewController { + return NicknameViewController(onboardingViewModel: makeOnboardingViewModel(), viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/OnboardingDoneViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/OnboardingDoneViewControllerFactory+.swift new file mode 100644 index 00000000..cde5b901 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/OnboardingDoneViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// OnboardingDoneViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.30. +// + +import Foundation + +import Presentation + +extension OnboardingDoneViewControllerFactory where Self: ViewControllerFactory { + func makeOnboardingDoneViewController(onboardingViewModel: OnboardingViewModel) -> OnboardingDoneViewController { + return OnboardingDoneViewController(onboardingViewModel: onboardingViewModel, viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/OttSelectViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/OttSelectViewControllerFactory+.swift new file mode 100644 index 00000000..44f393a6 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/OttSelectViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// OttSelectViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.30. +// + +import Foundation + +import Presentation + +extension OttSelectViewControllerFactory where Self: ViewControllerFactory { + func makeOttSelectViewController(onboardingViewModel: OnboardingViewModel) -> OttSelectViewController { + return OttSelectViewController(onboardingViewModel: onboardingViewModel, viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/ProfileViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/ProfileViewControllerFactory+.swift new file mode 100644 index 00000000..b6d6bdab --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/ProfileViewControllerFactory+.swift @@ -0,0 +1,25 @@ +// +// ProfileViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Presentation + +extension ProfileViewControllerFactory where Self: ProfileViewModelFactory & ViewControllerFactory { + func makeProfileViewController() -> ProfileViewController { + makeProfileViewController(target: .me) + } + + func makeProfileViewController( + target: ProfileViewModel.Target = .me + ) -> ProfileViewController { + return ProfileViewController( + profileViewModel: makeProfileViewModel(target: target), + viewControllerFactory: self + ) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/SplashViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/SplashViewControllerFactory+.swift new file mode 100644 index 00000000..b72c0724 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/SplashViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// SplashViewControllerFactory.swift +// FLINT +// +// Created by 김호성 on 2026.01.30. +// + +import Foundation + +import Presentation + +extension SplashViewControllerFactory where Self: ViewControllerFactory { + func makeSplashViewController() -> SplashViewController { + return SplashViewController(viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewController/TabBarViewControllerFactory+.swift b/FLINT/FLINT/Dependency/Factory/ViewController/TabBarViewControllerFactory+.swift new file mode 100644 index 00000000..8e6642f2 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewController/TabBarViewControllerFactory+.swift @@ -0,0 +1,16 @@ +// +// TabBarViewControllerFactory+.swift +// FLINT +// +// Created by 김호성 on 2026.01.31. +// + +import Foundation + +import Presentation + +extension TabBarViewControllerFactory where Self: ViewControllerFactory { + func makeTabBarViewController() -> TabBarViewController { + return TabBarViewController(viewControllerFactory: self) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/CollectionDetailFactory.swift b/FLINT/FLINT/Dependency/Factory/ViewModel/CollectionDetailViewModelFactory.swift similarity index 53% rename from FLINT/FLINT/Dependency/Factory/CollectionDetailFactory.swift rename to FLINT/FLINT/Dependency/Factory/ViewModel/CollectionDetailViewModelFactory.swift index 619e1fcd..9f8e18d6 100644 --- a/FLINT/FLINT/Dependency/Factory/CollectionDetailFactory.swift +++ b/FLINT/FLINT/Dependency/Factory/ViewModel/CollectionDetailViewModelFactory.swift @@ -1,23 +1,16 @@ // -// CollectionDetailFactory.swift +// CollectionDetailViewModel.swift // FLINT // -// Created by 진소은 on 1/23/26. +// Created by 김호성 on 2026.02.02. // import Foundation -import Data import Domain import Presentation -protocol CollectionDetailFactory: CollectionRepositoryFactory, BookmarkFactory { - - // MARK: - UseCase - func makeCollectionDetailUseCase(collectionRepository: CollectionRepository) -> CollectionDetailUseCase - func makeCollectionDetailUseCase() -> CollectionDetailUseCase - - // MARK: - ViewModel +protocol CollectionDetailViewModelFactory: CollectionDetailUseCaseFactory, FetchBookmarkedUserUseCaseFactory { func makeCollectionDetailViewModel(collectionId: Int64) -> CollectionDetailViewModel func makeCollectionDetailViewModel( collectionId: Int64, @@ -25,25 +18,13 @@ protocol CollectionDetailFactory: CollectionRepositoryFactory, BookmarkFactory { ) -> CollectionDetailViewModel } -extension CollectionDetailFactory { - - // MARK: - UseCase - func makeCollectionDetailUseCase() -> CollectionDetailUseCase { - return makeCollectionDetailUseCase(collectionRepository: makeCollectionRepository()) - } - - func makeCollectionDetailUseCase(collectionRepository: CollectionRepository) -> CollectionDetailUseCase { - return DefaultCollectionDetailUseCase(collectionRepository: collectionRepository) - } - - // MARK: - ViewModel +extension CollectionDetailViewModelFactory { func makeCollectionDetailViewModel(collectionId: Int64) -> CollectionDetailViewModel { return makeCollectionDetailViewModel( collectionId: collectionId, collectionDetailUseCase: makeCollectionDetailUseCase() ) } - func makeCollectionDetailViewModel( collectionId: Int64, collectionDetailUseCase: CollectionDetailUseCase diff --git a/FLINT/FLINT/Dependency/Factory/ViewModel/CollectionFolderListViewModel.swift b/FLINT/FLINT/Dependency/Factory/ViewModel/CollectionFolderListViewModel.swift deleted file mode 100644 index 92dac4b6..00000000 --- a/FLINT/FLINT/Dependency/Factory/ViewModel/CollectionFolderListViewModel.swift +++ /dev/null @@ -1,7 +0,0 @@ -// -// CollectionFolderListViewModel.swift -// FLINT -// -// Created by 소은 on 1/24/26. -// - diff --git a/FLINT/FLINT/Dependency/Factory/ViewModel/CollectionFolderListViewModelFactory.swift b/FLINT/FLINT/Dependency/Factory/ViewModel/CollectionFolderListViewModelFactory.swift new file mode 100644 index 00000000..e51f8564 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewModel/CollectionFolderListViewModelFactory.swift @@ -0,0 +1,25 @@ +// +// CollectionFolderListViewModelFactory.swift +// FLINT +// +// Created by 김호성 on 2026.02.02. +// + +import Foundation + +import Domain +import Presentation + +protocol CollectionFolderListViewModelFactory: FetchWatchingCollectionsUseCaseFactory { + func makeCollectionFolderListViewModel() -> CollectionFolderListViewModel + func makeCollectionFolderListViewModel(fetchWatchingCollectionsUseCase: FetchWatchingCollectionsUseCase) -> CollectionFolderListViewModel +} + +extension CollectionFolderListViewModelFactory { + func makeCollectionFolderListViewModel() -> CollectionFolderListViewModel { + return makeCollectionFolderListViewModel(fetchWatchingCollectionsUseCase: makeFetchWatchingCollectionsUseCase()) + } + func makeCollectionFolderListViewModel(fetchWatchingCollectionsUseCase: FetchWatchingCollectionsUseCase) -> CollectionFolderListViewModel { + return CollectionFolderListViewModel(fetchWatchingCollectionsUseCase: fetchWatchingCollectionsUseCase) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewModel/CreateCollectionViewModelFactory.swift b/FLINT/FLINT/Dependency/Factory/ViewModel/CreateCollectionViewModelFactory.swift new file mode 100644 index 00000000..18cb24c0 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewModel/CreateCollectionViewModelFactory.swift @@ -0,0 +1,25 @@ +// +// CreateCollectionViewModel.swift +// FLINT +// +// Created by 김호성 on 2026.02.02. +// + +import Foundation + +import Domain +import Presentation + +protocol CreateCollectionViewModelFactory: CreateCollectionUseCaseFactory { + func makeCreateCollectionViewModel() -> CreateCollectionViewModel + func makeCreateCollectionViewModel(createCollectionUseCase: CreateCollectionUseCase) -> CreateCollectionViewModel +} + +extension CreateCollectionViewModelFactory { + func makeCreateCollectionViewModel() -> CreateCollectionViewModel { + return makeCreateCollectionViewModel(createCollectionUseCase: makeCreateCollectionUseCase()) + } + func makeCreateCollectionViewModel(createCollectionUseCase: CreateCollectionUseCase) -> CreateCollectionViewModel { + return DefaultCreateCollectionViewModel(createCollectionUseCase: createCollectionUseCase) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewModel/HomeViewModelFactory.swift b/FLINT/FLINT/Dependency/Factory/ViewModel/HomeViewModelFactory.swift new file mode 100644 index 00000000..3425cfcf --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewModel/HomeViewModelFactory.swift @@ -0,0 +1,43 @@ +// +// HomeViewModelFactory.swift +// FLINT +// +// Created by 김호성 on 2026.02.02. +// + +import Foundation + +import Domain +import Presentation + +protocol HomeViewModelFactory: HomeUseCaseFactory, UserProfileUseCaseFactory, FetchWatchingCollectionsUseCaseFactory { + func makeHomeViewModel() -> HomeViewModel + func makeHomeViewModel( + homeUseCase: HomeUseCase, + userProfileUseCase: UserProfileUseCase, + fetchWatchingCollectionsUseCase: FetchWatchingCollectionsUseCase + ) -> HomeViewModel +} + +extension HomeViewModelFactory { + func makeHomeViewModel() -> HomeViewModel { + return makeHomeViewModel( + homeUseCase: makeHomeUseCase(), + userProfileUseCase: makeUserProfileUseCase(), + fetchWatchingCollectionsUseCase: makeFetchWatchingCollectionsUseCase() + ) + } + + func makeHomeViewModel( + homeUseCase: HomeUseCase, + userProfileUseCase: UserProfileUseCase, + fetchWatchingCollectionsUseCase: FetchWatchingCollectionsUseCase + ) -> HomeViewModel { + return HomeViewModel( + homeUseCase: homeUseCase, + userProfileUseCase: userProfileUseCase, + fetchWatchingCollectionsUseCase: fetchWatchingCollectionsUseCase, + initialUserName: "얀비" + ) + } +} diff --git a/FLINT/FLINT/Dependency/Factory/ViewModel/OnboardingViewModelFactory.swift b/FLINT/FLINT/Dependency/Factory/ViewModel/OnboardingViewModelFactory.swift index 5d1a9a7c..84181aff 100644 --- a/FLINT/FLINT/Dependency/Factory/ViewModel/OnboardingViewModelFactory.swift +++ b/FLINT/FLINT/Dependency/Factory/ViewModel/OnboardingViewModelFactory.swift @@ -17,7 +17,12 @@ protocol OnboardingViewModelFactory: NicknameUseCaseFactory, SearchContentsUseCa extension OnboardingViewModelFactory { func makeOnboardingViewModel() -> OnboardingViewModel { - return makeOnboardingViewModel(nicknameUseCase: makeNicknameUseCase(), contentsUseCase: makeContentsUseCase(), searchContentsUseCase: makeSearchContentsUseCase(), signupUseCase: makeSignupUseCase()) + return makeOnboardingViewModel( + nicknameUseCase: makeNicknameUseCase(), + contentsUseCase: makeContentsUseCase(), + searchContentsUseCase: makeSearchContentsUseCase(), + signupUseCase: makeSignupUseCase() + ) } func makeOnboardingViewModel(nicknameUseCase: NicknameUseCase, contentsUseCase: ContentsUseCase, searchContentsUseCase: SearchContentsUseCase, signupUseCase: SignupUseCase) -> OnboardingViewModel { return DefaultOnboardingViewModel(nicknameUseCase: nicknameUseCase, contentsUseCase: contentsUseCase, searchContentsUseCase: searchContentsUseCase, signupUseCase: signupUseCase) diff --git a/FLINT/FLINT/Dependency/Factory/ViewModel/ProfileViewModelFactory.swift b/FLINT/FLINT/Dependency/Factory/ViewModel/ProfileViewModelFactory.swift new file mode 100644 index 00000000..94bdd973 --- /dev/null +++ b/FLINT/FLINT/Dependency/Factory/ViewModel/ProfileViewModelFactory.swift @@ -0,0 +1,33 @@ +// +// ProfileViewModelFactory.swift +// FLINT +// +// Created by 김호성 on 2026.02.02. +// + +import Foundation + +import Domain +import Presentation + +protocol ProfileViewModelFactory: UserProfileUseCaseFactory { + func makeProfileViewModel() -> ProfileViewModel + func makeProfileViewModel( + target: ProfileViewModel.Target + ) -> ProfileViewModel +} + +extension ProfileViewModelFactory { + func makeProfileViewModel() -> ProfileViewModel { + return makeProfileViewModel(target: .me) + } + + func makeProfileViewModel( + target: ProfileViewModel.Target + ) -> ProfileViewModel { + return ProfileViewModel( + target: target, + userProfileUseCase: makeUserProfileUseCase() + ) + } +} diff --git a/FLINT/Presentation/Sources/ViewController/Dependency/ViewControllerFactory.swift b/FLINT/Presentation/Sources/ViewController/Dependency/ViewControllerFactory.swift index aab113db..7d2d346a 100644 --- a/FLINT/Presentation/Sources/ViewController/Dependency/ViewControllerFactory.swift +++ b/FLINT/Presentation/Sources/ViewController/Dependency/ViewControllerFactory.swift @@ -9,29 +9,30 @@ import UIKit import ViewModel -public protocol ViewControllerFactory { - func makeSplashViewController() -> SplashViewController - func makeLoginViewController() -> LoginViewController - - func makeNicknameViewController() -> NicknameViewController +public typealias ViewControllerFactory = - func makeFilmSelectViewController(onboardingViewModel: OnboardingViewModel) -> FilmSelectViewController - func makeOttSelectViewController(onboardingViewModel: OnboardingViewModel) -> OttSelectViewController - func makeOnboardingDoneViewController(onboardingViewModel: OnboardingViewModel) -> OnboardingDoneViewController + // MARK: - Splash / Login - func makeTabBarViewController() -> TabBarViewController + SplashViewControllerFactory & + LoginViewControllerFactory & - func makeHomeViewController() -> HomeViewController - func makeExploreViewController() -> ExploreViewController + // MARK: - Onboarding - func makeAddContentSelectViewController() -> AddContentSelectViewController - func makeCreateCollectionViewController() -> CreateCollectionViewController + NicknameViewControllerFactory & + FilmSelectViewControllerFactory & + OttSelectViewControllerFactory & + OnboardingDoneViewControllerFactory & - func makeProfileViewController() -> ProfileViewController - func makeProfileViewController(target: ProfileViewModel.Target) -> ProfileViewController - - func makeCollectionDetailViewController(collectionId: Int64) -> CollectionDetailViewController + // MARK: - Main - func makeCollectionFolderListViewController() -> CollectionFolderListViewController - -} + TabBarViewControllerFactory & + HomeViewControllerFactory & + ExploreViewControllerFactory & + ProfileViewControllerFactory & + + // MARK: - Collection + + CollectionFolderListViewControllerFactory & + CollectionDetailViewControllerFactory & + AddContentSelectViewControllerFactory & + CreateCollectionViewControllerFactory diff --git a/FLINT/Presentation/Sources/ViewController/Scene/CollectionDetail/CollectionDetailViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/CollectionDetail/CollectionDetailViewController.swift index bd225082..96dc4b99 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/CollectionDetail/CollectionDetailViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/CollectionDetail/CollectionDetailViewController.swift @@ -14,6 +14,10 @@ import Entity import View import ViewModel +public protocol CollectionDetailViewControllerFactory { + func makeCollectionDetailViewController(collectionId: Int64) -> CollectionDetailViewController +} + public final class CollectionDetailViewController: BaseViewController { // MARK: - Enum diff --git a/FLINT/Presentation/Sources/ViewController/Scene/CreateCollection/CollectionSearchVIew/AddContentSelectViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/CreateCollection/CollectionSearchVIew/AddContentSelectViewController.swift index 74f7e9bd..3250e0ff 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/CreateCollection/CollectionSearchVIew/AddContentSelectViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/CreateCollection/CollectionSearchVIew/AddContentSelectViewController.swift @@ -16,6 +16,10 @@ import Domain import View import ViewModel +public protocol AddContentSelectViewControllerFactory { + func makeAddContentSelectViewController() -> AddContentSelectViewController +} + public final class AddContentSelectViewController: BaseViewController { // MARK: - Output diff --git a/FLINT/Presentation/Sources/ViewController/Scene/CreateCollection/CreateCollectionView/CreateCollectionViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/CreateCollection/CreateCollectionView/CreateCollectionViewController.swift index 9c84fc79..1c32bd15 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/CreateCollection/CreateCollectionView/CreateCollectionViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/CreateCollection/CreateCollectionView/CreateCollectionViewController.swift @@ -12,6 +12,10 @@ import Domain import View import ViewModel +public protocol CreateCollectionViewControllerFactory { + func makeCreateCollectionViewController() -> CreateCollectionViewController +} + public final class CreateCollectionViewController: BaseViewController { // MARK: - Enum diff --git a/FLINT/Presentation/Sources/ViewController/Scene/Explore/ExploreViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/Explore/ExploreViewController.swift index 55730f54..c35978ba 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/Explore/ExploreViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/Explore/ExploreViewController.swift @@ -16,6 +16,10 @@ import Domain import View import ViewModel +public protocol ExploreViewControllerFactory { + func makeExploreViewController() -> ExploreViewController +} + public final class ExploreViewController: BaseViewController { public let exploreViewModel: ExploreViewModel diff --git a/FLINT/Presentation/Sources/ViewController/Scene/Home/CollectionFolder/CollectionFolderListViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/Home/CollectionFolder/CollectionFolderListViewController.swift index 1110274c..5e81cbf3 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/Home/CollectionFolder/CollectionFolderListViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/Home/CollectionFolder/CollectionFolderListViewController.swift @@ -12,6 +12,10 @@ import ViewModel import Domain +public protocol CollectionFolderListViewControllerFactory { + func makeCollectionFolderListViewController() -> CollectionFolderListViewController +} + public final class CollectionFolderListViewController: BaseViewController { // MARK: - Data diff --git a/FLINT/Presentation/Sources/ViewController/Scene/Home/HomeViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/Home/HomeViewController.swift index 18fe7501..3bf556bd 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/Home/HomeViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/Home/HomeViewController.swift @@ -12,11 +12,15 @@ import ViewModel import Domain +public protocol HomeViewControllerFactory { + func makeHomeViewController() -> HomeViewController +} + public final class HomeViewController: BaseViewController { private let viewModel: HomeViewModel - public init(viewModel: HomeViewModel, viewControllerFactory: ViewControllerFactory? = nil) { + public init(viewModel: HomeViewModel, viewControllerFactory: ViewControllerFactory) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) self.viewControllerFactory = viewControllerFactory diff --git a/FLINT/Presentation/Sources/ViewController/Scene/Login/LoginViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/Login/LoginViewController.swift index 76ad3e6f..849cf5b0 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/Login/LoginViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/Login/LoginViewController.swift @@ -12,6 +12,10 @@ import Domain import View import ViewModel +public protocol LoginViewControllerFactory { + func makeLoginViewController() -> LoginViewController +} + public final class LoginViewController: BaseViewController { // MARK: - ViewModel diff --git a/FLINT/Presentation/Sources/ViewController/Scene/MyViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/MyViewController.swift deleted file mode 100644 index 4947e5a8..00000000 --- a/FLINT/Presentation/Sources/ViewController/Scene/MyViewController.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// MyViewController.swift -// FLINT -// -// Created by 소은 on 1/6/26. -// - -import UIKit -import SnapKit -import Then - -public final class MyViewController: BaseViewController { - - private let titleLabel = UILabel().then { - $0.attributedText = .pretendard(.head1_sb_22, text: "My") - $0.textAlignment = .center - } - - public override func setUI() { - view.backgroundColor = .systemBackground - } - - public override func setHierarchy() { - view.addSubview(titleLabel) - } - - public override func setLayout() { - titleLabel.snp.makeConstraints { - $0.center.equalToSuperview() - } - } -} diff --git a/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/Done/OnboardingDoneViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/Done/OnboardingDoneViewController.swift index c79df8e5..87fff128 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/Done/OnboardingDoneViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/Done/OnboardingDoneViewController.swift @@ -12,6 +12,10 @@ import Domain import View import ViewModel +public protocol OnboardingDoneViewControllerFactory { + func makeOnboardingDoneViewController(onboardingViewModel: OnboardingViewModel) -> OnboardingDoneViewController +} + public final class OnboardingDoneViewController: BaseViewController { // MARK: - ViewModel diff --git a/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/FilmSelect/FilmSelectViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/FilmSelect/FilmSelectViewController.swift index 019e4042..0b367595 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/FilmSelect/FilmSelectViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/FilmSelect/FilmSelectViewController.swift @@ -14,7 +14,11 @@ import Domain import View import ViewModel -// TODO: - shadow & select logic +public protocol FilmSelectViewControllerFactory { + func makeFilmSelectViewController(onboardingViewModel: OnboardingViewModel) -> FilmSelectViewController +} + +// TODO: - shadow public final class FilmSelectViewController: BaseViewController { diff --git a/FLINT/Presentation/Sources/ViewController/Scene/Nickname/NicknameViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/Nickname/NicknameViewController.swift similarity index 98% rename from FLINT/Presentation/Sources/ViewController/Scene/Nickname/NicknameViewController.swift rename to FLINT/Presentation/Sources/ViewController/Scene/Onboarding/Nickname/NicknameViewController.swift index fcccfef9..41509f94 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/Nickname/NicknameViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/Nickname/NicknameViewController.swift @@ -14,6 +14,10 @@ import Domain import View import ViewModel +public protocol NicknameViewControllerFactory { + func makeNicknameViewController() -> NicknameViewController +} + public final class NicknameViewController: BaseViewController { // MARK: - ViewModel diff --git a/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/OttSelect/OttSelectViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/OttSelect/OttSelectViewController.swift index 96df2419..a0e535f0 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/OttSelect/OttSelectViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/Onboarding/OttSelect/OttSelectViewController.swift @@ -12,6 +12,10 @@ import Domain import View import ViewModel +public protocol OttSelectViewControllerFactory { + func makeOttSelectViewController(onboardingViewModel: OnboardingViewModel) -> OttSelectViewController +} + public class OttSelectViewController: BaseViewController { // MARK: - ViewModel diff --git a/FLINT/Presentation/Sources/ViewController/Scene/Profile/ProfileViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/Profile/ProfileViewController.swift index a97833ee..0450f37d 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/Profile/ProfileViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/Profile/ProfileViewController.swift @@ -15,6 +15,11 @@ import Domain import View import ViewModel +public protocol ProfileViewControllerFactory { + func makeProfileViewController() -> ProfileViewController + func makeProfileViewController(target: ProfileViewModel.Target) -> ProfileViewController +} + public final class ProfileViewController: BaseViewController { diff --git a/FLINT/Presentation/Sources/ViewController/Scene/Splash/SplashViewController.swift b/FLINT/Presentation/Sources/ViewController/Scene/Splash/SplashViewController.swift index 491eb0d4..c3b974b3 100644 --- a/FLINT/Presentation/Sources/ViewController/Scene/Splash/SplashViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/Scene/Splash/SplashViewController.swift @@ -12,6 +12,10 @@ import Combine import View import ViewModel +public protocol SplashViewControllerFactory { + func makeSplashViewController() -> SplashViewController +} + public final class SplashViewController: BaseViewController { public init(viewControllerFactory: ViewControllerFactory) { diff --git a/FLINT/Presentation/Sources/ViewController/TabBar/TabBarViewController.swift b/FLINT/Presentation/Sources/ViewController/TabBar/TabBarViewController.swift index 37763eeb..48681779 100644 --- a/FLINT/Presentation/Sources/ViewController/TabBar/TabBarViewController.swift +++ b/FLINT/Presentation/Sources/ViewController/TabBar/TabBarViewController.swift @@ -12,6 +12,10 @@ import Then import View +public protocol TabBarViewControllerFactory { + func makeTabBarViewController() -> TabBarViewController +} + public class TabBarViewController: UIViewController { // MARK: - DI