@researchdatabox/redbox-core 0.0.1-beta.8936 → 0.0.1-beta.9020

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/IntegrationAuditParams.d.ts +11 -0
  2. package/dist/IntegrationAuditParams.d.ts.map +1 -0
  3. package/dist/IntegrationAuditParams.js +14 -0
  4. package/dist/RecordAuditParams.d.ts +2 -0
  5. package/dist/RecordAuditParams.d.ts.map +1 -1
  6. package/dist/RecordAuditParams.js +3 -1
  7. package/dist/RecordsService.d.ts +14 -0
  8. package/dist/RecordsService.d.ts.map +1 -1
  9. package/dist/StorageService.d.ts +3 -0
  10. package/dist/StorageService.d.ts.map +1 -1
  11. package/dist/config/agendaQueue.config.d.ts.map +1 -1
  12. package/dist/config/agendaQueue.config.js +10 -1
  13. package/dist/config/auth.config.d.ts.map +1 -1
  14. package/dist/config/auth.config.js +2 -1
  15. package/dist/config/brandingConfigurationDefaults.config.d.ts +3 -0
  16. package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
  17. package/dist/config/brandingConfigurationDefaults.config.js +154 -3
  18. package/dist/config/figshareDev.config.d.ts +12 -0
  19. package/dist/config/figshareDev.config.d.ts.map +1 -0
  20. package/dist/config/figshareDev.config.js +9 -0
  21. package/dist/config/index.d.ts +4 -16
  22. package/dist/config/index.d.ts.map +1 -1
  23. package/dist/config/index.js +4 -13
  24. package/dist/config/recordtype.config.d.ts.map +1 -1
  25. package/dist/config/recordtype.config.js +17 -1
  26. package/dist/config/routes.config.d.ts.map +1 -1
  27. package/dist/config/routes.config.js +47 -43
  28. package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
  29. package/dist/configmodels/AdminSidebarConfig.js +3 -2
  30. package/dist/configmodels/AuthorizedDomainsEmails.d.ts +48 -0
  31. package/dist/configmodels/AuthorizedDomainsEmails.d.ts.map +1 -1
  32. package/dist/configmodels/AuthorizedDomainsEmails.js +50 -2
  33. package/dist/configmodels/ConfigModels.d.ts +7 -1
  34. package/dist/configmodels/ConfigModels.d.ts.map +1 -1
  35. package/dist/configmodels/ConfigModels.js +25 -1
  36. package/dist/configmodels/DoiPublishing.d.ts +4711 -0
  37. package/dist/configmodels/DoiPublishing.d.ts.map +1 -0
  38. package/dist/configmodels/DoiPublishing.js +639 -0
  39. package/dist/configmodels/FigsharePublishing.d.ts +1376 -0
  40. package/dist/configmodels/FigsharePublishing.d.ts.map +1 -0
  41. package/dist/configmodels/FigsharePublishing.js +630 -0
  42. package/dist/configmodels/SystemMessage.d.ts +32 -0
  43. package/dist/configmodels/SystemMessage.d.ts.map +1 -1
  44. package/dist/configmodels/SystemMessage.js +34 -2
  45. package/dist/controllers/AppConfigController.js +3 -3
  46. package/dist/controllers/FormVocabularyController.d.ts.map +1 -1
  47. package/dist/controllers/FormVocabularyController.js +4 -1
  48. package/dist/controllers/RecordAuditController.d.ts +29 -14
  49. package/dist/controllers/RecordAuditController.d.ts.map +1 -1
  50. package/dist/controllers/RecordAuditController.js +455 -57
  51. package/dist/controllers/RecordController.d.ts +1 -16
  52. package/dist/controllers/RecordController.d.ts.map +1 -1
  53. package/dist/controllers/RecordController.js +20 -39
  54. package/dist/controllers/index.d.ts.map +1 -1
  55. package/dist/controllers/index.js +4 -1
  56. package/dist/controllers/webservice/AppConfigController.js +3 -3
  57. package/dist/controllers/webservice/IntegrationAuditController.d.ts +10 -0
  58. package/dist/controllers/webservice/IntegrationAuditController.d.ts.map +1 -0
  59. package/dist/controllers/webservice/IntegrationAuditController.js +98 -0
  60. package/dist/form-config/default-1.0-draft.d.ts.map +1 -1
  61. package/dist/form-config/default-1.0-draft.js +26 -2
  62. package/dist/form-config/index.d.ts.map +1 -1
  63. package/dist/form-config/index.js +1 -1
  64. package/dist/index.d.ts +4 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +12 -2
  67. package/dist/model/storage/IntegrationAuditModel.d.ts +47 -0
  68. package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -0
  69. package/dist/model/storage/IntegrationAuditModel.js +104 -0
  70. package/dist/model/storage/index.d.ts +1 -0
  71. package/dist/model/storage/index.d.ts.map +1 -1
  72. package/dist/model/storage/index.js +7 -2
  73. package/dist/services/AppConfigService.d.ts +20 -2
  74. package/dist/services/AppConfigService.d.ts.map +1 -1
  75. package/dist/services/AppConfigService.js +129 -15
  76. package/dist/services/DoiService.d.ts +19 -25
  77. package/dist/services/DoiService.d.ts.map +1 -1
  78. package/dist/services/DoiService.js +258 -408
  79. package/dist/services/FigshareService.d.ts +35 -65
  80. package/dist/services/FigshareService.d.ts.map +1 -1
  81. package/dist/services/FigshareService.js +477 -2056
  82. package/dist/services/FormRecordConsistencyService.d.ts.map +1 -1
  83. package/dist/services/FormRecordConsistencyService.js +4 -2
  84. package/dist/services/FormsService.d.ts.map +1 -1
  85. package/dist/services/FormsService.js +4 -2
  86. package/dist/services/IntegrationAuditService.d.ts +100 -0
  87. package/dist/services/IntegrationAuditService.d.ts.map +1 -0
  88. package/dist/services/IntegrationAuditService.js +561 -0
  89. package/dist/services/RecordsService.d.ts +16 -0
  90. package/dist/services/RecordsService.d.ts.map +1 -1
  91. package/dist/services/RecordsService.js +54 -2
  92. package/dist/services/SolrSearchService.d.ts +1 -0
  93. package/dist/services/SolrSearchService.d.ts.map +1 -1
  94. package/dist/services/SolrSearchService.js +14 -3
  95. package/dist/services/VocabularyService.d.ts +1 -0
  96. package/dist/services/VocabularyService.d.ts.map +1 -1
  97. package/dist/services/VocabularyService.js +4 -1
  98. package/dist/services/doi-v2/audit.d.ts +7 -0
  99. package/dist/services/doi-v2/audit.d.ts.map +1 -0
  100. package/dist/services/doi-v2/audit.js +30 -0
  101. package/dist/services/doi-v2/bindings.d.ts +8 -0
  102. package/dist/services/doi-v2/bindings.d.ts.map +1 -0
  103. package/dist/services/doi-v2/bindings.js +85 -0
  104. package/dist/services/doi-v2/config.d.ts +7 -0
  105. package/dist/services/doi-v2/config.d.ts.map +1 -0
  106. package/dist/services/doi-v2/config.js +51 -0
  107. package/dist/services/doi-v2/context.d.ts +18 -0
  108. package/dist/services/doi-v2/context.d.ts.map +1 -0
  109. package/dist/services/doi-v2/context.js +41 -0
  110. package/dist/services/doi-v2/http.d.ts +21 -0
  111. package/dist/services/doi-v2/http.d.ts.map +1 -0
  112. package/dist/services/doi-v2/http.js +88 -0
  113. package/dist/services/doi-v2/payload.d.ts +4 -0
  114. package/dist/services/doi-v2/payload.d.ts.map +1 -0
  115. package/dist/services/doi-v2/payload.js +291 -0
  116. package/dist/services/doi-v2/profiles.d.ts +5 -0
  117. package/dist/services/doi-v2/profiles.d.ts.map +1 -0
  118. package/dist/services/doi-v2/profiles.js +31 -0
  119. package/dist/services/doi-v2/runtime.d.ts +16 -0
  120. package/dist/services/doi-v2/runtime.d.ts.map +1 -0
  121. package/dist/services/doi-v2/runtime.js +173 -0
  122. package/dist/services/doi-v2/types.d.ts +49 -0
  123. package/dist/services/doi-v2/types.d.ts.map +1 -0
  124. package/dist/services/doi-v2/types.js +3 -0
  125. package/dist/services/figshare-v2/assets.d.ts +5 -0
  126. package/dist/services/figshare-v2/assets.d.ts.map +1 -0
  127. package/dist/services/figshare-v2/assets.js +297 -0
  128. package/dist/services/figshare-v2/bindings.d.ts +6 -0
  129. package/dist/services/figshare-v2/bindings.d.ts.map +1 -0
  130. package/dist/services/figshare-v2/bindings.js +60 -0
  131. package/dist/services/figshare-v2/config.d.ts +13 -0
  132. package/dist/services/figshare-v2/config.d.ts.map +1 -0
  133. package/dist/services/figshare-v2/config.js +81 -0
  134. package/dist/services/figshare-v2/context.d.ts +4 -0
  135. package/dist/services/figshare-v2/context.d.ts.map +1 -0
  136. package/dist/services/figshare-v2/context.js +20 -0
  137. package/dist/services/figshare-v2/embargo.d.ts +5 -0
  138. package/dist/services/figshare-v2/embargo.d.ts.map +1 -0
  139. package/dist/services/figshare-v2/embargo.js +36 -0
  140. package/dist/services/figshare-v2/http.d.ts +25 -0
  141. package/dist/services/figshare-v2/http.d.ts.map +1 -0
  142. package/dist/services/figshare-v2/http.js +270 -0
  143. package/dist/services/figshare-v2/metadata.d.ts +6 -0
  144. package/dist/services/figshare-v2/metadata.d.ts.map +1 -0
  145. package/dist/services/figshare-v2/metadata.js +221 -0
  146. package/dist/services/figshare-v2/observability.d.ts +7 -0
  147. package/dist/services/figshare-v2/observability.d.ts.map +1 -0
  148. package/dist/services/figshare-v2/observability.js +85 -0
  149. package/dist/services/figshare-v2/plan.d.ts +5 -0
  150. package/dist/services/figshare-v2/plan.d.ts.map +1 -0
  151. package/dist/services/figshare-v2/plan.js +51 -0
  152. package/dist/services/figshare-v2/publish.d.ts +5 -0
  153. package/dist/services/figshare-v2/publish.d.ts.map +1 -0
  154. package/dist/services/figshare-v2/publish.js +20 -0
  155. package/dist/services/figshare-v2/queue.d.ts +4 -0
  156. package/dist/services/figshare-v2/queue.d.ts.map +1 -0
  157. package/dist/services/figshare-v2/queue.js +11 -0
  158. package/dist/services/figshare-v2/runtime.d.ts +11 -0
  159. package/dist/services/figshare-v2/runtime.d.ts.map +1 -0
  160. package/dist/services/figshare-v2/runtime.js +116 -0
  161. package/dist/services/figshare-v2/types.d.ts +194 -0
  162. package/dist/services/figshare-v2/types.d.ts.map +1 -0
  163. package/dist/services/figshare-v2/types.js +37 -0
  164. package/dist/services/figshare-v2/workflow.d.ts +3 -0
  165. package/dist/services/figshare-v2/workflow.d.ts.map +1 -0
  166. package/dist/services/figshare-v2/workflow.js +7 -0
  167. package/dist/services/figshare-v2/writeback.d.ts +5 -0
  168. package/dist/services/figshare-v2/writeback.d.ts.map +1 -0
  169. package/dist/services/figshare-v2/writeback.js +45 -0
  170. package/dist/services/index.d.ts +3 -0
  171. package/dist/services/index.d.ts.map +1 -1
  172. package/dist/services/index.js +7 -2
  173. package/dist/visitor/client.visitor.d.ts +3 -0
  174. package/dist/visitor/client.visitor.d.ts.map +1 -1
  175. package/dist/visitor/client.visitor.js +8 -1
  176. package/dist/visitor/construct.visitor.d.ts +3 -0
  177. package/dist/visitor/construct.visitor.d.ts.map +1 -1
  178. package/dist/visitor/construct.visitor.js +95 -70
  179. package/dist/visitor/data-value.visitor.d.ts +3 -0
  180. package/dist/visitor/data-value.visitor.d.ts.map +1 -1
  181. package/dist/visitor/data-value.visitor.js +5 -1
  182. package/dist/visitor/json-type-def.visitor.d.ts +3 -0
  183. package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
  184. package/dist/visitor/json-type-def.visitor.js +5 -1
  185. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +3 -0
  186. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
  187. package/dist/visitor/migrate-config-v4-v5.visitor.js +77 -64
  188. package/dist/visitor/template.visitor.d.ts +3 -0
  189. package/dist/visitor/template.visitor.d.ts.map +1 -1
  190. package/dist/visitor/template.visitor.js +5 -1
  191. package/dist/visitor/validator.visitor.d.ts +3 -1
  192. package/dist/visitor/validator.visitor.d.ts.map +1 -1
  193. package/dist/visitor/validator.visitor.js +6 -1
  194. package/dist/visitor/vocab-inline.visitor.d.ts +16 -1
  195. package/dist/visitor/vocab-inline.visitor.d.ts.map +1 -1
  196. package/dist/visitor/vocab-inline.visitor.js +109 -14
  197. package/package.json +25 -20
  198. package/dist/config/datacite.config.d.ts +0 -51
  199. package/dist/config/datacite.config.d.ts.map +0 -1
  200. package/dist/config/datacite.config.js +0 -44
  201. package/dist/config/figshareAPI.config.d.ts +0 -116
  202. package/dist/config/figshareAPI.config.d.ts.map +0 -1
  203. package/dist/config/figshareAPI.config.js +0 -857
  204. package/dist/config/figshareAPIEnv.config.d.ts +0 -11
  205. package/dist/config/figshareAPIEnv.config.d.ts.map +0 -1
  206. package/dist/config/figshareAPIEnv.config.js +0 -13
  207. package/dist/config/figshareRedboxFORMapping.config.d.ts +0 -15
  208. package/dist/config/figshareRedboxFORMapping.config.d.ts.map +0 -1
  209. package/dist/config/figshareRedboxFORMapping.config.js +0 -7458
@@ -1,42 +1,25 @@
1
1
  "use strict";
2
- // Copyright (c) 2017 Queensland Cyber Infrastructure Foundation (http://www.qcif.edu.au/)
3
- //
4
- // GNU GENERAL PUBLIC LICENSE
5
- // Version 2, June 1991
6
- //
7
- // This program is free software; you can redistribute it and/or modify
8
- // it under the terms of the GNU General Public License as published by
9
- // the Free Software Foundation; either version 2 of the License, or
10
- // (at your option) any later version.
11
- //
12
- // This program is distributed in the hope that it will be useful,
13
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- // GNU General Public License for more details.
16
- //
17
- // You should have received a copy of the GNU General Public License along
18
- // with this program; if not, write to the Free Software Foundation, Inc.,
19
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
2
  Object.defineProperty(exports, "__esModule", { value: true });
21
3
  exports.Services = void 0;
22
4
  const CoreService_1 = require("../CoreService");
5
+ const config_1 = require("./figshare-v2/config");
6
+ const context_1 = require("./figshare-v2/context");
7
+ const plan_1 = require("./figshare-v2/plan");
8
+ const bindings_1 = require("./figshare-v2/bindings");
9
+ const assets_1 = require("./figshare-v2/assets");
10
+ const embargo_1 = require("./figshare-v2/embargo");
11
+ const publish_1 = require("./figshare-v2/publish");
12
+ const writeback_1 = require("./figshare-v2/writeback");
13
+ const metadata_1 = require("./figshare-v2/metadata");
14
+ const queue_1 = require("./figshare-v2/queue");
15
+ const workflow_1 = require("./figshare-v2/workflow");
16
+ const http_1 = require("./figshare-v2/http");
23
17
  const RBValidationError_1 = require("../model/RBValidationError");
24
- const FigshareArticleCreate_1 = require("../model/api/FigshareArticleCreate");
25
- const FigshareArticleUpdate_1 = require("../model/api/FigshareArticleUpdate");
26
- const FigshareArticleEmbargo_1 = require("../model/api/FigshareArticleEmbargo");
27
- const momentShim_1 = require("../shims/momentShim");
28
- const axios = require('axios');
29
- const _ = require('lodash');
30
- const fs = require('fs');
31
- const checkDiskSpace = require('check-disk-space').default;
32
- const DEFAULT_RETRY_STATUS_CODES = [408, 429, 500, 502, 503, 504];
33
- let figshareLicenseCache = null;
34
- let figshareLicensePromise = null;
18
+ const IntegrationAuditModel_1 = require("../model/storage/IntegrationAuditModel");
19
+ const types_1 = require("./figshare-v2/types");
35
20
  var Services;
