loop-modules
Version:
Shared modules for the Loop product suite.
226 lines (204 loc) • 6.32 kB
text/typescript
// angular
import { Http, Response } from '@angular/http';
// libs
import { Store } from '@ngrx/store';
import { Observable } from 'rxjs/Observable';
// app
import { ResponseBody } from './response-body.interface';
import { APIRequestOptions } from './api-request-options.interface';
export abstract class APIDispatcher {
protected lastRequest: ResponseBody;
loaded: boolean = false;
fetchingNext: boolean = false;
constructor(public http: Http, public store: Store<any>) { }
/**
* Wraps the http layer for GET requests
* Injects Core API standards for filtering, sorting and pagination
*
* @param {string} url The relative API url
* @param {number} [page=0] The page of the dataset to request
* @param {number} [size=10] The maximum number of results to return
* @param {APIRequestOptions} [options] The optional request options
* @returns Observable of http get request
*/
get(url: string, page: number = 0, size: number = 10, options: APIRequestOptions = {}): Observable<Response> {
return this.http.get(url + '?' +
this.getPageFragment(page) +
this.getSizeFragment(size) +
this.getOptionalFragments(options));
}
/**
* Wraps the http layer for POST requests
* Injects Core API standards used for fetching items by identities
* Allows for filtering, sorting and pagination
*
* @param {string} url The relative API url
* @param {*} requestBody The request body to send to the server
* @param {number} [page=0] The page of the dataset to request
* @param {number} [size=10] The maximum number of results to return
* @param {APIRequestOptions} [options] The optional request options
* @returns
*/
post(url: string, requestBody: any, page: number = 0, size: number = 10, options: APIRequestOptions = {}): Observable<Response> {
return this.http.post(url + '?' +
this.getPageFragment(page) +
this.getSizeFragment(size) +
this.getOptionalFragments(options),
requestBody);
}
handleError(error: any): any {
let errMsg = (error.message) ? error.message : error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg);
return Observable.throw(errMsg);
}
/**
* This clears the previous requests
*
* @memberOf APIDispatcher
*/
clearRequest() {
this.lastRequest = undefined;
}
// TODO - This will need to be abstract once services are up-to-date
// getNextPage() {};
/**
* Determines if the paginated request has another page, based on the total number of pages vs. the currently requested content
*
* @readonly
* @type {boolean}
* @memberOf APIDispatcher
*/
get hasNext(): boolean {
if (this.lastRequest) {
return (this.lastRequest.totalPages - 1) > this.lastRequest.currentPage;
}
return false;
}
/**
* The get parameter fragment for page numbers
*
* @protected
* @param {number} page
* @returns {string}
*/
protected getPageFragment(page: number): string {
return 'page=' + page;
}
/**
* The get parameter fragment for collection size
*
* @protected
* @param {number} size
* @returns {string}
*/
protected getSizeFragment(size: number): string {
return '&size=' + size;
}
/**
* The get parameter fragments
*
* @protected
* @param {APIRequestOptions} options
* @returns {string}
*/
protected getOptionalFragments(options: APIRequestOptions): string {
return this.getSearchFragment(options.search) +
this.getSortByFragment(options.sortBy) +
this.getUnreadFragment(options.unread) +
this.getSortDirFragment(options.sortDir) +
this.getArchivedFragment(options.archived) +
this.getIsReviewedFragment(options.reviewed) +
this.getIsSubmittedFragment(options.submitted);
}
/**
* The get parameter fragment for search term
*
* @protected
* @param {string} search
* @returns {string}
*/
protected getSearchFragment(search: string): string {
if (search) {
return '&search=' + encodeURIComponent(search);
}
return '';
}
/**
* The get parameter fragment for sort by
*
* @protected
* @param {string} sortBy
* @returns {string}
*/
protected getSortByFragment(sortBy: string): string {
if (sortBy) {
return '&sortBy=' + sortBy;
}
return '';
}
/**
* The get parameter fragment for sort direction
*
* @protected
* @param {string} sortDir
* @returns {string}
*/
protected getSortDirFragment(sortDir: string): string {
if (sortDir) {
return '&sortDir=' + sortDir;
}
return '';
}
/**
* The get parameter fragment for unread
*
* @protected
* @param {string} unread
* @returns {string}
*/
protected getUnreadFragment(unread: string): string {
if (unread) {
return '&unread=' + unread;
}
return '';
}
/**
* The get parameter fragment for unread
*
* @protected
* @param {string} unread
* @returns {string}
*/
protected getArchivedFragment(archived: boolean): string {
if (archived) {
return '&isArchived=' + archived;
}
return '';
}
/**
* The get parameter fragment for unread
*
* @protected
* @param {string} unread
* @returns {string}
*/
protected getIsReviewedFragment(reviewed: boolean): string {
if (reviewed !== undefined) {
return '&reviewed=' + reviewed;
}
return '';
}
/**
* The get parameter fragment for unread
*
* @protected
* @param {string} unread
* @returns {string}
*/
protected getIsSubmittedFragment(submitted: boolean): string {
if (submitted !== undefined) {
return '&submitted=' + submitted;
}
return '';
}
}