Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

๐Ÿ”€ :: (#1109) ์™๋ฎค ์ถ”์ฒœ ํ”Œ๋ฆฌ ํ—ค๋” ๋ฒ„ํŠผ์„ ์ „์ฒด ์žฌ์ƒ์œผ๋กœ ํ†ต์ผ #1202

Merged
Merged
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 {
Copy link
Member

@baekteun baekteun Aug 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wm๋ณด๋‹ค๋Š” WM์œผ๋กœ ํ•˜๋Š”๊ฒŒ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์ƒ์œผ๋กœ ์ •์˜๋˜์–ด์žˆ์–ด์š”.
https://www.notion.so/waktaverse/Swift-Style-Guide-f87a0e12cb7742d69548fdd7b695c302?pvs=4#5295e1f460f34bac994e1cfc1929e358

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ €๋…์— ๋ฐ”๊ฟ” ๋†“๊ฒ ์Šต๋‹ˆ๋‹ค!

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
Loading