getBucketVersions.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* eslint-disable no-use-before-define */
  2. const proto = exports;
  3. const { isObject } = require('../utils/isObject');
  4. const { isArray } = require('../utils/isArray');
  5. proto.getBucketVersions = getBucketVersions;
  6. proto.listObjectVersions = getBucketVersions;
  7. async function getBucketVersions(query = {}, options = {}) {
  8. // prefix, key-marker, max-keys, delimiter, encoding-type, version-id-marker
  9. if (query.versionIdMarker && query.keyMarker === undefined) {
  10. throw new Error('A version-id marker cannot be specified without a key marker');
  11. }
  12. options.subres = Object.assign({ versions: '' }, options.subres);
  13. if (options.versionId) {
  14. options.subres.versionId = options.versionId;
  15. }
  16. const params = this._objectRequestParams('GET', '', options);
  17. params.xmlResponse = true;
  18. params.successStatuses = [200];
  19. params.query = formatQuery(query);
  20. const result = await this.request(params);
  21. let objects = result.data.Version || [];
  22. let deleteMarker = result.data.DeleteMarker || [];
  23. const that = this;
  24. if (objects) {
  25. if (!Array.isArray(objects)) {
  26. objects = [objects];
  27. }
  28. objects = objects.map(obj => ({
  29. name: obj.Key,
  30. url: that._objectUrl(obj.Key),
  31. lastModified: obj.LastModified,
  32. isLatest: obj.IsLatest === 'true',
  33. versionId: obj.VersionId,
  34. etag: obj.ETag,
  35. type: obj.Type,
  36. size: Number(obj.Size),
  37. storageClass: obj.StorageClass,
  38. owner: {
  39. id: obj.Owner.ID,
  40. displayName: obj.Owner.DisplayName
  41. }
  42. }));
  43. }
  44. if (deleteMarker) {
  45. if (!isArray(deleteMarker)) {
  46. deleteMarker = [deleteMarker];
  47. }
  48. deleteMarker = deleteMarker.map(obj => ({
  49. name: obj.Key,
  50. lastModified: obj.LastModified,
  51. versionId: obj.VersionId,
  52. owner: {
  53. id: obj.Owner.ID,
  54. displayName: obj.Owner.DisplayName
  55. }
  56. }));
  57. }
  58. let prefixes = result.data.CommonPrefixes || null;
  59. if (prefixes) {
  60. if (!isArray(prefixes)) {
  61. prefixes = [prefixes];
  62. }
  63. prefixes = prefixes.map(item => item.Prefix);
  64. }
  65. return {
  66. res: result.res,
  67. objects,
  68. deleteMarker,
  69. prefixes,
  70. // attirbute of legacy error
  71. nextMarker: result.data.NextKeyMarker || null,
  72. // attirbute of legacy error
  73. NextVersionIdMarker: result.data.NextVersionIdMarker || null,
  74. nextKeyMarker: result.data.NextKeyMarker || null,
  75. nextVersionIdMarker: result.data.NextVersionIdMarker || null,
  76. isTruncated: result.data.IsTruncated === 'true'
  77. };
  78. }
  79. function camel2Line(name) {
  80. return name.replace(/([A-Z])/g, '-$1').toLowerCase();
  81. }
  82. function formatQuery(query = {}) {
  83. const obj = {};
  84. if (isObject(query)) {
  85. Object.keys(query).forEach(key => {
  86. obj[camel2Line(key)] = query[key];
  87. });
  88. }
  89. return obj;
  90. }