import { Injectable } from '@angular/core'; import { Headers, Http, Request, RequestOptions, RequestOptionsArgs, URLSearchParams} from '@angular/http'; import * as _ from 'lodash'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/toPromise'; @Injectable() export class ApiProvider { // TODO hide information accessToken: string; userId: string; refreshToken: string; expiresIn: string; appId: string = '571aff7c854c8dde5ea32fca'; apiUri: string = ''; socketUri: string = ''; clientId: string = 'android'; clientSecret: string = 'SomeRandomCharsAndNumbers'; // clientId: string = 'qB3RtMADTCKj2OW0SSP6IvYYuLtD00s7.clientId.styloola'; getToken = this.getOxlToken; prepareReq = this.prepareOxlReq; user: any = null; language: string = 'en-US'; constructor(public http: Http) {} api (method: string, endpoint: string, payload: any) { let promise = new Promise( (resolve, reject) => { this.getToken().then((response) => { if (!payload) { payload = {}; } // // payload.accessToken = response; // payload.appId = this.appId; let req: any = this.prepareReq(method, endpoint, payload); // Callback to prepare the request // TODO check impact & remove if (method === 'GET' || method === 'DELETE' || method === 'PUT' || endpoint === '/v1/customer/checkin/') { req.params = payload; } else { req.data = payload; } this.http.request(req). map(res => res.json()). toPromise(). then((responseN) => { if (responseN.errors) { // TODO if we have a token-expired-error we need to 'refresh' the token // and issue again the request reject(responseN.errors); } else { resolve(responseN.data); } }, (err) => { if (err.status || err.status == 0 ) {reject(err.status); }else if (JSON.parse(err._body).errors) {reject(JSON.parse(err._body).errors); }else { reject(err); } }); }); }); return promise; } prepareOxlReq(method: string, endpoint: string , payload: any) { let headers = new Headers(); headers.append('Content-Type', 'application/json'); if (this.accessToken) { headers.append('Authorization', 'Bearer ' + this.accessToken); } headers.append('Accept-Language', this.getLanguage()); let params: URLSearchParams = new URLSearchParams(); if (method === 'GET' || endpoint === '/v1/customer/checkin/') { for ( let key in payload){ params.set(key, payload[key] ); } // TODO change login // if (payload.grant_type) { params.set('grant_type', payload.grant_type); } // if (payload.client_id) { params.set('client_id', payload.client_id); } // if (payload.client_secret) { params.set('client_secret', payload.client_secret); } // if (payload.username) { params.set('username', payload.username); } // if (payload.password) { params.set('password', payload.password); } } let basicOptions: RequestOptionsArgs = { // url: endpoint === '/v1/user'? serverurl + endpoint: this.apiUri + endpoint , url: `${this.apiUri}${endpoint}` , method: method, search: params, headers: headers, // new Headers({'trustme':true}), body: payload }; // basicOptions.url = (payload.id?this.apiUri + endpoint +'/'+payload.id: this.apiUri + endpoint); let reqOptions = new RequestOptions(basicOptions); return new Request(reqOptions); } getOxlToken() { let promise = new Promise( (resolve, reject) => { if (this.accessToken) { resolve(this.accessToken); }else {          if (this.user) {              // this.api('POST', 'oauth/token', this.user) let loginHeaders = new Headers(); loginHeaders.append('Content-Type', 'application/json');            this.http.post(this.apiUri + '/oauth/token', this.user, { headers: loginHeaders }).            map(res => res.json()).            toPromise().              then(                (response: any) => {                    if (response.errors) {                      reject('errors in oauth json');                    } else {                      // ERROR                      // deferred.reject(oxlStrings.errMsg(response.data['#data']['#errcode'], response.data['#data']['#message']));                      // reject                      // this.accessToken = response.data.access_token; // jshint ignore:line                      this.accessToken = response.access_token; // jshint ignore:line this.userId = response.userId; this.refreshToken = response.refresh_token;                      // TODO store the token object in localStorage                      resolve(this.accessToken);                    }                  }, (err) => {                      reject('Error in oauth' + err);                  });            }else { this.http.post(this.apiUri + '/oauth/anonymous', { client_id: this.clientId, client_secret: this.clientSecret }). map(res => res.json()). toPromise(). then( (response) => { if (response.errors) { reject('errors in oauth json'); } else { // ERROR // deferred.reject(oxlStrings.errMsg(response.data['#data']['#errcode'], response.data['#data']['#message'])); // reject // this.accessToken = response.data.access_token; // jshint ignore:line this.accessToken = response.access_token; // jshint ignore:line // TODO store the token object in localStorage resolve(this.accessToken); } }, (err) => { reject('Error in oauth' + err); }); } }}); return promise; } // TODO REMOVE loginUser(payload: any) { return new Promise ((resolve, reject) => { this.user = payload; let loginHeaders = new Headers(); loginHeaders.append('Content-Type', 'application/json');            this.http.post(this.apiUri + '/oauth/token', this.user, { headers: loginHeaders }).            map(res => res.json()).            toPromise().              then(                (response: any) => {                    if (response.errors) {                      reject('errors in oauth json');                    } else {                      // ERROR                      // deferred.reject(oxlStrings.errMsg(response.data['#data']['#errcode'], response.data['#data']['#message']));                      // reject                      // this.accessToken = response.data.access_token; // jshint ignore:line                     this.accessToken = response.access_token; // jshint ignore:line this.userId = response.userId; this.refreshToken = response.refresh_token;                      // TODO store the token object in localStorage console.log(response);                      resolve(response);                    }                  }, (err) => {                      reject('Error in oauth' + err);                  }); }); } logout() { let promise = new Promise( (resolve, reject) => { this.http.post(this.apiUri + '/oauth/anonymous', { client_id: this.clientId, client_secret: this.clientSecret }). map(res => res.json()). toPromise(). then( (response) => { if (response.errors) { reject('errors in oauth json'); } else { // ERROR // deferred.reject(oxlStrings.errMsg(response.data['#data']['#errcode'], response.data['#data']['#message'])); // reject // this.accessToken = response.data.access_token; // jshint ignore:line this.accessToken = response.access_token; // jshint ignore:line // TODO store the token object in localStorage resolve(this.accessToken); } }, (err) => { reject('Error in oauth' + err); }); }); return promise; } resolver(resolve: any, reject: any) { setTimeout(function doneCounting() { resolve('testString'); }, 2000); } retrieveUserInfo(){ // pending cache let payload: any = {}; let promise = new Promise((resolve, reject) => { this.api('GET', `/v1/user` , payload) .then((response: any) => { console.log(response); if (response.id) { resolve(response); } else { reject(); } }, (err) => { // catch error // @todo: We should check for errors ?!? reject(err); }); }); return promise; } setLanguage(lang: string) { this.language = lang; } getLanguage() { return this.language; } setApiUri( newUri: string) { this.apiUri = newUri; } setSocketUri( newUri: string) { this.socketUri = newUri; } }