import stampit from 'stampit'; import {Meta, Model} from './base'; import {BaseQuerySet, Get, List, Delete, Update, Create} from '../querySet'; import _ from 'lodash'; const SolutionQuerySet = stampit().compose( BaseQuerySet, Get, Create, List, Delete, Update ).methods({ star(properties = {}) { this.properties = _.assign({}, this.properties, properties); this.method = 'POST'; this.endpoint = 'star'; return this; }, unstar(properties = {}) { this.properties = _.assign({}, this.properties, properties); this.method = 'POST'; this.endpoint = 'unstar'; return this; }, getVersions(properties = {}) { this.properties = _.assign({}, this.properties, properties); this.method = 'GET'; this.endpoint = 'versions' return this; }, createVersion(properties = {}, payload = {}) { this.properties = _.assign({}, this.properties, properties); this.payload = payload; this.method = 'POST'; this.endpoint = 'versions'; return this; }, getVersion(properties = {}) { this.properties = _.assign({}, this.properties, properties); this.method = 'GET'; this.endpoint = 'versionDetail'; return this; }, installVersion(properties = {}, payload = {}) { this.properties = _.assign({}, this.properties, properties); this.method = 'POST'; this.payload = payload; this.endpoint = 'versionInstall'; return this; }, createVersionFromInstance(properties = {}, payload = {}) { this.properties = _.assign({}, this.properties, properties); this.method = 'POST'; this.payload = payload; this.endpoint = 'createFromInstance'; return this; } }); const SolutionMeta = Meta({ name: 'solution', pluralName: 'solutions', endpoints: { 'list': { 'methods': ['get'], 'path': '/v1.1/marketplace/solutions/' }, 'detail': { 'methods': ['get', 'post', 'patch', 'put', 'delete'], 'path': '/v1.1/marketplace/solutions/{id}/' }, 'star': { 'methods': ['post'], 'path': '/v1.1/marketplace/solutions/{id}/star/' }, 'unstar': { 'methods': ['post'], 'path': '/v1.1/marketplace/solutions/{id}/unstar/' }, 'versions': { 'methods': ['post', 'get'], 'path': '/v1.1/marketplace/solutions/{id}/versions/' }, 'createFromInstance': { 'methods': ['post', 'get'], 'path': '/v1.1/marketplace/solutions/{id}/versions/create_from_instance/' }, 'versionDetail': { 'methods': ['get'], 'path': '/v1.1/marketplace/solutions/{id}/versions/{version_id}/' }, 'versionInstall': { 'methods': ['post'], 'path': '/v1.1/marketplace/solutions/{id}/versions/{version_id}/install/' } } }); const SolutionConstraints = { label: { presence: true, string: true }, description: { string: true }, metadata: { object: true }, public: { boolean: true } }; /** * OO wrapper around Invoice. * @constructor * @type {Invoice} * @property {String} status * @property {Array} items * @property {String} period * @property {String} amount * @property {Number} id * @property {Date} [created_at = null] * @property {Date} [updated_at = null] */ const Solution = stampit() .compose(Model) .setQuerySet(SolutionQuerySet) .setMeta(SolutionMeta) .setConstraints(SolutionConstraints) .methods({ star() { const meta = this.getMeta(); const path = meta.resolveEndpointPath('star', this); return this.makeRequest('POST', path); }, unstar() { const meta = this.getMeta(); const path = meta.resolveEndpointPath('unstar', this); return this.makeRequest('POST', path); }, getVersions() { const meta = this.getMeta(); const path = meta.resolveEndpointPath('versions', this); return this.makeRequest('GET', path); }, getVersion(version_id) { const meta = this.getMeta(); const path = meta.resolveEndpointPath('versionDetail', _.assign({}, this, {version_id})); return this.makeRequest('GET', path); }, installVersion(version_id, payload = {}) { const meta = this.getMeta(); const path = meta.resolveEndpointPath('versionInstall', _.assign({}, this, {version_id})); return this.makeRequest('POST', path, {payload}); }, createVersion(payload = {}) { const meta = this.getMeta(); const path = meta.resolveEndpointPath('versions', this); return this.makeRequest('POST', path, {payload}); }, createVersionFromInstance(payload = {}) { const meta = this.getMeta(); const path = meta.resolveEndpointPath('createFromInstance', this); return this.makeRequest('POST', path, {payload}); } }); export default Solution;