nativescript-quickblox
Version:
NativeScript QuickBlox JS SDK
391 lines (353 loc) • 14.8 kB
JavaScript
/*
* QuickBlox JavaScript SDK
*
* Content module
*
* For an overview of this module and what it can be used for
* see http://quickblox.com/modules/content
*
* The API itself is described at http://quickblox.com/developers/Content
*
*/
var config = require('../qbConfig'),
Utils = require('../qbUtils');
/**
* Content
* @namespace QB.content
**/
function ContentProxy(service) {
this.service = service;
}
ContentProxy.prototype = {
/**
* Get a list of files for current user ({@link https://docsdev.quickblox.com/rest_api/Content_API.html#Retrieve_files read more})
* @memberof QB.content
* @param {object} params - Object of parameters
* @param {number} [params.page=1] - Used to paginate the results when more than one page of files retrieved
* @param {number} [params.per_page=10] - The maximum number of files to return per page, if not specified then the default is 10
* @param {listOfFilesCallback} callback - The listOfFilesCallback function
*/
list: function(params, callback) {
/**
* Callback for QB.content.list(params, callback)
* @callback listOfFilesCallback
* @param {object} error - The error object
* @param {object} response - Object with Array of files
*/
if (typeof params === 'function' && typeof callback === 'undefined') {
callback = params;
params = null;
}
this.service.ajax({url: Utils.getUrl(config.urls.blobs), data: params, type: 'GET'}, function(err,result){
if (err) {
callback(err, null);
} else {
callback (err, result);
}
});
},
/**
* Create new file object ({@link https://docsdev.quickblox.com/rest_api/Content_API.html#Create_file read more})
* @private
* @memberof QB.content
* @param {object} params - Object of parameters
* @param {string} params.content_type - The file's mime ({@link https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types content type})
* @param {string} params.name - The file's name
* @param {boolean} [params.public=false] - The file's visibility. public means it will be possible to access this file without QuickBlox session token provided. Default is 'false'
* @param {createFileCallback} callback - The createFileCallback function
*/
create: function(params, callback) {
/**
* Callback for QB.content.create(params, callback)
* @callback createFileCallback
* @param {object} error - The error object
* @param {object} response - The file object (blob-object-access)
*/
this.service.ajax({
type: 'POST',
data: {blob: params},
url: Utils.getUrl(config.urls.blobs)
}, function(err, result) {
if (err) {
callback(err, null);
} else {
callback(err, result.blob);
}
});
},
/**
* Delete file by id ({@link https://docsdev.quickblox.com/rest_api/Content_API.html#Delete_file read more})
* @memberof QB.content
* @param {Number} id - blob_id
* @param {deleteFileCallback} callback - The deleteFileCallback function.
*/
delete: function(id, callback) {
/**
* Callback for QB.content.delete(id, callback)
* @callback deleteFileCallback
* @param {object} error - The error object
* @param {object} response - Boolean
*/
this.service.ajax({url: Utils.getUrl(config.urls.blobs, id), type: 'DELETE', dataType: 'text'}, function(err, result) {
if (err) {
callback(err, null);
} else {
callback(null, true);
}
});
},
/**
* Create file > upload file > mark file as uploaded > return result.
* @memberof QB.content
* @param {object} params - Object of parameters
* @param {object} params.file - File object
* @param {string} params.name - The file's name
* @param {string} params.type - The file's mime ({@link https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types content type})
* @param {number} params.size - Size of file, in bytes
* @param {boolean} [params.public=false] - The file's visibility. public means it will be possible to access this file without QuickBlox session token provided. Default is 'false'
* @param {createAndUploadFileCallback} callback - The createAndUploadFileCallback function
*/
createAndUpload: function(params, callback) {
/**
* Callback for QB.content.createAndUpload(params, callback).
* @callback createAndUploadFileCallback
* @param {object} error - The error object
* @param {object} response - The file object (blob-object-access)
*/
var _this = this,
createParams= {},
file,
name,
type,
size,
fileId;
var clonedParams = JSON.parse(JSON.stringify(params));
clonedParams.file.data = "...";
file = params.file;
name = params.name || file.name;
type = params.type || file.type;
size = params.size || file.size;
createParams.name = name;
createParams.content_type = type;
if (params.public) {
createParams.public = params.public;
}
if (params.tag_list) {
createParams.tag_list = params.tag_list;
}
// Create a file object
this.create(createParams, function(err, createResult){
if (err) {
callback(err, null);
} else {
var uri = parseUri(createResult.blob_object_access.params),
uploadUrl = uri.protocol + "://" + uri.authority + uri.path,
uploadParams = {url: uploadUrl},
data = {};
fileId = createResult.id;
createResult.size = size;
Object.keys(uri.queryKey).forEach(function(val) {
data[val] = decodeURIComponent(uri.queryKey[val]);
});
data.file = file;
uploadParams.data = data;
// Upload the file to Amazon S3
_this.upload(uploadParams, function(err, result) {
if (err) {
callback(err, null);
} else {
// Mark file as uploaded
_this.markUploaded({
id: fileId,
size: size
}, function(err, result){
if (err) {
callback(err, null);
} else {
callback(null, createResult);
}
});
}
});
}
});
},
/**
* Upload a file to cloud storage ({@link https://docsdev.quickblox.com/rest_api/Content_API.html#Upload_file read more})
* @private
* @memberof QB.content
* @param {Object} params - Object of parameters (see into source code of QB.content.createAndUpload(params, callback) to know how to prepare the params object)
* @param {string} params.url - location url
* @param {object} params.data - formed data with file
* @param {uploadFileCallback} callback - The uploadFileCallback function
*/
upload: function(params, callback) {
/**
* Callback for QB.content.upload(params, callback)
* @callback uploadFileCallback
* @param {object} error - The error object
* @param {object} response - The empty object
*/
var uploadParams = {
type: 'POST',
dataType: 'text',
contentType: false,
url: params.url,
data: params.data
};
this.service.ajax(uploadParams, function(err, xmlDoc) {
if (err) {
callback (err, null);
} else {
callback (null, {});
}
});
},
/**
* Declare file uploaded. The file's 'status' field will be set to 'complete' ({@link https://docsdev.quickblox.com/rest_api/Content_API.html#Declare_file_uploaded read more})
* @private
* @memberof QB.content
* @param {object} params - Object of parameters
* @param {number} params.blob_id - The id of file to declare as uploaded
* @param {number} params.size - Size of file, in bytes
* @param {markUploadedFileCallback} callback - The markUploadedFileCallback function
*/
markUploaded: function (params, callback) {
/**
* Callback for QB.content.markUploaded(params, callback)
* @callback markUploadedFileCallback
* @param {object} error - The error object
* @param {object} response - The empty body
*/
this.service.ajax({
url: Utils.getUrl(config.urls.blobs, params.id + '/complete'),
type: 'PUT',
data: {
size: params.size
},
dataType: 'text'
}, function(err, res){
if (err) {
callback (err, null);
} else {
callback (null, res);
}
});
},
/**
* Retrieve file object by id (@link https://docsdev.quickblox.com/rest_api/Content_API.html#Retrieve_file read more})
* @memberof QB.content
* @param {number} id - The id of file to declare as uploaded
* @param {getFileInfoByIdCallback} callback - The getFileInfoByIdCallback function return file's object.
*/
getInfo: function (id, callback) {
/**
* Callback for QB.content.getInfo(id, callback)
* @callback getFileInfoByIdCallback
* @param {object} error - The error object
* @param {object} response - The file object (blob-object-access)
*/
this.service.ajax({url: Utils.getUrl(config.urls.blobs, id)}, function (err, res) {
if (err) {
callback (err, null);
} else {
callback (null, res);
}
});
},
/**
* Download file by UID. If the file is public then it's possible to download it without a session token (@link https://docsdev.quickblox.com/rest_api/Content_API.html#Download_file read more})
* @memberof QB.content
* @param {String} uid - The uid of file to declare as uploaded
* @param {downloadFileByUIDCallback} callback - The downloadFileByUIDCallback function
*/
getFile: function (uid, callback) {
/**
* Callback for QB.content.getFile(uid, callback)
* @callback downloadFileByUIDCallback
* @param {object} error - The error object
* @param {object} response - The file object
*/
this.service.ajax({url: Utils.getUrl(config.urls.blobs, uid)}, function (err, res) {
if (err) {
callback (err, null);
} else {
callback (null, res);
}
});
},
/**
* Edit a file by ID ({@link https://docsdev.quickblox.com/rest_api/Content_API.html#Download_file read more})
* @memberof QB.content
* @param {object} params - Object of parameters
* @param {number} params.id - The id of file to declare as uploaded
* @param {string} [params.name] - New file name
* @param {updateFileCallback} callback - The updateFileCallback function
*/
update: function (params, callback) {
/**
* Callback for QB.content.update(uid, callback)
* @callback updateFileCallback
* @param {object} error - The error object
* @param {object} response - The file object (blob-object-access)
*/
var data = {};
data.blob = {};
if (typeof params.name !== 'undefined') {
data.blob.name = params.name;
}
this.service.ajax({url: Utils.getUrl(config.urls.blobs, params.id), data: data}, function(err, res) {
if (err) {
callback (err, null);
} else {
callback (null, res);
}
});
},
/**
* Get private URL for file download by file_uid (blob_uid).
* @memberof QB.content
* @param {String} fileUID - The uid of file to declare as uploaded
*/
privateUrl: function (fileUID) {
return "https://" + config.endpoints.api + "/blobs/" + fileUID + "?token=" + this.service.getSession().token;
},
/**
* Get public URL for file download by file_uid (blob_uid).
* @memberof QB.content
* @param {String} fileUID - The uid of file to declare as uploaded
*/
publicUrl: function (fileUID) {
return "https://" + config.endpoints.api + "/blobs/" + fileUID;
}
};
module.exports = ContentProxy;
// parseUri 1.2.2
// (c) Steven Levithan <stevenlevithan.com>
// MIT License
// http://blog.stevenlevithan.com/archives/parseuri
function parseUri (str) {
var o = parseUri.options,
m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
uri = {},
i = 14;
while (i--) {uri[o.key[i]] = m[i] || "";}
uri[o.q.name] = {};
uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
if ($1) {uri[o.q.name][$1] = $2;}
});
return uri;
}
parseUri.options = {
strictMode: false,
key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
q: {
name: "queryKey",
parser: /(?:^|&)([^&=]*)=?([^&]*)/g
},
parser: {
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
}
};
;