import { twilioRequest } from './client.ts'
import {
asRecord,
boundedPageSize,
inputRecord,
optionalE164,
optionalString,
stringField,
type TwilioAuthOptions,
} from './validation.ts'
export type MessageLog = {
sid: string | null
from: string | null
to: string | null
body: string | null
status: string | null
direction: string | null
dateSent: string | null
errorCode: number | null
errorMessage: string | null
numMedia: string | null
}
function summarizeMessage(value: unknown): MessageLog {
const record = asRecord(value)
return {
sid: stringField(record, 'sid'),
from: stringField(record, 'from'),
to: stringField(record, 'to'),
body: stringField(record, 'body'),
status: stringField(record, 'status'),
direction: stringField(record, 'direction'),
dateSent: stringField(record, 'date_sent'),
errorCode: typeof record.error_code === 'number' ? record.error_code : null,
errorMessage: stringField(record, 'error_message'),
numMedia: stringField(record, 'num_media'),
}
}
/** List recent SMS/MMS logs on the authenticated Twilio account. */
export async function listMessages(
params: TwilioAuthOptions & {
pageSize?: number
pageUri?: string
to?: string
from?: string
dateSent?: string
} = {},
) {
const input = inputRecord(params)
const raw = await twilioRequest({
...input,
resource: '/Messages.json',
href: optionalString(input, 'pageUri'),
method: 'GET',
query: optionalString(input, 'pageUri')
? {}
: {
PageSize: boundedPageSize(input.pageSize),
To: optionalE164(input, 'to'),
From: optionalE164(input, 'from'),
DateSent: optionalString(input, 'dateSent'),
},
})
const items = Array.isArray(raw.messages)
? raw.messages.map(summarizeMessage)
: []
return {
ok: true,
items,
nextPageUri: stringField(raw, 'next_page_uri'),
}
}
export default listMessages