Source: models/hosting.js

import stampit from 'stampit';
import {Meta, Model} from './base';
import _ from 'lodash';
import Promise from 'bluebird';
import {BaseQuerySet, Get, Update, Create, Delete, List} from '../querySet';

const HostingQuerySet = stampit().compose(
  BaseQuerySet,
  Get,
  Update,
  Create,
  Delete,
  List
)
.methods({

  setDefault(properties = {}) {
    this.properties = _.assign({}, this.properties, properties);

    this.method = 'POST';
    this.endpoint = 'setDefault';

    return this;
  },

  listFiles(properties = {}) {
    const {HostingFile} = this.getConfig();

    return HostingFile.please().list({instanceName: properties.instanceName, hostingId: properties.id});
  },

  uploadFile(properties = {}, payload = {}) {
    const {HostingFile} = this.getConfig();

    return HostingFile.please().upload({instanceName: properties.instanceName, hostingId: properties.id}, payload);
  },

  uploadFiles(properties = {}, files = []) {
    const {HostingFile} = this.getConfig();

    return Promise.mapSeries(files, (f) => HostingFile.please().upload({instanceName: properties.instanceName, hostingId: properties.id}, f));
  },

  updateFile(properties = {}, payload = {}) {
    const {HostingFile} = this.getConfig();

    return HostingFile.please().update({instanceName: properties.instanceName, hostingId: properties.id, id: properties.fileId}, payload);
  },

  getFileDetails(properties = {}) {
    const {HostingFile} = this.getConfig();

    return HostingFile.please().get({ instanceName: properties.instanceName, hostingId: properties.id, id: properties.fileId});
  },

  deleteFile(properties = {}) {
    const {HostingFile} = this.getConfig();

    return HostingFile.please().delete({ instanceName: properties.instanceName, hostingId: properties.id, id: properties.fileId});
  }

});

const HostingMeta = Meta({
  name: 'hosting',
  pluralName: 'hostings',
  endpoints: {
    'detail': {
      'methods': ['get', 'put', 'patch', 'delete'],
      'path': '/v1.1/instances/{instanceName}/hosting/{id}/'
    },
    'setDefault': {
      'methods': ['post'],
      'path': '/v1.1/instances/{instanceName}/hosting/{id}/set_default/'
    },
    'list': {
      'methods': ['post', 'get'],
      'path': '/v1.1/instances/{instanceName}/hosting/'
    }
  }
});

const HostingConstraints = {
  instanceName: {
    presence: true,
    length: {
      minimum: 5
    }
  },
  label: {
    string: true
  },
  description: {
    string: true
  },
  domains: {
    array: true
  }
};

/**
 * OO wrapper around Hosting.
 * @constructor
 * @type {Hosting}

 * @property {String} label
 * @property {String} description
 * @property {Array} domains
 */
const Hosting = stampit()
  .compose(Model)
  .setQuerySet(HostingQuerySet)
  .setConstraints(HostingConstraints)
  .setMeta(HostingMeta)
  .methods({

    setDefault() {
      const meta = this.getMeta();
      const path = meta.resolveEndpointPath('setDefault', this);

      return this.makeRequest('POST', path).then((body) => this.serialize(body));
    },

    listFiles() {
      const {HostingFile} = this.getConfig();

      return HostingFile.please().list({instanceName: this.instanceName, hostingId: this.id});
    },

    uploadFile(payload = {}) {
      const {HostingFile} = this.getConfig();

      return HostingFile.please().upload({instanceName: this.instanceName, hostingId: this.id}, payload);
    },

    uploadFiles(files = []) {
      const {HostingFile} = this.getConfig();

      return Promise.mapSeries(files, (f) => HostingFile.please().upload({instanceName: this.instanceName, hostingId: this.id}, f));
    },

    updateFile(file_id, payload = {}) {
      const {HostingFile} = this.getConfig();

      return HostingFile.please().update({instanceName: this.instanceName, hostingId: this.id, id: file_id}, payload);
    },

    deleteFile(file_id) {
      const {HostingFile} = this.getConfig();

      return HostingFile.please().delete({ instanceName: this.instanceName, hostingId: this.id, id: file_id});
    },

    getFileDetails(file_id) {
      const {HostingFile} = this.getConfig();

      return HostingFile.please().get({ instanceName: this.instanceName, hostingId: this.id, id: file_id});
    }

  });

export default Hosting;