diff --git a/packages/angularjs/src/services/collection.ts b/packages/angularjs/src/services/collection.ts index e7965b20..50508094 100644 --- a/packages/angularjs/src/services/collection.ts +++ b/packages/angularjs/src/services/collection.ts @@ -309,6 +309,14 @@ export class Collection extends EventManager { withCredentials: this.withCredentials, } if (!isUndefined(data)) { + if (isObject(data) && Object.prototype.hasOwnProperty.call(data, 'p')) { + const validPage = this.normalizePositiveWholeNumber((data as LooseObject).p) + if (isUndefined(validPage)) { + delete (data as LooseObject).p + } else { + (data as LooseObject).p = validPage + } + } if (action === 'GET') { if (isObject(data) && Object.keys(data).length) { request.url += request.url.includes('?') ? '&' : '?' @@ -516,10 +524,27 @@ export class Collection extends EventManager { } page(page: any) { - this.paginate = !isEmpty(page) - this.meta.set('api.p', page) + const validPage = this.normalizePositiveWholeNumber(page) + this.paginate = !isUndefined(validPage) + if (isUndefined(validPage)) { + this.clearApiPage() + return + } + this.meta.set('api.p', validPage) this.fetch().then() - delete this.meta.get('api').p + this.clearApiPage() + } + + private normalizePositiveWholeNumber(value: any): number | undefined { + const page = Number(value) + return Number.isFinite(page) && Number.isInteger(page) && page >= 1 ? page : undefined + } + + private clearApiPage(): void { + const api = this.meta.get('api') + if (isObject(api) && Object.prototype.hasOwnProperty.call(api, 'p')) { + delete api.p + } } toJSON() {