Skip to content

Instantly share code, notes, and snippets.

@wake
Last active June 5, 2018 13:14
Show Gist options
  • Save wake/c93a10a6ba51eeacfce64b926ded2c61 to your computer and use it in GitHub Desktop.
Save wake/c93a10a6ba51eeacfce64b926ded2c61 to your computer and use it in GitHub Desktop.
Swapub Mobile API wrapper
/**
*
* API access
*
*/
var api = (function () {
/**
*
* Config
*
*/
var _api = {
app: null,
authing: false,
waiting: [],
config: {
host: '',
email: '',
password: '',
appid: '',
version: '',
type: '1',
cache: {},
retry: false,
token: ''
}
};
/**
*
* App 初始化
*
*/
_api.init = function (app, config) {
config = config || {};
_api.app = app;
_api.config.host = config.host || '';
_api.config.email = config.email || '';
_api.config.password = config.password || '';
_api.config.appid = config.appid || '';
_api.config.version = config.version || '';
_api.config.type = config.type || '';
}
/**
*
* Auth (ask token)
*
*/
_api.auth = function (after) {
after && _api.waiting.push (after);
// Pending if authing
if (_api.authing)
return;
_api.authing = true;
_api.request.post ('/PeformLogon', {
Version: _api.config.version,
Email: _api.config.email,
Password: _api.config.password,
Type: _api.config.type
}, function (res) {
_api.authing = false;
if (res.Token && res.Token != '')
_api.config.token = res.Token;
while (after = _api.waiting.shift ()) {
if (typeof after == 'function')
after ();
else if (typeof after.request == 'function') {
// 手動重新配置 arugments (因為 arguments 不是陣列,無法直接改變長度)
var pass = [];
for (i=0; i<after.arguments.length; i++)
pass[i] = after.arguments[i];
pass.push (true);
after.request.apply (_api, pass);
}
}
}, function () {
_api.authing = false;
console.log ('[api:auth] API 驗證失敗 (/PeformLogon)', arguments);
}, true) // retry
};
/**
*
* Fair View
*
*/
_api.fair = {
// FairView > GetCategories
category: function (handler, error) {
_api.request.get ('/Category', handler, error);
},
// FairView > GetBannerList
banner: function (options, handler, error) {
if (typeof options == 'string' || typeof options == 'number')
options = {CategoryID: options};
else
options.CategoryID = options.id;
query = $.param (options);
_api.request.get ('/GetBannerList?' + query, handler, error);
},
/**
*
* FairView > GetProductWithLocationAndCategory_V2
* @doc: http://dev-8085.swapub.com/Help/Api/GET-api-GetProductWithLocationAndCategory_V2_filterDate_category_country_area_city_count
*
* @param: *filterDate
* @param: category
* @param: country
* @param: area
* @param: city
* @param: count
*
*/
product: function (options, handler, error) {
options = options || {};
options.filterDate = options.filterDate || moment ().toISOString ();
query = $.param (options);
_api.request.get ('/GetProductWithLocationAndCategory_V2?' + query, handler, error);
}
};
/**
*
* Product View
*
*/
_api.product = {
// FairView > GetCategories
get: function (id, handler, error) {
_api.request.get ('/Product/' + id, handler, error);
},
// ProductView > GetProductTrackCount
trackCount: function (id, handler, error) {
_api.request.get ('/GetProductTrackCount?productID=' + id, handler, error);
},
// ProductView > GetPublicMessageCount
publicMessageCount: function (id, handler, error) {
_api.request.get ('/PublicMessage?productID=' + id, handler, error);
},
// ProductView > GetPublicMessageList
publicMessage: function (options, handler, error) {
if (typeof options == 'string' || typeof options == 'number')
options = {productID: options, maxtime: moment ().toISOString ()};
else {
options.productID = options.id;
options.maxtime = options.maxtime || moment ().toISOString ();
delete options.id;
}
query = $.param (options);
_api.request.get ('/PublicMessage?' + query, handler, error);
},
// ProductView > GetMessageCount
messageCount: function (id, handler, error) {
_api.request.get ('/Message1?productID=' + id, handler, error);
},
// ProductView > GetMessageList
message: function (options, handler, error) {
if (typeof options == 'string' || typeof options == 'number')
options = {productID: options};
else {
options.productID = options.id;
delete options.id;
}
query = $.param (options);
_api.request.get ('/Message?' + query, handler, error);
},
// ProductView > GetProductDeal
dealingInfo: function (options, handler, error) {
query = $.param (options);
_api.request.get ('/ProductDeal?' + query, handler, error);
},
// ProductView > GetProductSearchResult
searchResult: function (options, handler, error) {
if (typeof options == 'string' || typeof options == 'number')
options = {keyword: options};
options.skip = options.skip || 1;
query = $.param (options);
_api.request.get ('/search_product_es?' + query, handler, error);
}
};
/**
*
* Profile View
*
*/
_api.person = {
// ProfileView > GetAccountInfo
profile: function (id, handler, error) {
_api.request.get ('/User/' + id, handler, error);
},
// ProfileView > GetDealedNum
dealtNum: function (id, handler, error) {
_api.request.get ('/DealedNum?targetUser=' + id, handler, error);
},
// ProfileView > GetRatingCount
ratingCount: function (id, handler, error) {
_api.request.get ('/Rating?accountID=' + id, handler, error);
},
// ProfileView > GetBooth
product: function (options, handler, error) {
if (typeof options == 'string' || typeof options == 'number')
options = {ownerID: options};
options.filterDate = options.filterDate || moment ().toISOString ();
query = $.param (options);
_api.request.get ('/Product?' + query, handler, error);
},
// ProfileView > GetWishes
wish: function (options, handler, error) {
if (typeof options == 'string' || typeof options == 'number')
options = {ownerID: options};
options.filterDate = options.filterDate || moment ().toISOString ();
query = $.param (options);
_api.request.get ('/Wish?' + query, handler, error);
}
};
/**
*
* Search View
*
*/
_api.search = {
/**
*
* SearchView > GetSearchResult_v2
* @doc: http://dev-8085.swapub.com/Help/Api/GET-api-search_v2_keyword_skip_Country_Area_City_categoryID
*
* @param: *keyword
* @param: *skip
* @param: Country
* @param: Area
* @param: City
* @param: categoryID
*
*/
product: function (options, handler, error) {
if (typeof options == 'string' || typeof options == 'number')
options = {keyword: options};
options.skip = options.skip || 0;
query = $.param (options);
_api.request.get ('/search_v2?' + query, handler, error);
},
/**
*
* SearchView > GetSearchUserResult
* @doc: http://dev-8085.swapub.com/Help/Api/GET-api-SearchUser_keyword_SkipRecord
*
* @param: *keyword
* @param: *SkipRecord
*
*/
person: function (options, handler, error) {
if (typeof options == 'string' || typeof options == 'number')
options = {keyword: options};
options.SkipRecord = options.SkipRecord || 0;
query = $.param (options);
_api.request.get ('/SearchUser?' + query, handler, error);
},
// SearchView > GetPopularSearchKeyword
popularKeywords: function (options, handler, error) {
query = $.param (options);
_api.request.get ('/PopularSearchKeyword?' + query, handler, error);
}
};
/**
*
* Request
*
*/
_api.request = {
// GET operator
get: function (url, handler, error, retry) {
// Cache
var cache = {request: _api.request.get, arguments: arguments}
, headers = {appid: _api.config.appid}
, reqArguments = []
, reqData = null
, reqToken = ''
, reqLink = '*'
;
async.whilst (
// Stop condition
function () { return reqLink != null; },
// Request
function (cb) {
var fixedUrl = _api.helper.url (url, reqToken);
$.ajax ({
url: fixedUrl,
method: 'GET',
headers: headers,
dataType: 'json',
contentType: 'application/json'
}).done (function (data, textStatus, xhr) {
log.debug ('[api:GET] (done)', url);
reqToken = '';
reqArguments = arguments;
// 有取到 link header,試著拆解出 pageToken
if ((reqLink = xhr.getResponseHeader ('link')) != null) {
reqToken = reqLink.match (/pageToken=([._\-\w]+)/);
reqToken = reqToken[1] && reqToken[1] != '' ? reqToken[1] : '';
}
if (reqData === null)
reqData = data;
else if (typeof reqData == 'object' && typeof data == 'object')
reqData = reqData.concat (data);
cb (null, reqLink);
}).fail (function (res) {
log.debug ('[api:GET] (fail)', url);
reqArguments = arguments;
cb (res);
});
},
function (err) {
if (err == null || ! err) {
reqArguments[0] = reqData;
handler.apply (_api, reqArguments);
}
else {
// Maybe need authing, make authing and retry
if (err.status == 401 && ! retry)
_api.auth (cache);
else if (typeof error == 'function')
error.apply (_api, reqArguments);
else
handler.apply (_api, reqArguments);
}
}
);
},
// POST operator
post: function (url, data, handler, error, retry) {
// Cache
var cache = {request: _api.request.post, arguments: arguments}
, headers = {appid: _api.config.appid}
, fixedUrl = _api.helper.url (url)
, formMode = false
, fdata
;
if (data._form) {
fdata = new FormData ();
formMode = true;
for (var i in data) {
if (i[0] != '_')
fdata.append (i, data[i]);
}
}
$.ajax ({
url: fixedUrl,
method: 'POST',
headers: headers,
data: ! formMode ? JSON.stringify (data) : fdata,
dataType: formMode ? 'html' : 'json',
contentType: formMode ? false : 'application/json',
processData: formMode ? false : true
}).done (function () {
log.debug ('[api:POST] (done)', url);
handler.apply (_api, arguments);
}).fail (function (res) {
log.debug ('[api:POST] (fail)', url);
// Maybe need auth, auth and retry
if (res.status == 401 && ! retry)
_api.auth (cache);
else if (typeof error == 'function')
error.apply (_api, arguments);
else
handler.apply (_api, arguments);
});
},
// PUT operator
put: function (url, data, handler, error, retry) {
// Cache
var cache = {request: _api.request.put, arguments: arguments}
, headers = {appid: _api.config.appid}
, fixedUrl = _api.helper.url (url)
, formMode = false
, fdata
;
if (data._form) {
fdata = new FormData ();
formMode = true;
for (var i in data) {
if (i[0] != '_')
fdata.append (i, data[i]);
}
}
$.ajax ({
url: fixedUrl,
method: 'PUT',
headers: headers,
data: ! formMode ? JSON.stringify (data) : fdata,
dataType: formMode ? 'html' : 'json',
contentType: formMode ? false : 'application/json',
processData: formMode ? false : true
}).done (function () {
log.debug ('[api:PUT] (done)', url);
handler.apply (_api, arguments);
}).fail (function (res) {
log.debug ('[api:PUT] (fail)', url);
// Maybe need auth, auth and retry
if (res.status == 401 && ! retry)
_api.auth (cache);
else if (typeof error == 'function')
error.apply (_api, arguments);
else
handler.apply (_api, arguments);
});
},
// DELETE operator
delete: function (url, handler, error, retry) {
// Cache
var cache = {request: _api.request.put, arguments: arguments}
, headers = {appid: _api.config.appid}
, fixedUrl = _api.helper.url (url)
, formMode = false
, fdata
;
$.ajax ({
url: fixedUrl,
method: 'PUT',
headers: headers,
dataType: 'json',
contentType: 'application/json'
}).done (function () {
log.debug ('[api:DELETE] (done)', url);
handler.apply (_api, arguments);
}).fail (function (res) {
log.debug ('[api:DELETE] (fail)', url);
// Maybe need auth, auth and retry
if (res.status == 401 && ! retry)
_api.auth (cache);
else if (typeof error == 'function')
error.apply (_api, arguments);
else
handler.apply (_api, arguments);
});
}
}
/**
*
* Helper
*
*/
_api.helper = {
// URL fixer
url: function (url, pageToken) {
if (_api.config.token != '')
url += (url.indexOf ('?') !== -1 ? '&' : '?') + 'accessToken=' + _api.config.token;
return _api.config.host + url;
}
}
/**
*
* Instance
*
*/
return _api;
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment