1 var REST = library.REST.REST(); 2 3 function setLinks(theData) { 4 var aRemoveGroup = !!theData.removeGroup; 5 var aRemoveLinks = !!theData.removeLinks; 6 var aGroupId = theData.groupId; 7 8 var aGroup1 = theData.assetGroup1; 9 aGroup1 = Array.isArray(aGroup1) ? aGroup1 : [aGroup1]; 10 var aGroup2 = theData.assetGroup2; 11 aGroup2 = Array.isArray(aGroup2) ? aGroup2 : [aGroup2]; 12 13 var aGlobalDescription = theData.globalDescription; 14 var aDirectional = !theData.bidirectional; 15 for (var i in aGroup1) { 16 var aJSONLink = aGroup1[i]; 17 var anAssetToLink = getAssetFromJSONLink(aJSONLink); 18 if (!anAssetToLink) { 19 return; 20 } 21 for (var j in aGroup2) { 22 var aLinkGroup = null; 23 var aJSONLink2 = aGroup2[j]; 24 var aLink2Description = aJSONLink2.linkDescription; 25 aLink2Description = !aLink2Description ? "" : aLink2Description; 26 var aToLinkTo = getAssetFromJSONLink(aJSONLink2); 27 if (!aToLinkTo) { 28 return; 29 } 30 if (!aLinkGroup) { 31 //try to find a link group with the same name 32 aLinkGroup = getGroupWithMessage( 33 aToLinkTo, 34 aGlobalDescription, 35 aGroupId 36 ); 37 } 38 if (!aLinkGroup && !aRemoveLinks) { 39 //Make a new link group 40 var aLink = linkManager.createLink( 41 anAssetToLink, 42 aToLinkTo, 43 aDirectional, 44 aLink2Description, 45 aGlobalDescription 46 ); 47 aLinkGroup = aLink.groupId; 48 } else { 49 if (aRemoveLinks) { 50 var aJSLink = getJSLinkById(aToLinkTo, aLinkGroup); 51 if (!!aJSLink) { 52 linkManager.removeFromLinkGroup(anAssetToLink, aJSLink); 53 } 54 } else { 55 linkManager.addToLinkGroup( 56 anAssetToLink, 57 aToLinkTo, 58 aDirectional, 59 aLink2Description, 60 aLinkGroup 61 ); 62 } 63 } 64 REST.push(null, getLinks(aToLinkTo), true); 65 } 66 if (!aDirectional) { 67 REST.push(null, getLinks(anAssetToLink), true); 68 } 69 } 70 } 71 72 function getAssetFromJSONLink(theJSONLink) { 73 if (!theJSONLink || !theJSONLink.id) { 74 REST.pushError( 75 REST.errors.e400, 76 "Expecting an object with the properties 'id' and 'linkDescription' but got: " + 77 JSON.stringify(theJSONLink) 78 ); 79 return; 80 } 81 var anAsset = fileManager.getFileObjectById(theJSONLink.id); 82 if (!anAsset) { 83 REST.pushError( 84 REST.errors.e404, 85 "The file does not exist:" + theJSONLink.id 86 ); 87 return; 88 } 89 return anAsset; 90 } 91 92 function getGroupWithMessage(theAsset, theMessage, theIdIfExists) { 93 var aLinks = linkManager.getLinks(theAsset.assetId); 94 if (!aLinks) { 95 return null; 96 } 97 var aBestId = null; 98 for (var i in aLinks) { 99 var aDescription = aLinks[i].globalDescription; 100 if (!!aDescription && !aBestId && aDescription === theMessage) { 101 aBestId = aLinks[i].groupId 102 } 103 if (aLinks[i].groupId === theIdIfExists) { 104 aBestId = theIdIfExists; 105 } 106 } 107 return aBestId; 108 } 109 110 function getJSLinkById(theAsset, theGroupId) { 111 var aLinks = linkManager.getLinks(theAsset.assetId); 112 for (var i in aLinks) { 113 var aLink = aLinks[i]; 114 if (aLink.groupId == theGroupId) { 115 return aLink; 116 } 117 } 118 } 119 120 function getLinks(theAsset) { 121 var aLinks = linkManager.getLinks(theAsset.assetId); 122 var aLinksData = {}; 123 aLinksData.linkGroups = []; 124 125 for (var i in aLinks) { 126 var aLink = aLinks[i]; 127 var aLinkGroup = { 128 id: aLink.groupId, 129 globalDescription: aLink.globalDescription, 130 }; 131 aLinkGroup.links = []; 132 var aLinksInGroup = linkManager.getAssetsInLinkGroup(theAsset, aLink); 133 for (var j in aLinksInGroup) { 134 var aGroupLink = aLinksInGroup[j]; 135 var aLinkedAsset = REST.getInfo(aGroupLink, {}); 136 aLinkGroup.links[aLinkGroup.links.length] = { 137 linkDescription: aLink.description, 138 asset: aLinkedAsset, 139 }; 140 } 141 aLinksData.linkGroups[aLinksData.linkGroups.length] = aLinkGroup; 142 } 143 return REST.getInfo(theAsset, aLinksData); 144 } 145 146 /** 147 * @name SetLinks 148 * @class Creates asset links 149 * @description Creates asset link groups defined by a JSON object passed in the request 150 * @param [data] an array of objects 151 * <pre><code> 152 * [ 153 * { 154 * "assetGroup1": [{"id":201631649}, {"id":201631649}], 155 * "assetGroup2": [ 156 * { 157 * "id":201631708, 158 * "linkDescription": "test2" 159 * } 160 * ], 161 * "globalDescription":"test", 162 * "bidirectional":false //if true all of the assets in assetGroup1 will be linked to the assets in assetGroup2, otherwise assetGroup2 will just be linked to assetGroup1 163 * },... 164 * ] 165 * </code></pre> 166 * @param [verbose=false] Setting this to true will collect a variety of default values for each asset. 167 * @param [fields] An array of field id's to collect the values for each asset 168 * @returns [{assetInfo, "linkGroups": [links]}, ... ] 169 * 170 * @example /wf/restapi/v2/setLinks 171 * 172 * Properties: 173 * data=[ 174 * { 175 * "assetGroup1": [{"id":201631649}], 176 * "assetGroup2": [{"id":201631708, "linkDescription": "test2"}], 177 * "globalDescription":"test", 178 * "bidirectional":false 179 * } 180 * ] 181 * 182 * verbose=false 183 * 184 * Response: 185 [ 186 { 187 "linkGroups": [ 188 { 189 "id": "39D58F64-9C41-4FF9-8891-CF52EF3254A0", 190 "globalDescription": "test", 191 "links": [ 192 { 193 "linkDescription": "test2", 194 "asset": { 195 "id": 201631649 196 } 197 } 198 ] 199 } 200 ], 201 "id": 201631708 202 } 203 ] 204 205 * @example /wf/restapi/v2/setLinks 206 * 207 * Properties: 208 * data=[ 209 * { 210 * "assetGroup1": [{"id":201631649}], 211 * "assetGroup2": [{"id":201631708, "linkDescription": "test2"}], 212 * "globalDescription":"test", 213 * "bidirectional":true 214 * } 215 *] 216 * verbose=false 217 * 218 * Response: 219 [ 220 { 221 "linkGroups": [ 222 { 223 "id": "1F589B73-4099-4B28-8F10-B32DEE5B9CF7", 224 "globalDescription": null, 225 "links": [ 226 { 227 "linkDescription": null, 228 "asset": { 229 "id": 201632779 230 } 231 } 232 ] 233 }, 234 { 235 "id": "2AA2DB96-1F2E-416A-B291-751E51635792", 236 "globalDescription": "test", 237 "links": [ 238 { 239 "linkDescription": "test2", 240 "asset": { 241 "id": 201631649 242 } 243 } 244 ] 245 } 246 ], 247 "id": 201631708 248 }, 249 { 250 "linkGroups": [ 251 { 252 "id": "2AA2DB96-1F2E-416A-B291-751E51635792", 253 "globalDescription": "test", 254 "links": [ 255 { 256 "linkDescription": "test2", 257 "asset": { 258 "id": 201631708 259 } 260 } 261 ] 262 } 263 ], 264 "id": 201631649 265 } 266 ] 267 */ 268 (function main() { 269 REST.setCallback(setLinks); 270 return REST.execute("data"); 271 })(); 272