156 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* eslint-disable no-use-before-define */
 | 
						|
const { checkBucketName: _checkBucketName } = require('../utils/checkBucketName');
 | 
						|
const { isArray } = require('../utils/isArray');
 | 
						|
const { deepCopy } = require('../utils/deepCopy');
 | 
						|
const { isObject } = require('../utils/isObject');
 | 
						|
const { obj2xml } = require('../utils/obj2xml');
 | 
						|
const { checkObjectTag } = require('../utils/checkObjectTag');
 | 
						|
const { getStrBytesCount } = require('../utils/getStrBytesCount');
 | 
						|
 | 
						|
const proto = exports;
 | 
						|
 | 
						|
proto.putBucketLifecycle = async function putBucketLifecycle(name, rules, options) {
 | 
						|
  _checkBucketName(name);
 | 
						|
 | 
						|
  if (!isArray(rules)) {
 | 
						|
    throw new Error('rules must be Array');
 | 
						|
  }
 | 
						|
 | 
						|
  const params = this._bucketRequestParams('PUT', name, 'lifecycle', options);
 | 
						|
  const Rule = [];
 | 
						|
  const paramXMLObj = {
 | 
						|
    LifecycleConfiguration: {
 | 
						|
      Rule
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  rules.forEach(_ => {
 | 
						|
    defaultDaysAndDate2Expiration(_); // todo delete, 兼容旧版本
 | 
						|
    checkRule(_);
 | 
						|
    if (_.id) {
 | 
						|
      _.ID = _.id;
 | 
						|
      delete _.id;
 | 
						|
    }
 | 
						|
    Rule.push(_);
 | 
						|
  });
 | 
						|
 | 
						|
  const paramXML = obj2xml(paramXMLObj, {
 | 
						|
    headers: true,
 | 
						|
    firstUpperCase: true
 | 
						|
  });
 | 
						|
 | 
						|
  params.content = paramXML;
 | 
						|
  params.mime = 'xml';
 | 
						|
  params.successStatuses = [200];
 | 
						|
  const result = await this.request(params);
 | 
						|
  return {
 | 
						|
    res: result.res
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
// todo delete, 兼容旧版本
 | 
						|
function defaultDaysAndDate2Expiration(obj) {
 | 
						|
  if (obj.days) {
 | 
						|
    obj.expiration = {
 | 
						|
      days: obj.days
 | 
						|
    };
 | 
						|
  }
 | 
						|
  if (obj.date) {
 | 
						|
    obj.expiration = {
 | 
						|
      createdBeforeDate: obj.date
 | 
						|
    };
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function checkDaysAndDate(obj, key) {
 | 
						|
  const { days, createdBeforeDate } = obj;
 | 
						|
  if (!days && !createdBeforeDate) {
 | 
						|
    throw new Error(`${key} must includes days or createdBeforeDate`);
 | 
						|
  } else if (days && (isArray(days) || !/^[1-9][0-9]*$/.test(days))) {
 | 
						|
    throw new Error('days must be a positive integer');
 | 
						|
  } else if (createdBeforeDate && !/\d{4}-\d{2}-\d{2}T00:00:00.000Z/.test(createdBeforeDate)) {
 | 
						|
    throw new Error('createdBeforeDate must be date and conform to iso8601 format');
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function checkNoncurrentDays(obj, key) {
 | 
						|
  const { noncurrentDays } = obj;
 | 
						|
  if (!noncurrentDays) {
 | 
						|
    throw new Error(`${key} must includes noncurrentDays`);
 | 
						|
  } else if (noncurrentDays && (isArray(noncurrentDays) || !/^[1-9][0-9]*$/.test(noncurrentDays))) {
 | 
						|
    throw new Error('noncurrentDays must be a positive integer');
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function handleCheckTag(tag) {
 | 
						|
  if (!isArray(tag) && !isObject(tag)) {
 | 
						|
    throw new Error('tag must be Object or Array');
 | 
						|
  }
 | 
						|
  tag = isObject(tag) ? [tag] : tag;
 | 
						|
  const tagObj = {};
 | 
						|
  const tagClone = deepCopy(tag);
 | 
						|
  tagClone.forEach(v => {
 | 
						|
    tagObj[v.key] = v.value;
 | 
						|
  });
 | 
						|
 | 
						|
  checkObjectTag(tagObj);
 | 
						|
}
 | 
						|
 | 
						|
function checkStorageClass(storageClass) {
 | 
						|
  if (!['IA', 'Archive', 'ColdArchive', 'DeepColdArchive'].includes(storageClass))
 | 
						|
    throw new Error(`StorageClass must be IA or Archive or ColdArchive or DeepColdArchive`);
 | 
						|
}
 | 
						|
 | 
						|
function checkRule(rule) {
 | 
						|
  if (rule.id && getStrBytesCount(rule.id) > 255) throw new Error('ID is composed of 255 bytes at most');
 | 
						|
 | 
						|
  if (rule.prefix === undefined) throw new Error('Rule must includes prefix');
 | 
						|
 | 
						|
  if (!['Enabled', 'Disabled'].includes(rule.status)) throw new Error('Status must be Enabled or Disabled');
 | 
						|
 | 
						|
  if (
 | 
						|
    !rule.expiration &&
 | 
						|
    !rule.noncurrentVersionExpiration &&
 | 
						|
    !rule.abortMultipartUpload &&
 | 
						|
    !rule.transition &&
 | 
						|
    !rule.noncurrentVersionTransition
 | 
						|
  ) {
 | 
						|
    throw new Error(
 | 
						|
      'Rule must includes expiration or noncurrentVersionExpiration or abortMultipartUpload or transition or noncurrentVersionTransition'
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  if (rule.transition) {
 | 
						|
    checkStorageClass(rule.transition.storageClass);
 | 
						|
    checkDaysAndDate(rule.transition, 'Transition');
 | 
						|
  }
 | 
						|
 | 
						|
  if (rule.expiration) {
 | 
						|
    if (!rule.expiration.expiredObjectDeleteMarker) {
 | 
						|
      checkDaysAndDate(rule.expiration, 'Expiration');
 | 
						|
    } else if (rule.expiration.days || rule.expiration.createdBeforeDate) {
 | 
						|
      throw new Error('expiredObjectDeleteMarker cannot be used with days or createdBeforeDate');
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  if (rule.abortMultipartUpload) {
 | 
						|
    checkDaysAndDate(rule.abortMultipartUpload, 'AbortMultipartUpload');
 | 
						|
  }
 | 
						|
 | 
						|
  if (rule.noncurrentVersionTransition) {
 | 
						|
    checkStorageClass(rule.noncurrentVersionTransition.storageClass);
 | 
						|
    checkNoncurrentDays(rule.noncurrentVersionTransition, 'NoncurrentVersionTransition');
 | 
						|
  }
 | 
						|
 | 
						|
  if (rule.noncurrentVersionExpiration) {
 | 
						|
    checkNoncurrentDays(rule.noncurrentVersionExpiration, 'NoncurrentVersionExpiration');
 | 
						|
  }
 | 
						|
 | 
						|
  if (rule.tag) {
 | 
						|
    if (rule.abortMultipartUpload) {
 | 
						|
      throw new Error('Tag cannot be used with abortMultipartUpload');
 | 
						|
    }
 | 
						|
    handleCheckTag(rule.tag);
 | 
						|
  }
 | 
						|
}
 |