Skip to content

Commit aedb9c5

Browse files
committed
feat: 추천 루틴 등록하기 기능 추가
1 parent 7726a5a commit aedb9c5

9 files changed

Lines changed: 76 additions & 7 deletions

File tree

Projects/DataSource/Sources/Endpoint/RecommendedRoutineEndpoint.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
enum RecommendedRoutineEndpoint {
9+
case fetchRecommendedRoutine(id: Int)
910
case fetchRecommendedRoutines
1011
}
1112

@@ -16,7 +17,10 @@ extension RecommendedRoutineEndpoint: Endpoint {
1617

1718
var path: String {
1819
switch self {
19-
case .fetchRecommendedRoutines: baseURL
20+
case .fetchRecommendedRoutines:
21+
return baseURL
22+
case .fetchRecommendedRoutine(let id):
23+
return "\(baseURL)/\(id)"
2024
}
2125
}
2226

Projects/DataSource/Sources/Repository/RecommendedRoutineRepository.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ import Domain
1010
final class RecommendedRoutineRepository: RecommendedRoutineRepositoryProtocol {
1111
private let networkService = NetworkService.shared
1212

13+
func fetchRecommendedRoutine(id: Int) async throws -> RecommendedRoutineEntity? {
14+
let endpoint = RecommendedRoutineEndpoint.fetchRecommendedRoutine(id: id)
15+
16+
guard let recommendedRoutineDTO = try await networkService.request(endpoint: endpoint, type: RecommendedRoutineDTO.self)
17+
else { return nil }
18+
19+
return recommendedRoutineDTO.toRecommendedRoutineEntity()
20+
}
21+
1322
func fetchRecommendedRoutines() async throws -> [RecommendedRoutineEntity] {
1423
let endpoint = RecommendedRoutineEndpoint.fetchRecommendedRoutines
1524
guard let response = try await networkService.request(endpoint: endpoint, type: RecommendedRoutineDictionaryResponseDTO.self)

Projects/Domain/Sources/Protocol/Repository/RecommendedRoutineRepositoryProtocol.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77

88
// 추천 루틴에 관련된 데이터를 가져오는 Repository
99
public protocol RecommendedRoutineRepositoryProtocol {
10+
/// 추천 루틴 데이터를 가져옵니다.
11+
/// - Returns: 추천 루틴 (단건)
12+
func fetchRecommendedRoutine(id: Int) async throws -> RecommendedRoutineEntity?
13+
1014
/// 추천 루틴 데이터를 가져옵니다.
1115
/// - Returns: 추천 루틴 목록
1216
func fetchRecommendedRoutines() async throws -> [RecommendedRoutineEntity]

Projects/Domain/Sources/Protocol/UseCase/RecommendedRoutineUseCaseProtocol.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
//
77

88
public protocol RecommendedRoutineUseCaseProtocol {
9+
/// 추천 루틴 데이터를 가져옵니다.
10+
/// - Returns: 추천 루틴 (단건)
11+
func fetchRecommendedRoutine(id: Int) async throws -> RecommendedRoutineEntity?
12+
913
/// 추천 루틴 데이터를 가져옵니다.
1014
/// - Returns: 추천 루틴 목록
1115
func fetchRecommendedRoutines() async throws -> [RecommendedRoutineEntity]

Projects/Domain/Sources/UseCase/RecommendedRoutine/RecommendedRoutineUseCase.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ public final class RecommendedRoutineUseCase: RecommendedRoutineUseCaseProtocol
1212
self.recommendedRoutineRepository = recommendedRoutineRepository
1313
}
1414

15+
public func fetchRecommendedRoutine(id: Int) async throws -> RecommendedRoutineEntity? {
16+
let recommendedRoutine = try await recommendedRoutineRepository.fetchRecommendedRoutine(id: id)
17+
return recommendedRoutine
18+
}
19+
1520
public func fetchRecommendedRoutines() async throws -> [RecommendedRoutineEntity] {
1621
let recommendedRoutines = try await recommendedRoutineRepository.fetchRecommendedRoutines()
1722
return recommendedRoutines

Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,12 @@ public struct PresentationDependencyAssembler: DependencyAssemblerProtocol {
6767
}
6868

6969
DIContainer.shared.register(type: RoutineCreationViewModel.self) { container in
70-
guard let routineUseCase = container.resolve(type: RoutineUseCaseProtocol.self)
71-
else { fatalError("routineUseCase 의존성이 등록되지 않았습니다.") }
70+
guard
71+
let routineUseCase = container.resolve(type: RoutineUseCaseProtocol.self),
72+
let recommendedRoutineUseCase = container.resolve(type: RecommendedRoutineUseCaseProtocol.self)
73+
else { fatalError("routineUseCase, resultRecommendedRoutineUseCase 의존성이 등록되지 않았습니다.") }
7274

73-
return RoutineCreationViewModel(routineUseCase: routineUseCase)
75+
return RoutineCreationViewModel(routineUseCase: routineUseCase, recommenedRoutineUseCase: recommendedRoutineUseCase)
7476
}
7577

7678
DIContainer.shared.register(type: ResultRecommendedRoutineViewModel.self) { container in

Projects/Presentation/Sources/RecommendedRoutine/View/RecommendedRoutineView.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,13 @@ extension RecommendedRoutineView: RoutineCategoryViewDelegate {
268268
// MARK: RecommendedRoutineCardViewDelegate
269269
extension RecommendedRoutineView: RecommendedRoutineCardViewDelegate {
270270
func recommendedRoutineCardView(_ sender: RecommendedRoutineCardView, didTapRecommendedRoutine routine: RecommendedRoutine) {
271-
// TODO: 루틴 등록하기 화면으로 이동해야 함 + 추천 루틴 들고
271+
guard let routineCreationViewModel = DIContainer.shared.resolve(type: RoutineCreationViewModel.self) else {
272+
fatalError("routineCreationViewModel 의존성이 등록되지 않았습니다.")
273+
}
274+
275+
let routineCreationView = RoutineCreationView(viewModel: routineCreationViewModel, recommendRoutineId: routine.id)
276+
routineCreationView.hidesBottomBarWhenPushed = true
277+
self.navigationController?.pushViewController(routineCreationView, animated: true)
272278
}
273279
}
274280

Projects/Presentation/Sources/RoutineCreation/View/RoutineCreationView.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,15 @@ final class RoutineCreationView: BaseViewController<RoutineCreationViewModel> {
9393
viewModel.action(input: .fetchRoutine(id: routineId))
9494
}
9595
}
96-
96+
97+
init(viewModel: RoutineCreationViewModel, recommendRoutineId: Int) {
98+
navigationTitle = "루틴 등록"
99+
registerButtonTitle = "등록하기"
100+
101+
super.init(viewModel: viewModel)
102+
viewModel.action(input: .fetchRecommendedRoutine(id: recommendRoutineId))
103+
}
104+
97105
required init?(coder: NSCoder) {
98106
fatalError("init(coder:) has not been implemented")
99107
}
@@ -527,6 +535,7 @@ final class RoutineCreationView: BaseViewController<RoutineCreationViewModel> {
527535
registerButton.addAction(
528536
UIAction { [weak self] _ in
529537
self?.viewModel.action(input: .registerRoutine)
538+
self?.navigationController?.popViewController(animated: true)
530539
},
531540
for: .touchUpInside)
532541
}

Projects/Presentation/Sources/RoutineCreation/ViewModel/RoutineCreationViewModel.swift

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ final class RoutineCreationViewModel: ViewModel {
4141

4242
enum Input {
4343
case fetchRoutine(id: String)
44+
case fetchRecommendedRoutine(id: Int)
4445
case configureName(name: String)
4546
case addSubRoutine
4647
case deleteSubRoutine(index: Int)
@@ -69,11 +70,13 @@ final class RoutineCreationViewModel: ViewModel {
6970
private let executionTimeSubject = CurrentValueSubject<ExecutionType, Never>(.none)
7071
private let checkRoutinePublisher = PassthroughSubject<Bool, Never>()
7172
private let routineUseCase: RoutineUseCaseProtocol
73+
private let recommenedRoutineUseCase: RecommendedRoutineUseCaseProtocol
7274
private var deletedSubroutines = Set<SubRoutineSummaryEntity>()
7375
private var routineId: String?
7476

75-
init(routineUseCase: RoutineUseCaseProtocol) {
77+
init(routineUseCase: RoutineUseCaseProtocol, recommenedRoutineUseCase: RecommendedRoutineUseCaseProtocol) {
7678
self.routineUseCase = routineUseCase
79+
self.recommenedRoutineUseCase = recommenedRoutineUseCase
7780

7881
output = Output(
7982
namePublisher: nameSubject.eraseToAnyPublisher(),
@@ -92,6 +95,8 @@ final class RoutineCreationViewModel: ViewModel {
9295
switch input {
9396
case .fetchRoutine(let id):
9497
fetchRoutine(id: id)
98+
case .fetchRecommendedRoutine(let id):
99+
fetchRecommenedRoutine(id: id)
95100
case .configureName(let name):
96101
configureName(name: name)
97102
case .addSubRoutine:
@@ -152,6 +157,27 @@ final class RoutineCreationViewModel: ViewModel {
152157
}
153158
}
154159

160+
private func fetchRecommenedRoutine(id: Int) {
161+
Task {
162+
do {
163+
guard let routine = try await recommenedRoutineUseCase.fetchRecommendedRoutine(id: id) else { return }
164+
165+
let subRoutines = routine.subRoutines.map {
166+
SubRoutineSummaryEntity(
167+
subRoutineId: nil,
168+
subRoutineName: $0.title,
169+
sortOrder: nil)
170+
}
171+
172+
nameSubject.send(routine.title)
173+
subRoutinesSubject.send(subRoutines)
174+
175+
updateIsRoutineValid()
176+
} catch {
177+
}
178+
}
179+
}
180+
155181
private func configureName(name: String) {
156182
nameSubject.send(name)
157183
}

0 commit comments

Comments
 (0)