用工小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
2.8 KiB

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