// // SearchAudioViewModel.swift // Bremer // // Created by yhornisse on 2023/08/22. // import Combine import Foundation public class AudioInfo { var slug = "" var audioName = "" var artistName = "" var albumName = "" var localPath = "" } public class SearchAudioViewModel : ObservableObject { @Published private var audio = "" @Published private var artist = "" @Published private var album = "" @Published private var tag = "" @Published var hasError = false @Published var messageText : String = "" @Published var result : [Audio] = [] @Published var bremerApiBaseUrl = "" @Published var disposables = [AnyCancellable]() func searchAudio(keyword: String) { searchAudio(audio: keyword, artist: keyword, album: keyword, tag: keyword) } func searchAudio(audio: String, artist:String, album:String, tag:String) { self.audio = audio self.artist = artist self.album = album self.tag = tag sendApi(url: URL(string: "\(bremerApiBaseUrl)/audio?audio=\(audio)&album=\(album)&artist=\(artist)&tag=\(tag)" .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!) .sink { completion in switch completion { case .finished: break case .failure(let error): self.hasError = true self.messageText = getApiFailureTextByError(error) self.result = [] } } receiveValue: { (response : AudioApiResponse) in self.result = response.audioList if (self.result.isEmpty) { self.hasError = false self.messageText = "一致する曲がありません" } else { self.hasError = false self.messageText = "" self.searchAudio(audio: self.audio, artist: self.artist, album: self.album, tag: self.tag) } } .store(in: &disposables) } func updateAudio(slug:String, audioName:String, artistName:String, albumName:String) { sendApi(url: URL(string: "\(bremerApiBaseUrl)/audio/\(slug)" .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!, httpMethod: "PUT", requestBody: AudioRequest(name: audioName, artist: artistName, album: albumName)) .sink { completion in switch completion { case .finished: break case .failure(let error): self.hasError = true self.messageText = getApiFailureTextByError(error) } } receiveValue: { (response : Any) in self.hasError = false self.messageText = "" } .store(in: &disposables) } func deleteAudio(_ slug:String) { sendApi(url: URL(string: "\(bremerApiBaseUrl)/audio/\(slug)" .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!, httpMethod: "DELETE") .sink { completion in switch completion { case .finished: break case .failure(let error): self.hasError = true self.messageText = getApiFailureTextByError(error) } } receiveValue: { (response : Any) in self.hasError = false self.messageText = "" } .store(in: &disposables) } }