statement.base.service.ts 1.95 KB
import { Headers, Http, Response } from '@angular/http';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/map';

export abstract class StatementBaseService {
    protected abstract url: string;
    protected headers: Headers = new Headers({'Content-Type': 'application/json'});

    constructor(protected http: Http) { }

    getData(from: number = 0, to: number = 100, sort: string = null): Promise<any[]> {
        let url: string = this.url;
        url += '?from=' + from + '&to=' + to;
        if (sort) {
            url += '&sort=' + sort;
        }
        return this.http.get(url)
            .toPromise()
            .then((response: Response) => this.parseModels(response.json()))
      .catch(this.handleError);
  }

  // search(term: string): Observable<any[]> {
  //   return this.http
  //     .get(`app/heroes/?name=${term}`)
  //     .map(response => response.json().data as any[]);
  // }

  update(id: number, data: string): Promise<any> {
    return this.http.post(this.url + '/update?id=' + id, data, { headers: this.headers })
      .toPromise()
      .then((response: Response) => response.json())
      .catch(this.handleError);
  }

  create(data: string): Promise<any> {
    return this.http.post(this.url + '/create', data, { headers: this.headers })
      .toPromise()
      .then((response: Response) => this.parseModel(response.json()))
      .catch(this.handleError);
  }

  delete(id: number): Promise<any> {
    return this.http.delete(this.url + '/delete?id=' + id, { headers: this.headers })
      .toPromise()
      .then((response: Response) => response.json())
      .catch(this.handleError);
  }

  public abstract createModel(): Object;

  protected handleError(error: any): Promise<any> {
    console.error('An error occured', error);
    return Promise.reject(error.message || error);
  }

  protected abstract parseModels(json: any): any[];
  protected abstract parseModel(json: any): any;
}