diff --git a/src/models/ApiResponse.ts b/src/models/ApiResponse.ts index bcadc97..4ed6235 100644 --- a/src/models/ApiResponse.ts +++ b/src/models/ApiResponse.ts @@ -2,6 +2,7 @@ import { App } from './App'; import { CollectionResponse } from './CollectionResponse'; import { Field } from './Field'; import { GetPagedAppsResponse } from './GetPagedAppsResponse'; +import { GetPagedFieldsResponse } from './GetPagedFieldsResponse'; /** * @class ApiResponse - A generic response object for API requests. @@ -164,4 +165,34 @@ export class ApiResponse { collectionResponse ); } + + AsGetPagedFieldsResponseType(): ApiResponse { + const apiResponse = this as ApiResponse; + + const fields = apiResponse.data.items.map((item: any) => { + return new Field( + item.id, + item.appId, + item.name, + item.type, + item.status, + item.isRequired, + item.isUnique + ); + }); + + const getPagedFieldsResponse = new GetPagedFieldsResponse( + fields, + apiResponse.data.pageNumber, + apiResponse.data.pageSize, + apiResponse.data.totalPages, + apiResponse.data.totalRecords + ); + + return new ApiResponse( + apiResponse.statusCode, + apiResponse.message, + getPagedFieldsResponse + ); + } } diff --git a/src/models/EndpointFactory.ts b/src/models/EndpointFactory.ts index c3a19bb..2a4c631 100644 --- a/src/models/EndpointFactory.ts +++ b/src/models/EndpointFactory.ts @@ -58,10 +58,14 @@ export class EndpointFactory { /** * @method getFieldsByAppIdEndpoint - Gets the fields by app id endpoint. * @param {number} id - The id of the app. + * @param {PagingRequest} pagingRequest - Pagination information to use as query params in the endpoint string. * @returns {string} - The fields by app id endpoint. */ - public static getFieldsByAppIdEndpoint(id: number): string { - return `/Fields/appId/${id}`; + public static getFieldsByAppIdEndpoint( + id: number, + pagingRequest: PagingRequest + ): string { + return `/Fields/appId/${id}?pageSize=${pagingRequest.pageSize}&pageNumber=${pagingRequest.pageNumber}`; } /** diff --git a/src/models/GetPagedFieldsResponse.ts b/src/models/GetPagedFieldsResponse.ts new file mode 100644 index 0000000..fc5ca9e --- /dev/null +++ b/src/models/GetPagedFieldsResponse.ts @@ -0,0 +1,23 @@ +import { type Field } from './Field'; +import { PagedResponse } from './PagedResponse'; + +export class GetPagedFieldsResponse extends PagedResponse { + /** + * @constructor - Creates a new instance of the GetPagedAppsResponse class. + * @param {Field[]} items - The items in the collection. + * @param {number} pageNumber - The page number of the response. + * @param {number} pageSize - The page size of the response. + * @param {number} totalPages - The total number of pages in the response. + * @param {number} totalRecords - The total number of records in the response. + * @returns {GetPagedAppsResponse} - A new instance of the GetPagedAppsResponse class. + */ + constructor( + items: Field[], + pageNumber: number, + pageSize: number, + totalPages: number, + totalRecords: number + ) { + super(items, pageNumber, pageSize, totalPages, totalRecords); + } +} diff --git a/src/models/OnspringClient.ts b/src/models/OnspringClient.ts index 7dbd4e6..2b862ef 100644 --- a/src/models/OnspringClient.ts +++ b/src/models/OnspringClient.ts @@ -9,6 +9,7 @@ import { type GetPagedAppsResponse } from './GetPagedAppsResponse'; import { type App } from './App'; import { type CollectionResponse } from './CollectionResponse'; import { type Field } from './Field'; +import { type GetPagedFieldsResponse } from './GetPagedFieldsResponse'; /** * @class OnspringClient - A client that can communicate with the Onspring API. @@ -145,6 +146,23 @@ export class OnspringClient { return apiResponse.AsFieldCollectionType(); } + public async getFieldsByAppId( + appId: number, + pagingRequest: PagingRequest = new PagingRequest(1, 50) + ): Promise> { + const endpoint = EndpointFactory.getFieldsByAppIdEndpoint( + appId, + pagingRequest + ); + const apiResponse = await this.get(endpoint); + + if (apiResponse.isSuccessful === false) { + return apiResponse; + } + + return apiResponse.AsGetPagedFieldsResponseType(); + } + /** * @method get - Makes a GET request to the specified endpoint. * @param {string} endpoint - The endpoint that will be used to make the request. diff --git a/tests/EndpointFactory.spec.ts b/tests/EndpointFactory.spec.ts index 1e1756e..aeebd22 100644 --- a/tests/EndpointFactory.spec.ts +++ b/tests/EndpointFactory.spec.ts @@ -49,8 +49,11 @@ describe('EndpointFactory', function () { describe('getFieldsByAppIdEndpoint', function () { it('should return the correct fields by app id endpoint', function () { - const result = EndpointFactory.getFieldsByAppIdEndpoint(1); - expect(result).to.equal('/Fields/appId/1'); + const result = EndpointFactory.getFieldsByAppIdEndpoint( + 1, + new PagingRequest(2, 1000) + ); + expect(result).to.equal('/Fields/appId/1?pageSize=1000&pageNumber=2'); }); }); diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index a47f82b..d1afefe 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,4 +1,4 @@ { "extends": "./tsconfig.json", - "include": ["tests/**/*.ts", "src/index.ts"] + "include": ["src/**/*.ts", "tests/**/*.ts"] }