IceCubesApp/Packages/Network/Sources/Network/InstanceSocialClient.swift

74 lines
2.2 KiB
Swift
Raw Normal View History

2022-12-29 13:07:58 +00:00
import Foundation
import Models
2024-01-26 12:01:23 +00:00
public struct InstanceSocialClient: Sendable {
2022-12-29 13:07:58 +00:00
private let authorization = "Bearer 8a4xx3D7Hzu1aFnf18qlkH8oU0oZ5ulabXxoS2FtQtwOy8G0DGQhr5PjTIjBnYAmFrSBuE2CcASjFocxJBonY8XGbLySB7MXd9ssrwlRHUXTQh3Z578lE1OfUtafvhML"
private let listEndpoint = "https://instances.social/api/1.0/instances/list?count=1000&include_closed=false&include_dead=false&min_active_users=500"
private let searchEndpoint = "https://instances.social/api/1.0/instances/search"
2023-01-17 10:36:01 +00:00
2022-12-29 13:07:58 +00:00
struct Response: Decodable {
let instances: [InstanceSocial]
}
2023-01-17 10:36:01 +00:00
public init() {}
public func fetchInstances(keyword: String) async -> [InstanceSocial] {
let keyword = keyword.trimmingCharacters(in: .whitespacesAndNewlines)
let endpoint = keyword.isEmpty ? listEndpoint : searchEndpoint + "?q=\(keyword)"
guard let url = URL(string: endpoint) else { return [] }
var request = URLRequest(url: url)
request.setValue(authorization, forHTTPHeaderField: "Authorization")
guard let (data, _) = try? await URLSession.shared.data(for: request) else { return [] }
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
guard let response = try? decoder.decode(Response.self, from: data) else { return [] }
let result = response.instances.sorted(by: keyword)
return result
}
}
2024-02-14 11:48:14 +00:00
private extension Array where Self.Element == InstanceSocial {
func sorted(by keyword: String) -> Self {
let keyword = keyword.trimmingCharacters(in: .whitespacesAndNewlines)
var newArray = self
newArray.sort { (lhs: InstanceSocial, rhs: InstanceSocial) in
guard
let lhsNumber = Int(lhs.users),
let rhsNumber = Int(rhs.users)
else { return false }
return lhsNumber > rhsNumber
}
newArray.sort { (lhs: InstanceSocial, rhs: InstanceSocial) in
guard
let lhsNumber = Int(lhs.statuses),
let rhsNumber = Int(rhs.statuses)
else { return false }
return lhsNumber > rhsNumber
2022-12-29 13:07:58 +00:00
}
if !keyword.isEmpty {
newArray.sort { (lhs: InstanceSocial, rhs: InstanceSocial) in
if
lhs.name.contains(keyword),
!rhs.name.contains(keyword)
{ return true }
return false
}
}
return newArray
2022-12-29 13:07:58 +00:00
}
}