72 lines
2.3 KiB
Swift
72 lines
2.3 KiB
Swift
![]() |
//
|
||
|
// Mastodon+API+Server.swift
|
||
|
//
|
||
|
//
|
||
|
// Created by MainasuK Cirno on 2021-2-18.
|
||
|
//
|
||
|
|
||
|
import Foundation
|
||
|
import Combine
|
||
|
|
||
|
extension Mastodon.API.Server {
|
||
|
|
||
|
static let serversEndpointURL = Mastodon.API.joinMastodonEndpointURL.appendingPathComponent("servers")
|
||
|
static let categoriesEndpointURL = Mastodon.API.joinMastodonEndpointURL.appendingPathComponent("categories")
|
||
|
|
||
|
public static func servers(
|
||
|
session: URLSession,
|
||
|
query: ServersQuery
|
||
|
) -> AnyPublisher<Mastodon.Response.Content<[Mastodon.Entity.Server]>, Error> {
|
||
|
let request = Mastodon.API.get(
|
||
|
url: serversEndpointURL,
|
||
|
query: query,
|
||
|
authorization: nil
|
||
|
)
|
||
|
return session.dataTaskPublisher(for: request)
|
||
|
.tryMap { data, response in
|
||
|
let value = try Mastodon.API.decode(type: [Mastodon.Entity.Server].self, from: data, response: response)
|
||
|
return Mastodon.Response.Content(value: value, response: response)
|
||
|
}
|
||
|
.eraseToAnyPublisher()
|
||
|
}
|
||
|
|
||
|
public static func categories(
|
||
|
session: URLSession
|
||
|
) -> AnyPublisher<Mastodon.Response.Content<[Mastodon.Entity.Category]>, Error> {
|
||
|
let request = Mastodon.API.get(
|
||
|
url: categoriesEndpointURL,
|
||
|
query: nil,
|
||
|
authorization: nil
|
||
|
)
|
||
|
return session.dataTaskPublisher(for: request)
|
||
|
.tryMap { data, response in
|
||
|
let value = try Mastodon.API.decode(type: [Mastodon.Entity.Category].self, from: data, response: response)
|
||
|
return Mastodon.Response.Content(value: value, response: response)
|
||
|
}
|
||
|
.eraseToAnyPublisher()
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
extension Mastodon.API.Server {
|
||
|
|
||
|
public struct ServersQuery: Codable, GetQuery {
|
||
|
public let language: String?
|
||
|
public let category: String?
|
||
|
|
||
|
public init(language: String?, category: String?) {
|
||
|
self.language = language
|
||
|
self.category = category
|
||
|
}
|
||
|
|
||
|
var queryItems: [URLQueryItem]? {
|
||
|
var items: [URLQueryItem] = []
|
||
|
language.flatMap { items.append(URLQueryItem(name: "language", value: $0)) }
|
||
|
category.flatMap { items.append(URLQueryItem(name: "category", value: $0)) }
|
||
|
guard !items.isEmpty else { return nil }
|
||
|
return items
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|