(function(window) { Gitana.Methods = {}; /** * Produces the common function to handle listAttachments() on various attachables within Gitana. * * @param [mapClass] map implementation class (if none provided, uses Gitana.BinaryAttachmentMap) * * @return {Function} */ Gitana.Methods.listAttachments = function(mapClass) { if (!mapClass) { mapClass = Gitana.BinaryAttachmentMap; } return function(local) { var self = this; var result = this.subchain(new mapClass(this)); if (!local) { // front-load some work that fetches from remote server result.then(function() { var chain = this; self.getDriver().gitanaGet(self.getUri() + "/attachments", null, {}, function(response) { chain.handleResponse(response); chain.next(); }); return false; }); } else { // try to populate the map from our cached values on the node (if they exist) var existingMap = self.getSystemMetadata()["attachments"]; if (existingMap) { // attachments that come off of system() don't have "attachmentId" on their json object // instead, the "attachmentId" is the key into the map. // so here, in terms of normalizing things, we copy "attachmentId" into the json object for (var key in existingMap) { var value = result[key]; value["attachmentId"] = key; } } //result.handleResponse(existingMap); } return result; }; }; /** * Produces the common function to handle attach() of attachments to an attachable within Gitana. * * @param [attachmentClass] attachment implementation class (if none provided, uses Gitana.BinaryAttachment) * @param [paramsFunction] optional population function for url params * * @return {Function} */ Gitana.Methods.attach = function(attachmentClass, paramsFunction) { if (!attachmentClass) { attachmentClass = Gitana.BinaryAttachment; } return function(attachmentId, contentType, data) { var self = this; if (!attachmentId) { attachmentId = "default"; } // the thing we're handing back var result = this.subchain(new attachmentClass(this)); // preload some work onto a subchain result.then(function() { // params var params = {}; if (paramsFunction) { paramsFunction(params); } // upload the attachment var uploadUri = self.getUri() + "/attachments/" + attachmentId; this.chainUpload(this, uploadUri, params, contentType, data).then(function() { // read back attachment information and plug onto result this.subchain(self).listAttachments().then(function() { // TODO: update attachment information on attachable.system() ? this.select(attachmentId).then(function() { result.handleResponse(this); }); }); }); }); return result; }; }; /** * Produces the common function to handle unattach() of attachments from an attachable within Gitana. * * @return {Function} */ Gitana.Methods.unattach = function() { return function(attachmentId) { return this.then(function() { this.chainDelete(this, this.getUri() + "/attachments/" + attachmentId).then(function() { // TODO }); }); }; }; Gitana.Methods.getPreviewUri = function(prefix) { if (!prefix) { prefix = "preview"; } return function(name, config) { var url = this.getDriver().baseURL + this.getUri() + "/" + prefix + "/" + name; if (config) { var first = true; for (var key in config) { if (first) { url += "?"; } else { url += "&"; } var value = config[key]; if (value) { url += key + "=" + value; } first = false; } } return url; }; }; Gitana.Methods.listInteractionObjects = function(factoryMapMethod, uriPath) { return function(pagination) { var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var chainable = this.getFactory()[factoryMapMethod](this); return this.chainGet(chainable, this.getUri() + "/" + uriPath, params); }; }; Gitana.Methods.readInteractionObject = function(factoryObjectMethod, uriPath) { return function(interactionObjectId) { var chainable = this.getFactory()[factoryObjectMethod](this); return this.chainGet(chainable, this.getUri() + "/" + uriPath + "/" + interactionObjectId); }; }; Gitana.Methods.queryInteractionObjects = function(factoryMapMethod, uriPath) { return function(query, pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/" + uriPath + "/query"; }; var chainable = this.getFactory()[factoryMapMethod](this); return this.chainPost(chainable, uriFunction, params, query); }; }; })(window);