From 5a6c5094e96e2f0113b1d4c6959d35ced318ebac Mon Sep 17 00:00:00 2001 From: StevanFreeborn Date: Fri, 27 Jan 2023 22:53:14 -0600 Subject: [PATCH] feat: add get apps method --- src/OnspringClient.ts | 28 ++++++++++++++++++++++------ src/models/EndpointFactory.ts | 6 ++++-- src/models/GetPagedAppsResponse.ts | 8 ++++++++ src/models/PagedResponse.ts | 13 +++++++++++++ tests/EndpointFactory.spec.ts | 7 ++++--- tests/GetPagedAppsResponse.spec.ts | 28 ++++++++++++++++++++++++++++ tests/PagedResponse.spec.ts | 27 +++++++++++++++++++++++++++ 7 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 src/models/GetPagedAppsResponse.ts create mode 100644 src/models/PagedResponse.ts create mode 100644 tests/GetPagedAppsResponse.spec.ts create mode 100644 tests/PagedResponse.spec.ts diff --git a/src/OnspringClient.ts b/src/OnspringClient.ts index 7c9b6dc..8998457 100644 --- a/src/OnspringClient.ts +++ b/src/OnspringClient.ts @@ -4,6 +4,9 @@ import { ArgumentValidator } from './models/ArgumentValidator'; import { EndpointFactory } from './models/EndpointFactory'; import { ApiResponseFactory } from './models/ApiResponseFactory'; import { ApiResponse } from './models/ApiResponse'; +import { App } from './models/App'; +import { PagingRequest } from './models/PagingRequest'; +import { GetPagedAppsResponse } from './models/GetPagedAppsResponse'; /** * @class OnspringClient - A client that can communicate with the Onspring API. @@ -51,12 +54,25 @@ export class OnspringClient { const endpoint = EndpointFactory.getPingEndpoint( this._client.defaults.baseURL ); - try { - const response = await this.get>(endpoint); - return response.isSuccessful; - } catch (error) { - return false; - } + + const response = await this.get>(endpoint); + return response.isSuccessful; + } + + /** + * + * @param pagingRequest - The paging request that will be used to get the apps. + * @returns + */ + public async getApps( + pagingRequest: PagingRequest = new PagingRequest(1, 50) + ): Promise> { + const endpoint = EndpointFactory.getAppsEndpoint( + this._client.defaults.baseURL, + pagingRequest + ); + + return await this.get(endpoint); } /** diff --git a/src/models/EndpointFactory.ts b/src/models/EndpointFactory.ts index 8326e5c..fe8a16f 100644 --- a/src/models/EndpointFactory.ts +++ b/src/models/EndpointFactory.ts @@ -1,3 +1,5 @@ +import { PagingRequest } from "./PagingRequest"; + /** * @class EndpointFactory - A factory class for creating endpoints. */ @@ -14,8 +16,8 @@ export class EndpointFactory { * @param {string} baseUrl - The base url that will be used to create the apps endpoint. * @returns {string} - The apps endpoint. */ - public static getAppsEndpoint(baseUrl: string): string { - return `${baseUrl}/Apps`; + public static getAppsEndpoint(baseUrl: string, pagingRequest: PagingRequest): string { + return `${baseUrl}/Apps?pageSize=${pagingRequest.pageSize}&pageNumber=${pagingRequest.pageNumber}`; } /** diff --git a/src/models/GetPagedAppsResponse.ts b/src/models/GetPagedAppsResponse.ts new file mode 100644 index 0000000..02ac269 --- /dev/null +++ b/src/models/GetPagedAppsResponse.ts @@ -0,0 +1,8 @@ +import { PagedResponse } from "./PagedResponse"; +import { App } from "./App"; + +export class GetPagedAppsResponse extends PagedResponse { + constructor(items: App[], pageNumber: number, pageSize: number, totalCount: number) { + super(items, pageNumber, pageSize, totalCount); + } +} \ No newline at end of file diff --git a/src/models/PagedResponse.ts b/src/models/PagedResponse.ts new file mode 100644 index 0000000..029fe71 --- /dev/null +++ b/src/models/PagedResponse.ts @@ -0,0 +1,13 @@ +export class PagedResponse { + public items: T[]; + public pageNumber: number; + public pageSize: number; + public totalCount: number; + + constructor(items: T[], pageNumber: number, pageSize: number, totalCount: number) { + this.items = items; + this.pageNumber = pageNumber; + this.pageSize = pageSize; + this.totalCount = totalCount; + } +} \ No newline at end of file diff --git a/tests/EndpointFactory.spec.ts b/tests/EndpointFactory.spec.ts index 3891c25..9722e45 100644 --- a/tests/EndpointFactory.spec.ts +++ b/tests/EndpointFactory.spec.ts @@ -1,5 +1,6 @@ import { EndpointFactory } from '../src/models/EndpointFactory'; import { expect } from 'chai'; +import { PagingRequest } from '../src/models/PagingRequest'; describe('EndpointFactory', function () { const baseUrl = 'https://api.onspring.com'; @@ -12,9 +13,9 @@ describe('EndpointFactory', function () { }); describe('getAppsEndpoint', function () { - it('should return the correct apps endpoint', function () { - const result = EndpointFactory.getAppsEndpoint(baseUrl); - expect(result).to.equal(`${baseUrl}/Apps`); + it('should return the correct apps endpoint with paging params based on paging request parameter passed', function () { + const result = EndpointFactory.getAppsEndpoint(baseUrl, new PagingRequest(2, 1000)); + expect(result).to.equal(`${baseUrl}/Apps?page=2&pageSize=1000`); }); }); diff --git a/tests/GetPagedAppsResponse.spec.ts b/tests/GetPagedAppsResponse.spec.ts new file mode 100644 index 0000000..2fbf2a8 --- /dev/null +++ b/tests/GetPagedAppsResponse.spec.ts @@ -0,0 +1,28 @@ +import { GetPagedAppsResponse } from '../src/models/GetPagedAppsResponse'; +import { expect } from 'chai'; +import { App } from '../src/models/App'; + +describe('GetPagedAppsResponse', function () { + it('should be defined', function () { + expect(GetPagedAppsResponse).to.not.be.undefined; + }); + + it('should have a constructor', function () { + expect(GetPagedAppsResponse).to.have.property('constructor'); + }); + + it('should have 4 parameters', function () { + expect(GetPagedAppsResponse).to.have.lengthOf(4); + }); + + it('should construct a new instance of GetPagedAppsResponse', function () { + const getPagedAppsResponse = new GetPagedAppsResponse([new App('test', 1, 'test'), new App('test', 1, 'test')], 1, 10, 100); + + expect(getPagedAppsResponse).to.not.be.undefined; + expect(getPagedAppsResponse).to.be.instanceOf(GetPagedAppsResponse); + expect(getPagedAppsResponse).to.have.property('items').to.be.an('array').to.have.lengthOf(2); + expect(getPagedAppsResponse).to.have.property('pageNumber').to.be.a('number').to.equal(1); + expect(getPagedAppsResponse).to.have.property('pageSize').to.be.a('number').to.equal(10); + expect(getPagedAppsResponse).to.have.property('totalCount').to.be.a('number').to.equal(100); + }); +}); \ No newline at end of file diff --git a/tests/PagedResponse.spec.ts b/tests/PagedResponse.spec.ts new file mode 100644 index 0000000..68ba643 --- /dev/null +++ b/tests/PagedResponse.spec.ts @@ -0,0 +1,27 @@ +import { PagedResponse } from '../src/models/PagedResponse'; +import { expect } from 'chai'; + +describe('PagedResponse', function () { + it('should be defined', function () { + expect(PagedResponse).to.not.be.undefined; + }); + + it('should have a constructor', function () { + expect(PagedResponse).to.have.property('constructor'); + }); + + it('should have 4 parameters', function () { + expect(PagedResponse).to.have.lengthOf(4); + }); + + it('should construct a new instance of PagedResponse', function () { + const pagedResponse = new PagedResponse([1, 2, 3, 4], 1, 10, 100); + + expect(pagedResponse).to.not.be.undefined; + expect(pagedResponse).to.be.instanceOf(PagedResponse); + expect(pagedResponse).to.have.property('items').to.be.an('array').to.have.lengthOf(4); + expect(pagedResponse).to.have.property('pageNumber').to.be.a('number').to.equal(1); + expect(pagedResponse).to.have.property('pageSize').to.be.a('number').to.equal(10); + expect(pagedResponse).to.have.property('totalCount').to.be.a('number').to.equal(100); + }); +});