RTSDA-iOS/Services/PocketBaseService.swift
2025-02-03 16:15:57 -05:00

119 lines
4.3 KiB
Swift

import Foundation
class PocketBaseService {
static let shared = PocketBaseService()
private let baseURL = "https://pocketbase.rockvilletollandsda.church"
private init() {}
struct EventResponse: Codable {
let page: Int
let perPage: Int
let totalItems: Int
let totalPages: Int
let items: [Event]
enum CodingKeys: String, CodingKey {
case page
case perPage
case totalItems
case totalPages
case items
}
}
@MainActor
func fetchConfig() async throws -> Config {
let recordId = "nn753t8o2t1iupd"
let urlString = "\(baseURL)/api/collections/config/records/\(recordId)"
guard let url = URL(string: urlString) else {
throw URLError(.badURL)
}
var request = URLRequest(url: url)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let (data, response) = try await URLSession.shared.data(for: request)
guard let httpResponse = response as? HTTPURLResponse else {
throw URLError(.badServerResponse)
}
guard httpResponse.statusCode == 200 else {
if let errorString = String(data: data, encoding: .utf8) {
print("Error fetching config: \(errorString)")
}
throw URLError(.badServerResponse)
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
do {
return try decoder.decode(Config.self, from: data)
} catch {
print("Failed to decode config: \(error)")
if let decodingError = error as? DecodingError {
switch decodingError {
case .keyNotFound(let key, let context):
print("Missing key: \(key.stringValue) in \(context.debugDescription)")
case .typeMismatch(let type, let context):
print("Type mismatch: expected \(type) in \(context.debugDescription)")
case .valueNotFound(let type, let context):
print("Value not found: expected \(type) in \(context.debugDescription)")
case .dataCorrupted(let context):
print("Data corrupted: \(context.debugDescription)")
@unknown default:
print("Unknown decoding error")
}
}
throw error
}
}
@MainActor
func fetchEvents() async throws -> [Event] {
guard let url = URL(string: "\(baseURL)/api/collections/events/records?sort=start_time") else {
throw URLError(.badURL)
}
let (data, response) = try await URLSession.shared.data(from: url)
guard let httpResponse = response as? HTTPURLResponse else {
throw URLError(.badServerResponse)
}
guard httpResponse.statusCode == 200 else {
if let errorString = String(data: data, encoding: .utf8) {
print("Error fetching events: \(errorString)")
}
throw URLError(.badServerResponse)
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
do {
let eventResponse = try decoder.decode(EventResponse.self, from: data)
return eventResponse.items
} catch {
print("Failed to decode events: \(error)")
if let decodingError = error as? DecodingError {
switch decodingError {
case .keyNotFound(let key, let context):
print("Missing key: \(key.stringValue) in \(context.debugDescription)")
case .typeMismatch(let type, let context):
print("Type mismatch: expected \(type) in \(context.debugDescription)")
case .valueNotFound(let type, let context):
print("Value not found: expected \(type) in \(context.debugDescription)")
case .dataCorrupted(let context):
print("Data corrupted: \(context.debugDescription)")
@unknown default:
print("Unknown decoding error")
}
}
throw error
}
}
}