Skip to content
This repository was archived by the owner on Jun 12, 2024. It is now read-only.

Commit d4dc69f

Browse files
authored
Merge pull request #694 from OpenClinica/revert-691-merge/6.2.0
Revert "Merge/6.2.0"
2 parents 11db986 + d85d4e0 commit d4dc69f

File tree

110 files changed

+1193
-2826
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+1193
-2826
lines changed

.eslintrc.json

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,12 @@
99
"structuredClone": true
1010
},
1111
"extends": ["airbnb", "prettier"],
12-
"plugins": [
13-
"chai-friendly",
14-
"jsdoc",
15-
"prettier",
16-
"unicorn",
17-
"@typescript-eslint"
18-
],
19-
"parser": "@typescript-eslint/parser",
12+
"plugins": ["chai-friendly", "jsdoc", "prettier", "unicorn"],
2013
"parserOptions": {
2114
"sourceType": "module",
2215
"ecmaVersion": 2021
2316
},
2417
"settings": {
25-
"import/parsers": {
26-
"@typescript-eslint/parser": [".js", ".ts", ".tsx"]
27-
},
28-
"import/resolver": {
29-
"typescript": {
30-
"alwaysTryTypes": true
31-
}
32-
},
3318
"jsdoc": {
3419
"tagNamePreference": {
3520
"returns": "return"
@@ -46,8 +31,7 @@
4631
"enketo/widgets",
4732
"enketo/translator",
4833
"enketo/dialog",
49-
"enketo/file-manager",
50-
"enketo-transformer/web"
34+
"enketo/file-manager"
5135
]
5236
}
5337
],

CHANGELOG.md

Lines changed: 0 additions & 29 deletions

