const AWS = require('aws-sdk');

class S3Storage {
  constructor(config, log) {
    this.bucket = config.s3_bucket;
    this.log = log;
    const cfg = {};
    if (config.s3_endpoint != '') {
      cfg['endpoint'] = config.s3_endpoint;
    }
    cfg['s3ForcePathStyle'] = config.s3_use_path_style_endpoint;
    AWS.config.update(cfg);
    this.s3 = new AWS.S3();
  }

  async length(id) {
    const result = await this.s3
      .headObject({ Bucket: this.bucket, Key: id })
      .promise();
    return Number(result.ContentLength);
  }

  getStream(id) {
    return this.s3
      .getObject({ Bucket: this.bucket, Key: id })
      .createReadStream();
  }

  set(id, file) {
    const upload = this.s3.upload({
      Bucket: this.bucket,
      Key: id,
      Body: file
    });
    file.on('error', () => upload.abort());
    return upload.promise();
  }

  del(id) {
    return this.s3.deleteObject({ Bucket: this.bucket, Key: id }).promise();
  }

  ping() {
    return this.s3.headBucket({ Bucket: this.bucket }).promise();
  }
}

module.exports = S3Storage;
