// // TalkApi.swift // SodaLive // // Created by klaus on 8/29/25. // import Foundation import Moya enum TalkApi { case getTalkRooms case createChatRoom(request: CreateChatRoomRequest) case enterChatRoom(roomId: Int, characterImageId: Int?) case sendMessage(roomId: Int, request: SendChatMessageRequest) case getChatRoomMessages(roomId: Int, cursor: Int?, limit: Int) case getChatQuotaStatus(roomId: Int) case purchaseChatQuota(roomId: Int, request: ChatQuotaPurchaseRequest) case purchaseMessage(roomId: Int, messageId: Int64, request: ChatMessagePurchaseRequest) case resetChatRoom(roomId: Int, request: ChatRoomResetRequest) } extension TalkApi: TargetType { var baseURL: URL { URL(string: BASE_URL)! } var path: String { switch self { case .getTalkRooms: return "/api/chat/room/list" case .createChatRoom: return "/api/chat/room/create" case .enterChatRoom(let roomId, _): return "/api/chat/room/\(roomId)/enter" case .sendMessage(let roomId, _): return "/api/chat/room/\(roomId)/send" case .getChatRoomMessages(let roomId, _, _): return "/api/chat/room/\(roomId)/messages" case .getChatQuotaStatus(let roomId): return "/api/chat/rooms/\(roomId)/quota/me" case .purchaseChatQuota(let roomId, _): return "/api/chat/rooms/\(roomId)/quota/purchase" case .purchaseMessage(let roomId, let messageId, _): return "/api/chat/room/\(roomId)/messages/\(messageId)/purchase" case .resetChatRoom(let roomId, _): return "/api/chat/room/\(roomId)/reset" } } var method: Moya.Method { switch self { case .getTalkRooms: return .get case .createChatRoom: return .post case .enterChatRoom: return .get case .sendMessage: return .post case .getChatRoomMessages: return .get case .getChatQuotaStatus: return .get case .purchaseChatQuota: return .post case .purchaseMessage: return .post case .resetChatRoom: return .post } } var task: Moya.Task { switch self { case .getTalkRooms: return .requestPlain case .createChatRoom(let request): return .requestJSONEncodable(request) case .enterChatRoom(_, let characterImageId): var parameters: [String: Any] = [:] if let characterImageId = characterImageId { parameters["characterImageId"] = characterImageId } return .requestParameters( parameters: parameters, encoding: URLEncoding.queryString ) case .sendMessage(_, request: let request): return .requestJSONEncodable(request) case .getChatRoomMessages(_, let cursor, let limit): var parameters: [String: Any] = ["limit": limit] if let cursor = cursor { parameters["cursor"] = cursor } return .requestParameters( parameters: parameters, encoding: URLEncoding.queryString ) case .getChatQuotaStatus: return .requestPlain case .purchaseChatQuota(_, let request): return .requestJSONEncodable(request) case .purchaseMessage(_, _, let request): return .requestJSONEncodable(request) case .resetChatRoom(_, let request): return .requestJSONEncodable(request) } } var headers: [String : String]? { ["Authorization": "Bearer \(UserDefaults.string(forKey: UserDefaultsKey.token))"] } }