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