Skip to content

Commit 4e7d644

Browse files
committed
♻️ migrate objectGetLegalHold to async/await syntax
Issue: CLDSRV-823
1 parent aad0c3d commit 4e7d644

File tree

1 file changed

+64
-72
lines changed

1 file changed

+64
-72
lines changed

lib/api/objectGetLegalHold.js

Lines changed: 64 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
const async = require('async');
21
const { errors, errorInstances, s3middleware } = require('arsenal');
32

43
const { decodeVersionId, getVersionIdResHeader }
@@ -15,26 +14,21 @@ const { convertToXml } = s3middleware.objectLegalHold;
1514
* @param {AuthInfo} authInfo - Instance of AuthInfo class with requester's info
1615
* @param {object} request - http request object
1716
* @param {object} log - Werelogs logger
18-
* @param {function} callback - callback to server
19-
* @return {undefined}
17+
* @return {Promise<object>} - object containing xml and additionalResHeaders
2018
*/
21-
function objectGetLegalHold(authInfo, request, log, callback) {
19+
async function objectGetLegalHold(authInfo, request, log, callback) {
2220
log.debug('processing request', { method: 'objectGetLegalHold' });
2321

2422
const { bucketName, objectKey, query } = request;
2523

2624
const decodedVidResult = decodeVersionId(query);
2725
if (decodedVidResult instanceof Error) {
28-
log.trace('invalid versionId query', {
29-
versionId: query.versionId,
30-
error: decodedVidResult,
31-
});
26+
log.trace('invalid versionId query', { versionId: query.versionId, error: decodedVidResult });
3227
return process.nextTick(() => callback(decodedVidResult));
3328
}
3429
const versionId = decodedVidResult;
3530

36-
// FIXME pass 'getDeleteMarker: true' option to set
37-
// 'x-amz-delete-marker' header (see S3C-7592)
31+
// FIXME pass 'getDeleteMarker: true' option to set 'x-amz-delete-marker' header (see S3C-7592)
3832
const metadataValParams = {
3933
authInfo,
4034
bucketName,
@@ -44,71 +38,69 @@ function objectGetLegalHold(authInfo, request, log, callback) {
4438
request,
4539
};
4640

47-
return async.waterfall([
48-
next => standardMetadataValidateBucketAndObj(metadataValParams, request.actionImplicitDenies, log,
49-
(err, bucket, objectMD) => {
50-
if (err) {
51-
log.trace('request authorization failed',
52-
{ method: 'objectGetLegalHold', error: err });
53-
return next(err);
54-
}
55-
if (!objectMD) {
56-
const err = versionId ? errors.NoSuchVersion :
57-
errors.NoSuchKey;
58-
log.trace('error no object metadata found',
59-
{ method: 'objectGetLegalHold', error: err });
60-
return next(err, bucket);
61-
}
62-
if (objectMD.isDeleteMarker) {
63-
if (versionId) {
64-
log.trace('requested version is delete marker',
65-
{ method: 'objectGetLegalHold' });
66-
// FIXME we should return a `x-amz-delete-marker: true` header,
67-
// see S3C-7592
68-
return next(errors.MethodNotAllowed);
41+
let bucket;
42+
let objectMD;
43+
44+
try {
45+
({ bucket, objectMD } = await new Promise((resolve, reject) => {
46+
standardMetadataValidateBucketAndObj(
47+
metadataValParams, request.actionImplicitDenies, log,
48+
(err, bucket, objectMD) => {
49+
if (err) {
50+
log.trace('request authorization failed', { method: 'objectGetLegalHold', error: err });
51+
return reject(err);
6952
}
70-
log.trace('most recent version is delete marker',
71-
{ method: 'objectGetLegalHold' });
72-
// FIXME we should return a `x-amz-delete-marker: true` header,
73-
// see S3C-7592
74-
return next(errors.NoSuchKey);
75-
}
76-
if (!bucket.isObjectLockEnabled()) {
77-
log.trace('object lock not enabled on bucket',
78-
{ method: 'objectGetRetention' });
79-
return next(errorInstances.InvalidRequest.customizeDescription(
80-
'Bucket is missing Object Lock Configuration'));
81-
}
82-
return next(null, bucket, objectMD);
83-
}),
84-
(bucket, objectMD, next) => {
85-
const { legalHold } = objectMD;
86-
const xml = convertToXml(legalHold);
87-
if (xml === '') {
88-
return next(errors.NoSuchObjectLockConfiguration);
53+
return resolve({ bucket, objectMD });
54+
});
55+
}));
56+
57+
if (!objectMD) {
58+
const err = versionId ? errors.NoSuchVersion : errors.NoSuchKey;
59+
log.trace('error no object metadata found', { method: 'objectGetLegalHold', error: err });
60+
throw err;
61+
}
62+
63+
if (objectMD.isDeleteMarker) {
64+
if (versionId) {
65+
log.trace('requested version is delete marker', { method: 'objectGetLegalHold' });
66+
// FIXME we should return a `x-amz-delete-marker: true` header, see S3C-7592
67+
throw errors.MethodNotAllowed;
8968
}
90-
return next(null, bucket, xml, objectMD);
91-
},
92-
], (err, bucket, xml, objectMD) => {
93-
const additionalResHeaders = collectCorsHeaders(request.headers.origin,
94-
request.method, bucket);
95-
if (err) {
96-
log.trace('error processing request', { error: err,
97-
method: 'objectGetLegalHold' });
98-
} else {
99-
pushMetric('getObjectLegalHold', log, {
100-
authInfo,
101-
bucket: bucketName,
102-
keys: [objectKey],
103-
versionId: objectMD ? objectMD.versionId : undefined,
104-
location: objectMD ? objectMD.dataStoreName : undefined,
105-
});
106-
const verCfg = bucket.getVersioningConfiguration();
107-
additionalResHeaders['x-amz-version-id'] =
108-
getVersionIdResHeader(verCfg, objectMD);
69+
70+
log.trace('most recent version is delete marker', { method: 'objectGetLegalHold' });
71+
// FIXME we should return a `x-amz-delete-marker: true` header, see S3C-7592
72+
throw errors.NoSuchKey;
73+
}
74+
75+
if (!bucket.isObjectLockEnabled()) {
76+
log.trace('object lock not enabled on bucket', { method: 'objectGetRetention' });
77+
throw errorInstances.InvalidRequest.customizeDescription('Bucket is missing Object Lock Configuration');
10978
}
110-
return callback(err, xml, additionalResHeaders);
111-
});
79+
80+
const { legalHold } = objectMD;
81+
const xml = convertToXml(legalHold);
82+
if (xml === '') {
83+
throw errors.NoSuchObjectLockConfiguration;
84+
}
85+
86+
const additionalResHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
87+
88+
pushMetric('getObjectLegalHold', log, {
89+
authInfo,
90+
bucket: bucketName,
91+
keys: [objectKey],
92+
versionId: objectMD ? objectMD.versionId : undefined,
93+
location: objectMD ? objectMD.dataStoreName : undefined,
94+
});
95+
const verCfg = bucket.getVersioningConfiguration();
96+
additionalResHeaders['x-amz-version-id'] = getVersionIdResHeader(verCfg, objectMD);
97+
98+
return callback(null, xml, additionalResHeaders);
99+
} catch (err) {
100+
const additionalResHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
101+
err.additionalResHeaders = additionalResHeaders;
102+
return callback(err);
103+
}
112104
}
113105

114106
module.exports = objectGetLegalHold;

0 commit comments

Comments
 (0)