@zhiguang-gastrofy/capi
Version:
comany apis, including Northfork api and Gastrofy api
218 lines (184 loc) • 5.34 kB
text/typescript
import axios from 'axios';
import { HttpService } from './http.service';
import { parseImage, parsePrice } from './utils';
import { Product } from './models';
const CancelToken = axios.CancelToken;
function parseRecipePrices( prices:any ) {
for( let name in prices ) {
prices[name] = parsePrice( prices[name] );
}
return prices;
}
export class NorthforkService {
_NFHttp: any;
_cartInited:boolean = false;
_cartId:string;
constructor( config?:any ) {
this._NFHttp = new HttpService( { ...{
host: 'https://api.northfork.se/api',
}, ...config||{} } );
}
getRecipes( params?:any ) {
let cancel:any;
let promise:any = this._NFHttp.get( 'discovery/recipes', {
params: params,
cancelToken: new CancelToken(function executor(c:any) {
cancel = c;
}),
} ).then( ( res:any ) => {
res.data = res.data.map( ( item:any ) => {
item.image_url = parseImage( item );
item.price = parseRecipePrices( item.price );
return item;
} );
return res;
} );
promise.cancel = cancel;
return promise;
}
getRecipe( id:any, params?:any ) {
return this._NFHttp.get( 'discovery/recipes/' + id, {
params: params,
} ).then( ( res:any ) => {
let data = res.data;
data.price = parseRecipePrices( data.price );
data.image_url = parseImage( data );
return data;
} );
}
getStores( params?:any ) {
return this._NFHttp.get( 'int/stores', {
params: params,
} );
}
getProducts( params?: any ) {
let cancel:any;
let promise:any = this._NFHttp.get( 'int/products', {
params: params,
cancelToken: new CancelToken(function executor(c:any) {
cancel = c;
}),
} ).then( ( res:any ) => {
res.data = res.data.map( ( item:any ) => {
let product:Product = {
id: item.id,
external_id: item.external_id,
image_url: parseImage( item ),
name: item.meta.title,
brand: item.meta.brand_name,
price: parsePrice( item.price.price ),
is_active: item.is_active,
size: item.size.size,
size_unit_name: item.size.unit_name,
mid: item.mid,
};
return product;
} );
return res;
} );
promise.cancel = cancel;
return promise;
}
getProduct( id: number, params?:any ) {
return this._NFHttp.get( 'int/products/' + id, {
params: params,
} ).then( ( res:any ) => {
let data = res.data;
let product:Product = {
id: data.id,
external_id: data.external_id,
image_url: parseImage( data ),
name: data.meta.title,
brand: data.meta.brand_name,
price: parsePrice( data.price.price ),
is_active: data.is_active,
size: data.size.size,
size_unit_name: data.size.unit_name,
mid: data.mid,
};
return product;
} );
}
getIngredients( params?:any ) {
return this._NFHttp.get( 'int/ingredients', {
params: params
} );
}
getCampaigns( params?:any ) {
return this._NFHttp.get( 'int/campaigns', {
params:params
} );
}
createCampaign( data:any ) {
return this._NFHttp.post( 'int/campaigns', data, {
} );
}
getSubstitutes( storeIdentifier:string, productIdentifier:string, params?:any ) {
let api = `smart-cart/stores/${storeIdentifier}/products/${productIdentifier}/substitutes`;
return this._NFHttp.get( api, {
params: params,
} ).then( ( res:any ) => {
res.data = res.data.map( ( product:any ) => {
product.image_url = parseImage( product );
product.price = parsePrice( product.price );
product.brand = product.brand !== 'na'? product.brand: null;
product.is_active = product.in_stock === true;
delete product.in_stock;
return product;
} );
return res;
} );
}
getProductCategories( params?:any ) {
return this._NFHttp.get( 'int/product-categories', {
params: params,
} ).then( ( res:any ) => {
return res;
} );
}
getCart( userId:any ) {
if( !userId ) return;
let cancel:any;
let promise:any = this._NFHttp.get( 'int/carts?user_id=' + userId, {
cancelToken: new CancelToken(function executor( c:any ) {
cancel = c;
}),
} ).then( ( res:any ) => {
this._cartInited = true;
let cart = res.data && res.data[0];
if( cart ) {
this._cartId = cart.id;
delete cart.id;
delete cart.user_id;
}
return cart || null;
} );
promise.cancel = cancel;
return promise;
}
saveCart( data:any ) {
if( !this._cartInited ) return;
let cancel:any;
let action: string;
let apiPath = 'int/carts';
if( !this._cartId ) {
action = 'post';
} else {
action = 'put';
apiPath += '/' + this._cartId;
}
let promise:any = this._NFHttp[action]( apiPath, data, {
cancelToken: new CancelToken(function executor( c:any ) {
cancel = c;
} ),
} ).then( ( res:any ) => {
let cart = res.data;
if( action === 'post' ) this._cartId = cart.id;
delete cart.id;
delete cart.user_id;
return cart;
} );
promise.cancel = cancel;
return promise;
}
}