| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- import Foundation
- enum GoogleMeetClientError: Error {
- case invalidResponse
- case httpStatus(Int)
- }
- /// Thin Meet REST API wrapper.
- /// Note: Meet REST API is best used for conferences/participants/artifacts, while scheduling comes from Calendar.
- final class GoogleMeetClient {
- private let session: URLSession
- init(session: URLSession = .shared) {
- self.session = session
- }
- /// Lists conference records for a given meeting space resource name.
- /// This is intentionally minimal scaffolding for phase 2 enrichment.
- func listConferenceRecords(accessToken: String, spaceResourceName: String, pageSize: Int = 10) async throws -> [ConferenceRecord] {
- var components = URLComponents(string: "https://meet.googleapis.com/v2/\(spaceResourceName)/conferenceRecords")!
- components.queryItems = [
- URLQueryItem(name: "pageSize", value: String(pageSize))
- ]
- var request = URLRequest(url: components.url!)
- request.httpMethod = "GET"
- request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
- let (data, response) = try await session.data(for: request)
- guard let http = response as? HTTPURLResponse else { throw GoogleMeetClientError.invalidResponse }
- guard (200..<300).contains(http.statusCode) else { throw GoogleMeetClientError.httpStatus(http.statusCode) }
- let decoded = try JSONDecoder().decode(ListConferenceRecordsResponse.self, from: data)
- return decoded.conferenceRecords ?? []
- }
- }
- // MARK: - Minimal models (v2)
- struct ConferenceRecord: Decodable, Equatable {
- let name: String?
- let startTime: Date?
- let endTime: Date?
- }
- private struct ListConferenceRecordsResponse: Decodable {
- let conferenceRecords: [ConferenceRecord]?
- let nextPageToken: String?
- }
|