diff --git a/src/__tests__/lib/api/resources/Messages.test.ts b/src/__tests__/lib/api/resources/Messages.test.ts index 8b7da8c..9e49e88 100644 --- a/src/__tests__/lib/api/resources/Messages.test.ts +++ b/src/__tests__/lib/api/resources/Messages.test.ts @@ -185,6 +185,70 @@ describe("lib/api/resources/Messages: ", () => { expect(result).toEqual(expectedResponseData); }); + it("successfully gets messages with last_id parameter.", async () => { + const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/inboxes/${inboxId}/messages`; + const lastId = 100; + const expectedResponseData = [responseData]; + + mock + .onGet(endpoint, { params: { last_id: lastId } }) + .reply(200, expectedResponseData); + + const result = await messagesAPI.get(inboxId, { last_id: lastId }); + + expect(mock.history.get[0].url).toEqual(endpoint); + expect(mock.history.get[0].params).toEqual({ last_id: lastId }); + expect(result).toEqual(expectedResponseData); + }); + + it("successfully gets messages with page parameter.", async () => { + const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/inboxes/${inboxId}/messages`; + const page = 2; + const expectedResponseData = [responseData]; + + mock + .onGet(endpoint, { params: { page } }) + .reply(200, expectedResponseData); + + const result = await messagesAPI.get(inboxId, { page }); + + expect(mock.history.get[0].url).toEqual(endpoint); + expect(mock.history.get[0].params).toEqual({ page }); + expect(result).toEqual(expectedResponseData); + }); + + it("successfully gets messages with search parameter.", async () => { + const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/inboxes/${inboxId}/messages`; + const search = "test query"; + const expectedResponseData = [responseData]; + + mock + .onGet(endpoint, { params: { search } }) + .reply(200, expectedResponseData); + + const result = await messagesAPI.get(inboxId, { search }); + + expect(mock.history.get[0].url).toEqual(endpoint); + expect(mock.history.get[0].params).toEqual({ search }); + expect(result).toEqual(expectedResponseData); + }); + + it("successfully gets messages with all query parameters.", async () => { + const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/inboxes/${inboxId}/messages`; + const options = { last_id: 100, page: 2, search: "test query" }; + const expectedResponseData = [responseData]; + + mock + .onGet(endpoint, { params: options }) + .reply(200, expectedResponseData); + + const result = await messagesAPI.get(inboxId, options); + + expect(mock.history.get[0].url).toEqual(endpoint); + expect(mock.history.get[0].params).toEqual(options); + expect(result).toEqual(expectedResponseData); + }); + it("fails with error.", async () => { const expectedErrorMessage = "Request failed with status code 404"; diff --git a/src/lib/api/resources/Messages.ts b/src/lib/api/resources/Messages.ts index 4e34239..cb8186e 100644 --- a/src/lib/api/resources/Messages.ts +++ b/src/lib/api/resources/Messages.ts @@ -5,6 +5,7 @@ import CONFIG from "../../../config"; import { EmailHeaders, Message, + MessageListOptions, MessageUpdateParams, Report, SpamReport, @@ -58,10 +59,16 @@ export default class MessagesApi { /** * Gets all messages in inboxes. */ - public async get(inboxId: number) { + public async get(inboxId: number, options?: MessageListOptions) { const url = `${this.messagesURL}/${inboxId}/messages`; - return this.client.get(url); + const params = { + ...(options?.last_id !== undefined && { last_id: options.last_id }), + ...(options?.page !== undefined && { page: options.page }), + ...(options?.search && { search: options.search }), + }; + + return this.client.get(url, { params }); } /** diff --git a/src/types/api/messages.ts b/src/types/api/messages.ts index e7f3cba..0a376b3 100644 --- a/src/types/api/messages.ts +++ b/src/types/api/messages.ts @@ -1,3 +1,8 @@ +export type SmtpInformationData = { + mail_from_addr: string; + client_ip: string; +}; + export type Message = { id: number; inbox_id: number; @@ -22,6 +27,7 @@ export type Message = { blacklists_report_info: boolean; smtp_information: { ok: boolean; + data?: SmtpInformationData; }; }; @@ -69,3 +75,9 @@ export type SpamReport = { export type MessageUpdateParams = { isRead: boolean; }; + +export type MessageListOptions = { + last_id?: number; + page?: number; + search?: string; +};