Skip to content

Commit

Permalink
Merge pull request #1202 from wakmusic/1109-replace-wakmusic-playlist…
Browse files Browse the repository at this point in the history
…-button-header

🔀 :: (#1109) 왁뮤 추천 플리 헤더 버튼을 전체 재생으로 통일
  • Loading branch information
yongbeomkwak authored Aug 20, 2024
2 parents 183dfc8 + a4ef646 commit 4f70195
Show file tree
Hide file tree
Showing 15 changed files with 160 additions and 62 deletions.
6 changes: 6 additions & 0 deletions Projects/App/Sources/Application/AppComponent+Playlist.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,12 @@ public extension AppComponent {
}
}

var fetchWmPlaylistDetailUseCase: any FetchWmPlaylistDetailUseCase {
shared {
FetchWmPlaylistDetailUseCaseImpl(playlistRepository: playlistRepository)
}
}

var createPlaylistUseCase: any CreatePlaylistUseCase {
shared {
CreatePlaylistUseCaseImpl(playlistRepository: playlistRepository)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import SongsDomainInterface
public protocol RemotePlaylistDataSource {
func fetchRecommendPlaylist() -> Single<[RecommendPlaylistEntity]>
func fetchPlaylistDetail(id: String, type: PlaylistType) -> Single<PlaylistDetailEntity>
func fetchWmPlaylistDetail(id: String) -> Single<WmPlaylistDetailEntity>
func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable
func createPlaylist(title: String) -> Single<PlaylistBaseEntity>
func fetchPlaylistSongs(key: String) -> Single<[SongEntity]>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import Foundation
import SongsDomainInterface

public struct WmPlaylistDetailEntity: Equatable {
public init(
key: String,
title: String,
songs: [SongEntity],
image: String,
playlistURL: String
) {
self.key = key
self.title = title
self.songs = songs
self.image = image
self.playlistURL = playlistURL
}

public let key, title, image, playlistURL: String
public var songs: [SongEntity]
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import SongsDomainInterface
public protocol PlaylistRepository {
func fetchRecommendPlaylist() -> Single<[RecommendPlaylistEntity]>
func fetchPlaylistDetail(id: String, type: PlaylistType) -> Single<PlaylistDetailEntity>
func fetchWmPlaylistDetail(id: String) -> Single<WmPlaylistDetailEntity>
func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable
func createPlaylist(title: String) -> Single<PlaylistBaseEntity>
func fetchPlaylistSongs(key: String) -> Single<[SongEntity]>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import Foundation
import RxSwift

public protocol FetchWmPlaylistDetailUseCase {
func execute(id: String) -> Single<WmPlaylistDetailEntity>
}
19 changes: 10 additions & 9 deletions Projects/Domains/PlaylistDomain/Sources/API/PlaylistAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import PlaylistDomainInterface

public enum PlaylistAPI {
case fetchPlaylistDetail(id: String, type: PlaylistType) // 플리 상세 불러오기
case fetchWmPlaylistDetail(id: String) // 왁뮤 플리 상세 불러오기
case updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) // title and private 업데이트
case createPlaylist(title: String) // 플리 생성
case fetchPlaylistSongs(key: String) // 전체 재생 시 곡 데이터만 가져오기
Expand All @@ -33,12 +34,10 @@ extension PlaylistAPI: WMAPI {
return "/recommend/list"

case let .fetchPlaylistDetail(id: id, type: type):
switch type {
case .unknown, .my:
return "/\(id)"
case .wmRecommend:
return "/recommend/\(id)"
}
return "/\(id)"

case let .fetchWmPlaylistDetail(id: id):
return "/recommend/\(id)"

case let .updateTitleAndPrivate(key: key, _, _):
return "/\(key)"
Expand All @@ -65,7 +64,8 @@ extension PlaylistAPI: WMAPI {

public var method: Moya.Method {
switch self {
case .fetchRecommendPlaylist, .fetchPlaylistDetail, .fetchPlaylistSongs, .checkSubscription,
case .fetchRecommendPlaylist, .fetchPlaylistDetail, .fetchWmPlaylistDetail, .fetchPlaylistSongs,
.checkSubscription,
.requestPlaylistOwnerID:
return .get

Expand All @@ -85,7 +85,8 @@ extension PlaylistAPI: WMAPI {

public var task: Moya.Task {
switch self {
case .fetchRecommendPlaylist, .fetchPlaylistDetail, .fetchPlaylistSongs, .subscribePlaylist, .checkSubscription,
case .fetchRecommendPlaylist, .fetchPlaylistDetail, .fetchWmPlaylistDetail, .fetchPlaylistSongs,
.subscribePlaylist, .checkSubscription,
.requestPlaylistOwnerID:
return .requestPlain

Expand Down Expand Up @@ -124,7 +125,7 @@ extension PlaylistAPI: WMAPI {

public var jwtTokenType: JwtTokenType {
switch self {
case .fetchRecommendPlaylist:
case .fetchRecommendPlaylist, .fetchWmPlaylistDetail:
return .none

case let .fetchPlaylistDetail(_, type):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ public final class RemotePlaylistDataSourceImpl: BaseRemoteDataSource<PlaylistAP
.map { $0.toDomain() }
}

public func fetchWmPlaylistDetail(id: String) -> Single<WmPlaylistDetailEntity> {
request(.fetchWmPlaylistDetail(id: id))
.map(WmPlaylistDetailResponseDTO.self)
.map { $0.toDomain() }
}

public func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable {
request(.updateTitleAndPrivate(key: key, title: title, isPrivate: isPrivate))
.asCompletable()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ public final class PlaylistRepositoryImpl: PlaylistRepository {
remotePlaylistDataSource.fetchPlaylistDetail(id: id, type: type)
}

public func fetchWmPlaylistDetail(id: String) -> Single<WmPlaylistDetailEntity> {
remotePlaylistDataSource.fetchWmPlaylistDetail(id: id)
}

public func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable {
remotePlaylistDataSource.updateTitleAndPrivate(key: key, title: title, isPrivate: isPrivate)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import Foundation
import PlaylistDomainInterface
import SongsDomain
import SongsDomainInterface

public struct WmPlaylistDetailResponseDTO: Decodable {
public let key: String?
public let title: String
public let songs: [SingleSongResponseDTO]?
public let imageURL: String
public let playlistURL: String

enum CodingKeys: String, CodingKey {
case key
case title
case songs
case imageURL = "imageUrl"
case playlistURL = "playlistUrl"
}
}

public extension WmPlaylistDetailResponseDTO {
func toDomain() -> WmPlaylistDetailEntity {
WmPlaylistDetailEntity(
key: key ?? "",
title: title,
songs: (songs ?? []).map { $0.toDomain() },
image: imageURL,
playlistURL: playlistURL
)
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,3 @@
//
// FetchArtistListUseCaseImpl.swift
// DataModule
//
// Created by KTH on 2023/02/08.
// Copyright © 2023 yongbeomkwak. All rights reserved.
//

import Foundation
import PlaylistDomainInterface
import RxSwift
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import Foundation
import PlaylistDomainInterface
import RxSwift

public struct FetchWmPlaylistDetailUseCaseImpl: FetchWmPlaylistDetailUseCase {
private let playlistRepository: any PlaylistRepository

public init(
playlistRepository: PlaylistRepository
) {
self.playlistRepository = playlistRepository
}

public func execute(id: String) -> Single<WmPlaylistDetailEntity> {
playlistRepository.fetchWmPlaylistDetail(id: id)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import SignInFeatureInterface
import UIKit

public protocol WakmusicPlaylistDetailDependency: Dependency {
var fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase { get }
var fetchWmPlaylistDetailUseCase: any FetchWmPlaylistDetailUseCase { get }
var containSongsFactory: any ContainSongsFactory { get }
var textPopUpFactory: any TextPopUpFactory { get }
var songDetailPresenter: any SongDetailPresentable { get }
Expand All @@ -21,7 +21,7 @@ public final class WakmusicPlaylistDetailComponent: Component<WakmusicPlaylistDe
return WakmusicPlaylistDetailViewController(
reactor: WakmusicPlaylistDetailReactor(
key: key,
fetchPlaylistDetailUseCase: dependency.fetchPlaylistDetailUseCase
fetchWmPlaylistDetailUseCase: dependency.fetchWmPlaylistDetailUseCase
),
containSongsFactory: dependency.containSongsFactory,
textPopUpFactory: dependency.textPopUpFactory,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,27 +28,29 @@ final class WakmusicPlaylistDetailReactor: Reactor {
case updateSelectingStateByIndex([SongEntity])
case showToast(String)
case updateLoginPopupState(Bool)
case updatePlaylistURL(String)
}

struct State {
var header: PlaylistDetailHeaderModel
var dataSource: [SongEntity]
var isLoading: Bool
var selectedCount: Int
var playlistURL: String?
@Pulse var toastMessage: String?
@Pulse var showLoginPopup: Bool
}

var initialState: State
private let fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase
private let fetchWmPlaylistDetailUseCase: any FetchWmPlaylistDetailUseCase

init(
key: String,
fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase
fetchWmPlaylistDetailUseCase: any FetchWmPlaylistDetailUseCase

) {
self.key = key
self.fetchPlaylistDetailUseCase = fetchPlaylistDetailUseCase
self.fetchWmPlaylistDetailUseCase = fetchWmPlaylistDetailUseCase

self.initialState = State(
header: PlaylistDetailHeaderModel(
Expand Down Expand Up @@ -106,6 +108,9 @@ final class WakmusicPlaylistDetailReactor: Reactor {
newState.dataSource = dataSource
case let .updateLoginPopupState(flag):
newState.showLoginPopup = flag

case let .updatePlaylistURL(URL):
newState.playlistURL = URL
}

return newState
Expand All @@ -116,7 +121,7 @@ private extension WakmusicPlaylistDetailReactor {
func updateDataSource() -> Observable<Mutation> {
return .concat([
.just(.updateLoadingState(true)),
fetchPlaylistDetailUseCase.execute(id: key, type: .wmRecommend)
fetchWmPlaylistDetailUseCase.execute(id: key)
.asObservable()
.flatMap { data -> Observable<Mutation> in
return .concat([
Expand All @@ -125,11 +130,12 @@ private extension WakmusicPlaylistDetailReactor {
key: data.key,
title: data.title,
image: data.image,
userName: data.userName,
private: data.private,
userName: "Wakmu",
private: false,
songCount: data.songs.count
)
)),
Observable.just(.updatePlaylistURL(data.playlistURL)),
Observable.just(Mutation.updateDataSource(data.songs))
])
}
Expand Down
Loading

0 comments on commit 4f70195

Please sign in to comment.