36
21
  (function (Services) {
37
22
  class FigshareService extends CoreService_1.Services.Core.Service {
38
- datastreamService;
39
- queueService;
40
23
  _exportedMethods = [
41
24
  'createUpdateFigshareArticle',
42
25
  'uploadFilesToFigshareArticle',
@@ -46,2148 +29,586 @@ var Services;
46
29
  'queueDeleteFiles',
47
30
  'queuePublishAfterUploadFiles',
48
31
  'transitionRecordWorkflowFromFigshareArticlePropertiesJob',
32
+ 'preparePublication',
33
+ 'syncMetadata',
34
+ 'syncAssets',
35
+ 'syncEmbargo',
36
+ 'publishIfNeeded',
37
+ 'writeBack',
38
+ 'syncRecordWithFigshare',
49
39
  'init',
50
40
  ];
51
- constructor() {
52
- //Better not use 'this.createUpdateFigshareArticleLogLevel' in the constructor as it may not be available for certain events.
53
- //There is no harm to use error log level to ensure minimal logging is always printed because services are singletons therefore
54
- //it's printed only once and it's critical to have logs to ensure this service has loaded correctly during development face until
55
- //it reaches a certain level of stability/maturity. Then it can be changed to verbose
56
- super();
57
- }
58
- init() {
59
- const that = this;
60
- this.registerSailsHook('on', 'ready', function () {
61
- const datastreamServiceName = sails.config.record.datastreamService;
62
- const queueServiceName = sails.config.queue.serviceName;
63
- sails.log.verbose(`FigshareTrigger ready, using datastream service: ${datastreamServiceName}`);
64
- if (datastreamServiceName != undefined) {
65
- that.datastreamService = sails.services[datastreamServiceName];
66
- }
67
- sails.log.verbose(`FigshareTrigger ready, using queue service: ${queueServiceName}`);
68
- if (queueServiceName != undefined) {
69
- that.queueService = sails.services[queueServiceName];
70
- }
71
- });
72
- this.registerSailsHook('on', 'lifted', function () {
73
- const runtimeConfig = that.getRuntimeConfig();
74
- if (that.isFigshareAPIEnabled(runtimeConfig)) {
75
- sails.log.verbose('FigService - constructor start');
76
- that.getFigPrivateLicenses(runtimeConfig)
77
- .then(function () {
78
- sails.log.verbose('FigService - SUCCESSFULY LOADED LICENSES');
79
- })
80
- .catch(function (error) {
81
- sails.log.error('FigService - ERROR LOADING LICENSES');
82
- sails.log.error(error);
83
- });
84
- sails.log.verbose('FigService - constructor end');
85
- }
41
+ startIntegrationAudit(record, action, details) {
42
+ const oid = String(record.redboxOid ?? record.id ?? '');
43
+ return IntegrationAuditService.startAudit(oid, action, {
44
+ brandId: record.metaMetadata?.brandId,
45
+ triggeredBy: details.triggerSource,
46
+ requestSummary: details,
86
47
  });
87
48
  }
88
- getRuntimeConfig() {
89
- const figshareConfig = sails.config.figshareAPI || {};
90
- const overrideArtifacts = _.get(sails.config, 'figshareAPIEnv.overrideArtifacts', {});
91
- const baseMapping = figshareConfig.mapping || {};
92
- const overrideMapping = _.get(overrideArtifacts, 'mapping', {});
93
- const mapping = _.mergeWith({}, baseMapping, overrideMapping, (_objValue, srcValue) => {
94
- if (_.isArray(srcValue)) {
95
- return srcValue;
96
- }
97
- return undefined;
98
- });
99
- const mappingArtifacts = _.get(overrideMapping, 'artifacts', _.get(baseMapping, 'artifacts', {}));
100
- const figArticleURLPathInRecordList = _.isArray(mapping.recordFigArticleURL)
101
- ? mapping.recordFigArticleURL
102
- : _.isEmpty(mapping.recordFigArticleURL)
103
- ? []
104
- : [mapping.recordFigArticleURL];
105
- const figshareItemGroupId = _.toNumber(_.get(overrideArtifacts, 'mapping.figshareItemGroupId', mapping.figshareItemGroupId));
106
- const figshareItemType = _.get(overrideArtifacts, 'mapping.figshareItemType', mapping.figshareItemType);
107
- return {
108
- apiToken: _.get(overrideArtifacts, 'APIToken', figshareConfig.APIToken) || '',
109
- baseURL: _.get(overrideArtifacts, 'baseURL', figshareConfig.baseURL) || '',
110
- frontEndURL: _.get(overrideArtifacts, 'frontEndURL', figshareConfig.frontEndURL) || '',
111
- logLevel: _.get(sails.config, 'record.createUpdateFigshareArticleLogLevel', 'verbose'),
112
- extraVerboseLogging: !!figshareConfig.extraVerboseLogging,
113
- mappingArtifacts: (_.isPlainObject(mappingArtifacts) ? mappingArtifacts : {}),
114
- mapping: (_.isPlainObject(mapping) ? mapping : {}),
115
- forCodesMapping: (_.isArray(_.get(sails.config, 'figshareReDBoxFORMapping.FORMapping', []))
116
- ? _.get(sails.config, 'figshareReDBoxFORMapping.FORMapping', [])
117
- : []),
118
- figArticleIdPathInRecord: mapping.recordFigArticleId || '',
119
- figArticleURLPathInRecordList: figArticleURLPathInRecordList,
120
- dataLocationsPathInRecord: mapping.recordDataLocations || '',
121
- entityIdFAR: _.get(mapping, 'response.entityId', ''),
122
- locationFAR: _.get(mapping, 'response.location', ''),
123
- curationStatusFA: mapping.figshareCurationStatus || '',
124
- curationStatusTargetValueFA: mapping.figshareCurationStatusTargetValue || 'public',
125
- disableUpdateByCurationStatusFA: !!mapping.figshareDisableUpdateByCurationStatus,
126
- figNeedsPublishAfterFileUpload: !!mapping.figshareNeedsPublishAfterFileUpload,
127
- recordAuthorExternalName: mapping.recordAuthorExternalName || '',
128
- recordAuthorUniqueBy: mapping.recordAuthorUniqueBy || '',
129
- figshareItemGroupId: Number.isFinite(figshareItemGroupId) ? figshareItemGroupId : 0,
130
- figshareItemType: typeof figshareItemType === 'string' ? figshareItemType : ''
131
- };
132
- }
133
- isFigshareAPIEnabled(config) {
134
- return !_.isEmpty(config.apiToken) && !_.isEmpty(config.baseURL) && !_.isEmpty(config.frontEndURL);
135
- }
136
- getAxiosConfig(config, method, urlSectionPattern, requestBody) {
137
- const figshareBaseUrl = config.baseURL + urlSectionPattern;
138
- const figAccessToken = 'token ' + config.apiToken;
139
- const figHeaders = {
140
- 'Content-Type': 'application/json',
141
- 'Authorization': figAccessToken
142
- };
143
- const axiosConfig = {
144
- method: method,
145
- url: figshareBaseUrl,
146
- headers: figHeaders,
147
- data: requestBody
148
- };
149
- if (method == 'get') {
150
- delete axiosConfig.data;
151
- }
152
- else if (method == 'put' || method == 'post' || method == 'delete') {
153
- // no-op
154
- }
155
- else {
156
- this.logWithLevel(config.logLevel, 'Invalid API method ' + method);
157
- this.logWithLevel(config.logLevel, 'urlSectionPattern ' + urlSectionPattern);
158
- this.logWithLevel(config.logLevel, requestBody);
159
- }
160
- return axiosConfig;
161
- }
162
- logWithLevel(logLevel, ...args) {
163
- const logger = sails.log[logLevel] || sails.log.info;
164
- logger(...args);
165
- }
166
- logVerbose(config, ...args) {
167
- if (config.extraVerboseLogging) {
168
- this.logWithLevel(config.logLevel, ...args);
169
- }
170
- }
171
- getRetryConfig(override = {}) {
172
- const configured = _.get(sails.config, 'figshareAPI.retry', {});
173
- const configOverride = _.isObject(configured) ? configured : {};
174
- const maxAttempts = _.toNumber(override.maxAttempts ?? configOverride.maxAttempts ?? 3);
175
- const baseDelayMs = _.toNumber(override.baseDelayMs ?? configOverride.baseDelayMs ?? 500);
176
- const maxDelayMs = _.toNumber(override.maxDelayMs ?? configOverride.maxDelayMs ?? 4000);
177
- const retryOnStatusCodes = _.isArray(override.retryOnStatusCodes)
178
- ? override.retryOnStatusCodes
179
- : _.isArray(configOverride.retryOnStatusCodes)
180
- ? configOverride.retryOnStatusCodes
181
- : DEFAULT_RETRY_STATUS_CODES;
182
- const retryOnMethods = _.isArray(override.retryOnMethods)
183
- ? override.retryOnMethods
184
- : _.isArray(configOverride.retryOnMethods)
185
- ? configOverride.retryOnMethods
186
- : ['get', 'put', 'delete'];
187
- return {
188
- maxAttempts: Math.max(1, maxAttempts),
189
- baseDelayMs: Math.max(0, baseDelayMs),
190
- maxDelayMs: Math.max(baseDelayMs, maxDelayMs),
191
- retryOnStatusCodes: retryOnStatusCodes,
192
- retryOnMethods: retryOnMethods.map((method) => method.toLowerCase())
193
- };
194
- }
195
- shouldRetryRequest(error, axiosConfig, retryConfig) {
196
- const method = _.get(axiosConfig, 'method', 'get').toLowerCase();
197
- if (!retryConfig.retryOnMethods.includes(method)) {
198
- return false;
199
- }
200
- const status = _.get(error, 'response.status');
201
- if (!status) {
202
- return true;
203
- }
204
- return retryConfig.retryOnStatusCodes.includes(status);
205
- }
206
- redactAxiosConfig(axiosConfig) {
207
- if (!axiosConfig || !axiosConfig.headers) {
208
- return axiosConfig;
209
- }
210
- return {
211
- ...axiosConfig,
212
- headers: {
213
- ...axiosConfig.headers,
214
- Authorization: axiosConfig.headers.Authorization ? 'REDACTED' : undefined
215
- }
216
- };
217
- }
218
- describeAxiosError(error) {
219
- const status = _.get(error, 'response.status');
220
- const statusText = _.get(error, 'response.statusText');
221
- const message = _.get(error, 'message');
222
- const responseMessage = _.get(error, 'response.data.message');
223
- return [status, statusText, responseMessage, message].filter(Boolean).join(' - ');
224
- }
225
- async sleep(delayMs) {
226
- await new Promise((resolve) => setTimeout(resolve, delayMs));
227
- }
228
- async requestWithRetry(config, axiosConfig, options = {}) {
229
- const retryConfig = this.getRetryConfig(options.retry);
230
- const label = options.label || `${(axiosConfig?.method || 'get').toUpperCase()} ${axiosConfig?.url || ''}`.trim();
231
- for (let attempt = 1; attempt <= retryConfig.maxAttempts; attempt++) {
232
- try {
233
- if (config.extraVerboseLogging) {
234
- this.logWithLevel(config.logLevel, `FigService - request ${label} attempt ${attempt}`, this.redactAxiosConfig(axiosConfig));
235
- }
236
- const response = await axios(axiosConfig);
237
- if (options.logResponse) {
238
- this.logWithLevel(config.logLevel, `FigService - response ${label} status ${response.status} ${response.statusText}`);
239
- }
240
- return response;
241
- }
242
- catch (error) {
243
- const retryable = this.shouldRetryRequest(error, axiosConfig, retryConfig);
244
- const status = _.get(error, 'response.status');
245
- this.logWithLevel('warn', `FigService - request ${label} failed (attempt ${attempt}/${retryConfig.maxAttempts}) status ${status || 'no-response'}`);
246
- if (!retryable || attempt === retryConfig.maxAttempts) {
247
- this.logWithLevel('error', `FigService - request ${label} failed permanently: ${this.describeAxiosError(error)}`);
248
- throw error;
249
- }
250
- const delay = Math.min(retryConfig.maxDelayMs, retryConfig.baseDelayMs * Math.pow(2, attempt - 1));
251
- const jitter = Math.floor(Math.random() * Math.min(250, retryConfig.baseDelayMs));
252
- await this.sleep(delay + jitter);
253
- }
254
- }
255
- throw new Error(`FigService - request ${label} failed after retries`);
256
- }
257
- getValueFromObject(config, field, pathOrTemplate) {
258
- const fieldObj = (_.isPlainObject(field) ? field : {});
259
- const template = String(pathOrTemplate ?? '');
260
- let value;
261
- if (template.indexOf('<%') != -1) {
262
- const context = {
263
- moment: momentShim_1.momentShim,
264
- field: fieldObj,
265
- artifacts: config.mappingArtifacts
266
- };
267
- value = _.template(template)(context);
268
- this.logVerbose(config, `FigService ---- getValueFromObject ---- ${JSON.stringify(fieldObj)}`);
269
- }
270
- else {
271
- value = _.get(fieldObj, template);
272
- }
273
- return value;
274
- }
275
- getValueFromRecord(config, record, pathOrTemplate) {
276
- const recordObj = (_.isPlainObject(record) ? record : {});
277
- const template = String(pathOrTemplate ?? '');
278
- let value;
279
- if (template.indexOf('<%') != -1) {
280
- const context = {
281
- moment: momentShim_1.momentShim,
282
- record: recordObj,
283
- artifacts: config.mappingArtifacts
284
- };
285
- value = _.template(template)(context);
286
- if (config.extraVerboseLogging) {
287
- if (_.isObject(value)) {
288
- this.logWithLevel(config.logLevel, `FigService ---- getValueFromRecord ---- ${JSON.stringify(value)}`);
289
- }
290
- else {
291
- this.logWithLevel(config.logLevel, `FigService ---- getValueFromRecord ---- ${value}`);
292
- }
293
- }
294
- }
295
- else {
296
- value = _.get(recordObj, template);
297
- }
298
- return value;
299
- }
300
- setFieldInRecord(config, record, article, field) {
301
- let value = '';
302
- const template = field.template ?? '';
303
- const runByNameOnly = !!field.runByNameOnly;
304
- const unset = !!field.unset;
305
- const unsetBeforeSet = !!field.unsetBeforeSet;
306
- const figName = typeof field.figName === 'string' ? field.figName : '';
307
- const rbName = typeof field.rbName === 'string' ? field.rbName : '';
308
- if (unset) {
309
- if (figName) {
310
- _.unset(record, figName);
311
- }
312
- }
313
- else if (!runByNameOnly) {
314
- if (template.indexOf('<%') != -1) {
315
- const context = {
316
- record: record,
317
- article: article,
318
- moment: momentShim_1.momentShim,
319
- field: field,
320
- artifacts: config.mappingArtifacts
321
- };
322
- value = _.template(template)(context);
323
- if (config.extraVerboseLogging) {
324
- if (_.isObject(value)) {
325
- this.logWithLevel(config.logLevel, `FigService ---- setFieldInRecord ---- ${figName} ---- template ---- ${JSON.stringify(value)}`);
326
- }
327
- else {
328
- this.logWithLevel(config.logLevel, `FigService ---- setFieldInRecord ---- ${figName} ---- template ---- ${value}`);
329
- }
330
- }
331
- }
332
- else {
333
- const orignalValue = rbName ? _.get(record, rbName) : undefined;
334
- if (config.extraVerboseLogging) {
335
- this.logWithLevel(config.logLevel, `FigService ---- setFieldInRecord ---- ${rbName} ---- orignalValue ---- ${orignalValue}`);
336
- }
337
- value = figName ? _.get(article, figName, orignalValue) : orignalValue;
338
- if (config.extraVerboseLogging) {
339
- this.logWithLevel(config.logLevel, `FigService ---- setFieldInRecord ---- ${figName} ---- value ---- ${value}`);
340
- }
341
- }
342
- if (unsetBeforeSet) {
343
- if (rbName) {
344
- _.unset(record, rbName);
345
- }
346
- }
347
- if (config.extraVerboseLogging) {
348
- this.logWithLevel(config.logLevel, `FigService ---- setFieldInRecord ---- ${rbName} ---- value ---- ${value}`);
349
- }
350
- if (rbName) {
351
- _.set(record, rbName, value);
352
- }
49
+ completeIntegrationAudit(ctx, details) {
50
+ IntegrationAuditService.completeAudit(ctx, details);
51
+ }
52
+ failIntegrationAudit(ctx, error, details) {
53
+ IntegrationAuditService.failAudit(ctx, error, details);
54
+ }
55
+ assertConfig(record, operation) {
56
+ const config = this.getConfig(record);
57
+ if (config == null) {
58
+ throw new Error(`Figshare config is not enabled for operation '${operation}'`);
59
+ }
60
+ return config;
61
+ }
62
+ getConfig(record) {
63
+ return (0, config_1.resolveFigsharePublishingConfig)(record);
64
+ }
65
+ getSyncState(config, record) {
66
+ return (0, config_1.getSyncState)(config, record);
67
+ }
68
+ setSyncState(config, record, syncState) {
69
+ (0, config_1.setSyncState)(config, record, syncState);
70
+ }
71
+ validateHandlebarsTemplate(template) {
72
+ (0, bindings_1.validateHandlebarsTemplate)(template);
73
+ }
74
+ async buildMetadataPayload(config, record) {
75
+ return (0, metadata_1.buildMetadataPayload)(config, record, this.makeClient(config, record, undefined, 'buildMetadataPayload'));
76
+ }
77
+ makeClient(config, record, jobId, triggerSource = 'manual') {
78
+ const runContext = (0, context_1.createRunContext)(record, config, jobId, triggerSource);
79
+ return config.runtime.mode === 'fixture' ? (0, http_1.makeFixtureClient)(config) : (0, http_1.makeLiveClient)(config, runContext);
80
+ }
81
+ preparePublication(record, jobId) {
82
+ const config = this.getConfig(record);
83
+ const rm = record;
84
+ if (config == null) {
85
+ return { action: 'skip', sameJob: false, syncState: { status: 'idle' } };
86
+ }
87
+ const runContext = (0, context_1.createRunContext)(record, config, jobId);
88
+ const existingState = this.getSyncState(config, rm);
89
+ return (0, plan_1.preparePublication)(config, rm, existingState, runContext.correlationId);
90
+ }
91
+ async syncMetadata(record, plan) {
92
+ const config = this.assertConfig(record, 'syncMetadata');
93
+ const rm = record;
94
+ const publicationPlan = plan ?? this.preparePublication(rm);
95
+ const articleId = publicationPlan.articleId;
96
+ if (articleId) {
97
+ const currentArticle = await this.makeClient(config, rm, publicationPlan.syncState.correlationId, 'syncMetadata').getArticle(articleId);
98
+ if (this.isCurationLocked(rm, currentArticle)) {
99
+ return currentArticle;
100
+ }
101
+ await this.ensureNoFileUploadInProgress(config, rm, articleId);
102
+ }
103
+ const client = this.makeClient(config, rm, publicationPlan.syncState.correlationId, 'syncMetadata');
104
+ return (0, metadata_1.syncMetadataPhase)(client, config, rm, publicationPlan);
105
+ }
106
+ async syncAssets(record, article) {
107
+ const config = this.assertConfig(record, 'syncAssets');
108
+ const rm = record;
109
+ const syncState = this.getSyncState(config, rm);
110
+ const client = this.makeClient(config, rm, syncState.correlationId, 'syncAssets');
111
+ return (0, assets_1.syncAssetsPhase)(client, config, rm, article, syncState);
112
+ }
113
+ async syncEmbargo(record, articleId) {
114
+ const config = this.assertConfig(record, 'syncEmbargo');
115
+ const rm = record;
116
+ const client = this.makeClient(config, rm, undefined, 'syncEmbargo');
117
+ return (0, embargo_1.syncEmbargoPhase)(client, config, rm, articleId);
118
+ }
119
+ async publishIfNeeded(record, articleId) {
120
+ const config = this.assertConfig(record, 'publishIfNeeded');
121
+ const rm = record;
122
+ const client = this.makeClient(config, rm, undefined, 'publishIfNeeded');
123
+ return (0, publish_1.publishIfNeededPhase)(client, config, rm, articleId, this.getSyncState(config, rm));
124
+ }
125
+ writeBack(record, article, publishResult, assetSyncResult) {
126
+ const config = this.getConfig(record);
127
+ if (config == null) {
128
+ return record;
353
129
  }
130
+ return (0, writeback_1.writeBackPhase)(config, record, article, publishResult, assetSyncResult);
354
131
  }
355
- setStandardFieldInRequestBody(config, record, requestBody, standardField) {
356
- let value = '';
357
- const template = standardField.template ?? '';
358
- const runByNameOnly = !!standardField.runByNameOnly;
359
- const unset = !!standardField.unset;
360
- const unsetBeforeSet = !!standardField.unsetBeforeSet;
361
- const figName = typeof standardField.figName === 'string' ? standardField.figName : '';
362
- const rbName = typeof standardField.rbName === 'string' ? standardField.rbName : '';
363
- if (unset) {
364
- if (figName) {
365
- _.unset(requestBody, figName);
366
- }
367
- }
368
- else if (!runByNameOnly) {
369
- if (template.indexOf('<%') != -1) {
370
- const context = {
371
- record: record,
372
- moment: momentShim_1.momentShim,
373
- field: standardField,
374
- artifacts: config.mappingArtifacts
375
- };
376
- value = _.template(template)(context);
377
- if (config.extraVerboseLogging) {
378
- if (_.isObject(value)) {
379
- this.logWithLevel(config.logLevel, `FigService ---- standardField ---- ${figName} ---- template ---- ${JSON.stringify(value)}`);
380
- }
381
- else {
382
- this.logWithLevel(config.logLevel, `FigService ---- standardField ---- ${figName} ---- template ---- ${value}`);
383
- }
384
- }
385
- }
386
- else {
387
- value = rbName ? _.get(record, rbName, standardField.defaultValue) : standardField.defaultValue;
388
- }
389
- if (unsetBeforeSet) {
390
- if (figName) {
391
- _.unset(requestBody, figName);
392
- }
132
+ async getArticleFiles(client, articleId) {
133
+ const files = [];
134
+ let page = 1;
135
+ const pageSize = 20;
136
+ while (true) {
137
+ const pageResults = await client.listArticleFiles(articleId, page, pageSize);
138
+ if (!Array.isArray(pageResults) || pageResults.length === 0) {
139
+ break;
393
140
  }
394
- if (figName) {
395
- _.set(requestBody, figName, value);
141
+ files.push(...pageResults);
142
+ if (pageResults.length < pageSize) {
143
+ break;
396
144
  }
145
+ page++;
397
146
  }
147
+ return files;
398
148
  }
399
- setCustomFieldInRequestBody(config, record, customFieldsTemplate, keyName, customFieldsMappings) {
400
- const customField = _.find(customFieldsMappings, { 'figName': keyName });
401
- let value = '';
402
- if (_.isObject(customField)) {
403
- const template = customField.template ?? '';
404
- if (template.indexOf('<%') != -1) {
405
- const context = {
406
- record: record,
407
- moment: momentShim_1.momentShim,
408
- field: customField,
409
- artifacts: config.mappingArtifacts
410
- };
411
- value = _.template(template)(context);
412
- if (config.extraVerboseLogging) {
413
- this.logWithLevel(config.logLevel, `FigService ---- ${keyName} ---- template ---- ${value}`);
414
- }
415
- }
416
- else {
417
- const rbName = typeof customField.rbName === 'string' ? customField.rbName : '';
418
- value = rbName ? _.get(record, rbName, customField.defaultValue) : customField.defaultValue;
419
- }
420
- _.set(customFieldsTemplate, keyName, value);
149
+ isCurationLocked(record, article) {
150
+ const config = this.getConfig(record);
151
+ const statusField = config?.article.curationLock?.statusField ?? '';
152
+ const targetValue = config?.article.curationLock?.targetValue ?? 'public';
153
+ const updatesDisabled = config?.article.curationLock?.enabled === true;
154
+ if (!updatesDisabled || statusField === '') {
155
+ return false;
421
156
  }
157
+ return String(article[statusField] ?? '') === targetValue;
422
158
  }
423
- setFieldByNameInRequestBody(config, record, requestBody, fieldConfig, fieldName, runtimeArtifacts = {}) {
424
- let value = '';
425
- const field = _.find(fieldConfig, { figName: fieldName });
426
- if (!_.isEmpty(field)) {
427
- const template = field.template ?? '';
428
- const unset = !!field.unset;
429
- const unsetBeforeSet = !!field.unsetBeforeSet;
430
- const figName = typeof field.figName === 'string' ? field.figName : '';
431
- const rbName = typeof field.rbName === 'string' ? field.rbName : '';
432
- if (unset) {
433
- if (config.extraVerboseLogging) {
434
- this.logWithLevel(config.logLevel, `FigService ---- setFieldByNameInRequestBody ---- before unset ${figName} ---- ${JSON.stringify(requestBody)}`);
435
- }
436
- if (figName) {
437
- _.unset(requestBody, figName);
438
- }
439
- if (config.extraVerboseLogging) {
440
- this.logWithLevel(config.logLevel, `FigService ---- setFieldByNameInRequestBody ---- after unset ${figName} ---- ${JSON.stringify(requestBody)}`);
441
- }
442
- }
443
- else if (template.indexOf('<%') != -1) {
444
- const context = {
445
- record: record,
446
- moment: momentShim_1.momentShim,
447
- field: field,
448
- artifacts: config.mappingArtifacts,
449
- runtimeArtifacts: runtimeArtifacts
450
- };
451
- value = _.template(template)(context);
452
- if (config.extraVerboseLogging) {
453
- if (_.isObject(value)) {
454
- this.logWithLevel(config.logLevel, `FigService ---- setFieldByNameInRequestBody ---- ${figName} ---- template ---- ${JSON.stringify(value)}`);
455
- }
456
- else {
457
- this.logWithLevel(config.logLevel, `FigService ---- setFieldByNameInRequestBody ---- ${figName} ---- template ---- ${value}`);
458
- }
459
- }
460
- }
461
- else {
462
- value = rbName ? _.get(record, rbName, field.defaultValue) : field.defaultValue;
463
- }
464
- if (unsetBeforeSet) {
465
- if (figName) {
466
- _.unset(requestBody, figName);
467
- }
468
- }
469
- if (figName) {
470
- _.set(requestBody, figName, value);
471
- }
159
+ async ensureNoFileUploadInProgress(config, record, articleId) {
160
+ const client = this.makeClient(config, record, undefined, 'ensureNoFileUploadInProgress');
161
+ const files = await this.getArticleFiles(client, articleId);
162
+ const inProgress = files.some((entry) => String(entry.status ?? '').toLowerCase() === 'created');
163
+ if (inProgress) {
164
+ throw new RBValidationError_1.RBValidationError({
165
+ message: `Figshare file uploads are still in progress for article '${articleId}'`,
166
+ displayErrors: [{
167
+ title: 'Figshare file uploads are still in progress',
168
+ detail: `Figshare file uploads are still in progress for article '${articleId}'`
169
+ }]
170
+ });
472
171
  }
473
172
  }
474
- //These method takes the list of contributors found in the ReDBox record and will try to match the
475
- //ReDBox Id to a Figshare Id. The Identifier(s) to be used are defined in figshareAPI config file
476
- async getAuthorUserIDs(config, authors) {
477
- this.logWithLevel(config.logLevel, 'FigService - getAuthorUserIDs enter');
478
- const authorList = [];
479
- let uniqueAuthors = authors;
480
- if (!_.isUndefined(config.recordAuthorUniqueBy) && !_.isEmpty(config.recordAuthorUniqueBy)) {
481
- uniqueAuthors = _.uniqBy(authors, config.recordAuthorUniqueBy);
173
+ async cleanupUploadedFiles(record, articleId) {
174
+ const config = this.getConfig(record);
175
+ if (config == null) {
176
+ return record;
482
177
  }
483
- this.logWithLevel(config.logLevel, 'FigService - uniqueAuthors');
484
- this.logWithLevel(config.logLevel, uniqueAuthors);
485
- const getAuthorTemplateRequests = (_.isArray(sails.config.figshareAPI.mapping.templates.getAuthor)
486
- ? sails.config.figshareAPI.mapping.templates.getAuthor
487
- : []);
488
- const uniqueAuthorsControlList = _.clone(uniqueAuthors);
489
- for (const author of uniqueAuthorsControlList) {
490
- this.logWithLevel(config.logLevel, author);
491
- let authorMatched = false;
492
- for (const requestBodyTemplate of getAuthorTemplateRequests) {
493
- const template = String(requestBodyTemplate.template ?? '');
494
- let userId = this.getValueFromObject(config, author, template);
495
- if (!_.isUndefined(userId) && !_.isEmpty(userId)) {
496
- const requestBody = _.clone(requestBodyTemplate);
497
- _.unset(requestBody, 'template');
498
- const keys = _.keys(requestBody);
499
- const searchBy = keys[0];
500
- //This code is added for the sole purpose of facilitating test/staging use case that some
501
- //intitutions have a different domain in their test environment compared to production and
502
- //it's intended to be restrictive
503
- if (searchBy == 'email') {
504
- const userIdStr = _.isString(userId) ? userId : '';
505
- if (_.has(requestBody, 'prefix') && userIdStr.indexOf('@') > 0) {
506
- const tmpEmailArray = _.split(userIdStr, '@');
507
- if (tmpEmailArray.length == 2) {
508
- const tmpEmail = tmpEmailArray[0] + '@' + _.get(requestBody, 'prefix', '') + tmpEmailArray[1];
509
- userId = tmpEmail;
510
- }
511
- _.unset(requestBody, 'prefix');
512
- }
513
- else if (_.has(requestBody, 'override') && userIdStr.indexOf('@') > 0) {
514
- const tmpEmailArray = _.split(userIdStr, '@');
515
- if (tmpEmailArray.length == 2) {
516
- const tmpEmail = tmpEmailArray[0] + '@' + _.get(requestBody, 'override', '');
517
- userId = tmpEmail;
518
- }
519
- _.unset(requestBody, 'override');
520
- }
521
- }
522
- //Set request body with the userId value that matches the searchBy template in example:
523
- //
524
- // 1- Search by email:
525
- // {
526
- // institution_user_id: user1234
527
- // }
528
- //
529
- // 2- Search by email:
530
- // {
531
- // email: staging.user@institution.edu.au
532
- // }
533
- //
534
- // 3- Search by symplectic_user_id:
535
- // {
536
- // symplectic_user_id: user1234
537
- // }
538
- //
539
- _.set(requestBody, searchBy, userId);
540
- const requestConfig = this.getAxiosConfig(config, 'post', '/account/institution/accounts/search', requestBody);
541
- if (config.extraVerboseLogging) {
542
- this.logWithLevel(config.logLevel, `FigService - getAuthorUserIDs - userId ${userId} - ${requestConfig.method} - ${requestConfig.url}`);
543
- }
544
- try {
545
- const response = await this.requestWithRetry(config, requestConfig, { label: 'getAuthorUserIDs', retry: { retryOnMethods: ['post'] } });
546
- const authorData = response.data;
547
- if (config.extraVerboseLogging) {
548
- this.logWithLevel(config.logLevel, authorData);
549
- }
550
- if (!_.isEmpty(authorData)) {
551
- const authorDataEntry = authorData[0] || {};
552
- const figshareAccountUserID = {
553
- id: _.toNumber(authorDataEntry[sails.config.figshareAPI.mapping.figshareAuthorUserId])
554
- };
555
- if (config.extraVerboseLogging) {
556
- this.logWithLevel(config.logLevel, `FigService - getAuthorUserIDs - author `);
557
- this.logWithLevel(config.logLevel, figshareAccountUserID);
558
- }
559
- authorList.push(figshareAccountUserID);
560
- authorMatched = true;
561
- break;
562
- }
563
- }
564
- catch (error) {
565
- sails.log.error(error);
566
- sails.log.error(`FigService - getAuthorUserIDs - author error`);
567
- sails.log.error(author);
568
- }
569
- }
570
- }
571
- if (!authorMatched) {
572
- const otherContributor = { name: author[config.recordAuthorExternalName] };
573
- if (!_.isUndefined(otherContributor.name)) {
574
- authorList.push(otherContributor);
178
+ const client = this.makeClient(config, record, undefined, 'cleanupUploadedFiles');
179
+ const articleFiles = await this.getArticleFiles(client, articleId);
180
+ const dataLocations = ((0, types_1.getRecordField)(record, config.record.dataLocationsPath) ?? []);
181
+ const recordConfig = sails.config.record;
182
+ const datastreamServiceName = String(recordConfig?.datastreamService ?? '');
183
+ const datastreamService = datastreamServiceName ? sails.services?.[datastreamServiceName] : undefined;
184
+ for (const entry of [...dataLocations]) {
185
+ if (entry.type !== 'attachment' || entry.fileId == null) {
186
+ continue;
187
+ }
188
+ const uploaded = articleFiles.find((file) => file.name === (entry.name ?? ''));
189
+ if (uploaded == null) {
190
+ continue;
191
+ }
192
+ const removeDatastream = datastreamService?.removeDatastream;
193
+ if (removeDatastream != null) {
194
+ try {
195
+ await removeDatastream(record.redboxOid ?? record.id ?? '', entry);
575
196
  }
576
- }
577
- }
578
- return authorList;
579
- }
580
- //This method allows for defining rules to gather a list of all relevant contributors from a ReDBox record
581
- //The rules can be configured in the artifacts method getContributorsFromRecord that uses a lodash template
582
- //and these rules are meant to be project spefic and hence these are set in figshareAPI config file
583
- getContributorsFromRecord(config, record) {
584
- let authors = [];
585
- const template = sails.config.figshareAPI.mapping.runtimeArtifacts.getContributorsFromRecord.template;
586
- if (!_.isUndefined(template) && template.indexOf('<%') != -1) {
587
- const context = {
588
- record: record
589
- };
590
- const result = _.template(template)(context);
591
- if (_.isArray(result)) {
592
- authors = result;
593
- }
594
- this.logVerbose(config, `FigService ---- getContributorsFromRecord ---- template`);
595
- }
596
- this.logVerbose(config, `FigService - getContributorsFromRecord: ${JSON.stringify(authors)}`);
597
- return authors;
598
- }
599
- //This method allows for defining rules to check if an ReDBox record is embargoed
600
- isRecordEmbargoed(config, request, filesOrURLsAttached) {
601
- let isEmbargoed = false;
602
- if (!_.isEmpty(sails.config.figshareAPI.mapping.standardFields.embargo)) {
603
- const template = sails.config.figshareAPI.mapping.runtimeArtifacts.isRecordEmbargoed.template;
604
- if (!_.isUndefined(template) && template.indexOf('<%') != -1) {
605
- const context = {
606
- request: request,
607
- filesOrURLsAttached: filesOrURLsAttached
608
- };
609
- isEmbargoed = !!_.template(template)(context);
610
- this.logVerbose(config, `FigService ---- isRecordEmbargoed ---- template`);
611
- }
612
- }
613
- this.logVerbose(config, `FigService - isRecordEmbargoed: ${isEmbargoed}`);
614
- return isEmbargoed;
615
- }
616
- async isClearEmbargoNeeded(config, request, articleId, articleDetails) {
617
- let isEmbargoCleared = false;
618
- if (_.isUndefined(articleDetails) || _.isEmpty(articleDetails)) {
619
- articleDetails = await this.getArticleDetails(config, articleId);
620
- }
621
- const isEmbargoSet = _.get(articleDetails, 'is_embargoed', false);
622
- if (isEmbargoSet) {
623
- if (!_.isEmpty(sails.config.figshareAPI.mapping.standardFields.embargo)) {
624
- const template = sails.config.figshareAPI.mapping.runtimeArtifacts.isRecordEmbargoCleared.template;
625
- if (!_.isUndefined(template) && template.indexOf('<%') != -1) {
626
- const context = {
627
- request: request
628
- };
629
- isEmbargoCleared = !!_.template(template)(context);
630
- this.logVerbose(config, `FigService ---- isRecordEmbargoCleared ---- template`);
197
+ catch (error) {
198
+ sails.log.warn(`FigService - failed to remove datastream for record '${record.redboxOid ?? record.id ?? ''}'`, {
199
+ entry,
200
+ error: error instanceof Error ? error.message : String(error)
201
+ });
631
202
  }
632
203
  }
633
- }
634
- this.logVerbose(config, `FigService - isRecordEmbargoCleared: ${isEmbargoCleared}`);
635
- return isEmbargoCleared;
636
- }
637
- async checkEmbargoDetailsChanged(config, requestEmbargoBody, articleId, articleDetails) {
638
- let embargoDetailsChanged = false;
639
- if (!_.isEmpty(sails.config.figshareAPI.mapping.standardFields.embargo)) {
640
- if (_.isUndefined(articleDetails) || _.isEmpty(articleDetails)) {
641
- articleDetails = await this.getArticleDetails(config, articleId);
642
- }
643
- if (sails.config.figshareAPI.mapping.figshareForceEmbargoUpdateAlways) {
644
- embargoDetailsChanged = true;
645
- return embargoDetailsChanged;
646
- }
647
- for (const standardField of sails.config.figshareAPI.mapping.standardFields.embargo) {
648
- const checkChangedBeforeUpdate = _.get(standardField, 'checkChangedBeforeUpdate', false);
649
- if (checkChangedBeforeUpdate) {
650
- const requestFieldValue = _.get(requestEmbargoBody, standardField.figName, '');
651
- const articleFieldValue = _.get(articleDetails, standardField.figName, '');
652
- // if(this.extraVerboseLogging) {
653
- this.logWithLevel(config.logLevel, `FigService - ${standardField.figName}: redbox request value ${requestFieldValue} - figshare value ${articleFieldValue} `);
654
- // }
655
- if (requestFieldValue != articleFieldValue) {
656
- embargoDetailsChanged = true;
657
- break;
658
- }
659
- }
204
+ const idx = dataLocations.indexOf(entry);
205
+ if (idx >= 0) {
206
+ dataLocations.splice(idx, 1);
660
207
  }
661
- }
662
- return embargoDetailsChanged;
663
- }
664
- findCategoryIDs(config, record) {
665
- let catIDs = [];
666
- if (!_.isUndefined(config.forCodesMapping) && !_.isEmpty(config.forCodesMapping)) {
667
- const template = sails.config.figshareAPI.mapping.runtimeArtifacts.getCategoryIDs.template;
668
- if (!_.isUndefined(template) && template.indexOf('<%') != -1) {
669
- const context = {
670
- record: record,
671
- forCodes: config.forCodesMapping
672
- };
673
- const result = _.template(template)(context);
674
- if (_.isArray(result)) {
675
- catIDs = result;
676
- }
677
- this.logVerbose(config, `FigService ---- findCategoryIDs ---- template`);
208
+ const downloadUrl = typeof uploaded.download_url === 'string' ? uploaded.download_url.trim() : '';
209
+ if (downloadUrl === '') {
210
+ sails.log.warn(`FigService - uploaded file '${uploaded.name}' for entry '${String(entry.selected ?? '')}' has no download URL; skipping write-back URL replacement`);
211
+ continue;
678
212
  }
679
- this.logVerbose(config, catIDs);
680
- }
681
- return catIDs;
682
- }
683
- async getFigPrivateLicenses(config) {
684
- if (figshareLicenseCache) {
685
- return figshareLicenseCache;
686
- }
687
- if (figshareLicensePromise) {
688
- return figshareLicensePromise;
689
- }
690
- const requestConfig = this.getAxiosConfig(config, 'get', '/account/licenses', null);
691
- if (config.extraVerboseLogging) {
692
- this.logWithLevel(config.logLevel, `FigService - getFigPrivateLicenses - ${requestConfig.method} - ${requestConfig.url}`);
693
- this.logWithLevel(config.logLevel, `FigService - getFigPrivateLicenses - config ${JSON.stringify(this.redactAxiosConfig(requestConfig))}`);
213
+ dataLocations.push({
214
+ type: 'url',
215
+ location: downloadUrl,
216
+ notes: `File name: ${uploaded.name}`,
217
+ originalFileName: uploaded.name,
218
+ ignore: true,
219
+ selected: entry.selected ?? false
220
+ });
694
221
  }
695
- figshareLicensePromise = (async () => {
696
- try {
697
- const response = await this.requestWithRetry(config, requestConfig, { label: 'getFigPrivateLicenses', logResponse: true });
698
- figshareLicenseCache = response.data;
699
- return figshareLicenseCache;
700
- }
701
- catch (error) {
702
- if (!_.isEmpty(sails.config.figshareAPI.testLicenses)) {
703
- figshareLicenseCache = sails.config.figshareAPI.testLicenses;
704
- return figshareLicenseCache;
705
- }
706
- this.logWithLevel('error', error);
707
- figshareLicenseCache = null;
708
- return null;
709
- }
710
- finally {
711
- figshareLicensePromise = null;
712
- }
713
- })();
714
- return figshareLicensePromise;
715
- }
716
- async getArticleDetails(config, articleId) {
717
- const articleIdStr = String(articleId);
718
- const articleDetailsConfig = this.getAxiosConfig(config, 'get', `/account/articles/${articleIdStr}`, null);
719
- if (config.extraVerboseLogging) {
720
- this.logWithLevel(config.logLevel, `FigService - getArticleDetails checkStatusConfig ${articleDetailsConfig.method} - ${articleDetailsConfig.url}`);
222
+ (0, types_1.setRecordField)(record, config.record.dataLocationsPath, dataLocations);
223
+ const uploadedFlagPath = config.record.allFilesUploadedPath;
224
+ if (typeof uploadedFlagPath === 'string' && uploadedFlagPath !== '') {
225
+ (0, types_1.setRecordField)(record, uploadedFlagPath, 'yes');
721
226
  }
722
- const responseArticleDetails = await this.requestWithRetry(config, articleDetailsConfig, { label: 'getArticleDetails', logResponse: true });
723
- const articleDetails = responseArticleDetails.data;
724
- return articleDetails;
227
+ return record;
725
228
  }
726
- async isArticleApprovedAndPublished(config, articleId, articleDetails) {
727
- if (_.isUndefined(articleDetails) || _.isEmpty(articleDetails)) {
728
- articleDetails = await this.getArticleDetails(config, articleId);
729
- }
730
- if (_.has(articleDetails, config.curationStatusFA) && articleDetails[config.curationStatusFA] == config.curationStatusTargetValueFA) {
731
- this.logWithLevel(config.logLevel, 'FigService - isArticleApprovedAndPublished - true');
732
- return true;
733
- }
734
- else {
229
+ async isArticleReadyForWorkflowTransition(config, record, articleId, figshareTargetFieldKey, figshareTargetFieldValue) {
230
+ if (!articleId.trim()) {
231
+ sails.log.error(`FigService - the article id '${articleId}' is not valid`);
735
232
  return false;
736
233
  }
737
- }
738
- async getArticleFileList(config, articleId, logEnabled = true) {
739
- const articleIdStr = String(articleId);
740
- const defaultPageSize = 20;
741
- const pageSizeConfig = _.get(sails.config, 'figshareAPI.mapping.upload.fileListPageSize', defaultPageSize);
742
- const pageSize = _.isNumber(pageSizeConfig) && pageSizeConfig > 0 ? pageSizeConfig : defaultPageSize;
743
- let page = 1;
744
- const articleFileList = [];
745
- let hasMorePages = true;
746
- while (hasMorePages) {
747
- const articleFileListConfig = this.getAxiosConfig(config, 'get', `/account/articles/${articleIdStr}/files?page_size=${pageSize}&page=${page}`, null);
748
- if (logEnabled) {
749
- this.logWithLevel(config.logLevel, `FigService - getArticleFileList - page ${page} - ${articleFileListConfig.method} - ${articleFileListConfig.url}`);
750
- }
751
- const responseArticleList = await this.requestWithRetry(config, articleFileListConfig, { label: 'getArticleFileList', logResponse: logEnabled });
752
- if (logEnabled) {
753
- this.logWithLevel(config.logLevel, `FigService - getArticleFileList - page ${page} status: ${responseArticleList.status} statusText: ${responseArticleList.statusText}`);
754
- }
755
- const currentPage = responseArticleList.data;
756
- if (_.isArray(currentPage) && currentPage.length > 0) {
757
- articleFileList.push(...currentPage);
758
- hasMorePages = currentPage.length >= pageSize;
759
- }
760
- else {
761
- hasMorePages = false;
762
- }
763
- page++;
764
- }
765
- if (logEnabled) {
766
- this.logWithLevel(config.logLevel, `FigService - getArticleFileList - total files fetched ${articleFileList.length}`);
767
- }
768
- return articleFileList;
769
- }
770
- async isFileUploadInProgress(config, articleId, articleFileList) {
771
- if (_.isUndefined(articleFileList) || _.isEmpty(articleFileList)) {
772
- articleFileList = await this.getArticleFileList(config, articleId);
773
- }
774
- //Files in figshare article have to be status available. Status 'created' means that the file is still being uploaded to the article
775
- const fileUploadInProgress = _.find(articleFileList, ['status', 'created']);
776
- if (!_.isUndefined(fileUploadInProgress)) {
777
- this.logWithLevel(config.logLevel, `FigService - isFileUploadInProgress - true - articleId ${articleId}`);
778
- return true;
234
+ const client = this.makeClient(config, record, `${articleId}:workflow-transition`, 'transitionRecordWorkflowFromFigshareArticlePropertiesJob');
235
+ const article = await client.getArticle(articleId);
236
+ const figshareFieldValue = article[figshareTargetFieldKey] ?? null;
237
+ if (figshareFieldValue == null || figshareFieldValue !== figshareTargetFieldValue) {
238
+ sails.log.warn(`FigService - the article id '${articleId}' item property '${figshareTargetFieldKey}' value '${JSON.stringify(figshareFieldValue)}' is not '${JSON.stringify(figshareTargetFieldValue)}'`);
239
+ return false;
779
240
  }
780
- else {
241
+ const files = await this.getArticleFiles(client, articleId);
242
+ const uploadInProgress = files.some((entry) => String(entry.status ?? '').toLowerCase() === 'created');
243
+ if (uploadInProgress) {
244
+ sails.log.warn(`FigService - the article id '${articleId}' has an upload in progress`);
781
245
  return false;
782
246
  }
247
+ return true;
783
248
  }
784
- async checkArticleHasURLsOrFilesAttached(config, articleId, articleFileList) {
785
- let stringifyFileList = '';
786
- if (!_.isUndefined(articleFileList)) {
787
- stringifyFileList = JSON.stringify(articleFileList);
788
- }
789
- this.logWithLevel(config.logLevel, 'FigService - checkArticleHasURLsOrFilesAttached - articleFileList before ' + stringifyFileList);
790
- if (_.isUndefined(articleFileList) || _.isEmpty(articleFileList)) {
791
- articleFileList = await this.getArticleFileList(config, articleId);
792
- }
793
- if (!_.isUndefined(articleFileList)) {
794
- stringifyFileList = JSON.stringify(articleFileList);
795
- }
796
- this.logWithLevel(config.logLevel, 'FigService - checkArticleHasURLsOrFilesAttached - articleFileList after ' + stringifyFileList);
797
- const fileUploadInProgress = _.find(articleFileList, ['status', 'created']);
798
- const filesOrURLsAttached = _.find(articleFileList, ['status', 'available']);
799
- if (_.isUndefined(fileUploadInProgress) && !_.isUndefined(filesOrURLsAttached)) {
800
- this.logWithLevel(config.logLevel, 'FigService - checkArticleHasURLsOrFilesAttached - true');
801
- return true;
249
+ async transitionWorkflowForRecord(record, user, oid, articleId, targetStep, figshareTargetFieldKey, figshareTargetFieldValue) {
250
+ const config = this.getConfig(record);
251
+ if (config == null) {
252
+ return;
802
253
  }
803
- else {
804
- return false;
254
+ const msgPartial = `record oid '${oid}' with figshare article id '${articleId}' to step '${targetStep}'`;
255
+ if (!(await this.isArticleReadyForWorkflowTransition(config, record, articleId, figshareTargetFieldKey, figshareTargetFieldValue))) {
256
+ sails.log.warn(`FigService - cannot transition ${msgPartial} because the linked article is not in the required state`);
257
+ return;
805
258
  }
806
- }
807
- getArticleUpdateRequestBody(config, record, figshareAccountAuthorIDs, figCategoryIDs, figLicenceIDs) {
808
- //Custom_fields is a dict not an array
809
- const customFields = _.clone(sails.config.figshareAPI.mapping.templates.customFields.update);
810
- //Encountered shared reference issues even when creating a new object hence _.cloneDeep is required
811
- const requestBodyUpdate = _.cloneDeep(new FigshareArticleUpdate_1.FigshareArticleUpdate(config.figshareItemGroupId, config.figshareItemType));
812
- //FindAuthor_Step3 - set list of contributors in request body to be sent to Fighare passed in as a runtime artifact
813
- this.setFieldByNameInRequestBody(config, record, requestBodyUpdate, sails.config.figshareAPI.mapping.standardFields.update, 'authors', figshareAccountAuthorIDs);
814
- this.setFieldByNameInRequestBody(config, record, requestBodyUpdate, sails.config.figshareAPI.mapping.standardFields.update, 'license', figLicenceIDs);
815
- this.setFieldByNameInRequestBody(config, record, requestBodyUpdate, sails.config.figshareAPI.mapping.standardFields.update, 'categories', figCategoryIDs);
816
- this.setFieldByNameInRequestBody(config, record, requestBodyUpdate, sails.config.figshareAPI.mapping.standardFields.update, 'impersonate', figshareAccountAuthorIDs);
817
- for (const standardField of sails.config.figshareAPI.mapping.standardFields.update) {
818
- this.setStandardFieldInRequestBody(config, record, requestBodyUpdate, standardField);
259
+ const currentRec = await RecordsService.getMeta(oid);
260
+ const brand = BrandingService.getBrand(currentRec.metaMetadata?.brandId ?? 'default');
261
+ const userRoles = user.roles ?? [];
262
+ const hasEditAccess = await RecordsService.hasEditAccess(brand, user, userRoles, currentRec);
263
+ if (!hasEditAccess) {
264
+ sails.log.warn(`FigService - cannot transition ${msgPartial} because user '${user.username}' does not have edit permission`);
265
+ return;
819
266
  }
820
- const customFieldsKeys = _.keys(customFields);
821
- for (const customFieldKey of customFieldsKeys) {
822
- this.setCustomFieldInRequestBody(config, record, customFields, customFieldKey, sails.config.figshareAPI.mapping.customFields.update);
267
+ const recordTypeName = currentRec.metaMetadata?.type ?? '';
268
+ const recordType = await RecordTypesService.get(brand, recordTypeName).toPromise();
269
+ if (!recordType) {
270
+ sails.log.warn(`FigService - cannot transition ${msgPartial} because record type is missing`);
271
+ return;
823
272
  }
824
- _.set(requestBodyUpdate, sails.config.figshareAPI.mapping.customFields.path, customFields);
825
- return requestBodyUpdate;
826
- }
827
- getArticleCreateRequestBody(config, record, figshareAccountAuthorIDs, figCategoryIDs, figLicenceIDs) {
828
- //Encountered shared reference issues even when creating a new object hence _.cloneDeep is required
829
- const requestBodyCreate = _.cloneDeep(new FigshareArticleCreate_1.FigshareArticleCreate());
830
- //Open Access and Full Text URL custom fields have to be set on create because the figshare article
831
- //cannot be Made non draft (publish) so reviewers can pick it up from the queue
832
- const customFields = _.clone(sails.config.figshareAPI.mapping.templates.customFields.create);
833
- const customFieldsKeys = _.keys(customFields);
834
- this.setFieldByNameInRequestBody(config, record, requestBodyCreate, sails.config.figshareAPI.mapping.standardFields.update, 'categories', figCategoryIDs);
835
- this.setFieldByNameInRequestBody(config, record, requestBodyCreate, sails.config.figshareAPI.mapping.standardFields.create, 'license', figLicenceIDs);
836
- this.setFieldByNameInRequestBody(config, record, requestBodyCreate, sails.config.figshareAPI.mapping.standardFields.create, 'impersonate', figshareAccountAuthorIDs);
837
- for (const customFieldKey of customFieldsKeys) {
838
- this.setCustomFieldInRequestBody(config, record, customFields, customFieldKey, sails.config.figshareAPI.mapping.customFields.create);
273
+ const nextStepResp = await WorkflowStepsService.get(recordType, targetStep).toPromise();
274
+ const metadata = currentRec.metadata;
275
+ const recordUpdateResult = await RecordsService.updateMeta(brand, oid, currentRec, user, true, true, nextStepResp, metadata);
276
+ const isSuccessful = recordUpdateResult.isSuccessful();
277
+ if (isSuccessful) {
278
+ sails.log.info(`FigService - updated ${msgPartial}`);
839
279
  }
840
- for (const standardField of sails.config.figshareAPI.mapping.standardFields.create) {
841
- this.setStandardFieldInRequestBody(config, record, requestBodyCreate, standardField);
280
+ else {
281
+ sails.log.error(`FigService - failed to update ${msgPartial}: ${JSON.stringify(recordUpdateResult)}`);
842
282
  }
843
- _.set(requestBodyCreate, sails.config.figshareAPI.mapping.customFields.path, customFields);
844
- return requestBodyCreate;
845
283
  }
846
- getEmbargoRequestBody(config, record, figshareAccountAuthorIDs) {
847
- let requestEmbargoBody = {};
848
- if (!_.isEmpty(sails.config.figshareAPI.mapping.standardFields.embargo)) {
849
- //Encountered shared reference issues even when creating a new object hence _.cloneDeep is required
850
- requestEmbargoBody = _.cloneDeep(new FigshareArticleEmbargo_1.FigshareArticleEmbargo(0, false, '', '', '', '', []));
851
- this.setFieldByNameInRequestBody(config, record, requestEmbargoBody, sails.config.figshareAPI.mapping.standardFields.embargo, 'impersonate', figshareAccountAuthorIDs || []);
852
- for (const standardField of sails.config.figshareAPI.mapping.standardFields.embargo) {
853
- this.setStandardFieldInRequestBody(config, record, requestEmbargoBody, standardField);
854
- }
284
+ async syncRecordWithFigshare(record, jobId, triggerSource = 'manual') {
285
+ const config = this.getConfig(record);
286
+ const rm = record;
287
+ if (config == null) {
288
+ return record;
855
289
  }
856
- return requestEmbargoBody;
857
- }
858
- getPublishRequestBody(config, figshareAccountAuthorIDs) {
859
- const requestBody = sails.config.figshareAPI.mapping.templates.impersonate;
860
- const targetStatePublish = (sails.config.figshareAPI.mapping.targetState.publish || []);
861
- this.setFieldByNameInRequestBody(config, {}, requestBody, targetStatePublish, 'impersonate', figshareAccountAuthorIDs || []);
862
- return requestBody;
863
- }
864
- async sendDataPublicationToFigshare(record) {
865
- const config = this.getRuntimeConfig();
866
- if (!this.isFigshareAPIEnabled(config)) {
867
- this.logWithLevel('warn', 'FigService - Figshare API is disabled. Skipping sendDataPublicationToFigshare.');
290
+ const plan = this.preparePublication(rm, jobId);
291
+ if (plan.action === 'skip') {
868
292
  return record;
869
293
  }
294
+ const auditCtx = this.startIntegrationAudit(rm, IntegrationAuditModel_1.IntegrationAuditAction.syncRecordWithFigshare, {
295
+ triggerSource,
296
+ jobId,
297
+ correlationId: plan.syncState.correlationId,
298
+ articleId: plan.articleId,
299
+ phase: 'sync-start',
300
+ });
870
301
  try {
871
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
872
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare - enter ');
873
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
874
- let articleId = 0;
875
- if (_.has(record, config.figArticleIdPathInRecord) && !_.isUndefined(_.get(record, config.figArticleIdPathInRecord)) &&
876
- _.get(record, config.figArticleIdPathInRecord) > 0) {
877
- articleId = _.toNumber(_.get(record, config.figArticleIdPathInRecord));
878
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare - metadata.figshare_article_id ' + articleId);
879
- }
880
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare - articleId ' + articleId);
881
- //FindAuthor_Step1 - get list of contributors from record (Configurabe with lodash template)
882
- const contributorsDP = this.getContributorsFromRecord(config, record);
883
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - contributorsDP ${JSON.stringify(contributorsDP)}`);
884
- let figshareAccountAuthorIDs = [];
885
- if (!_.isEmpty(sails.config.figshareAPI.testUsers)) {
886
- figshareAccountAuthorIDs = sails.config.figshareAPI.testUsers;
887
- }
888
- else {
889
- //FindAuthor_Step2 - get list of contributors by matched Figshare IDs plus externals/unmatched added by name only (Configurabe with lodash template)
890
- figshareAccountAuthorIDs = await this.getAuthorUserIDs(config, contributorsDP);
891
- }
892
- const figLicenceIDs = (await this.getFigPrivateLicenses(config));
893
- let figCategoryIDs = [];
894
- if (!_.isEmpty(sails.config.figshareAPI.testCategories)) {
895
- figCategoryIDs = sails.config.figshareAPI.testCategories;
896
- }
897
- else {
898
- //FindCat_Step1 - to get the list of Figshare category IDs from a ReDBox record (Configurabe with lodash template)
899
- figCategoryIDs = this.findCategoryIDs(config, record);
900
- }
901
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare - figshareAccountAuthorIDs');
902
- this.logWithLevel(config.logLevel, figshareAccountAuthorIDs);
903
- if (articleId == 0) {
904
- const requestBodyCreate = this.getArticleCreateRequestBody(config, record, figshareAccountAuthorIDs, figCategoryIDs, figLicenceIDs);
905
- this.logWithLevel(config.logLevel, 'FigService before early validation - requestBodyCreate -------------------------');
906
- this.logWithLevel(config.logLevel, 'FigService before early validation - requestBodyCreate ' + JSON.stringify(requestBodyCreate));
907
- this.logWithLevel(config.logLevel, 'FigService before early validation - requestBodyCreate -------------------------');
908
- this.validateCreateRequestBody(config, requestBodyCreate);
909
- //Need to pre validate the update request body as well before creating the article because if the article gets
910
- //created and then a backend validation is thrown before update the DP record will not save the article ID given
911
- //this process is occurring in a pre save trigger
912
- const dummyRequestBodyUpdate = this.getArticleUpdateRequestBody(config, record, figshareAccountAuthorIDs, figCategoryIDs, figLicenceIDs);
913
- this.logWithLevel(config.logLevel, 'FigService before early validation - requestBodyUpdate -------------------------');
914
- this.logWithLevel(config.logLevel, 'FigService before early validation - requestBodyUpdate ' + JSON.stringify(dummyRequestBodyUpdate));
915
- this.logWithLevel(config.logLevel, 'FigService before early validation - requestBodyUpdate -------------------------');
916
- this.validateUpdateRequestBody(config, dummyRequestBodyUpdate);
917
- const dummyEmbargoRequestBody = this.getEmbargoRequestBody(config, record, figshareAccountAuthorIDs);
918
- this.logWithLevel(config.logLevel, 'FigService before early validation - embargoRequestBody ------------------------');
919
- this.logWithLevel(config.logLevel, 'FigService before early validation - embargoRequestBody ' + JSON.stringify(dummyEmbargoRequestBody));
920
- this.logWithLevel(config.logLevel, 'FigService before early validation - embargoRequestBody ------------------------');
921
- this.validateEmbargoRequestBody(config, record, dummyEmbargoRequestBody);
922
- //config for create article
923
- const figshareArticleConfig = this.getAxiosConfig(config, 'post', '/account/articles', requestBodyCreate);
924
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
925
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare ${figshareArticleConfig.method} - ${figshareArticleConfig.url}`);
926
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
927
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare before create');
928
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare before post -------------------------------------------');
929
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare before post requestBodyCreate ' + JSON.stringify(requestBodyCreate));
930
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare before post -------------------------------------------');
931
- //create article
932
- let responseCreate = {
933
- status: '',
934
- statusText: '',
935
- data: {
936
- location: '',
937
- entity_id: 0,
938
- warnings: ['']
939
- }
940
- };
941
- try {
942
- responseCreate = await this.requestWithRetry(config, figshareArticleConfig, { label: 'createArticle', logResponse: true });
943
- }
944
- catch (createError) {
945
- if (sails.config.figshareAPI.testMode) {
946
- responseCreate = _.get(sails.config.figshareAPI, 'testResponse', {});
947
- }
948
- else {
949
- throw new RBValidationError_1.RBValidationError({
950
- message: `Failed to create FigShare article for oid '${record.redboxOid}'`,
951
- options: { cause: createError },
952
- displayErrors: [{ title: "Failed to create FigShare article.", meta: { oid: record.redboxOid } }],
953
- });
954
- }
955
- }
956
- const responseCreateData = (responseCreate.data ?? {});
957
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare status: ${responseCreate.status} statusText: ${responseCreate.statusText}`);
958
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare entityIdFAR: ${config.entityIdFAR} `);
959
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare sails.config.figshareAPI.testMode: ${sails.config.figshareAPI.testMode} `);
960
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare responseCreate.data: ${JSON.stringify(responseCreateData)} `);
961
- this.logWithLevel(config.logLevel, responseCreateData);
962
- //Note that lodash isEmpty will return true if the value is a number therefore had to be removed from the condition
963
- if (_.has(responseCreateData, config.entityIdFAR)) {
964
- articleId = _.toNumber(responseCreateData[config.entityIdFAR]);
965
- if (!_.isUndefined(articleId) && articleId > 0) {
966
- _.set(record, config.figArticleIdPathInRecord, articleId + '');
967
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare responseCreate.data.location ' + responseCreateData.location);
968
- if (_.has(responseCreateData, config.locationFAR) && !_.isEmpty(responseCreateData.location)) {
969
- const articleLocationURL = responseCreateData.location;
970
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare articleLocationURL response ' + articleLocationURL);
971
- if (_.isArray(config.figArticleURLPathInRecordList) && !_.isEmpty(config.figArticleURLPathInRecordList)) {
972
- const figArticleURLPathInRecordResponse = config.figArticleURLPathInRecordList[0] + '_response';
973
- _.set(record, figArticleURLPathInRecordResponse, articleLocationURL);
974
- for (const figArticleURLPathInRecord of config.figArticleURLPathInRecordList) {
975
- _.set(record, figArticleURLPathInRecord, `${config.frontEndURL}/${articleId}`);
976
- }
977
- }
978
- const requestEmbargoBody = this.getEmbargoRequestBody(config, record, figshareAccountAuthorIDs);
979
- const isEmbargoed = this.isRecordEmbargoed(config, requestEmbargoBody, false);
980
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare - first post create check isEmbargoed ' + isEmbargoed);
981
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare - targetState ' + JSON.stringify(sails.config.figshareAPI.mapping.targetState));
982
- if (_.isUndefined(sails.config.figshareAPI.mapping.targetState.draft) && !isEmbargoed) {
983
- //https://docs.figshare.com/#private_article_publish
984
- const requestBodyPublishAfterCreate = this.getPublishRequestBody(config, figshareAccountAuthorIDs);
985
- const publishConfig = this.getAxiosConfig(config, 'post', `/account/articles/${articleId}/publish`, requestBodyPublishAfterCreate);
986
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare ${publishConfig.method} - ${publishConfig.url}`);
987
- let responsePublish = { status: '', statusText: '' };
988
- try {
989
- responsePublish = await this.requestWithRetry(config, publishConfig, { label: 'publishAfterCreate', logResponse: true });
990
- }
991
- catch (updateError) {
992
- if (!sails.config.figshareAPI.testMode) {
993
- throw new RBValidationError_1.RBValidationError({
994
- message: `Failed to update FigShare article id '${articleId}'`,
995
- options: { cause: updateError },
996
- displayErrors: [{
997
- title: "Failed to update FigShare article.",
998
- meta: { articleId, oid: record.redboxOid }
999
- }],
1000
- });
1001
- }
1002
- }
1003
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare status: ${responsePublish.status} statusText: ${responsePublish.statusText}`);
1004
- }
1005
- }
1006
- }
1007
- }
1008
- }
1009
- if (!_.isUndefined(articleId) && articleId > 0) {
1010
- let articleDetails = await this.getArticleDetails(config, articleId);
1011
- const articleApprovedPublished = await this.isArticleApprovedAndPublished(config, articleId, articleDetails);
1012
- const articleFileList = await this.getArticleFileList(config, articleId);
1013
- const fileUploadInProgress = await this.isFileUploadInProgress(config, articleId, articleFileList);
1014
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - articleApprovedPublished ${articleApprovedPublished}`);
1015
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - fileUploadInProgress ${fileUploadInProgress}`);
1016
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - articleDetails ${JSON.stringify(articleDetails)}`);
1017
- if (articleApprovedPublished && config.disableUpdateByCurationStatusFA) {
1018
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare cannot be modified any further after it has been Approved & Published`);
1019
- }
1020
- else if (fileUploadInProgress) {
1021
- throw new RBValidationError_1.RBValidationError({
1022
- message: `sendDataPublicationToFigshare file uploads still in progress: ${fileUploadInProgress}`,
1023
- displayErrors: [{
1024
- code: '@backend-Upload-In-Progress-validationMessage',
1025
- meta: { articleId: articleId, oid: record.redboxOid }
1026
- }],
1027
- });
1028
- }
1029
- else {
1030
- //set request body for updating Figshare article
1031
- const requestBodyUpdate = this.getArticleUpdateRequestBody(config, record, figshareAccountAuthorIDs, figCategoryIDs, figLicenceIDs);
1032
- this.logWithLevel(config.logLevel, requestBodyUpdate);
1033
- this.validateUpdateRequestBody(config, requestBodyUpdate);
1034
- //articleId is passed in then changed config to update (put) instead of create (post) config for update
1035
- const figshareArticleConfig = this.getAxiosConfig(config, 'put', `/account/articles/${articleId}`, requestBodyUpdate);
1036
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1037
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare before update articleId ' + articleId);
1038
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1039
- this.logWithLevel(config.logLevel, 'FigService - figLicenceIDs ' + JSON.stringify(figLicenceIDs));
1040
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1041
- this.logWithLevel(config.logLevel, 'FigService - requestBodyUpdate ' + JSON.stringify(requestBodyUpdate));
1042
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1043
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - ${figshareArticleConfig.method} - ${figshareArticleConfig.url}`);
1044
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1045
- //update article without impersonate
1046
- const responseUpdate = await this.requestWithRetry(config, figshareArticleConfig, { label: 'updateArticle', logResponse: true });
1047
- const responseUpdateData = (responseUpdate.data ?? {});
1048
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare status: ${responseUpdate.status} statusText: ${responseUpdate.statusText}`);
1049
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare responseUpdate.data.location ' + responseUpdateData.location);
1050
- if (_.has(responseUpdateData, config.locationFAR) && !_.isEmpty(responseUpdateData.location)) {
1051
- const articleLocationURL = responseUpdateData.location;
1052
- this.logWithLevel(config.logLevel, 'FigService - articleLocationURL response ' + articleLocationURL);
1053
- if (_.isArray(config.figArticleURLPathInRecordList) && !_.isEmpty(config.figArticleURLPathInRecordList)) {
1054
- const figArticleURLPathInRecordResponse = config.figArticleURLPathInRecordList[0] + '_response';
1055
- _.set(record, figArticleURLPathInRecordResponse, articleLocationURL);
1056
- for (const figArticleURLPathInRecord of config.figArticleURLPathInRecordList) {
1057
- _.set(record, figArticleURLPathInRecord, `${config.frontEndURL}/${articleId}`);
1058
- }
1059
- }
1060
- const filesOrURLsAttached = await this.checkArticleHasURLsOrFilesAttached(config, articleId, articleFileList);
1061
- const requestEmbargoBody = this.getEmbargoRequestBody(config, record, figshareAccountAuthorIDs);
1062
- const isEmbargoed = this.isRecordEmbargoed(config, requestEmbargoBody, filesOrURLsAttached);
1063
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare - post update check isEmbargoed ' + isEmbargoed);
1064
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare - targetState ' + JSON.stringify(sails.config.figshareAPI.mapping.targetState));
1065
- if (_.isUndefined(sails.config.figshareAPI.mapping.targetState.draft) && !isEmbargoed) {
1066
- const requestBodyPublishAfterUpdate = this.getPublishRequestBody(config, figshareAccountAuthorIDs);
1067
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare before publish response location ' + responseUpdateData.location);
1068
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare before publish requestBodyPublishAfterUpdate ' + JSON.stringify(requestBodyPublishAfterUpdate));
1069
- //https://docs.figshare.com/#private_article_publish
1070
- const publishConfig = this.getAxiosConfig(config, 'post', `/account/articles/${articleId}/publish`, requestBodyPublishAfterUpdate);
1071
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - ${publishConfig.method} - ${publishConfig.url}`);
1072
- const responsePublish = await this.requestWithRetry(config, publishConfig, { label: 'publishAfterUpdate', logResponse: true });
1073
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - status: ${responsePublish.status} statusText: ${responsePublish.statusText}`);
1074
- if (!_.isEmpty(sails.config.figshareAPI.mapping.response.article)) {
1075
- const responseArticleFields = (sails.config.figshareAPI.mapping.response.article || []);
1076
- articleDetails = await this.getArticleDetails(config, articleId);
1077
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - after publish articleDetails ${JSON.stringify(articleDetails)}`);
1078
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - after publish mapping.response.article ${JSON.stringify(sails.config.figshareAPI.mapping.response.article)}`);
1079
- for (const field of responseArticleFields) {
1080
- this.setFieldInRecord(config, record, articleDetails, field);
1081
- }
1082
- }
1083
- }
1084
- }
1085
- }
1086
- const requestEmbargoBody = this.getEmbargoRequestBody(config, record, figshareAccountAuthorIDs);
1087
- const filesOrURLsAttached = await this.checkArticleHasURLsOrFilesAttached(config, articleId, articleFileList);
1088
- const isEmbargoed = this.isRecordEmbargoed(config, requestEmbargoBody, filesOrURLsAttached);
1089
- const isEmbargoCleared = await this.isClearEmbargoNeeded(config, requestEmbargoBody, articleId, articleDetails);
1090
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare - post update check 2 isEmbargoed ' + isEmbargoed);
1091
- this.logWithLevel(config.logLevel, 'FigService - sendDataPublicationToFigshare - post update check 2 isEmbargoCleared ' + isEmbargoCleared);
1092
- if (isEmbargoed) {
1093
- const embargoDetailsChanged = await this.checkEmbargoDetailsChanged(config, requestEmbargoBody, articleId, articleDetails);
1094
- if (embargoDetailsChanged) {
1095
- //validate requestEmbargoBody
1096
- this.validateEmbargoRequestBody(config, record, requestEmbargoBody);
1097
- //Update full article embargo info because Figshare rules allow for full article embargo to be set regardless if there are files uploaded
1098
- const embargoConfig = this.getAxiosConfig(config, 'put', `/account/articles/${articleId}/embargo`, requestEmbargoBody);
1099
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - ${embargoConfig.method} - ${embargoConfig.url}`);
1100
- this.logWithLevel(config.logLevel, 'FigService - before embargo -------------------------------------------');
1101
- this.logWithLevel(config.logLevel, 'FigService - before embargo requestEmbargoBody ' + JSON.stringify(requestEmbargoBody));
1102
- this.logWithLevel(config.logLevel, 'FigService - before embargo -------------------------------------------');
1103
- const responseEmbargo = await this.requestWithRetry(config, embargoConfig, { label: 'setEmbargo', logResponse: true });
1104
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare status: ${responseEmbargo.status} statusText: ${responseEmbargo.statusText}`);
1105
- }
1106
- }
1107
- else if (isEmbargoCleared) {
1108
- const embargoDeleteConfig = this.getAxiosConfig(config, 'delete', `/account/articles/${articleId}/embargo`, {});
1109
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare - ${embargoDeleteConfig.method} - ${embargoDeleteConfig.url}`);
1110
- this.logWithLevel(config.logLevel, 'FigService - before clear embargo -------------------------------------------');
1111
- this.logWithLevel(config.logLevel, 'FigService - before clear embargo requestEmbargoBody ' + JSON.stringify(requestEmbargoBody));
1112
- this.logWithLevel(config.logLevel, 'FigService - before clear embargo -------------------------------------------');
1113
- const responseEmbargoDelete = await this.requestWithRetry(config, embargoDeleteConfig, { label: 'clearEmbargo', logResponse: true });
1114
- this.logWithLevel(config.logLevel, `FigService - sendDataPublicationToFigshare status: ${responseEmbargoDelete.status} statusText: ${responseEmbargoDelete.statusText}`);
1115
- }
1116
- }
302
+ let article = await this.syncMetadata(rm, plan);
303
+ const assetSyncResult = await this.syncAssets(rm, article);
304
+ await this.syncEmbargo(rm, String(article?.id ?? plan.articleId ?? ''));
305
+ const publishResult = await this.publishIfNeeded(rm, String(article?.id ?? plan.articleId ?? ''));
306
+ if (Object.keys(publishResult).length > 0) {
307
+ article = await this.makeClient(config, rm, plan.syncState.correlationId, triggerSource).getArticle(String(article?.id ?? plan.articleId ?? ''));
308
+ }
309
+ const updatedRecord = this.writeBack(rm, article, publishResult, assetSyncResult);
310
+ this.completeIntegrationAudit(auditCtx, {
311
+ message: 'Figshare sync completed successfully.',
312
+ responseSummary: {
313
+ triggerSource,
314
+ jobId,
315
+ correlationId: plan.syncState.correlationId,
316
+ articleId: String(article?.id ?? plan.articleId ?? ''),
317
+ phases: ['metadata sync', 'asset sync', 'embargo sync', 'publish', 'write-back'],
318
+ publishResult,
319
+ partialProgress: this.getSyncState(config, rm).partialProgress,
320
+ },
321
+ });
322
+ return updatedRecord;
1117
323
  }
1118
324
  catch (error) {
1119
- const msg = "Failed communicating with FigShare";
1120
- throw new RBValidationError_1.RBValidationError({
1121
- message: _.get(error, 'response.data.message') || msg,
1122
- options: { cause: error },
1123
- displayErrors: [{ title: msg }],
325
+ const syncState = this.getSyncState(config, rm);
326
+ syncState.status = 'failed';
327
+ syncState.lastError = error instanceof Error ? error.message : String(error);
328
+ this.setSyncState(config, rm, syncState);
329
+ this.failIntegrationAudit(auditCtx, error, {
330
+ message: 'Figshare sync failed.',
331
+ errorDetail: error instanceof Error ? error.message : String(error),
332
+ responseSummary: {
333
+ triggerSource,
334
+ jobId,
335
+ correlationId: plan.syncState.correlationId,
336
+ articleId: plan.articleId,
337
+ phase: 'syncRecordWithFigshare',
338
+ partialProgress: syncState.partialProgress,
339
+ },
1124
340
  });
341
+ throw error;
1125
342
  }
1126
- return record;
1127
- }
1128
- validateEmbargoRequestBody(config, record, requestBody) {
1129
- let valid = '';
1130
- if (!_.isEmpty(sails.config.figshareAPI.mapping.standardFields.embargo)) {
1131
- for (const embargoField of sails.config.figshareAPI.mapping.standardFields.embargo) {
1132
- valid = this.validateFieldInRequestBody(config, requestBody, embargoField, '', record);
1133
- if (valid != '') {
1134
- throw new RBValidationError_1.RBValidationError({
1135
- message: `FigShare embargo request body was not valid: field ${embargoField} message ${valid} body ${JSON.stringify(requestBody)}`,
1136
- displayErrors: [{ detail: valid }],
1137
- });
1138
- }
1139
- }
1140
- }
1141
- }
1142
- checkCreateFields(config, requestBody) {
1143
- let valid = '';
1144
- const impersonate = sails.config.figshareAPI.mapping.standardFields.create;
1145
- if (!_.isEmpty(impersonate)) {
1146
- for (const impersonateField of impersonate) {
1147
- valid = this.validateFieldInRequestBody(config, requestBody, impersonateField);
1148
- if (valid != '') {
1149
- return valid;
1150
- }
1151
- }
1152
- }
1153
- for (const standardField of sails.config.figshareAPI.mapping.standardFields.create) {
1154
- valid = this.validateFieldInRequestBody(config, requestBody, standardField);
1155
- if (valid != '') {
1156
- return valid;
1157
- }
1158
- }
1159
- for (const customField of sails.config.figshareAPI.mapping.customFields.create) {
1160
- valid = this.validateFieldInRequestBody(config, requestBody, customField, sails.config.figshareAPI.mapping.customFields.path);
1161
- if (valid != '') {
1162
- return valid;
1163
- }
1164
- }
1165
- return valid;
1166
343
  }
1167
- validateFieldInRequestBody(config, requestBody, field, customFieldPath = '', record = {}) {
1168
- const invalidValueForField = TranslationService.t('@backend-prefix-validationMessage'); //Invalid value for field:
1169
- const maxLengthIs = TranslationService.t('@backend-maxlength-validationMessage'); //maximum length is
1170
- const minLengthIs = TranslationService.t('@backend-minlength-validationMessage'); //minimum length is
1171
- const idNotFound = TranslationService.t('@backend-idNotFound-validationMessage'); //Id Not Found in Figshare
1172
- let valid = '';
1173
- let passed = true;
1174
- let context = {};
1175
- const validations = _.get(field, 'validations', []);
1176
- const figName = typeof field.figName === 'string' ? field.figName : '';
1177
- if (config.extraVerboseLogging) {
1178
- this.logWithLevel(config.logLevel, `FigService ---- requestBody ---- ${JSON.stringify(requestBody)}`);
1179
- this.logWithLevel(config.logLevel, `FigService ---- field ---- ${JSON.stringify(field)} --- path ${customFieldPath}`);
1180
- }
1181
- if (!_.isEmpty(validations)) {
1182
- for (const validation of validations) {
1183
- const template = _.get(validation, 'template');
1184
- const minLength = _.get(validation, 'minLength', 0);
1185
- const maxLength = _.get(validation, 'maxLength', 0);
1186
- const addPrefix = _.get(validation, 'addPrefix', true);
1187
- const addSuffix = _.get(validation, 'addSuffix', false);
1188
- const overridePrefix = _.get(validation, 'overridePrefix', '');
1189
- const overrideSuffix = _.get(validation, 'overrideSuffix', '');
1190
- const regexValidation = _.get(validation, 'regexValidation', '');
1191
- if (!_.isUndefined(template) && template.indexOf('<%') != -1) {
1192
- if (_.isEmpty(context)) {
1193
- if (!_.isEmpty(record)) {
1194
- context = {
1195
- request: requestBody,
1196
- moment: momentShim_1.momentShim,
1197
- field: field,
1198
- artifacts: config.mappingArtifacts,
1199
- record: record
1200
- };
1201
- }
1202
- else {
1203
- context = {
1204
- request: requestBody,
1205
- moment: momentShim_1.momentShim,
1206
- field: field,
1207
- artifacts: config.mappingArtifacts
1208
- };
1209
- }
1210
- }
1211
- passed = _.template(template)(context);
1212
- if (config.extraVerboseLogging) {
1213
- this.logWithLevel(config.logLevel, `FigService ---- field ---- ${figName} ---- template ---- ${passed}`);
1214
- }
1215
- if (!passed) {
1216
- valid = TranslationService.t(_.get(validation, 'message', 'Error on request to Figshare'));
1217
- }
1218
- }
1219
- else if (maxLength > 0) {
1220
- let val = figName ? _.get(requestBody, figName, '') : '';
1221
- if (customFieldPath != '') {
1222
- val = figName ? _.get(requestBody, customFieldPath + '.' + figName, '') : '';
1223
- }
1224
- if (val.length > maxLength) {
1225
- passed = false;
1226
- }
1227
- else {
1228
- passed = true;
1229
- }
1230
- if (config.extraVerboseLogging) {
1231
- this.logWithLevel(config.logLevel, `FigService ---- standardField ---- ${figName} ---- maxLength ---- ${passed}`);
1232
- }
1233
- if (!passed) {
1234
- valid = TranslationService.t(_.get(validation, 'message', 'Error on request to Figshare')) + ' ' + maxLengthIs + ' ' + maxLength;
1235
- }
1236
- }
1237
- else if (minLength > 0) {
1238
- let val = figName ? _.get(requestBody, figName, '') : '';
1239
- if (customFieldPath != '') {
1240
- val = figName ? _.get(requestBody, customFieldPath + '.' + figName, '') : '';
1241
- }
1242
- if (val.length <= minLength) {
1243
- passed = false;
1244
- }
1245
- else {
1246
- passed = true;
1247
- }
1248
- if (config.extraVerboseLogging) {
1249
- this.logWithLevel(config.logLevel, `FigService ---- standardField ---- ${figName} ---- minLength ---- ${passed}`);
1250
- }
1251
- if (!passed) {
1252
- valid = TranslationService.t(_.get(validation, 'message', 'Error on request to Figshare')) + ' ' + minLengthIs + ' ' + minLength;
1253
- }
1254
- }
1255
- else if (regexValidation != '') {
1256
- const val = figName ? _.get(requestBody, figName, '') : '';
1257
- const caseSensitive = _.get(validation, 'caseSensitive', true);
1258
- const skipIfEmpty = _.get(validation, 'skipIfEmpty', false);
1259
- if (skipIfEmpty && _.trim(val) == '') {
1260
- //do nothing
1261
- }
1262
- else {
1263
- if (caseSensitive) {
1264
- const re = new RegExp(regexValidation);
1265
- if (!re.test(val)) {
1266
- valid = TranslationService.t(_.get(validation, 'message', 'Error on request to Figshare'));
1267
- }
1268
- }
1269
- else {
1270
- const re = new RegExp(regexValidation, 'i');
1271
- if (!re.test(val)) {
1272
- valid = TranslationService.t(_.get(validation, 'message', 'Error on request to Figshare'));
1273
- }
1274
- }
1275
- }
1276
- }
1277
- if (valid != '') {
1278
- if (addPrefix) {
1279
- if (overridePrefix != '') {
1280
- valid = TranslationService.t(overridePrefix) + ' ' + valid;
1281
- }
1282
- else {
1283
- valid = invalidValueForField + ' ' + valid;
1284
- }
1285
- }
1286
- if (addSuffix) {
1287
- if (overrideSuffix != '') {
1288
- valid = valid + ' ' + TranslationService.t(overrideSuffix);
1289
- }
1290
- else {
1291
- valid = valid + ' ' + idNotFound;
1292
- }
1293
- }
1294
- }
1295
- }
344
+ async persistSyncRecord(oid, record, user) {
345
+ try {
346
+ const brandName = (0, config_1.getBrandName)(record);
347
+ const brand = BrandingService.getBrand(brandName);
348
+ await RecordsService.updateMeta(brand, oid, record, user, false, false);
1296
349
  }
1297
- return valid;
1298
- }
1299
- validateCreateRequestBody(config, requestBody) {
1300
- const valid = this.checkCreateFields(config, requestBody);
1301
- this.logWithLevel(config.logLevel, `FigService - validateCreateArticleRequestBody - validMessage ${valid}`);
1302
- if (valid != '') {
1303
- throw new RBValidationError_1.RBValidationError({
1304
- message: `FigShare create request body was not valid: message ${valid} body ${JSON.stringify(requestBody)}`,
1305
- displayErrors: [{ detail: valid }],
1306
- });
350
+ catch (error) {
351
+ sails.log.error(`FigService - failed to persist Figshare sync state for ${oid}`, error);
1307
352
  }
1308
353
  }
1309
- checkRequestUpdateFields(config, requestBody) {
1310
- let valid = '';
1311
- for (const standardField of sails.config.figshareAPI.mapping.standardFields.update) {
1312
- valid = this.validateFieldInRequestBody(config, requestBody, standardField);
1313
- if (valid != '') {
1314
- return valid;
1315
- }
1316
- }
1317
- for (const customField of sails.config.figshareAPI.mapping.customFields.update) {
1318
- valid = this.validateFieldInRequestBody(config, requestBody, customField, sails.config.figshareAPI.mapping.customFields.path);
1319
- if (valid != '') {
1320
- return valid;
1321
- }
354
+ createUpdateFigshareArticle(oid, record, _options, _user) {
355
+ if (this.getConfig(record) == null) {
356
+ return record;
1322
357
  }
1323
- return valid;
358
+ return this.syncRecordWithFigshare(record, `${oid}:pre`, 'pre-save');
1324
359
  }
1325
- validateUpdateRequestBody(config, requestBody) {
1326
- const valid = this.checkRequestUpdateFields(config, requestBody);
1327
- this.logWithLevel(config.logLevel, `FigService - validateUpdateArticleRequestBody - validMessage ${valid}`);
1328
- if (valid != '') {
1329
- throw new RBValidationError_1.RBValidationError({
1330
- message: `FigShare update request body was not valid: message ${valid} body ${JSON.stringify(requestBody)}`,
1331
- displayErrors: [{ detail: valid }],
1332
- });
360
+ uploadFilesToFigshareArticle(oid, record, _options, user) {
361
+ if (this.getConfig(record) == null) {
362
+ return;
1333
363
  }
364
+ void this.syncRecordWithFigshare(record, `${oid}:post`, 'post-save')
365
+ .then(async (updatedRecord) => {
366
+ await this.persistSyncRecord(oid, updatedRecord, user);
367
+ const config = this.getConfig(updatedRecord);
368
+ if (config != null) {
369
+ const rm = updatedRecord;
370
+ const syncState = this.getSyncState(config, rm);
371
+ const articleId = String((0, types_1.getRecordField)(rm, config.record.articleIdPath) ?? '');
372
+ const brandId = rm.metaMetadata?.brandId ?? '';
373
+ const attachmentCount = Number(syncState.partialProgress?.attachmentCount ?? 0);
374
+ const uploadsComplete = syncState.partialProgress?.uploadsComplete === true;
375
+ if (attachmentCount > 0 && articleId !== '') {
376
+ if (config.article.publishMode === 'afterUploadsComplete') {
377
+ this.queuePublishAfterUploadFiles(oid, articleId, user, brandId);
378
+ }
379
+ else if (config.article.publishMode === 'immediate' && uploadsComplete) {
380
+ this.queueDeleteFiles(oid, user, brandId, articleId);
381
+ }
382
+ }
383
+ }
384
+ })
385
+ .catch(async (error) => {
386
+ await this.persistSyncRecord(oid, record, user);
387
+ sails.log.error(`FigService - uploadFilesToFigshareArticle sync failed for ${oid}`, error);
388
+ });
1334
389
  }
1335
- isFileAttachmentInDataLocations(dataLocations) {
1336
- let foundAttachment = false;
1337
- if (sails.config.figshareAPI.mapping.figshareOnlyPublishSelectedAttachmentFiles) {
1338
- for (const attachmentFile of dataLocations) {
1339
- if (!_.isUndefined(attachmentFile) && !_.isEmpty(attachmentFile) && attachmentFile.type == 'attachment' && attachmentFile.selected == true) {
1340
- foundAttachment = true;
1341
- break;
1342
- }
1343
- }
390
+ deleteFilesFromRedboxTrigger(oid, record, options, user) {
391
+ const config = this.getConfig(record);
392
+ const rm = record;
393
+ if (config == null) {
394
+ return record;
1344
395
  }
1345
- else {
1346
- for (const attachmentFile of dataLocations) {
1347
- if (!_.isUndefined(attachmentFile) && !_.isEmpty(attachmentFile) && attachmentFile.type == 'attachment') {
1348
- foundAttachment = true;
1349
- break;
1350
- }
396
+ if (this.metTriggerCondition(oid, rm, options, user) === 'true') {
397
+ const articleId = String((0, types_1.getRecordField)(rm, config.record.articleIdPath) ?? '');
398
+ if (articleId === '') {
399
+ return record;
1351
400
  }
401
+ return this.cleanupUploadedFiles(rm, articleId);
1352
402
  }
1353
- return foundAttachment;
403
+ return record;
1354
404
  }
1355
- isURLAttachmentInDataLocations(dataLocations) {
1356
- let foundURLAttachment = false;
1357
- if (sails.config.figshareAPI.mapping.figshareOnlyPublishSelectedAttachmentFiles) {
1358
- for (const urlAttachment of dataLocations) {
1359
- if (!_.isUndefined(urlAttachment) && !_.isEmpty(urlAttachment) && urlAttachment.type == 'url' && urlAttachment.selected == true) {
1360
- foundURLAttachment = true;
1361
- break;
1362
- }
1363
- }
405
+ async publishAfterUploadFilesJob(job) {
406
+ const data = job?.attrs?.data;
407
+ if (data == null || (data.oid == null && data.articleId == null)) {
408
+ return;
1364
409
  }
1365
- else {
1366
- for (const urlAttachment of dataLocations) {
1367
- if (!_.isUndefined(urlAttachment) && !_.isEmpty(urlAttachment) && urlAttachment.type == 'url') {
1368
- foundURLAttachment = true;
1369
- break;
1370
- }
1371
- }
410
+ const oid = data.oid ?? '';
411
+ const articleId = data.articleId ?? '';
412
+ const brandId = data.brandId ?? '';
413
+ const user = data.user;
414
+ if (!oid.trim()) {
415
+ sails.log.error(`FigService - cannot publish uploaded files because the record oid is empty before calling RecordsService.getMeta`);
416
+ return;
1372
417
  }
1373
- return foundURLAttachment;
1374
- }
1375
- countFileAttachmentsInDataLocations(dataLocations) {
1376
- let count = 0;
1377
- if (sails.config.figshareAPI.mapping.figshareOnlyPublishSelectedAttachmentFiles) {
1378
- for (const attachmentFile of dataLocations) {
1379
- if (!_.isUndefined(attachmentFile) && !_.isEmpty(attachmentFile) && attachmentFile.type == 'attachment' && attachmentFile.selected == true) {
1380
- count++;
1381
- }
1382
- }
418
+ const record = await RecordsService.getMeta(oid);
419
+ const config = this.getConfig(record);
420
+ if (config == null) {
421
+ return;
1383
422
  }
1384
- else {
1385
- for (const attachmentFile of dataLocations) {
1386
- if (!_.isUndefined(attachmentFile) && !_.isEmpty(attachmentFile) && attachmentFile.type == 'attachment') {
1387
- count++;
1388
- }
1389
- }
423
+ if (!articleId.trim()) {
424
+ sails.log.error(`FigService - cannot publish uploaded files for record '${oid}' because the Figshare article id is empty`);
425
+ return;
1390
426
  }
1391
- return count;
1392
- }
1393
- async checkUploadFilesPending(config, record, oid, user, figshareAccountAuthorIDs) {
427
+ const auditCtx = this.startIntegrationAudit(record, IntegrationAuditModel_1.IntegrationAuditAction.publishAfterUploadFilesJob, {
428
+ triggerSource: 'publishAfterUploadFilesJob',
429
+ jobId: `${oid}:publish-job`,
430
+ correlationId: `${oid}:publish-job`,
431
+ articleId,
432
+ phase: 'publish',
433
+ });
434
+ const client = this.makeClient(config, record, `${oid}:publish-job`, 'publishAfterUploadFilesJob');
1394
435
  try {
1395
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1396
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - enter');
1397
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1398
- let articleId = 0;
1399
- if (_.has(record, config.figArticleIdPathInRecord) && !_.isUndefined(_.get(record, config.figArticleIdPathInRecord)) &&
1400
- _.get(record, config.figArticleIdPathInRecord) > 0) {
1401
- articleId = _.toNumber(_.get(record, config.figArticleIdPathInRecord));
1402
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - metadata.figshare_article_id ' + articleId);
1403
- }
1404
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - articleId ' + articleId);
1405
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - oid ' + oid);
1406
- if (articleId > 0) {
1407
- if (!figshareAccountAuthorIDs) {
1408
- const contributorsDP = this.getContributorsFromRecord(config, record);
1409
- if (!_.isEmpty(sails.config.figshareAPI.testUsers)) {
1410
- figshareAccountAuthorIDs = sails.config.figshareAPI.testUsers;
1411
- }
1412
- else {
1413
- figshareAccountAuthorIDs = await this.getAuthorUserIDs(config, contributorsDP);
1414
- }
1415
- }
1416
- //Check article curation status and if approved cannot be updated
1417
- const checkStatusConfig = this.getAxiosConfig(config, 'get', `/account/articles/${articleId}`, null);
1418
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - ${checkStatusConfig.method} - ${checkStatusConfig.url}`);
1419
- const responseArticleDetails = await this.requestWithRetry(config, checkStatusConfig, { label: 'checkUploadFilesPendingStatus', logResponse: true });
1420
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - status: ${responseArticleDetails.status} statusText: ${responseArticleDetails.statusText}`);
1421
- let articleDetails = (responseArticleDetails.data ?? {});
1422
- const articleApprovedPublished = await this.isArticleApprovedAndPublished(config, articleId, articleDetails);
1423
- if (articleApprovedPublished && config.disableUpdateByCurationStatusFA) {
1424
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - cannot be modified any further after it has been Approved & Published`);
1425
- }
1426
- else {
1427
- //Try to upload files to article
1428
- const that = this;
1429
- let articleFileList = await this.getArticleFileList(config, articleId);
1430
- const filePath = sails.config.figshareAPI.attachmentsFigshareTempDir;
1431
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - attachmentsFigshareTempDir ' + filePath);
1432
- if (!fs.existsSync(filePath)) {
1433
- fs.mkdirSync(filePath);
1434
- }
1435
- const dataLocations = _.get(record, config.dataLocationsPathInRecord) || [];
1436
- const dataLocationsAlreadyUploaded = _.filter(dataLocations, { 'ignore': true });
1437
- let foundFileAttachment = this.isFileAttachmentInDataLocations(dataLocations);
1438
- const countFileAttachments = this.countFileAttachmentsInDataLocations(dataLocations);
1439
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - before override foundAttachment ' + foundFileAttachment);
1440
- //Evaluate project specific rules that can override the need to upload files present in data locations list
1441
- const uploadOverrideConfig = sails.config.figshareAPI.mapping.upload.override;
1442
- if (uploadOverrideConfig && !_.isEmpty(uploadOverrideConfig) && foundFileAttachment) {
1443
- const overrideTemplate = uploadOverrideConfig.template;
1444
- if (overrideTemplate) {
1445
- foundFileAttachment = !!this.getValueFromRecord(config, record, overrideTemplate);
1446
- }
1447
- }
1448
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - foundAttachment ' + foundFileAttachment);
1449
- if (foundFileAttachment) {
1450
- //Files in figshare article have to be status available. Status 'created' means that the file is still being uploaded to the article
1451
- const fileUploadsInProgress = await this.isFileUploadInProgress(config, articleId, articleFileList);
1452
- if (fileUploadsInProgress) {
1453
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - file uploads still in progress');
1454
- }
1455
- const onlyUploadIfSelected = sails.config.figshareAPI.mapping.figshareOnlyPublishSelectedAttachmentFiles;
1456
- for (const attachmentFile of dataLocations) {
1457
- if (!_.isUndefined(attachmentFile) && !_.isEmpty(attachmentFile) && attachmentFile.type == 'attachment') {
1458
- this.logWithLevel(config.logLevel, attachmentFile);
1459
- const attachId = String(attachmentFile.fileId ?? '');
1460
- const fileName = String(attachmentFile.name ?? '');
1461
- const fileSize = _.toNumber(attachmentFile.size);
1462
- if (!attachId || !fileName || !Number.isFinite(fileSize)) {
1463
- continue;
1464
- }
1465
- //check if the file has been uploaded already or not to the figshare article
1466
- articleFileList = await this.getArticleFileList(config, articleId, false);
1467
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - article file list: ' + JSON.stringify(articleFileList));
1468
- const filePendingToBeUploaded = _.find(articleFileList, ['name', fileName]);
1469
- const fileFullPath = filePath + '/' + fileName;
1470
- const thresholdAppliedFileSize = fileSize + sails.config.figshareAPI.diskSpaceThreshold;
1471
- if (_.isUndefined(filePendingToBeUploaded) && !fileUploadsInProgress && ((onlyUploadIfSelected && _.get(attachmentFile, 'selected', false)) || !onlyUploadIfSelected)) {
1472
- //if file name not found on the articleFileList means it's not yet uploaded and an agenda queue job needs to be queued
1473
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - attachmentsTempDir ' + sails.config.figshareAPI.attachmentsTempDir);
1474
- const diskSpace = await checkDiskSpace(sails.config.figshareAPI.attachmentsTempDir);
1475
- this.logWithLevel(config.logLevel, diskSpace);
1476
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - total file size ' + fileSize);
1477
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - total free disk space ' + diskSpace.free);
1478
- if (diskSpace.free > thresholdAppliedFileSize) {
1479
- that.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - saving file to temp location in ${fileFullPath}`);
1480
- that.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - start processing file upload ');
1481
- that.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - fileSize ' + fileSize);
1482
- //Refactor not to use agenda queue and processing only one file at a time per one data publication although concurrent file uploads can
1483
- //happen with different data publication records and once a file upload process is finished it will do a recursive call to this method
1484
- //checkUploadFilesPending to process to process the next file upload to Figshare
1485
- this.processFileUploadToFigshare(config, oid, attachId, String(articleId), record, fileName, fileSize, user, figshareAccountAuthorIDs);
1486
- break;
1487
- }
1488
- else {
1489
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - Not enough free space on disk');
1490
- }
1491
- }
1492
- }
1493
- }
1494
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - fileUploadsInProgress ' + fileUploadsInProgress);
1495
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - articleFileList.length ' + articleFileList.length);
1496
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - countFileAttachments ' + countFileAttachments);
1497
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - figNeedsPublishAfterFileUpload ' + config.figNeedsPublishAfterFileUpload);
1498
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - recordAllFilesUploaded ' + sails.config.figshareAPI.mapping.recordAllFilesUploaded);
1499
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - articleFileList: ${JSON.stringify(articleFileList)}`);
1500
- if (!fileUploadsInProgress && ((articleFileList.length == countFileAttachments && !onlyUploadIfSelected) || ((articleFileList.length - dataLocationsAlreadyUploaded.length) == countFileAttachments && articleFileList.length >= dataLocationsAlreadyUploaded.length && onlyUploadIfSelected))) {
1501
- //Update file embargo info if required
1502
- //Figshare rules allow for full article embargo to be set regardless if there are files uploaded however a file
1503
- //embargo can be set only after at least one file has been successfully uploaded however it's best to allow the
1504
- //file upload process to run it's course and set file embargo after processing of file uploads
1505
- const requestEmbargoBody = this.getEmbargoRequestBody(config, record, figshareAccountAuthorIDs);
1506
- const filesOrURLsAttached = await this.checkArticleHasURLsOrFilesAttached(config, articleId, []);
1507
- const isEmbargoed = this.isRecordEmbargoed(config, requestEmbargoBody, filesOrURLsAttached);
1508
- const isEmbargoCleared = await this.isClearEmbargoNeeded(config, requestEmbargoBody, articleId, articleDetails);
1509
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - final check isEmbargoed ' + isEmbargoed);
1510
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - final check isEmbargoCleared ' + isEmbargoCleared);
1511
- if (isEmbargoed) {
1512
- //validate requestEmbargoBody
1513
- this.validateEmbargoRequestBody(config, record, requestEmbargoBody);
1514
- const embargoDetailsChanged = await this.checkEmbargoDetailsChanged(config, requestEmbargoBody, articleId, articleDetails);
1515
- if (embargoDetailsChanged) {
1516
- const embargoConfig = this.getAxiosConfig(config, 'put', `/account/articles/${articleId}/embargo`, requestEmbargoBody);
1517
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - embargo - ${embargoConfig.method} - ${embargoConfig.url}`);
1518
- const responseEmbargo = await this.requestWithRetry(config, embargoConfig, { label: 'checkUploadFilesPendingEmbargo', logResponse: true });
1519
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - status: ${responseEmbargo.status} statusText: ${responseEmbargo.statusText}`);
1520
- }
1521
- }
1522
- else if (isEmbargoCleared) {
1523
- const embargoDeleteConfig = this.getAxiosConfig(config, 'delete', `/account/articles/${articleId}/embargo`, {});
1524
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - ${embargoDeleteConfig.method} - ${embargoDeleteConfig.url}`);
1525
- const responseEmbargoDelete = await this.requestWithRetry(config, embargoDeleteConfig, { label: 'checkUploadFilesPendingClearEmbargo', logResponse: true });
1526
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending status: ${responseEmbargoDelete.status} statusText: ${responseEmbargoDelete.statusText}`);
1527
- }
1528
- if (config.figNeedsPublishAfterFileUpload) {
1529
- const recordMeta = (record.metaMetadata ?? {});
1530
- this.queuePublishAfterUploadFiles(oid, String(articleId), user, String(recordMeta.brandId ?? ''));
1531
- }
1532
- }
1533
- }
1534
- else {
1535
- const onlyUploadURLIfSelected = sails.config.figshareAPI.mapping.figshareOnlyPublishSelectedLocationURLs;
1536
- let foundURLAttachment = this.isURLAttachmentInDataLocations(dataLocations);
1537
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - before override foundURLAttachment ' + foundURLAttachment);
1538
- //Evaluate project specific rules that can override the need to upload files present in data locations list
1539
- const uploadOverrideConfig = sails.config.figshareAPI.mapping.upload.override;
1540
- if (uploadOverrideConfig && !_.isEmpty(uploadOverrideConfig) && foundURLAttachment) {
1541
- const overrideTemplate = uploadOverrideConfig.template;
1542
- if (overrideTemplate) {
1543
- foundURLAttachment = !!this.getValueFromRecord(config, record, overrideTemplate);
1544
- }
1545
- }
1546
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - foundURLAttachment ' + foundURLAttachment);
1547
- if (foundURLAttachment) {
1548
- for (const attachmentFile of dataLocations) {
1549
- if (!_.isUndefined(attachmentFile) && !_.isEmpty(attachmentFile) && attachmentFile.type == 'url' && ((onlyUploadURLIfSelected && _.get(attachmentFile, 'selected', false)) || !onlyUploadURLIfSelected) && !_.get(attachmentFile, 'ignore', false)) {
1550
- let linkOnlyFileFound = false;
1551
- let linkOnlyId;
1552
- for (const linkOnly of articleFileList) {
1553
- if (linkOnly['is_link_only'] == true) {
1554
- linkOnlyFileFound = true;
1555
- linkOnlyId = linkOnly['id'];
1556
- break;
1557
- }
1558
- }
1559
- if (linkOnlyFileFound) {
1560
- const configDelete = this.getAxiosConfig(config, 'delete', `/account/articles/${articleId}/files/${linkOnlyId}`, {});
1561
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - ${configDelete.method} - ${configDelete.url}`);
1562
- const responseDelete = await this.requestWithRetry(config, configDelete, { label: 'deleteLinkOnlyFile', logResponse: true });
1563
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - responseDelete status: ${responseDelete.status} statusText: ${responseDelete.statusText}`);
1564
- const responseDeleteData = (responseDelete.data ?? {});
1565
- this.logWithLevel(config.logLevel, responseDeleteData);
1566
- }
1567
- const requestBody = {
1568
- link: attachmentFile.location
1569
- };
1570
- const configUpload = this.getAxiosConfig(config, 'post', `/account/articles/${articleId}/files`, requestBody);
1571
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - ${configUpload.method} - ${configUpload.url}`);
1572
- const response = await this.requestWithRetry(config, configUpload, { label: 'uploadLinkOnly', logResponse: true });
1573
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - response link only status: ${response.status} statusText: ${response.statusText}`);
1574
- const responseData = (response.data ?? {});
1575
- this.logWithLevel(config.logLevel, responseData);
1576
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1577
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - response link only ' + responseData.location);
1578
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1579
- //File embargo can be set only if there are file attachments and these have been successfully uploaded
1580
- //therefore if the attachments are sigle URL link then only embargo type article can be set
1581
- const requestEmbargoBody = this.getEmbargoRequestBody(config, record, figshareAccountAuthorIDs);
1582
- const isEmbargoed = this.isRecordEmbargoed(config, requestEmbargoBody, false);
1583
- const isEmbargoCleared = await this.isClearEmbargoNeeded(config, requestEmbargoBody, articleId, articleDetails);
1584
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - in progress check isEmbargoed ' + isEmbargoed);
1585
- this.logWithLevel(config.logLevel, 'FigService - checkUploadFilesPending - in progress check isEmbargoCleared ' + isEmbargoCleared);
1586
- if ((isEmbargoed)) {
1587
- //validate requestEmbargoBody
1588
- this.validateEmbargoRequestBody(config, record, requestEmbargoBody);
1589
- const embargoDetailsChanged = await this.checkEmbargoDetailsChanged(config, requestEmbargoBody, articleId, articleDetails);
1590
- if (embargoDetailsChanged) {
1591
- const embargoConfig = this.getAxiosConfig(config, 'put', `/account/articles/${articleId}/embargo`, requestEmbargoBody);
1592
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending update embargo - ${embargoConfig.method} - ${embargoConfig.url}`);
1593
- const responseEmbargo = await this.requestWithRetry(config, embargoConfig, { label: 'uploadLinkOnlyEmbargo', logResponse: true });
1594
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - status: ${responseEmbargo.status} statusText: ${responseEmbargo.statusText}`);
1595
- }
1596
- }
1597
- else if (isEmbargoCleared) {
1598
- const embargoDeleteConfig = this.getAxiosConfig(config, 'delete', `/account/articles/${articleId}/embargo`, {});
1599
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending clear embargo - ${embargoDeleteConfig.method} - ${embargoDeleteConfig.url}`);
1600
- const responseEmbargoDelete = await this.requestWithRetry(config, embargoDeleteConfig, { label: 'uploadLinkOnlyClearEmbargo', logResponse: true });
1601
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending status: ${responseEmbargoDelete.status} statusText: ${responseEmbargoDelete.statusText}`);
1602
- }
1603
- if (config.figNeedsPublishAfterFileUpload) {
1604
- //https://docs.figshare.com/#private_article_publish
1605
- const requestBodyPublishAfterFileUploads = this.getPublishRequestBody(config, figshareAccountAuthorIDs);
1606
- this.logWithLevel(config.logLevel, `FigService - publish checkUploadFilesPending requestBodyPublishAfterFileUploads ${JSON.stringify(requestBodyPublishAfterFileUploads)}`);
1607
- const publishConfig = this.getAxiosConfig(config, 'post', `/account/articles/${articleId}/publish`, requestBodyPublishAfterFileUploads);
1608
- this.logWithLevel(config.logLevel, `FigService - publish checkUploadFilesPending ${publishConfig.method} - ${publishConfig.url}`);
1609
- let responsePublish = { status: '', statusText: '' };
1610
- this.logWithLevel(config.logLevel, `FigService - linkOnlyFileFound publish checkUploadFilesPending status: ${responsePublish.status} statusText: ${responsePublish.statusText}`);
1611
- responsePublish = await this.requestWithRetry(config, publishConfig, { label: 'publishLinkOnly', logResponse: true });
1612
- this.logWithLevel(config.logLevel, `FigService - publish checkUploadFilesPending status: ${responsePublish.status} statusText: ${responsePublish.statusText}`);
1613
- if (!_.isEmpty(sails.config.figshareAPI.mapping.response.article)) {
1614
- const responseArticleFields = (sails.config.figshareAPI.mapping.response.article || []);
1615
- //articleDetails needs to be retrieved after publish to update handle and doi and other fields that may have been empty
1616
- articleDetails = await this.getArticleDetails(config, articleId);
1617
- this.logVerbose(config, `FigService - checkUploadFilesPending - after publish articleDetails ${JSON.stringify(articleDetails)}`);
1618
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending - after publish mapping.response.article ${JSON.stringify(sails.config.figshareAPI.mapping.response.article)}`);
1619
- for (const field of responseArticleFields) {
1620
- this.setFieldInRecord(config, record, articleDetails, field);
1621
- }
1622
- this.logVerbose(config, `FigService - checkUploadFilesPending record before ${JSON.stringify(record)}`);
1623
- const recordMeta = (record.metaMetadata ?? {});
1624
- const brand = BrandingService.getBrandById(recordMeta.brandId);
1625
- this.logWithLevel(config.logLevel, `FigService - checkUploadFilesPending oid: ${oid} user: ${JSON.stringify(user)}`);
1626
- if (!_.isUndefined(sails.config.figshareAPI.mapping.recordAllFilesUploaded) && !_.isEmpty(sails.config.figshareAPI.mapping.recordAllFilesUploaded)) {
1627
- _.set(record, sails.config.figshareAPI.mapping.recordAllFilesUploaded, 'yes');
1628
- }
1629
- await RecordsService.updateMeta(brand, oid, record, user, false, false);
1630
- }
1631
- }
1632
- break;
1633
- }
1634
- }
1635
- }
1636
- }
1637
- }
1638
- }
436
+ await this.ensureNoFileUploadInProgress(config, record, articleId);
1639
437
  }
1640
438
  catch (error) {
1641
- this.logWithLevel(config.logLevel, `FigService - publish checkUploadFilesPending error: ${JSON.stringify(error)}`);
1642
- sails.log.error(error);
1643
- }
1644
- }
1645
- //Fixed version, unminified and ES6'ed
1646
- //taken from SO
1647
- //https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript
1648
- formatBytes(bytes, decimals = 2) {
1649
- if (bytes === 0)
1650
- return '0 Bytes';
1651
- const k = 1024;
1652
- const dm = decimals < 0 ? 0 : decimals;
1653
- const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
1654
- const i = Math.floor(Math.log(bytes) / Math.log(k));
1655
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
1656
- }
1657
- async processFileUploadToFigshare(config, oid, attachId, articleId, record, fileName, fileSize, user, figshareAccountAuthorIDs = undefined) {
1658
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - enter');
1659
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - oid ' + oid);
1660
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - attachId ' + attachId);
1661
- this.logWithLevel(config.logLevel, attachId);
1662
- const filePath = sails.config.figshareAPI.attachmentsFigshareTempDir;
1663
- const fileFullPath = filePath + '/' + fileName;
1664
- this.logWithLevel(config.logLevel, record);
1665
- const dataLocations = _.get(record, config.dataLocationsPathInRecord) || [];
1666
- //Print the list of files in the dataPublication record
1667
- for (const attachmentFile of dataLocations) {
1668
- this.logWithLevel(config.logLevel, attachmentFile);
1669
- }
1670
- try {
1671
- const file = fs.createWriteStream(fileFullPath);
1672
- try {
1673
- const response = await this.datastreamService.getDatastream(oid, attachId);
1674
- const readStream = response.readstream;
1675
- if (readStream) {
1676
- await new Promise((resolve, reject) => {
1677
- readStream.pipe(file);
1678
- readStream.on("error", (err) => {
1679
- reject(err);
1680
- });
1681
- readStream.on("close", () => {
1682
- resolve(file);
1683
- });
1684
- });
1685
- }
1686
- }
1687
- catch (err) {
1688
- sails.log.error('FigService - processFileUploadToFigshare ' + JSON.stringify(err));
1689
- }
1690
- const fileStats = fs.statSync(fileFullPath);
1691
- const aproxFileSize = this.formatBytes(fileStats.size);
1692
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - fileFullPath ' + fileFullPath + ' aproxFileSize ' + aproxFileSize);
1693
- if (fs.existsSync(fileFullPath) && fileStats.size > 0) {
1694
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - file saved to ' + fileFullPath);
1695
- let uploadURL = '';
1696
- let uploadParts = [];
1697
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - articleId ' + articleId);
1698
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - fileName ' + fileName);
1699
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - filePath ' + filePath);
1700
- const requestStep1 = {
1701
- impersonate: 0,
1702
- name: fileName,
1703
- size: fileSize
1704
- };
1705
- this.setFieldByNameInRequestBody(config, record, requestStep1, sails.config.figshareAPI.mapping.upload.attachments, 'impersonate', figshareAccountAuthorIDs);
1706
- const configStep1 = this.getAxiosConfig(config, 'post', `/account/articles/${articleId}/files`, requestStep1);
1707
- this.logWithLevel(config.logLevel, `FigService - processFileUploadToFigshare - ${configStep1.method} - ${configStep1.url}`);
1708
- const responseStep1 = await this.requestWithRetry(config, configStep1, { label: 'uploadFileStep1', logResponse: true });
1709
- this.logWithLevel(config.logLevel, `FigService - processFileUploadToFigshare- response step 1 status: ${responseStep1.status} statusText: ${responseStep1.statusText}`);
1710
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1711
- const responseStep1Data = (responseStep1.data ?? {});
1712
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - response step 1 ' + responseStep1Data.location);
1713
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1714
- //example reply
1715
- /*
1716
- {
1717
- "location": "https://api.figsh.com/v2/account/articles/7554216/files/829883224"
1718
- }
1719
- */
1720
- const uploadFileLocation = responseStep1Data.location;
1721
- const figAccessToken = 'token ' + config.apiToken;
1722
- const figHeaders = {
1723
- 'Content-Type': 'application/json',
1724
- 'Authorization': figAccessToken
1725
- };
1726
- const configStep2 = {
1727
- method: 'get',
1728
- url: uploadFileLocation,
1729
- headers: figHeaders
1730
- };
1731
- this.logWithLevel(config.logLevel, `FigService - processFileUploadToFigshare - ${configStep2.method} - ${configStep2.url}`);
1732
- const responseStep2 = await this.requestWithRetry(config, configStep2, { label: 'uploadFileStep2', logResponse: true });
1733
- this.logWithLevel(config.logLevel, `FigService - processFileUploadToFigshare - response step 2 status: ${responseStep2.status} statusText: ${responseStep2.statusText}`);
1734
- const responseStep2Data = (responseStep2.data ?? {});
1735
- uploadURL = responseStep2Data.upload_url || '';
1736
- const fileId = responseStep2Data.id;
1737
- //example reply
1738
- /*
1739
- {
1740
- "upload_token": "563297df-249f-48a7-a7a2-80aa25af12b4",
1741
- "upload_url": "https://fup1010100.figsh.com/upload/563297df-249f-48a7-a7a2-80aa25af12b4",
1742
- "status": "created",
1743
- "preview_state": "preview_not_available",
1744
- "viewer_type": "",
1745
- "id": 829883224,
1746
- "name": "Untitled4.png",
1747
- "size": 18850,
1748
- "is_link_only": false,
1749
- "download_url": "https://ndownloader.figsh.com/files/829883224",
1750
- "supplied_md5": "0c13924e817babc9afb2a1bcdec72067",
1751
- "computed_md5": ""
1752
- }
1753
- */
1754
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1755
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - response step 2 - id ' + fileId + ' - url ' + uploadURL);
1756
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1757
- const configStep3 = {
1758
- method: 'get',
1759
- url: uploadURL,
1760
- headers: figHeaders
1761
- };
1762
- this.logWithLevel(config.logLevel, `FigService - processFileUploadToFigshare - ${configStep3.method} - ${configStep3.url}`);
1763
- const responseStep3 = await this.requestWithRetry(config, configStep3, { label: 'uploadFileStep3', logResponse: true });
1764
- this.logWithLevel(config.logLevel, `FigService - processFileUploadToFigshare - response step 3 status: ${responseStep3.status} statusText: ${responseStep3.statusText}`);
1765
- const responseStep3Data = (responseStep3.data ?? {});
1766
- uploadParts = responseStep3Data.parts || [];
1767
- //example reply
1768
- /*
1769
- {
1770
- "token": "563297df-249f-48a7-a7a2-80aa25af12b4",
1771
- "md5": "0c13924e817babc9afb2a1bcdec72067",
1772
- "size": 18850,
1773
- "name": "829883224/Untitled4.png",
1774
- "status": "PENDING",
1775
- "parts": [
1776
- {
1777
- "partNo": 1,
1778
- "startOffset": 0,
1779
- "endOffset": 18849,
1780
- "status": "PENDING",
1781
- "locked": false
1782
- }
1783
- ]
1784
- }
1785
- */
1786
- const totalParts = uploadParts.length;
1787
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - uploadParts.length ' + totalParts);
1788
- if (!_.isUndefined(uploadParts) && uploadParts.length > 0) {
1789
- if (uploadParts.length > 0) {
1790
- for (const part of uploadParts) {
1791
- const partNo = _.toNumber(part.partNo);
1792
- const startReadByte = _.toNumber(part.startOffset);
1793
- const endReadByte = _.toNumber(part.endOffset);
1794
- // let chunkSize = endReadByte - startReadByte + 1;
1795
- const readStreamConfig = {
1796
- start: startReadByte,
1797
- end: endReadByte
1798
- };
1799
- //https://stackoverflow.com/questions/30386768/is-createreadstream-asynchronous
1800
- //Based on the above SO question/answer await cannot be used here because It does not
1801
- //return a promise or accept a callback or accept a callback but it's also not required
1802
- const bufferChunk = fs.createReadStream(fileFullPath, readStreamConfig);
1803
- this.logWithLevel(config.logLevel, 'FigService - processFileUploadToFigshare - createReadStream end - totalParts ' + totalParts + ' partNo ' + partNo + ' fileName ' + fileName);
1804
- const paramsImpersonate = {
1805
- impersonate: 0
1806
- };
1807
- this.setFieldByNameInRequestBody(config, record, paramsImpersonate, sails.config.figshareAPI.mapping.upload.attachments, 'impersonate', figshareAccountAuthorIDs);
1808
- const configStep4 = {
1809
- headers: {
1810
- 'Content-Type': 'application/octet-stream',
1811
- 'Authorization': 'Token ' + config.apiToken
1812
- },
1813
- maxContentLength: Infinity,
1814
- maxBodyLength: Infinity,
1815
- method: 'put',
1816
- params: paramsImpersonate,
1817
- url: `${uploadURL}/${partNo}`,
1818
- data: bufferChunk
1819
- };
1820
- this.logWithLevel(config.logLevel, `FigService - processFilePartUploadToFigshare - ${configStep4.method} - ${configStep4.url}`);
1821
- //this is when the read stream or file or bufferChunk is open and read therefore this is the only await that is required
1822
- const responseStep4 = await this.requestWithRetry(config, configStep4, { label: 'uploadFileStep4', logResponse: true });
1823
- this.logWithLevel(config.logLevel, `FigService - processFilePartUploadToFigshare - response step 4 status: ${responseStep4.status} statusText: ${responseStep4.statusText}`);
1824
- this.logWithLevel(config.logLevel, 'FigService - processFilePartUploadToFigshare - uploaded file chunk totalParts ' + totalParts + ' partNo ' + partNo + ' fileName ' + fileName);
1825
- }
1826
- //complete upload step 5
1827
- const requestBodyComplete = { impersonate: 0 };
1828
- this.logWithLevel(config.logLevel, `FigService - processFilePartUploadToFigshare - before complete file upload`);
1829
- this.setFieldByNameInRequestBody(config, record, requestBodyComplete, sails.config.figshareAPI.mapping.upload.attachments, 'impersonate', figshareAccountAuthorIDs);
1830
- this.logWithLevel(config.logLevel, `FigService - processFilePartUploadToFigshare requestBodyComplete - ${JSON.stringify(requestBodyComplete)}`);
1831
- const configStep5 = this.getAxiosConfig(config, 'post', `/account/articles/${articleId}/files/${fileId}`, requestBodyComplete);
1832
- this.logWithLevel(config.logLevel, `FigService - processFilePartUploadToFigshare - ${configStep5.method} - ${configStep5.url}`);
1833
- const responseStep5 = await this.requestWithRetry(config, configStep5, { label: 'uploadFileStep5', logResponse: true });
1834
- this.logWithLevel(config.logLevel, `FigService - processFilePartUploadToFigshare - response step 5 status: ${responseStep5.status} statusText: ${responseStep5.statusText}`);
1835
- sails.log.info(`FigService - processFilePartUploadToFigshare - file upload completed articleId ${articleId} totalParts ${totalParts} fileName ${fileName}`);
1836
- //Delete the file from the temp directory
1837
- fs.unlinkSync(fileFullPath);
1838
- }
1839
- }
439
+ if (!(error instanceof RBValidationError_1.RBValidationError)) {
440
+ this.failIntegrationAudit(auditCtx, error, {
441
+ message: 'Figshare publish-after-uploads job failed while checking upload status.',
442
+ errorDetail: error instanceof Error ? error.message : String(error),
443
+ responseSummary: {
444
+ articleId,
445
+ correlationId: `${oid}:publish-job`,
446
+ phase: 'verify-upload-status',
447
+ },
448
+ });
449
+ throw error;
1840
450
  }
1841
- else {
1842
- sails.log.info(`FigService - processFileUploadToFigshare - filePath ${fileFullPath} not found articleId ${articleId}`);
451
+ sails.log.warn(`FigService - article '${articleId}' still has uploads in progress, rescheduling deferred publish`, error);
452
+ try {
453
+ this.queuePublishAfterUploadFiles(oid, articleId, user, brandId);
454
+ this.completeIntegrationAudit(auditCtx, {
455
+ message: 'Figshare publish-after-uploads job rescheduled because file uploads are still in progress.',
456
+ responseSummary: {
457
+ articleId,
458
+ correlationId: `${oid}:publish-job`,
459
+ phase: 'publish',
460
+ rescheduled: true,
461
+ },
462
+ });
463
+ return;
1843
464
  }
1844
- }
1845
- catch (error) {
1846
- sails.log.error(error);
1847
- if (fs.existsSync(fileFullPath)) {
1848
- fs.unlinkSync(fileFullPath);
465
+ catch (queueError) {
466
+ this.failIntegrationAudit(auditCtx, queueError, {
467
+ message: 'Figshare publish-after-uploads job could not be rescheduled while uploads were still in progress.',
468
+ errorDetail: queueError instanceof Error ? queueError.message : String(queueError),
469
+ responseSummary: {
470
+ articleId,
471
+ correlationId: `${oid}:publish-job`,
472
+ phase: 'publish',
473
+ rescheduled: false,
474
+ },
475
+ });
476
+ throw queueError;
1849
477
  }
1850
478
  }
1851
- //After successful or failure of uploading a file still check if there are other files pending to be uploaded to figshare
1852
- this.checkUploadFilesPending(config, record, oid, user, figshareAccountAuthorIDs);
1853
- return record;
1854
- }
1855
- async deleteFilesAndUpdateDataLocationEntries(config, record, oid) {
1856
479
  try {
1857
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1858
- this.logWithLevel(config.logLevel, 'FigService - deleteFilesAndUpdateDataLocationEntries - enter');
1859
- this.logWithLevel(config.logLevel, 'FigService - -------------------------------------------');
1860
- let articleId;
1861
- if (_.has(record, config.figArticleIdPathInRecord) && !_.isUndefined(_.get(record, config.figArticleIdPathInRecord)) &&
1862
- _.get(record, config.figArticleIdPathInRecord) > 0) {
1863
- articleId = _.get(record, config.figArticleIdPathInRecord);
1864
- this.logWithLevel(config.logLevel, 'FigService - deleteFilesAndUpdateDataLocationEntries - metadata.figshare_article_id ' + articleId);
1865
- }
1866
- else {
1867
- articleId = 0;
1868
- }
1869
- this.logWithLevel(config.logLevel, 'FigService - deleteFilesAndUpdateDataLocationEntries - articleId ' + articleId);
1870
- this.logWithLevel(config.logLevel, 'FigService - deleteFilesAndUpdateDataLocationEntries - oid ' + oid);
1871
- if (articleId > 0) {
1872
- const articleFileList = await this.getArticleFileList(config, articleId);
1873
- const dataLocations = _.get(record, config.dataLocationsPathInRecord) || [];
1874
- const urlList = [];
1875
- //delete files from redbox
1876
- for (const attachmentFile of dataLocations) {
1877
- if (!_.isUndefined(attachmentFile) && !_.isEmpty(attachmentFile) && _.has(attachmentFile, 'fileId')) {
1878
- const figFileDetails = _.find(articleFileList, ['name', attachmentFile['name']]);
1879
- if (!_.isUndefined(figFileDetails)) {
1880
- urlList.push(figFileDetails);
1881
- this.logWithLevel(config.logLevel, attachmentFile);
1882
- await this.datastreamService.removeDatastream(oid, attachmentFile);
1883
- }
1884
- }
1885
- }
1886
- if (!_.isEmpty(urlList)) {
1887
- //update entries in data location widget to point to the Figshare URL
1888
- for (const fileUrl of urlList) {
1889
- this.logWithLevel(config.logLevel, fileUrl);
1890
- const fileName = fileUrl['name'];
1891
- const fileNameNotes = 'File name: ' + fileName;
1892
- const newUrl = { type: 'url', location: fileUrl['download_url'], notes: fileNameNotes, originalFileName: fileName, ignore: true };
1893
- if (sails.config.figshareAPI.mapping.figshareOnlyPublishSelectedAttachmentFiles) {
1894
- _.set(newUrl, 'selected', true);
1895
- }
1896
- this.logWithLevel(config.logLevel, newUrl);
1897
- //remove existing entry to the file attachment
1898
- const locationList = _.get(record, config.dataLocationsPathInRecord) || [];
1899
- _.remove(locationList, ['name', fileName]);
1900
- //add new entry as URL to the same file already uploaded to Figshare
1901
- locationList.push(newUrl);
1902
- _.set(record, config.dataLocationsPathInRecord, locationList);
1903
- }
1904
- }
1905
- }
480
+ const publishResult = await client.publishArticle(articleId, {});
481
+ const article = await client.getArticle(articleId);
482
+ const updatedRecord = this.writeBack(record, article, publishResult);
483
+ await this.persistSyncRecord(oid, updatedRecord, user);
484
+ this.completeIntegrationAudit(auditCtx, {
485
+ message: 'Figshare publish-after-uploads job completed successfully.',
486
+ responseSummary: {
487
+ articleId,
488
+ correlationId: `${oid}:publish-job`,
489
+ publishResult,
490
+ },
491
+ });
1906
492
  }
1907
493
  catch (error) {
1908
- sails.log.error(error);
1909
- }
1910
- return record;
1911
- }
1912
- async isArticleInExpectedState(config, articleId, figshareTargetFieldKey, figshareTargetFieldValue) {
1913
- const prefix = "FigService -";
1914
- if (!articleId?.toString()?.trim()) {
1915
- sails.log.error(`${prefix} the article id '${articleId}' is not valid`);
1916
- return false;
494
+ this.failIntegrationAudit(auditCtx, error, {
495
+ message: 'Figshare publish-after-uploads job failed.',
496
+ errorDetail: error instanceof Error ? error.message : String(error),
497
+ responseSummary: {
498
+ articleId,
499
+ correlationId: `${oid}:publish-job`,
500
+ phase: 'publish',
501
+ },
502
+ });
503
+ throw error;
1917
504
  }
1918
- // Check if the figshare item has expected property key and value.
1919
- const articleDetails = await this.getArticleDetails(config, articleId);
1920
- const figshareFieldValue = _.get(articleDetails, figshareTargetFieldKey, null);
1921
- const figshareFieldValueMatches = figshareFieldValue !== null && figshareFieldValue === figshareTargetFieldValue;
1922
- if (!figshareFieldValueMatches) {
1923
- sails.log.warn(`${prefix} the article id '${articleId}' item property '${figshareTargetFieldKey}' value '${JSON.stringify(figshareFieldValue)}' is not '${JSON.stringify(figshareTargetFieldValue)}'`);
1924
- return false;
505
+ try {
506
+ this.queueDeleteFiles(oid, user, brandId, articleId);
1925
507
  }
1926
- // Exclude figshare items that have in progress uploads.
1927
- const articleFileList = await this.getArticleFileList(config, articleId, false);
1928
- const figshareIsUploadInProgressResult = await this.isFileUploadInProgress(config, articleId, articleFileList);
1929
- if (figshareIsUploadInProgressResult) {
1930
- sails.log.warn(`${prefix} the article id '${articleId}' has an upload in progress`);
1931
- return false;
508
+ catch (error) {
509
+ sails.log.warn(`FigService - unable to queue uploaded file cleanup after successful publish for oid ${oid}`, error);
1932
510
  }
1933
- sails.log.debug(`${prefix} the article id '${articleId}' item property '${figshareTargetFieldKey}' value '${JSON.stringify(figshareFieldValue)}' matches expected value '${JSON.stringify(figshareTargetFieldValue)}'`);
1934
- return true;
1935
511
  }
1936
- async transitionRecordWorkflowFromFigshareArticleProperties(config, brand, user, oid, articleId, targetStep, figshareTargetFieldKey, figshareTargetFieldValue) {
1937
- const prefix = "FigService -";
1938
- const msgPartial = `record oid '${oid}' with figshare article id '${articleId}' to step '${targetStep}'`;
1939
- if (!oid) {
1940
- sails.log.error(`${prefix} cannot transition ${msgPartial} because the record oid is not valid`);
1941
- return;
1942
- }
1943
- const isArticleInExpectedState = await this.isArticleInExpectedState(config, articleId, figshareTargetFieldKey, figshareTargetFieldValue);
1944
- if (!isArticleInExpectedState) {
1945
- sails.log.warn(`${prefix} cannot transition ${msgPartial} because the linked article is not in the required state`);
512
+ async deleteFilesFromRedbox(job) {
513
+ const data = job?.attrs?.data;
514
+ if (data == null || (data.oid == null && data.articleId == null)) {
1946
515
  return;
1947
516
  }
1948
- // --> If there are any ReDBox records in stage queued that the corresponding Figshare item
1949
- // status is public then move the dataPublication record to stage 'targetStep'
1950
- // The automated processing of ReDBox dataPublication records should be equivalent to the
1951
- // action performed by the user.
1952
- // The process to replicate is when a user manually opens a data publication in stage queued,
1953
- // and then they click Submit for publication button.
1954
- const currentRec = await RecordsService.getMeta(oid);
1955
- const userRoles = (user.roles ?? []);
1956
- const hasEditAccess = await RecordsService.hasEditAccess(brand, user, userRoles, currentRec);
1957
- if (!hasEditAccess) {
1958
- sails.log.warn(`${prefix} cannot transition ${msgPartial} because user '${user}' does not have edit permission`);
517
+ const oid = data.oid ?? '';
518
+ const articleId = data.articleId ?? '';
519
+ const user = data.user;
520
+ if (!oid.trim()) {
1959
521
  return;
1960
522
  }
1961
- const recordType = await RecordTypesService.get(brand, currentRec.metaMetadata.type).toPromise();
1962
- if (!recordType) {
1963
- sails.log.warn(`${prefix} cannot transition ${msgPartial} because record type is missing`);
523
+ let record = await RecordsService.getMeta(oid);
524
+ const config = this.getConfig(record);
525
+ if (config == null) {
1964
526
  return;
1965
527
  }
1966
- const nextStepResp = await WorkflowStepsService.get(recordType, targetStep).toPromise();
1967
- const metadata = currentRec.metadata;
1968
- const recordUpdateResult = await RecordsService.updateMeta(brand, oid, currentRec, user, true, true, nextStepResp, metadata);
1969
- const isSuccessful = _.get(recordUpdateResult, 'success', true)?.toString() === 'true';
1970
- if (isSuccessful) {
1971
- sails.log.info(`${prefix} updated ${msgPartial}`);
1972
- }
1973
- else {
1974
- sails.log.error(`${prefix} failed to update ${msgPartial}: ${JSON.stringify(recordUpdateResult)}`);
1975
- }
1976
- }
1977
- //This method has been designed to be called by a pre save trigger that executes after a user has performed an action
1978
- //In example when a record is moved from one workflow state to another and the trigger conditons are met
1979
- createUpdateFigshareArticle(oid, record, options, user) {
1980
- const config = this.getRuntimeConfig();
1981
- sails.log.info(`FigService - createUpdateFigshareArticle - log level ${config.logLevel}`);
1982
- const recordObj = record;
1983
- if (this.metTriggerCondition(oid, recordObj, options, user) === 'true') {
1984
- return this.sendDataPublicationToFigshare(recordObj);
1985
- }
1986
- else {
1987
- return record;
1988
- }
1989
- }
1990
- //This method has been designed to be called by a post save trigger that executes after a user has performed an action
1991
- //In example when a record is moved from one workflow state to another and the trigger conditons are met
1992
- uploadFilesToFigshareArticle(oid, record, options, user) {
1993
- const config = this.getRuntimeConfig();
1994
- sails.log.info(`FigService - uploadFilesToFigshareArticle - log level ${config.logLevel}`);
1995
- const recordObj = record;
1996
- if (this.metTriggerCondition(oid, recordObj, options, user) === 'true') {
1997
- this.logWithLevel(config.logLevel, 'FigService - uploadFilesToFigshareArticle - enter');
1998
- this.logWithLevel(config.logLevel, 'FigService - uploadFilesToFigshareArticle - oid ' + oid);
1999
- this.checkUploadFilesPending(config, recordObj, oid, user);
2000
- }
2001
- }
2002
- //This method has been designed to be called by a pre save trigger that executes after a user has performed an action
2003
- //In example when a record is moved from one workflow state to another and the trigger conditons are met
2004
- deleteFilesFromRedboxTrigger(oid, record, options, user) {
2005
- const config = this.getRuntimeConfig();
2006
- sails.log.info(`FigService - deleteFilesFromRedboxTrigger - log level ${config.logLevel}`);
2007
- const recordObj = record;
2008
- if (this.metTriggerCondition(oid, recordObj, options, user) === 'true') {
2009
- return this.deleteFilesAndUpdateDataLocationEntries(config, recordObj, oid);
2010
- }
2011
- else {
2012
- return record;
2013
- }
528
+ record = await this.cleanupUploadedFiles(record, articleId);
529
+ await this.persistSyncRecord(oid, record, user);
2014
530
  }
2015
- //This method will be called automatically when the setting figshareNeedsPublishAfterFileUpload is set to true
2016
- //and will be called by a scheduled agendaQueue job
2017
- async publishAfterUploadFilesJob(job) {
2018
- const jobAttrs = (job.attrs ?? {});
2019
- const data = (jobAttrs.data ?? {});
2020
- const config = this.getRuntimeConfig();
2021
- this.logWithLevel(config.logLevel, 'FigService - publishAfterUploadFilesJob - data ' + JSON.stringify(data));
2022
- if (!_.isUndefined(data) && !_.isNull(data) && !_.isEmpty(data)) {
2023
- const oid = String(data.oid ?? '');
2024
- const articleId = String(data.articleId ?? '');
2025
- const user = data.user;
2026
- const brandId = String(data.brandId ?? '');
2027
- //https://docs.figshare.com/#private_article_publish
2028
- const record = await RecordsService.getMeta(oid);
2029
- let figshareAccountAuthorIDs = [];
2030
- if (!_.isEmpty(sails.config.figshareAPI.testUsers)) {
2031
- figshareAccountAuthorIDs = sails.config.figshareAPI.testUsers;
2032
- }
2033
- else {
2034
- const contributorsDP = this.getContributorsFromRecord(config, record);
2035
- figshareAccountAuthorIDs = await this.getAuthorUserIDs(config, contributorsDP);
2036
- }
2037
- const requestBodyPublishAfterFileUploads = this.getPublishRequestBody(config, figshareAccountAuthorIDs);
2038
- this.logWithLevel(config.logLevel, `FigService - publish publishAfterUploadFilesJob requestBodyPublishAfterFileUploads ${JSON.stringify(requestBodyPublishAfterFileUploads)}`);
2039
- const publishConfig = this.getAxiosConfig(config, 'post', `/account/articles/${articleId}/publish`, requestBodyPublishAfterFileUploads);
2040
- this.logWithLevel(config.logLevel, `FigService - publish publishAfterUploadFiles ${publishConfig.method} - ${publishConfig.url}`);
2041
- let responsePublish = { status: '', statusText: '' };
2042
- try {
2043
- this.logWithLevel(config.logLevel, `FigService - publishAfterUploadFiles - all file uploads finished starting publishing`);
2044
- responsePublish = await this.requestWithRetry(config, publishConfig, { label: 'publishAfterUploadFilesJob', logResponse: true });
2045
- this.logWithLevel(config.logLevel, `FigService - publish publishAfterUploadFiles status: ${responsePublish.status} statusText: ${responsePublish.statusText}`);
2046
- this.queueDeleteFiles(oid, user, brandId, articleId);
2047
- }
2048
- catch (error) {
2049
- this.logWithLevel(config.logLevel, `FigService - publish publishAfterUploadFiles error: ${responsePublish.status} statusText: ${responsePublish.statusText}`);
2050
- this.logWithLevel(config.logLevel, `FigService - publish publishAfterUploadFiles error: ${JSON.stringify(error)}`);
2051
- this.logWithLevel(config.logLevel, error);
2052
- }
2053
- }
2054
- }
2055
- //This method will be called automatically when the setting figshareNeedsPublishAfterFileUpload is set to true
2056
- //and will be called by a scheduled agendaQueue job
2057
- async deleteFilesFromRedbox(job) {
2058
- const jobAttrs = (job.attrs ?? {});
2059
- const data = (jobAttrs.data ?? {});
2060
- const config = this.getRuntimeConfig();
2061
- this.logWithLevel(config.logLevel, 'FigService - deleteFilesFromRedbox - data ' + JSON.stringify(data));
2062
- if (!_.isUndefined(data) && !_.isNull(data) && !_.isEmpty(data)) {
2063
- try {
2064
- sails.log.info(`FigService - deleteFilesFromRedbox - log level ${config.logLevel}`);
2065
- const oid = String(data.oid ?? '');
2066
- this.logWithLevel(config.logLevel, `FigService - deleteFilesFromRedbox record oid ${oid}`);
2067
- let record = (await RecordsService.getMeta(oid));
2068
- this.logWithLevel(config.logLevel, `FigService - deleteFilesFromRedbox record before ${JSON.stringify(record)}`);
2069
- record = await this.deleteFilesAndUpdateDataLocationEntries(config, record, oid);
2070
- this.logWithLevel(config.logLevel, `FigService - deleteFilesFromRedbox record after ${JSON.stringify(record)}`);
2071
- const brandId = String(data.brandId ?? '');
2072
- this.logWithLevel(config.logLevel, `FigService - deleteFilesFromRedbox record brandId ${brandId}`);
2073
- const brand = BrandingService.getBrandById(brandId);
2074
- this.logWithLevel(config.logLevel, `FigService - deleteFilesFromRedbox oid: ${oid} user: ${JSON.stringify(data.user)}`);
2075
- if (!_.isUndefined(sails.config.figshareAPI.mapping.recordAllFilesUploaded) && !_.isEmpty(sails.config.figshareAPI.mapping.recordAllFilesUploaded)) {
2076
- _.set(record, sails.config.figshareAPI.mapping.recordAllFilesUploaded, 'yes');
2077
- }
2078
- if (!_.isEmpty(sails.config.figshareAPI.mapping.response.article)) {
2079
- const responseArticleFields = (sails.config.figshareAPI.mapping.response.article || []);
2080
- //articleDetails needs to be retrieved after publish to update handle and doi and other fields that may have been empty
2081
- const articleDetails = await this.getArticleDetails(config, String(data.articleId ?? ''));
2082
- this.logVerbose(config, `FigService - deleteFilesFromRedbox articleDetails ${JSON.stringify(articleDetails)}`);
2083
- this.logWithLevel(config.logLevel, `FigService - deleteFilesFromRedbox - mapping.response.article ${JSON.stringify(sails.config.figshareAPI.mapping.response.article)}`);
2084
- for (const field of responseArticleFields) {
2085
- this.setFieldInRecord(config, record, articleDetails, field);
2086
- }
2087
- this.logVerbose(config, `FigService - deleteFilesFromRedbox record before ${JSON.stringify(record)}`);
2088
- }
2089
- const result = await RecordsService.updateMeta(brand, oid, record, data.user, false, false);
2090
- this.logWithLevel(config.logLevel, 'FigService - deleteFilesFromRedbox - result ' + JSON.stringify(result));
2091
- }
2092
- catch (error) {
2093
- this.logWithLevel(config.logLevel, `FigService - deleteFilesFromRedbox error: ${JSON.stringify(error)}`);
2094
- this.logWithLevel(config.logLevel, error);
2095
- }
2096
- }
2097
- }
2098
- //This method will be called automatically when the setting figshareNeedsPublishAfterFileUpload is set to true
2099
- //and will be scheduled after all the file uploads have been finished successfully for a particular article
2100
531
  queuePublishAfterUploadFiles(oid, articleId, user, brandId) {
532
+ const queueMessage = (0, queue_1.buildPublishAfterUploadsMessage)(oid, articleId, user, brandId);
2101
533
  const jobName = 'Figshare-PublishAfterUpload-Service';
2102
- const queueMessage = {
2103
- oid: oid,
2104
- articleId: articleId,
2105
- user: user,
2106
- brandId: brandId
534
+ const record = {
535
+ metaMetadata: { brandId }
2107
536
  };
2108
- const config = this.getRuntimeConfig();
2109
- this.logWithLevel(config.logLevel, `FigService - queuePublishAfterUploadFiles - Queueing up trigger using jobName ${jobName}`);
2110
- this.logWithLevel(config.logLevel, 'FigService - queuePublishAfterUploadFiles - queueMessage ' + JSON.stringify(queueMessage));
2111
- const scheduleIn = _.get(sails.config.figshareAPI.mapping.schedulePublishAfterUploadJob, 'in 2 minutes');
2112
- this.logWithLevel(config.logLevel, 'FigService - queuePublishAfterUploadFiles - scheduleIn ' + scheduleIn);
2113
- if (scheduleIn == 'immediate') {
2114
- this.queueService.now(jobName, queueMessage);
537
+ const config = this.getConfig(record);
538
+ const scheduleIn = String(config?.queue.publishAfterUploadDelay ?? 'in 2 minutes');
539
+ if (scheduleIn === 'immediate') {
540
+ AgendaQueueService.now(jobName, queueMessage);
2115
541
  }
2116
542
  else {
2117
- this.queueService.schedule(jobName, scheduleIn, queueMessage);
543
+ AgendaQueueService.schedule(jobName, scheduleIn, queueMessage);
2118
544
  }
2119
545
  }
2120
- //This method will be called automatically when the setting figshareNeedsPublishAfterFileUpload is set to true
2121
- //and will be scheduled after the Figshare-PublishAfterUpload-Service job has finished
2122
546
  queueDeleteFiles(oid, user, brandId, articleId) {
547
+ const queueMessage = (0, queue_1.buildDeleteFilesMessage)(oid, user, brandId, articleId);
2123
548
  const jobName = 'Figshare-UploadedFilesCleanup-Service';
2124
- const queueMessage = {
2125
- oid: oid,
2126
- user: user,
2127
- brandId: brandId,
2128
- articleId: articleId
549
+ const record = {
550
+ metaMetadata: { brandId }
2129
551
  };
2130
- const config = this.getRuntimeConfig();
2131
- this.logWithLevel(config.logLevel, `FigService - queueDeleteFiles - Queueing up trigger using jobName ${jobName}`);
2132
- this.logWithLevel(config.logLevel, 'FigService - queueDeleteFiles - queueMessage ' + JSON.stringify(queueMessage));
2133
- const scheduleIn = _.get(sails.config.figshareAPI.mapping.scheduleUploadedFilesCleanupJob, 'in 5 minutes');
2134
- this.logWithLevel(config.logLevel, 'FigService - queueDeleteFiles - scheduleIn ' + scheduleIn);
2135
- if (scheduleIn == 'immediate') {
2136
- this.queueService.now(jobName, queueMessage);
552
+ const config = this.getConfig(record);
553
+ const scheduleIn = String(config?.queue.uploadedFilesCleanupDelay ?? 'in 5 minutes');
554
+ if (scheduleIn === 'immediate') {
555
+ AgendaQueueService.now(jobName, queueMessage);
2137
556
  }
2138
557
  else {
2139
- this.queueService.schedule(jobName, scheduleIn, queueMessage);
558
+ AgendaQueueService.schedule(jobName, scheduleIn, queueMessage);
2140
559
  }
2141
560
  }
2142
561
  async transitionRecordWorkflowFromFigshareArticlePropertiesJob(_job) {
2143
- const prefix = "FigService -";
2144
- const config = this.getRuntimeConfig();
562
+ const defaultConfig = this.getConfig({ metaMetadata: { brandId: 'default' } });
563
+ const jobConfig = (defaultConfig?.workflow.transitionJob ?? {});
564
+ if (!(0, workflow_1.shouldRunWorkflowTransitionJob)(jobConfig)) {
565
+ sails.log.info('FigService - transitionRecordWorkflowFromFigshareArticlePropertiesJob is disabled by config');
566
+ return;
567
+ }
2145
568
  try {
2146
- //For the moment it is ok to hard code the branding. Once multi tenancy is fully implemented this can be revisited
2147
569
  const brand = BrandingService.getBrand('default');
2148
570
  const start = 0;
2149
571
  const rows = 30;
2150
572
  const maxRecords = 100;
2151
- // configurable criteria
2152
- const jobConfig = _.get(sails.config, 'figshareAPI.mapping.figshareScheduledTransitionRecordWorkflowFromArticlePropertiesJob', {}) ?? {};
2153
- const enabled = _.get(jobConfig, 'enabled', '')?.toString() === 'true';
2154
- const namedQuery = _.get(jobConfig, 'namedQuery', '') ?? "";
2155
- const targetStep = _.get(jobConfig, 'targetStep', '') ?? "";
2156
- const paramMap = _.get(jobConfig, 'paramMap', {}) ?? {};
2157
- const figshareTargetFieldKey = _.get(jobConfig, 'figshareTargetFieldKey', '') ?? "";
2158
- const figshareTargetFieldValue = _.get(jobConfig, 'figshareTargetFieldValue', '') ?? "";
2159
- const username = _.get(jobConfig, 'username', '') ?? "";
2160
- const userType = _.get(jobConfig, 'userType', '') ?? "";
573
+ const namedQuery = jobConfig.namedQuery ?? '';
574
+ const targetStep = jobConfig.targetStep ?? '';
575
+ const paramMap = jobConfig.paramMap ?? {};
576
+ const figshareTargetFieldKey = jobConfig.figshareTargetFieldKey ?? '';
577
+ const figshareTargetFieldValue = jobConfig.figshareTargetFieldValue ?? '';
578
+ const username = jobConfig.username ?? '';
579
+ const userType = jobConfig.userType ?? '';
2161
580
  const user = await UsersService.getUserWithUsername(username).toPromise();
2162
581
  if (!user || !user?.username || user?.type !== userType) {
2163
- sails.log.error(`${prefix} cannot run job because could not find user with username '${username}' and type '${userType} user:`, user);
2164
- return;
2165
- }
2166
- // --> Check whether this process is enabled.
2167
- if (!enabled) {
2168
- sails.log.info(`${prefix} transitionRecordWorkflowFromFigshareArticlePropertiesJob is disabled by config`);
582
+ sails.log.error(`FigService - cannot run job because could not find user with username '${username}' and type '${userType}' user:`, user);
2169
583
  return;
2170
584
  }
2171
- // --> Find dataPublication records in stage queued in ReDBox database
2172
585
  const namedQueryConfig = await NamedQueryService.getNamedQueryConfig(brand, namedQuery);
2173
586
  const queryResults = await NamedQueryService.performNamedQueryFromConfigResults(namedQueryConfig, paramMap, brand, namedQuery, start, rows, maxRecords, user);
2174
587
  for (const queryResult of queryResults) {
2175
- const oid = _.get(queryResult, 'oid');
2176
- const articleId = _.get(queryResult, config.figArticleIdPathInRecord);
588
+ const oid = String(queryResult.oid ?? '');
589
+ if (oid === '') {
590
+ continue;
591
+ }
2177
592
  try {
2178
- await this.transitionRecordWorkflowFromFigshareArticleProperties(config, brand, user, oid, articleId, targetStep, figshareTargetFieldKey, figshareTargetFieldValue);
593
+ const record = await RecordsService.getMeta(oid);
594
+ const config = this.getConfig(record);
595
+ if (config == null) {
596
+ continue;
597
+ }
598
+ const articleId = String((0, types_1.getRecordField)(record, config.record.articleIdPath) ?? '');
599
+ await this.transitionWorkflowForRecord(record, user, oid, articleId, targetStep, figshareTargetFieldKey, figshareTargetFieldValue);
2179
600
  }
2180
601
  catch (error) {
2181
- sails.log.verbose(`${prefix} transitionRecordWorkflowFromFigshareArticlePropertiesJob unable to process articleId ${articleId}`, error);
602
+ sails.log.warn(`FigService - transitionRecordWorkflowFromFigshareArticlePropertiesJob unable to process oid ${oid}`, error);
2182
603
  }
2183
604
  }
2184
605
  }
2185
- catch (err) {
2186
- sails.log.error(`${prefix} error in transitionRecordWorkflowFromFigshareArticlePropertiesJob`, err);
606
+ catch (error) {
607
+ sails.log.error('FigService - error in transitionRecordWorkflowFromFigshareArticlePropertiesJob', error);
2187
608
  }
2188
609
  }
2189
610
  }
2190
611
  Services.FigshareService = FigshareService;
2191
612
  })(Services || (exports.Services = Services = {}));
2192
613
  module.exports.Services = Services;
2193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlnc2hhcmVTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0ZpZ3NoYXJlU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEZBQTBGO0FBQzFGLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsdUVBQXVFO0FBQ3ZFLG9FQUFvRTtBQUNwRSxzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsZ0VBQWdFO0FBQ2hFLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw4REFBOEQ7OztBQUU5RCxnREFBc0Q7QUFHdEQsa0VBQStEO0FBSS9ELDhFQUEyRTtBQUMzRSw4RUFBMkU7QUFDM0UsZ0ZBQTZFO0FBQzdFLG9EQUEyRDtBQUMzRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0IsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzVCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLENBQUM7QUErRDNELE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2xFLElBQUksb0JBQW9CLEdBQW1CLElBQUksQ0FBQztBQUNoRCxJQUFJLHNCQUFzQixHQUE0QixJQUFJLENBQUM7QUFFM0QsSUFBaUIsUUFBUSxDQTAyRXhCO0FBMTJFRCxXQUFpQixRQUFRO0lBRXZCLE1BQWEsZUFBZ0IsU0FBUSxzQkFBUSxDQUFDLElBQUksQ0FBQyxPQUFPO1FBRWhELGlCQUFpQixDQUFx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
614
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlnc2hhcmVTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL0ZpZ3NoYXJlU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnREFBc0Q7QUFDdEQsaURBQWlIO0FBQ2pILG1EQUF5RDtBQUN6RCw2Q0FBa0Y7QUFDbEYscURBQW9FO0FBQ3BFLGlEQUF1RDtBQUN2RCxtREFBeUQ7QUFDekQsbURBQTZEO0FBQzdELHVEQUF5RDtBQUN6RCxxREFBMkc7QUFDM0csK0NBQStGO0FBQy9GLHFEQUF3RTtBQUN4RSw2Q0FBdUY7QUFDdkYsa0VBQStEO0FBRy9ELGtGQUFnRjtBQUNoRiwrQ0FjNkI7QUFTN0IsSUFBaUIsUUFBUSxDQW9wQnhCO0FBcHBCRCxXQUFpQixRQUFRO0lBQ3ZCLE1BQWEsZUFBZ0IsU0FBUSxzQkFBUSxDQUFDLElBQUksQ0FBQyxPQUFPO1FBQ3JDLGdCQUFnQixHQUFhO1lBQzlDLDZCQUE2QjtZQUM3Qiw4QkFBOEI7WUFDOUIsdUJBQXVCO1lBQ3ZCLDhCQUE4QjtZQUM5Qiw0QkFBNEI7WUFDNUIsa0JBQWtCO1lBQ2xCLDhCQUE4QjtZQUM5QiwwREFBMEQ7WUFDMUQsb0JBQW9CO1lBQ3BCLGNBQWM7WUFDZCxZQUFZO1lBQ1osYUFBYTtZQUNiLGlCQUFpQjtZQUNqQixXQUFXO1lBQ1gsd0JBQXdCO1lBQ3hCLE1BQU07U0FDUCxDQUFDO1FBRU0scUJBQXFCLENBQzNCLE1BQW1CLEVBQ25CLE1BQThCLEVBQzlCLE9BQWdDO1lBRWhDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDeEQsT0FBTyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRTtnQkFDckQsT0FBTyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTztnQkFDckMsV0FBVyxFQUFF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