Skip to content

Commit

Permalink
Merge branch 'develop' into 743-analytics-log-lyric-highlighting
Browse files Browse the repository at this point in the history
  • Loading branch information
KangTaeHoon committed Jul 6, 2024
2 parents 2aee3e6 + b6a01b9 commit c693f60
Show file tree
Hide file tree
Showing 35 changed files with 372 additions and 301 deletions.
1 change: 1 addition & 0 deletions Projects/App/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ let targets: [Target] = [
.Project.Features.RootFeature,
.Project.Module.ThirdPartyLib,
.feature(target: .PlaylistFeature),
.feature(target: .MusicDetailFeature),
.domain(target: .AppDomain),
.domain(target: .ArtistDomain),
.domain(target: .AuthDomain),
Expand Down
6 changes: 6 additions & 0 deletions Projects/App/Sources/Application/AppComponent+Songs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import BaseFeature
import HomeFeature
import LyricHighlightingFeature
import LyricHighlightingFeatureInterface
import MusicDetailFeature
import MusicDetailFeatureInterface
import SongsDomain
import SongsDomainInterface

Expand All @@ -10,6 +12,10 @@ public extension AppComponent {
HomeComponent(parent: self)
}

var musicDetailFactory: any MusicDetailFactory {
MusicDetailComponent(parent: self)
}

var newSongsComponent: NewSongsComponent {
NewSongsComponent(parent: self)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public struct SongEntity: Hashable {
views: Int,
last: Int,
date: String,
likes: Int = 0,
isSelected: Bool = false,
karaokeNumber: SongEntity.KaraokeNumber = .init(TJ: nil, KY: nil)
) {
Expand All @@ -21,6 +22,7 @@ public struct SongEntity: Hashable {
self.views = views
self.last = last
self.date = date
self.likes = likes
self.isSelected = isSelected
self.karaokeNumber = karaokeNumber
}
Expand All @@ -29,6 +31,7 @@ public struct SongEntity: Hashable {
public let reaction: String
public let views, last: Int
public let date: String
public let likes: Int
public var isSelected: Bool
public let karaokeNumber: SongEntity.KaraokeNumber

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ public extension SingleSongResponseDTO {
reaction: "",
views: views,
last: 0,
date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd"),
date: (Double(date) / 1000.0).unixTimeToDate.dateToString(format: "yyyy.MM.dd"),
likes: likes,
karaokeNumber: .init(TJ: karaokeNumber.TJ, KY: karaokeNumber.KY)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,18 @@ public struct UserInfoEntity: Equatable {
platform: String,
name: String,
profile: String,
version: Int
itemCount: Int

) {
self.id = id
self.platform = platform
self.name = name
self.profile = profile
self.version = version
self.itemCount = itemCount
}

public let id, platform, name, profile: String
public let version: Int
public let itemCount: Int

public static func == (lhs: UserInfoEntity, rhs: UserInfoEntity) -> Bool {
lhs.id == rhs.id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ public extension FavoriteSongsResponseDTO {
reaction: reaction,
views: total?.views ?? 0,
last: total?.last ?? 0,
date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd")
date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd"),
likes: 0
),
isSelected: false
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public extension FetchUserResponseDTO {
platform: platform,
name: name,
profile: profile,
version: 0
itemCount: itemCount
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import UserDomainInterface

public struct FetchUserInfoUseCaseSpy: FetchUserInfoUseCase {
public func execute() -> Single<UserInfoEntity> {
return .just(UserInfoEntity(id: "fakeid", platform: "naver", name: "fakename", profile: "", version: 1))
return .just(UserInfoEntity(id: "fakeid", platform: "naver", name: "fakename", profile: "", itemCount: 1))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import Foundation
import RealmSwift

final class PlaylistLocalEntity: Object {
@Persisted(primaryKey: true) var id: String
@Persisted var title: String
@Persisted var artist: String

convenience init(
id: String,
title: String,
artist: String
) {
self.init()
self.id = id
self.title = title
self.artist = artist
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,53 +9,61 @@
import Combine
import Foundation
import SongsDomainInterface

public struct PlayListItem: Equatable {
public var item: SongEntity
public var isPlaying: Bool

public init(item: SongEntity, isPlaying: Bool = false) {
self.item = item
self.isPlaying = isPlaying
import Utility

public struct PlaylistItem: Equatable {
public let id: String
public let title: String
public let artist: String

public init(
id: String,
title: String,
artist: String
) {
self.id = id
self.title = title
self.artist = artist
}

public static func == (lhs: PlayListItem, rhs: PlayListItem) -> Bool {
return lhs.item == rhs.item && lhs.item.isSelected == rhs.item.isSelected && lhs.isPlaying == rhs.isPlaying
public init(item: SongEntity) {
self.id = item.id
self.title = item.title
self.artist = item.artist
}
}

public class PlayList {
public var list: [PlayListItem] {
public class Playlist {
public var list: [PlaylistItem] {
didSet(oldValue) {
listChanged.send(list)
}
}

public var listChanged = PassthroughSubject<[PlayListItem], Never>()
public var listAppended = PassthroughSubject<[PlayListItem], Never>()
public var listRemoved = PassthroughSubject<[PlayListItem], Never>()
public var listReordered = PassthroughSubject<[PlayListItem], Never>()
public var currentPlayIndexChanged = PassthroughSubject<[PlayListItem], Never>()
public var currentPlaySongChanged = PassthroughSubject<SongEntity, Never>()
public var listChanged = PassthroughSubject<[PlaylistItem], Never>()
public var listAppended = PassthroughSubject<[PlaylistItem], Never>()
public var listRemoved = PassthroughSubject<[PlaylistItem], Never>()
public var listReordered = PassthroughSubject<[PlaylistItem], Never>()
public var currentPlayIndexChanged = PassthroughSubject<[PlaylistItem], Never>()

public init(list: [PlayListItem] = []) {
public init(list: [PlaylistItem] = []) {
self.list = list
}

public var count: Int { return list.count }
public var isEmpty: Bool { return list.isEmpty }

public func append(_ item: PlayListItem) {
public func append(_ item: PlaylistItem) {
list.append(item)
listAppended.send(list)
}

public func append(_ items: [PlayListItem]) {
public func append(_ items: [PlaylistItem]) {
list.append(contentsOf: items)
listAppended.send(list)
}

public func insert(_ newElement: PlayListItem, at: Int) {
public func insert(_ newElement: PlaylistItem, at: Int) {
list.insert(newElement, at: at)
listAppended.send(list)
}
Expand All @@ -77,7 +85,7 @@ public class PlayList {
listRemoved.send(list)
}

public func contains(_ item: PlayListItem) -> Bool {
public func contains(_ item: PlaylistItem) -> Bool {
return list.contains(item)
}

Expand All @@ -88,7 +96,7 @@ public class PlayList {
}

/// 해당 곡이 이미 재생목록에 있으면 재생목록 속 해당 곡의 index, 없으면 nil 리턴
public func uniqueIndex(of item: PlayListItem) -> Int? {
return list.firstIndex(where: { $0.item == item.item })
public func uniqueIndex(of item: PlaylistItem) -> Int? {
return list.firstIndex(of: item)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,18 @@ public extension PlayState {
// 3. 리스트 뒤에 곡들 추가
// 4. currentPlayIndex 변경
// 5. 주어진 첫번째 곡 재생
let existSongIndexs = songs.uniqueElements.compactMap { self.playList.uniqueIndex(of: PlayListItem(item: $0)) }
let existSongIndexs = songs.uniqueElements.compactMap { self.playList.uniqueIndex(of: PlaylistItem(item: $0)) }
self.playList.remove(indexs: existSongIndexs)
let mappedSongs = songs.uniqueElements.map { PlayListItem(item: $0) }
let mappedSongs = songs.uniqueElements.map { PlaylistItem(item: $0) }
self.playList.append(mappedSongs)
}

/// 주어진 곡들을 재생목록에 추가합니다.
/// - Parameter duplicateAllowed: 재생목록 추가 시 중복 허용 여부 (기본값: false)
func appendSongsToPlaylist(_ songs: [SongsDomainInterface.SongEntity], duplicateAllowed: Bool = false) {
let existSongIndexs = songs.uniqueElements.compactMap { self.playList.uniqueIndex(of: PlayListItem(item: $0)) }
let existSongIndexs = songs.uniqueElements.compactMap { self.playList.uniqueIndex(of: PlaylistItem(item: $0)) }
self.playList.remove(indexs: existSongIndexs)
let mappedSongs = songs.uniqueElements.map { PlayListItem(item: $0) }
let mappedSongs = songs.uniqueElements.map { PlaylistItem(item: $0) }
self.playList.append(mappedSongs)
}
}
53 changes: 18 additions & 35 deletions Projects/Features/BaseFeature/Sources/Etc/PlayState/PlayState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,15 @@ import Foundation
import SongsDomainInterface
import Utility

/// 완전히 도메인 로직으로 전환 고려
public final class PlayState {
public static let shared = PlayState()
@Published public var playList: PlayList
@Published public var playList: Playlist
private var subscription = Set<AnyCancellable>()

public init(
playList: PlayList = PlayList()
) {
public init() {
DEBUG_LOG("🚀:: \(Self.self) initialized")
self.playList = playList
self.playList = Playlist()
self.playList.list = fetchPlayListFromLocalDB()
subscribePlayListChanges()
}
Expand All @@ -42,46 +41,30 @@ public final class PlayState {
.sink { [weak self] playListItems in
guard let self else { return }
self.updatePlaylistChangesToLocalDB(playList: playListItems)
}.store(in: &subscription)
}
.store(in: &subscription)
}

public func updatePlaylistChangesToLocalDB(playList: [PlayListItem]) {
let allPlayedLists = RealmManager.shared.realm.objects(PlayedLists.self)
public func updatePlaylistChangesToLocalDB(playList: [PlaylistItem]) {
let allPlayedLists = RealmManager.shared.fetchRealmDB(PlaylistLocalEntity.self)
RealmManager.shared.deleteRealmDB(model: allPlayedLists)

let playedList = playList.map {
PlayedLists(
id: $0.item.id,
title: $0.item.title,
artist: $0.item.artist,
remix: $0.item.remix,
reaction: $0.item.reaction,
views: $0.item.views,
last: $0.item.last,
date: $0.item.date,
lastPlayed: $0.isPlaying
PlaylistLocalEntity(
id: $0.id,
title: $0.title,
artist: $0.artist
)
}
RealmManager.shared.addRealmDB(model: playedList)
}

public func fetchPlayListFromLocalDB() -> [PlayListItem] {
let playedList = RealmManager.shared.realm.objects(PlayedLists.self)
.toArray(type: PlayedLists.self)
.map { PlayListItem(
item:
SongEntity(
id: $0.id,
title: $0.title,
artist: $0.artist,
remix: $0.remix,
reaction: $0.reaction,
views: $0.views,
last: $0.last,
date: $0.date
),
isPlaying: $0.lastPlayed
) }
public func fetchPlayListFromLocalDB() -> [PlaylistItem] {
let playedList = RealmManager.shared.fetchRealmDB(PlaylistLocalEntity.self)
.toArray(type: PlaylistLocalEntity.self)
.map {
PlaylistItem(id: $0.id, title: $0.title, artist: $0.artist)
}
return playedList
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -504,5 +504,6 @@ private extension FruitDrawViewController {
descriptioniLabel.alpha = isHide ? 0 : 1
drawMachineImageView.alpha = descriptioniLabel.alpha
drawOrConfirmButton.alpha = descriptioniLabel.alpha
navigationBarView.alpha = descriptioniLabel.alpha
}
}
Loading

0 comments on commit c693f60

Please sign in to comment.