70 lines
2.8 KiB
Swift
70 lines
2.8 KiB
Swift
//
|
|
// NetworkService.swift
|
|
// WatchRunner Watch App
|
|
//
|
|
// Created by LittleSheep on 2025/10/29.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
// MARK: - Network Service
|
|
|
|
class NetworkService {
|
|
private let session = URLSession.shared
|
|
|
|
func fetchActivities(filter: String, cursor: String? = nil, token: String, serverUrl: String) async throws -> [SnActivity] {
|
|
guard let baseURL = URL(string: serverUrl) else {
|
|
throw URLError(.badURL)
|
|
}
|
|
var components = URLComponents(url: baseURL.appendingPathComponent("/sphere/activities"), resolvingAgainstBaseURL: false)!
|
|
var queryItems = [URLQueryItem(name: "take", value: "20")]
|
|
if filter.lowercased() != "explore" {
|
|
queryItems.append(URLQueryItem(name: "filter", value: filter.lowercased()))
|
|
}
|
|
if let cursor = cursor {
|
|
queryItems.append(URLQueryItem(name: "cursor", value: cursor))
|
|
}
|
|
components.queryItems = queryItems
|
|
|
|
var request = URLRequest(url: components.url!)
|
|
request.httpMethod = "GET"
|
|
request.setValue("application/json", forHTTPHeaderField: "Accept")
|
|
|
|
request.setValue("AtField \(token)", forHTTPHeaderField: "Authorization")
|
|
request.setValue("SolianWatch/1.0", forHTTPHeaderField: "User-Agent")
|
|
|
|
let (data, _) = try await session.data(for: request)
|
|
|
|
let decoder = JSONDecoder()
|
|
decoder.dateDecodingStrategy = .iso8601
|
|
decoder.keyDecodingStrategy = .convertFromSnakeCase
|
|
|
|
return try decoder.decode([SnActivity].self, from: data)
|
|
}
|
|
|
|
func createPost(title: String, content: String, token: String, serverUrl: String) async throws {
|
|
guard let baseURL = URL(string: serverUrl) else {
|
|
throw URLError(.badURL)
|
|
}
|
|
let url = baseURL.appendingPathComponent("/sphere/posts")
|
|
|
|
var request = URLRequest(url: url)
|
|
request.httpMethod = "POST"
|
|
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
request.setValue("application/json", forHTTPHeaderField: "Accept")
|
|
request.setValue("AtField \(token)", forHTTPHeaderField: "Authorization")
|
|
request.setValue("SolianWatch/1.0", forHTTPHeaderField: "User-Agent")
|
|
|
|
let body: [String: Any] = ["title": title, "content": content]
|
|
request.httpBody = try JSONSerialization.data(withJSONObject: body)
|
|
|
|
let (data, response) = try await session.data(for: request)
|
|
|
|
if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode != 201 {
|
|
let responseBody = String(data: data, encoding: .utf8) ?? ""
|
|
print("[watchOS] createPost failed with status code: \(httpResponse.statusCode), body: \(responseBody)")
|
|
throw URLError(URLError.Code(rawValue: httpResponse.statusCode))
|
|
}
|
|
}
|
|
}
|