qalandarov/YoutubeDataKit

View on GitHub
YoutubeDataKit/YoutubeDataKit/API/Requests/SearchListRequest.swift

Summary

Maintainability
A
0 mins
Test Coverage
//
//  SearchListRequest.swift
//  YoutubeKit
//
//  Created by Ryo Ishikawa on 12/30/2017
//

import Foundation

/// SeeAlso: https://developers.google.com/youtube/v3/docs/search/list
public struct SearchListRequest: Requestable {
    
    public typealias Response = SearchList
    
    public var path: String {
        return "search"
    }
    
    public var httpMethod: HTTPMethod {
        return .get
    }
    
    public var isAuthorizedRequest: Bool {
        guard let filter = filter else { return false }
        
        switch filter {
        case .forContentOwner:
            return true
        case .forMine:
            return true
        case .relatedToVideoID:
            return false
        }
    }
    
    public var queryParameters: [String: Any] {
        var query: [String: Any] = ["part": part.toCSV()]
        query.appendingQueryFilter(filter)
        query.appendingQueryParameter(key: "channelId", value: channelID)
        query.appendingQueryParameter(key: "q", value: searchQuery)
        query.appendingQueryParameter(key: "topicId", value: topicID)
        query.appendingQueryParameter(key: "type", value: resourceType)
        query.appendingQueryParameter(key: "videoCategoryId", value: videoCategoryID)
        query.appendingQueryParameter(key: "channelType", value: channelType)
        query.appendingQueryParameter(key: "eventType", value: eventType)
        query.appendingQueryParameter(key: "maxResults", value: maxResults)
        query.appendingQueryParameter(key: "onBehalfOfContentOwner", value: onBehalfOfContentOwner)
        query.appendingQueryParameter(key: "order", value: order)
        query.appendingQueryParameter(key: "pageToken", value: pageToken)
        query.appendingQueryParameter(key: "publishedAfter", value: publishedAfter)
        query.appendingQueryParameter(key: "publishedBefore", value: publishedBefore)
        query.appendingQueryParameter(key: "regionCode", value: regionCode)
        query.appendingQueryParameter(key: "safeSearch", value: safeSearch)
        query.appendingQueryParameter(key: "videoCaption", value: videoCaption)
        query.appendingQueryParameter(key: "videoDefinition", value: videoDefinition)
        query.appendingQueryParameter(key: "videoDimension", value: videoDimension)
        query.appendingQueryParameter(key: "videoDuration", value: videoDuration)
        query.appendingQueryParameter(key: "videoEmbeddable", value: videoEmbeddable)
        query.appendingQueryParameter(key: "videoLicense", value: videoLicense)
        query.appendingQueryParameter(key: "videoSyndicated", value: videoSyndicated)
        query.appendingQueryParameter(key: "videoType", value: videoType)
        return query
    }
    
    // MARK: - Required parameters
    
    public let part: [Part.SearchList]
    
    // MARK: - Option parameters
    
    public let filter: Filter.SearchList?
    public let channelID: String?
    public let channelType: String?
    public let eventType: SearchEventType?
    public let maxResults: Int?
    public let onBehalfOfContentOwner: String?
    public let order: ResultOrder.Search?
    public let pageToken: String?
    public let publishedAfter: Date?
    public let publishedBefore: Date?
    public let searchQuery: String?
    public let regionCode: String?
    public let safeSearch: SearchSafeMode?
    public let topicID: String?
    public let resourceType: [SearchResourceType]?
    public let videoCaption: SearchVideoCaption?
    public let videoCategoryID: VideoCategoryID?
    public let videoDefinition: SearchVideoDefinition?
    public let videoDimension: SearchVideoDimension?
    public let videoDuration: SearchVideoDuration?
    public let videoEmbeddable: SearchVideoEmbeddable?
    public let videoLicense: SearchVideoLicense?
    public let videoSyndicated: SearchVideoSyndicated?
    public let videoType: SearchVideoType?
    
    public init(part: [Part.SearchList],
                filter: Filter.SearchList? = nil,
                channelID: String? = nil,
                channelType: String? = nil,
                eventType: SearchEventType? = nil,
                maxResults: Int? = nil,
                onBehalfOfContentOwner: String? = nil,
                order: ResultOrder.Search? = nil,
                pageToken: String? = nil,
                publishedAfter: Date? = nil,
                publishedBefore: Date? = nil,
                searchQuery: String? = nil,
                regionCode: String? = nil,
                safeSearch: SearchSafeMode? = nil,
                topicID: String? = nil,
                resourceType: [SearchResourceType]? = nil,
                videoCaption: SearchVideoCaption? = nil,
                videoCategoryID: VideoCategoryID? = nil,
                videoDefinition: SearchVideoDefinition? = nil,
                videoDimension: SearchVideoDimension? = nil,
                videoDuration: SearchVideoDuration? = nil,
                videoEmbeddable: SearchVideoEmbeddable? = nil,
                videoLicense: SearchVideoLicense? = nil,
                videoSyndicated: SearchVideoSyndicated? = nil,
                videoType: SearchVideoType? = nil) {
        self.part = part
        self.filter = filter
        self.channelID = channelID
        self.channelType = channelType
        self.eventType = eventType
        self.maxResults = maxResults
        self.onBehalfOfContentOwner = onBehalfOfContentOwner
        self.order = order
        self.pageToken = pageToken
        self.publishedAfter = publishedAfter
        self.publishedBefore = publishedBefore
        self.searchQuery = searchQuery
        self.regionCode = regionCode
        self.safeSearch = safeSearch
        self.topicID = topicID
        self.resourceType = resourceType
        self.videoCaption = videoCaption
        self.videoCategoryID = videoCategoryID
        self.videoDefinition = videoDefinition
        self.videoDimension = videoDimension
        self.videoDuration = videoDuration
        self.videoEmbeddable = videoEmbeddable
        self.videoLicense = videoLicense
        self.videoSyndicated = videoSyndicated
        self.videoType = videoType
    }
}