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;