import {z} from 'zod' export type GetApiRestapiV10AccountAccountIdCallLogCallRecordIdArgs = {accountId: string, callRecordId: Array, view?: ('Simple' | 'Detailed') | undefined}; export type GetApiRestapiV10AccountAccountIdCallLogCallRecordIdOptions = {baseUrl?: string | undefined, OAuth2?: string | undefined, fetch?: typeof fetch | undefined}; export const extensionInfoCallLog = z.object({id: z.number().int(), uri: z.string()}); export const callTransportEnum = z.enum(["PSTN", "VoIP"]); export const callLogRecordDeviceInfo = z.object({id: z.string(), uri: z.string()}); export const callLogFromParty = z.object({phoneNumber: z.string().optional(), extensionNumber: z.string().optional(), extensionId: z.string().optional(), name: z.string().optional(), location: z.string().optional(), device: callLogRecordDeviceInfo.optional(), dialerPhoneNumber: z.string().optional()}); export const callLogToParty = z.object({phoneNumber: z.string().optional(), extensionNumber: z.string().optional(), extensionId: z.string().optional(), name: z.string().optional(), location: z.string().optional(), device: callLogRecordDeviceInfo.optional(), dialedPhoneNumber: z.string().optional()}); export const callTypeEnum = z.enum(["Voice", "Fax"]); export const callDirectionEnum = z.enum(["Inbound", "Outbound"]); export const callLogRecordMessage = z.object({id: z.string(), type: z.string(), uri: z.string()}); export const callLogDelegateInfo = z.object({id: z.string(), name: z.string().optional()}); export const delegationTypeEnum = z.enum(["Coworker", "Unknown"]); export const callActionEnum = z.enum(["Accept Call", "Barge In Call", "Call Park", "Call Return", "CallOut-CallMe", "Calling Card", "Conference Call", "E911 Update", "Emergency", "External Application", "FindMe", "FollowMe", "FreeSPDL", "Hunting", "Incoming Fax", "Monitoring", "Move", "Outgoing Fax", "Paging", "Park Location", "Phone Call", "Phone Login", "Pickup", "RC Meetings", "Ring Directly", "RingMe", "RingOut Mobile", "RingOut PC", "RingOut Web", "Sip Forwarding", "Support", "Text Relay", "Transfer", "Unknown", "VoIP Call"]); export const callResultEnum = z.enum(["911", "933", "Abandoned", "Accepted", "Answered Not Accepted", "Blocked", "Busy", "Call Failed", "Call Failure", "Call connected", "Carrier is not active", "Declined", "EDGE trunk misconfigured", "Fax Not Sent", "Fax Partially Sent", "Fax Poor Line", "Fax Receipt Error", "Fax on Demand", "Hang Up", "IP Phone Offline", "In Progress", "Internal Error", "International Disabled", "International Restricted", "Missed", "No Answer", "No Calling Credit", "Not Allowed", "Partial Receive", "Phone Login", "Receive Error", "Received", "Rejected", "Reply", "Restricted Number", "Send Error", "Sent", "Sent to Voicemail", "Stopped", "Suspended account", "Unknown", "Voicemail", "Wrong Number"]); export const callResultReasonEnum = z.enum(["Accepted", "Bad Number", "Call Loop", "Calls Not Accepted", "Carrier is not active", "Connected", "Customer 611 Restricted", "EDGE trunk misconfigured", "Emergency Address not defined", "Failed Try Again", "Fax Not Received", "Fax Not Sent", "Fax Partially Sent", "Fax Poor Line", "Fax Prepare Error", "Fax Save Error", "Fax Send Error", "Hang Up", "Info 411 Restricted", "Internal Call Error", "Internal Error", "International Disabled", "International Restricted", "Line Busy", "Max Call Limit", "No Answer", "No Credit", "No Digital Line", "Not Answered", "Number Blocked", "Number Disabled", "Number Not Allowed", "Receive Error", "Resource Error", "Restricted Number", "Stopped", "Too Many Calls", "Unknown", "Wrong Number"]); export const callLogRecordingInfo = z.object({id: z.string(), uri: z.string(), type: z.enum(["Automatic", "OnDemand"]), contentUri: z.string()}); export const billingInfo = z.object({costIncluded: z.number().optional(), costPurchased: z.number().optional()}); export const callInternalTypeEnum = z.enum(["Local", "LongDistance", "International", "Sip", "RingMe", "RingOut", "Usual", "TollFreeNumber", "VerificationNumber", "Vma", "LocalNumber", "ImsOutgoing", "ImsIncoming"]); export const callLegTypeEnum = z.enum(["SipForwarding", "ServiceMinus2", "ServiceMinus3", "PstnToSip", "Accept", "FindMe", "FollowMe", "TestCall", "FaxSent", "CallBack", "CallingCard", "RingDirectly", "RingOutWebToSubscriber", "RingOutWebToCaller", "SipToPstnMetered", "RingOutClientToSubscriber", "RingOutClientToCaller", "RingMe", "TransferCall", "SipToPstnUnmetered", "RingOutDeviceToSubscriber", "RingOutDeviceToCaller", "RingOutOneLegToCaller", "ExtensionToExtension", "CallPark", "PagingServer", "Hunting", "OutgoingFreeSpDl", "ParkLocation", "ConferenceCall", "MobileApp", "MoveToConference", "Unknown", "MeetingsCall", "SilentMonitoring", "Monitoring", "Pickup", "ImsCall", "JoinCall", "TextRelay"]); export const callLogRecordLegInfo = z.object({extension: extensionInfoCallLog.optional(), telephonySessionId: z.string().optional(), sipUuidInfo: z.string().optional(), transferTarget: z.object({telephonySessionId: z.string().optional()}).optional(), transferee: z.object({telephonySessionId: z.string().optional()}).optional(), partyId: z.string().optional(), transport: callTransportEnum.optional(), from: callLogFromParty.optional(), to: callLogToParty.optional(), type: callTypeEnum, direction: callDirectionEnum, message: callLogRecordMessage.optional(), delegate: callLogDelegateInfo.optional(), delegationType: delegationTypeEnum.optional(), action: callActionEnum, result: callResultEnum.optional(), reason: callResultReasonEnum.optional(), reasonDescription: z.string().optional(), startTime: z.string(), duration: z.number().int(), durationMs: z.number().int(), recording: callLogRecordingInfo.optional(), shortRecording: z.boolean().optional(), billing: billingInfo.optional(), internalType: callInternalTypeEnum.optional(), legType: callLegTypeEnum, master: z.boolean().optional()}); export const callLogRecord = z.object({extension: extensionInfoCallLog.optional(), telephonySessionId: z.string().optional(), sipUuidInfo: z.string().optional(), transferTarget: z.object({telephonySessionId: z.string().optional()}).optional(), transferee: z.object({telephonySessionId: z.string().optional()}).optional(), partyId: z.string().optional(), transport: callTransportEnum.optional(), from: callLogFromParty.optional(), to: callLogToParty.optional(), type: callTypeEnum, direction: callDirectionEnum, message: callLogRecordMessage.optional(), delegate: callLogDelegateInfo.optional(), delegationType: delegationTypeEnum.optional(), action: callActionEnum, result: callResultEnum.optional(), reason: callResultReasonEnum.optional(), reasonDescription: z.string().optional(), startTime: z.string(), duration: z.number().int(), durationMs: z.number().int(), recording: callLogRecordingInfo.optional(), shortRecording: z.boolean().optional(), billing: billingInfo.optional(), internalType: callInternalTypeEnum.optional(), id: z.string(), uri: z.string(), sessionId: z.string(), deleted: z.boolean().optional(), legs: z.array(callLogRecordLegInfo).optional(), lastModifiedTime: z.string().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get Company Call Record(s) * * GET /restapi/v1.0/account/{accountId}/call-log/{callRecordId} */ export const getApiRestapiV10AccountAccountIdCallLogCallRecordId = async (args: GetApiRestapiV10AccountAccountIdCallLogCallRecordIdArgs, options?: GetApiRestapiV10AccountAccountIdCallLogCallRecordIdOptions) => { const {baseUrl = "https://platform.ringcentral.com", fetch: fetchFn = fetch, OAuth2} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.view != null) query.append("view", String(args.view)) if (OAuth2 !== undefined) headers.set('authorization', `Bearer ${OAuth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/restapi/v1.0/account/${encodeURIComponent(String(args.accountId))}/call-log/${encodeURIComponent(String(args.callRecordId))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(callLogRecord, await res.json()) };