Newer
Older
bremer-ios-app / BremerApp / ViewModel / SearchAudioViewModel.swift
yhornisse on 10 Sep 2023 3 KB Initial Commit
//
//  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)
    }
}