Newer
Older
bremer-ios-app / BremerApp / ViewModel / AllPlaylistViewModel.swift
yhornisse on 10 Sep 2023 3 KB Initial Commit
//
//  AllPlaylistViewModel.swift
//  Bremer
//
//  Created by yhornisse on 2023/08/08.
//

import Combine
import Foundation

public final class AllPlaylistViewModel : ObservableObject {
    @Published
    var playlists: [Playlist] = []
    @Published
    var hasError = false
    @Published
    var messageText : String = ""
    @Published
    var disposables = [AnyCancellable]()
    @Published
    var bremerApiBaseUrl = ""

    func getAllPlaylist() {
        sendApi(url: URL(string: "\(bremerApiBaseUrl)/playlist"
            .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!)
        .sink { completion in
            switch completion {
            case .finished:
                break
            case .failure(let error):
                self.hasError = true
                self.messageText = getApiFailureTextByError(error)
                self.playlists = []
            }
        } receiveValue: { (response : AllPlaylistApiResponse) in
            self.playlists = response.playlist
            if (self.playlists.isEmpty) {
                self.hasError = false
                self.messageText = "プレイリストがありません"
            } else {
                self.hasError = false
                self.messageText = ""
            }
        }
        .store(in: &disposables)
    }
    
    func createPlaylist(_ name: String) {
        sendApi(url: URL(string: "\(bremerApiBaseUrl)/playlist"
            .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!,
                httpMethod: "POST",
                requestBody: PlaylistRequest(name: name))
        .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 = ""
            self.getAllPlaylist()
        }
        .store(in: &disposables)
    }
    
    func updatePlaylist(_ slug: String, _ name: String) {
        sendApi(url: URL(string: "\(bremerApiBaseUrl)/playlist/\(slug)"
            .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!,
                httpMethod: "PUT",
                requestBody: PlaylistRequest(name: name))
        .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 = ""
            self.getAllPlaylist()
        }
        .store(in: &disposables)
    }

    func deletePlaylist(_ slug: String) {
        sendApi(url: URL(string: "\(bremerApiBaseUrl)/playlist/\(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 = ""
            self.getAllPlaylist()
        }
        .store(in: &disposables)
    }
}