Gruntfile.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ module.exports = (grunt) => {
66
'!.nyc_output',
77
'!**/node_modules/**',
88
'!test/client/forms/forms.js',
9-
'!public/js/build/**',
9+
'!public/js/build/*',
1010
'!docs/**',
1111
'!test-coverage/**',
1212
];
@@ -105,7 +105,7 @@ module.exports = (grunt) => {
105105
'find locales -name "translation-combined.json" -delete && rm -fr locales/??',
106106
},
107107
'clean-js': {
108-
command: 'rm -rf public/js/build/* && rm -f public/js/*.js',
108+
command: 'rm -f public/js/build/* && rm -f public/js/*.js',
109109
},
110110
translation: {
111111
command:

README.md

Lines changed: 4 additions & 6 deletions

app/controllers/media-controller.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const request = require('request');
88
const express = require('express');
99

1010
const router = express.Router();
11-
const debug = require('debug')('enketo:media-controller');
11+
const debug = require('debug')('media-controller');
1212
const {
1313
RequestFilteringHttpAgent,
1414
RequestFilteringHttpsAgent,

app/controllers/transformation-controller.js

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
const transformer = require('enketo-transformer');
66
const communicator = require('../lib/communicator');
7-
const { ResponseError, TranslatedError } = require('../lib/custom-error');
7+
const { TranslatedError } = require('../lib/custom-error');
88
const surveyModel = require('../models/survey-model');
99
const cacheModel = require('../models/cache-model');
1010
const account = require('../models/account-model');
@@ -13,6 +13,7 @@ const config = require('../models/config-model').server;
1313
const utils = require('../lib/utils');
1414
const routerUtils = require('../lib/router-utils');
1515
const express = require('express');
16+
const url = require('url');
1617
const mediaLib = require('../lib/media');
1718

1819
const router = express.Router();
@@ -100,15 +101,27 @@ async function getSurveyParts(req, res, next) {
100101
/** @type {string | null} */
101102
let formId = null;
102103

104+
/** @type {string | null} */
105+
let formFileName = null;
106+
103107
try {
104108
let survey = await _getSurveyParams(req);
105109

106-
formId = survey.openRosaId;
110+
// A request with "xformUrl" body parameter was used (unlaunched form)
111+
if (survey.info != null) {
112+
formFileName = survey.info.downloadUrl.replace(
113+
/.*\/([^/]+)$/,
114+
'$1'
115+
);
116+
survey = await _getFormDirectly(survey);
117+
118+
_respond(res, survey);
107119

108-
if (formId == null) {
109-
throw new ResponseError(404);
120+
return;
110121
}
111122

123+
formId = survey.openRosaId;
124+
112125
const authenticated = await _authenticate(survey);
113126
const cached = await _getFormFromCache(authenticated);
114127

@@ -129,10 +142,14 @@ async function getSurveyParts(req, res, next) {
129142
});
130143
} catch (error) {
131144
if (error.status === 403) {
132-
const notFoundError = new TranslatedError(
133-
'error.notfoundinformlist',
134-
{ formId }
135-
);
145+
const notFoundError =
146+
formId == null
147+
? new TranslatedError('error.notfounddirectformurl', {
148+
formFileName,
149+
})
150+
: new TranslatedError('error.notfoundinformlist', {
151+
formId,
152+
});
136153

137154
notFoundError.status = 404;
138155

@@ -166,6 +183,17 @@ function getSurveyHash(req, res, next) {
166183
.catch(next);
167184
}
168185

186+
/**
187+
* @param {module:survey-model~SurveyObject} survey - survey object
188+
*
189+
* @return { Promise<module:survey-model~SurveyObject> } a Promise resolving with survey object with form transformation result
190+
*
191+
*/
192+
function _getFormDirectly(survey) {
193+
survey.openclinica = true;
194+
return communicator.getXForm(survey).then(transformer.transform);
195+
}
196+
169197
/**
170198
* @param {module:survey-model~SurveyObject} survey - survey object
171199
*
@@ -205,11 +233,8 @@ function _updateCache(survey) {
205233
delete survey.mediaHash;
206234
delete survey.mediaUrlHash;
207235
delete survey.formHash;
208-
survey.openclinica = true;
209-
return communicator
210-
.getXForm(survey)
211-
.then(transformer.transform)
212-
.then(cacheModel.set);
236+
237+
return _getFormDirectly(survey).then(cacheModel.set);
213238
}
214239

215240
return survey;
@@ -334,6 +359,7 @@ function _setCookieAndCredentials(survey, req) {
334359
* @return { Promise<module:survey-model~SurveyObject> } a Promise resolving with survey object
335360
*/
336361
function _getSurveyParams(req) {
362+
const params = req.body;
337363
const customParamName = req.app.get(
338364
'query parameter to pass to submission'
339365
);
@@ -350,7 +376,32 @@ function _getSurveyParams(req) {
350376
return _setCookieAndCredentials(survey, req);
351377
});
352378
}
353-
379+
if (params.xformUrl) {
380+
const urlObj = url.parse(params.xformUrl);
381+
if (!urlObj || !urlObj.protocol || !urlObj.host) {
382+
const error = new Error('Bad Request. Form URL is invalid.');
383+
error.status = 400;
384+
throw error;
385+
}
386+
const xUrl = `${urlObj.protocol}//${urlObj.host}${urlObj.pathname}`;
387+
388+
return account
389+
.check({
390+
openRosaServer: xUrl,
391+
})
392+
.then(
393+
(
394+
survey // no need to check quota
395+
) =>
396+
Promise.resolve({
397+
info: {
398+
downloadUrl: params.xformUrl,
399+
},
400+
account: survey.account,
401+
})
402+
)
403+
.then((survey) => _setCookieAndCredentials(survey, req));
404+
}
354405
const error = new Error('Bad Request. Survey information not complete.');
355406
error.status = 400;
356407
throw error;

app/lib/communicator.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const request = require('request');
66
const { Auth } = require('request/lib/auth');
77
const TError = require('./custom-error').TranslatedError;
88
const config = require('../models/config-model').server;
9-
const debug = require('debug')('enketo:openrosa-communicator');
9+
const debug = require('debug')('openrosa-communicator');
1010
const Xml2Js = require('xml2js');
1111

1212
const parser = new Xml2Js.Parser();

app/lib/pdf.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ async function get(
121121
},
122122
scale,
123123
printBackground: true,
124-
timeout,
125124
});
126125
} catch (e) {
127126
e.status = e.status || 400;

app/models/cache-model.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const utils = require('../lib/utils');
99

1010
const prefix = 'ca:';
1111
const expiry = 30 * 24 * 60 * 60;
12-
const debug = require('debug')('enketo:cache-model');
12+
const debug = require('debug')('cache-model');
1313

1414
const clientGet = promisify(cacheClient.get).bind(cacheClient);
1515
const clientSet = promisify(cacheClient.set).bind(cacheClient);

app/models/survey-model.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const TError = require('../lib/custom-error').TranslatedError;
88
const config = require('./config-model').server;
99

1010
const pending = {};
11-
const debug = require('debug')('enketo:survey-model');
11+
const debug = require('debug')('survey-model');
1212

1313
/**
1414
* @typedef {import('./account-model').AccountObj} AccountObj

app/views/index.pug

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ block content
5757
li= t("langs.sv")
5858
when "lo"
5959
li= t("langs.lo")
60-
when "uk"
61-
li= t("langs.uk")
6260
when "sk"
6361
li= t("langs.sk")
6462
when "tr"

app/views/surveys/webform.pug

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ block style
2020

2121
block script
2222
- var suffix = (type && type !== 'single') ? '-' + (type === 'full' || type === 'preview' || type === 'fieldsubmission' ? 'oc' : type): ''
23-
script#main-script(defer, type='module', src=`${basePath}${offlinePath || ''}/js/build/enketo-webform${suffix}.js`)
23+
script#main-script(defer, module, src=`${basePath}${offlinePath || ''}/js/build/enketo-webform${suffix}.js`)
2424

2525
-// load jini stuff asynchronously (OC)
2626
if jini && !headless

config/build.js

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
1-
// @ts-check
2-
1+
const alias = require('esbuild-plugin-alias');
32
const path = require('path');
43
const pkg = require('../package.json');
54

65
const cwd = process.cwd();
76

87
const entryPoints = pkg.entries.map((entry) => path.resolve(cwd, entry));
98

10-
module.exports = /** @satisfies {import('esbuild').BuildOptions} */ ({
11-
alias: Object.fromEntries(
12-
Object.entries(pkg.browser).map(([key, value]) => [
13-
key,
14-
path.resolve(cwd, `${value}.js`),
15-
])
16-
),
9+
const isProduction = process.env.NODE_ENV === 'production';
10+
11+
module.exports = {
1712
bundle: true,
18-
chunkNames: 'chunks/[name]-[hash]',
1913
entryPoints,
20-
entryNames: '[name]',
21-
external: ['crypto', 'libxslt'],
22-
format: 'esm',
23-
minify: true,
14+
format: 'iife',
15+
minify: isProduction,
2416
outdir: path.resolve(cwd, './public/js/build'),
25-
sourcemap: true,
26-
splitting: true,
17+
plugins: [
18+
alias(
19+
Object.fromEntries(
20+
Object.entries(pkg.browser).map(([key, value]) => [
21+
key,
22+
path.resolve(cwd, `${value}.js`),
23+
])
24+
)
25+
),
26+
],
27+
sourcemap: isProduction ? false : 'inline',
2728
target: ['chrome89', 'edge89', 'firefox90', 'safari13'],
28-
});
29+
};

config/express.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const errorHandler = require('../app/controllers/error-handler');
1414

1515
const controllersPath = path.join(__dirname, '../app/controllers');
1616
const app = express();
17-
const debug = require('debug')('enketo:express');
17+
const debug = require('debug')('express');
1818
const config = require('../app/models/config-model');
1919

2020
// general

docs/app_controllers_api-controller.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_controllers_api-v1-controller.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_controllers_api-v2-controller.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_controllers_authentication-controller.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_controllers_error-handler.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_controllers_media-controller.js.html

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

docs/app_controllers_offline-controller.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_controllers_pages-controller.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_controllers_submission-controller.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_controllers_survey-controller.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_controllers_transformation-controller.js.html

Lines changed: 64 additions & 14 deletions
Large diffs are not rendered by default.

docs/app_lib_communicator.js.html

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

docs/app_lib_custom-error.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_lib_media.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_lib_pdf.js.html

Lines changed: 1 addition & 2 deletions
Large diffs are not rendered by default.

docs/app_lib_router-utils.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_lib_utils.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_models_account-model.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_models_cache-model.js.html

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

docs/app_models_config-model.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_models_instance-model.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_models_record-model.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_models_submission-model.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/app_models_survey-model.js.html

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

docs/app_models_user-model.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/global.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/index.html

Lines changed: 5 additions & 6 deletions
Large diffs are not rendered by default.

docs/module-account-model.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-api-controller.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-api-v1-controller.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-api-v2-controller.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-authentication-controller.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-cache-model.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-communicator.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-config-model.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-custom-error.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-duplicates.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-error-handler.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-instance-model.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-media-controller.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-offline-resources-controller.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-pages-controller.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-pdf.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-router-utils.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-submission-model.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-submissions-controller.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-survey-controller.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-survey-model.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-transformation-controller.html

Lines changed: 166 additions & 12 deletions
Large diffs are not rendered by default.

docs/module-user-model.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/module-utils.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/tools_duplicates.js.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/tutorial-00-getting-started.html

Lines changed: 1 addition & 5 deletions
Large diffs are not rendered by default.

docs/tutorial-02-heroku.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/tutorial-10-configure.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)