2025-04-15 16:18:08 +08:00

145 lines
5.6 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Api.swift
// dimensionhub
//
// Created by on 2025/2/19.
//
import Foundation
struct API {
//
struct APIErrorResponse: Codable {
struct APIError: Codable {
let code: Int32
let message: String
}
let error: APIError
}
//
struct APISuccessResponse<T: Codable>: Codable {
let result: T
}
enum APIResponse<T: Codable> {
case result(T)
case error(Int32, String)
}
//
enum LoadMode: String {
case prev = "prev"
case next = "next"
}
//
static let baseUrl = "https://dimensionhub.s5s8.com"
// token
static func sendDeviceTokenToServer<T: Codable>(userId: String, token: String, as: T.Type) async -> APIResponse<T> {
// Create the request
var request = URLRequest(url: URL(string: baseUrl + "/api/device_token")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
// Convert parameters to JSON data
let parameters: [String:String] = [
"user_id": userId,
"token": token
]
let jsonData = try! JSONSerialization.data(withJSONObject: parameters, options: [])
request.httpBody = jsonData
return await doRequest(request: request, as: T.self)
}
//
static func getIndexData<T: Codable>(userId: String, as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: baseUrl + "/api/index?user_id=\(userId)")!)
return await doRequest(request: request, as: T.self)
}
//
static func getFlowNum<T: Codable>(userId: String, as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: baseUrl + "/api/follow_num?user_id=\(userId)")!)
return await doRequest(request: request, as: T.self)
}
//
static func loadMoreUpdateDramas<T: Codable>(userId: String, mode: LoadMode, id: Int, as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: baseUrl + "/api/load_more_dramas?user_id=\(userId)&mode=\(mode.rawValue)&id=\(id)")!)
return await doRequest(request: request, as: T.self)
}
//
static func getUserFollowList<T: Codable>(userId: String, as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: baseUrl + "/api/follow_list?user_id=\(userId)")!)
return await doRequest(request: request, as: T.self)
}
//
static func loadDateUpdateDramas<T: Codable>(userId: String, date: String, as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: baseUrl + "/api/load_date_dramas?user_id=\(userId)&date=\(date)")!)
return await doRequest(request: request, as: T.self)
}
static func getDateIndex<T: Codable>(userId: String, as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: baseUrl + "/api/date_index?user_id=\(userId)")!)
return await doRequest(request: request, as: T.self)
}
static func getDramaDetail<T: Codable>(userId: String, id: Int, as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: baseUrl + "/api/detail?user_id=\(userId)&id=\(id)")!)
return await doRequest(request: request, as: T.self)
}
static func followDrama<T: Codable>(userId: String, id: Int, status: String, as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: baseUrl + "/api/follow?user_id=\(userId)&id=\(id)&status=\(status)")!)
return await doRequest(request: request, as: T.self)
}
// nameurl_encode
static func searchDrama<T: Codable>(userId: String, name: String, as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: baseUrl + "/api/search?user_id=\(userId)&name=\(name)")!)
return await doRequest(request: request, as: T.self)
}
// http
private static func doRequest<T: Codable>(request: URLRequest, as: T.Type) async -> APIResponse<T> {
do {
let (data, response) = try await URLSession.shared.data(for: request)
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
print("url: \(request.url!.absoluteString)")
// print(String(data: data, encoding: .utf8)!)
return .error(-1, "http status error")
}
print("request url: \(request.url!.absoluteString)")
// let x = String(data: data, encoding: .utf8)!
// print("url: \(request.url!.path()), data is: \(x)")
do {
let result = try JSONDecoder().decode(APISuccessResponse<T>.self, from: data)
return .result(result.result)
} catch let err {
print("http request: \(request.url!.path()), get error: \(err)")
let apiError = try JSONDecoder().decode(APIErrorResponse.self, from: data)
return .error(apiError.error.code, apiError.error.message)
}
} catch let err {
print("http error: \(err)")
return .error(-1, err.localizedDescription)
}
}
}