Update model request interface and references

This commit is contained in:
gconsidine
2017-11-09 17:01:32 -05:00
parent 4cd2f93c31
commit e8fd40ace0
15 changed files with 260 additions and 209 deletions

View File

@@ -45,6 +45,7 @@ module.exports = {
ignoreTemplateLiterals: true,
}],
'no-continue': 'off',
'no-debugger': 'off',
'no-mixed-operators': 'off',
'no-param-reassign': 'off',
'no-plusplus': 'off',

View File

@@ -42,7 +42,7 @@ function AddCredentialsController (models, $state, strings) {
vm.form.save = data => {
data.user = me.get('id');
return credential.request('post', data);
return credential.request('post', { data });
};
vm.form.onSaveSuccess = res => {

View File

@@ -88,7 +88,7 @@ function EditCredentialsController (models, $state, $scope, strings) {
data.user = me.get('id');
credential.unset('inputs');
return credential.request('put', data);
return credential.request('put', { data });
};
vm.form.onSaveSuccess = () => {

View File

@@ -2,33 +2,44 @@ let $http;
let $q;
let cache;
function request (method, resource) {
if (Array.isArray(method)) {
const promises = method.map((_method_, i) =>
this.request(_method_, Array.isArray(resource) ? resource[i] : resource));
function request (method, resource, config) {
let req = this.parseRequestConfig(method, resource, config);
if (Array.isArray(req.method)) {
const promises = req.method.map((_method, i) => {
const _resource = Array.isArray(req.resource) ? req.resource[i] : req.resource;
req = this.parseRequestConfig(_method, _resource, config);
if (this.isCacheable(req)) {
return this.requestWithCache(req);
}
return this.request(req);
});
return $q.all(promises);
}
if (this.isCacheable(method, resource)) {
return this.requestWithCache(method, resource);
if (this.isCacheable(req)) {
return this.requestWithCache(req);
}
return this.http[method](resource);
return this.http[req.method](req);
}
function requestWithCache (method, resource) {
const key = cache.createKey(method, this.path, resource);
function requestWithCache (config) {
const key = cache.createKey(config.method, this.path, config.resource);
return cache.get(key)
.then(data => {
if (data) {
this.model[method.toUpperCase()] = data;
this.model[config.method.toUpperCase()] = data;
return data;
}
return this.http[method](resource)
return this.http[config.method](config)
.then(res => {
cache.put(key, res.data);
@@ -77,22 +88,22 @@ function search (params, config) {
});
}
function httpGet (resource, config) {
function httpGet (config = {}) {
const req = {
method: 'GET',
url: this.path
};
if (config && config.params) {
if (config.params) {
req.params = config.params;
}
if (typeof resource === 'object') {
this.model.GET = resource;
if (typeof config.resource === 'object') {
this.model.GET = config.resource;
return $q.resolve();
} else if (resource) {
req.url = `${this.path}${resource}/`;
} else if (config.resource) {
req.url = `${this.path}${config.resource}/`;
}
return $http(req)
@@ -103,40 +114,51 @@ function httpGet (resource, config) {
});
}
function httpPost (data) {
function httpPost (config = {}) {
const req = {
method: 'POST',
url: this.path,
data
data: config.data
};
return $http(req).then(res => {
this.model.GET = res.data;
return $http(req)
.then(res => {
this.model.GET = res.data;
return res;
});
return res;
});
}
function httpPut (changes) {
const model = Object.assign(this.get(), changes);
function httpPatch (config = {}) {
const req = {
method: 'PUT',
url: `${this.path}${this.get('id')}/`,
data: config.changes
};
return $http(req);
}
function httpPut (config = {}) {
const model = _.merge(this.get(), config.data);
const req = {
method: 'PUT',
url: `${this.path}${model.id}/`,
url: `${this.path}${this.get('id')}/`,
data: model
};
return $http(req).then(res => res);
return $http(req);
}
function httpOptions (resource) {
function httpOptions (config = {}) {
const req = {
method: 'OPTIONS',
url: this.path
};
if (resource) {
req.url = `${this.path}${resource}/`;
if (config.resource) {
req.url = `${this.path}${config.resource}/`;
}
return $http(req)
@@ -147,17 +169,17 @@ function httpOptions (resource) {
});
}
function httpDelete (resource) {
function httpDelete (config = {}) {
const req = {
method: 'DELETE',
url: this.path
};
if (resource) {
req.url = `${this.path}${resource}/`;
if (config.resource) {
req.url = `${this.path}${config.resource}/`;
}
return $http(req).then(res => res);
return $http(req);
}
function options (keys) {
@@ -367,29 +389,19 @@ function graft (id) {
}
function getDependentResourceCounts (id) {
if (this.setDependentResources) {
this.setDependentResources(id);
} else {
return Promise.resolve([]);
}
this.setDependentResources(id);
const dependentResourcePromises = [];
const promises = [];
this.dependentResources.forEach(dependentResource => {
const config = {};
if (dependentResource.params) {
config.params = dependentResource.params;
}
dependentResourcePromises.push(dependentResource.model.http.get(undefined, config)
.then((val) => ({
label: dependentResource.model.label,
count: val.data.count
this.dependentResources.forEach(resource => {
promises.push(resource.model.request('get', resource.params)
.then(res => ({
label: resource.model.label,
count: res.data.count
})));
});
return Promise.all(dependentResourcePromises);
return Promise.all(promises);
}
/**
@@ -401,20 +413,22 @@ function getDependentResourceCounts (id) {
* @arg {string=} method - Populate the model with `GET` or `OPTIONS` data.
* @arg {(string|Object)=} resource - An `id` reference to a particular
* resource or an existing model's data.
* @arg {boolean=} isGraft - Create a new instance from existing model data.
* @arg {config=} config - Create a new instance from existing model data.
*
* @returns {(Object|Promise)} - Returns a reference to the model instance
* if an empty instance or graft is created. Otherwise, a promise yielding
* a model instance is returned.
*/
function create (method, resource, isGraft, config) {
if (!method) {
function create (method, resource, config) {
const req = this.parseRequestConfig(method, resource, config);
if (!req || !req.method) {
return this;
}
this.promise = this.request(method, resource, config);
this.promise = this.request(req);
if (isGraft) {
if (req.graft) {
return this;
}
@@ -422,6 +436,40 @@ function create (method, resource, isGraft, config) {
.then(() => this);
}
function parseRequestConfig (method, resource, config) {
if (!method) {
return null;
}
let req = {};
if (Array.isArray(method)) {
if (Array.isArray(resource)) {
req.resource = resource;
} else if (typeof resource === 'object') {
req = resource;
}
req.method = method;
} else if (typeof method === 'string') {
if (typeof resource === 'object') {
req = resource;
} else {
req.resource = resource;
}
req.method = method;
} else if (typeof method === 'object') {
req = method;
} else {
req = config;
req.method = method;
req.resource = resource;
}
return req;
}
/**
* Base functionality for API interaction.
*
@@ -444,6 +492,7 @@ function BaseModel (path, settings) {
this.match = match;
this.normalizePath = normalizePath;
this.options = options;
this.parseRequestConfig = parseRequestConfig;
this.request = request;
this.requestWithCache = requestWithCache;
this.search = search;
@@ -455,6 +504,7 @@ function BaseModel (path, settings) {
this.http = {
get: httpGet.bind(this),
options: httpOptions.bind(this),
patch: httpPatch.bind(this),
post: httpPost.bind(this),
put: httpPut.bind(this),
delete: httpDelete.bind(this)

View File

@@ -1,5 +1,5 @@
let $log;
let BaseModel;
let Base;
function getTruncatedVersion () {
let version;
@@ -17,18 +17,18 @@ function isOpen () {
return this.get('license_info.license_type') === 'open';
}
function ConfigModel (method, resource, graft) {
BaseModel.call(this, 'config', { cache: true });
function ConfigModel (method, resource, config) {
Base.call(this, 'config', { cache: true });
this.Constructor = ConfigModel;
this.getTruncatedVersion = getTruncatedVersion;
this.isOpen = isOpen;
return this.create(method, resource, graft);
return this.create(method, resource, config);
}
function ConfigModelLoader (_BaseModel_, _$log_) {
BaseModel = _BaseModel_;
function ConfigModelLoader (BaseModel, _$log_) {
Base = BaseModel;
$log = _$log_;
return ConfigModel;

View File

@@ -1,11 +1,11 @@
const ENCRYPTED_VALUE = '$encrypted$';
let BaseModel;
let ProjectModel;
let JobTemplateModel;
let InventoryModel;
let InventorySourceModel;
let ModelsStrings;
let Base;
let Project;
let JobTemplate;
let Inventory;
let InventorySource;
let strings;
function createFormSchema (method, config) {
if (!config) {
@@ -48,26 +48,26 @@ function assignInputGroupValues (inputs) {
function setDependentResources (id) {
this.dependentResources = [
{
model: new ProjectModel(),
model: new Project(),
params: {
credential: id
}
},
{
model: new JobTemplateModel(),
model: new JobTemplate(),
params: {
credential: id,
ask_credential_on_launch: false
}
},
{
model: new InventoryModel(),
model: new Inventory(),
params: {
insights_credential: id
}
},
{
model: new InventorySourceModel(),
model: new InventorySource(),
params: {
credential: id
}
@@ -75,32 +75,32 @@ function setDependentResources (id) {
];
}
function CredentialModel (method, resource, graft) {
BaseModel.call(this, 'credentials');
function CredentialModel (method, resource, config) {
Base.call(this, 'credentials');
this.Constructor = CredentialModel;
this.createFormSchema = createFormSchema.bind(this);
this.assignInputGroupValues = assignInputGroupValues.bind(this);
this.setDependentResources = setDependentResources.bind(this);
this.label = ModelsStrings.get('labels.CREDENTIAL');
this.label = strings.get('labels.CREDENTIAL');
return this.create(method, resource, graft);
return this.create(method, resource, config);
}
function CredentialModelLoader (
_BaseModel_,
_ProjectModel_,
_JobTemplateModel_,
_InventoryModel_,
_InventorySourceModel_,
_ModelsStrings_
BaseModel,
ProjectModel,
JobTemplateModel,
InventoryModel,
InventorySourceModel,
ModelsStrings
) {
BaseModel = _BaseModel_;
ProjectModel = _ProjectModel_;
JobTemplateModel = _JobTemplateModel_;
InventoryModel = _InventoryModel_;
InventorySourceModel = _InventorySourceModel_;
ModelsStrings = _ModelsStrings_;
Base = BaseModel;
Project = ProjectModel;
JobTemplate = JobTemplateModel;
Inventory = InventoryModel;
InventorySource = InventorySourceModel;
strings = ModelsStrings;
return CredentialModel;
}

View File

@@ -1,6 +1,6 @@
let BaseModel;
let CredentialModel;
let ModelsStrings;
let Base;
let Credential;
let strings;
function categorizeByKind () {
const group = {};
@@ -35,7 +35,7 @@ function mergeInputProperties () {
function setDependentResources (id) {
this.dependentResources = [
{
model: new CredentialModel(),
model: new Credential(),
params: {
credential_type: id
}
@@ -43,26 +43,26 @@ function setDependentResources (id) {
];
}
function CredentialTypeModel (method, resource, graft) {
BaseModel.call(this, 'credential_types');
function CredentialTypeModel (method, resource, config) {
Base.call(this, 'credential_types');
this.Constructor = CredentialTypeModel;
this.categorizeByKind = categorizeByKind.bind(this);
this.mergeInputProperties = mergeInputProperties.bind(this);
this.setDependentResources = setDependentResources.bind(this);
this.label = ModelsStrings.get('labels.CREDENTIAL_TYPE');
this.label = strings.get('labels.CREDENTIAL_TYPE');
return this.create(method, resource, graft);
return this.create(method, resource, config);
}
function CredentialTypeModelLoader (
_BaseModel_,
_CredentialModel_,
_ModelsStrings_
BaseModel,
CredentialModel,
ModelsStrings
) {
BaseModel = _BaseModel_;
CredentialModel = _CredentialModel_;
ModelsStrings = _ModelsStrings_;
Base = BaseModel;
Credential = CredentialModel;
strings = ModelsStrings;
return CredentialTypeModel;
}

View File

@@ -1,11 +1,11 @@
let BaseModel;
let JobTemplateModel;
let ModelsStrings;
let Base;
let JobTemplate;
let strings;
function setDependentResources (id) {
this.dependentResources = [
{
model: new JobTemplateModel(),
model: new JobTemplate(),
params: {
inventory: id
}
@@ -13,24 +13,24 @@ function setDependentResources (id) {
];
}
function InventoryModel (method, resource, graft) {
BaseModel.call(this, 'inventories');
function InventoryModel (method, resource, config) {
Base.call(this, 'inventories');
this.Constructor = InventoryModel;
this.setDependentResources = setDependentResources.bind(this);
this.label = ModelsStrings.get('labels.INVENTORY');
this.label = strings.get('labels.INVENTORY');
return this.create(method, resource, graft);
return this.create(method, resource, config);
}
function InventoryModelLoader (
_BaseModel_,
_JobTemplateModel_,
_ModelsStrings_
BaseModel,
JobTemplateModel,
ModelsStrings
) {
BaseModel = _BaseModel_;
JobTemplateModel = _JobTemplateModel_;
ModelsStrings = _ModelsStrings_;
Base = BaseModel;
JobTemplate = JobTemplateModel;
strings = ModelsStrings;
return InventoryModel;
}

View File

@@ -1,11 +1,11 @@
let BaseModel;
let InventorySourceModel;
let ModelsStrings;
let Base;
let InventorySource;
let strings;
function setDependentResources (id) {
this.dependentResources = [
{
model: new InventorySourceModel(),
model: new InventorySource(),
params: {
source_script: id
}
@@ -13,24 +13,24 @@ function setDependentResources (id) {
];
}
function InventoryScriptModel (method, resource, graft) {
BaseModel.call(this, 'inventory_scripts');
function InventoryScriptModel (method, resource, config) {
Base.call(this, 'inventory_scripts');
this.Constructor = InventoryScriptModel;
this.setDependentResources = setDependentResources.bind(this);
this.label = ModelsStrings.get('labels.INVENTORY_SCRIPT');
this.label = strings.get('labels.INVENTORY_SCRIPT');
return this.create(method, resource, graft);
return this.create(method, resource, config);
}
function InventoryScriptModelLoader (
_BaseModel_,
_InventorySourceModel_,
_ModelsStrings_
BaseModel,
InventorySourceModel,
ModelsStrings
) {
BaseModel = _BaseModel_;
InventorySourceModel = _InventorySourceModel_;
ModelsStrings = _ModelsStrings_;
Base = BaseModel;
InventorySource = InventorySourceModel;
strings = ModelsStrings;
return InventoryScriptModel;
}

View File

@@ -1,11 +1,11 @@
let BaseModel;
let WorkflowJobTemplateNodeModel;
let ModelsStrings;
let Base;
let WorkflowJobTemplateNode;
let strings;
function setDependentResources (id) {
this.dependentResources = [
{
model: new WorkflowJobTemplateNodeModel(),
model: new WorkflowJobTemplateNode(),
params: {
unified_job_template: id
}
@@ -13,24 +13,24 @@ function setDependentResources (id) {
];
}
function InventorySourceModel (method, resource, graft) {
BaseModel.call(this, 'inventory_sources');
function InventorySourceModel (method, resource, config) {
Base.call(this, 'inventory_sources');
this.Constructor = InventorySourceModel;
this.label = strings.get('labels.INVENTORY_SOURCE');
this.setDependentResources = setDependentResources.bind(this);
this.label = ModelsStrings.get('labels.INVENTORY_SOURCE');
return this.create(method, resource, graft);
return this.create(method, resource, config);
}
function InventorySourceModelLoader (
_BaseModel_,
_WorkflowJobTemplateNodeModel_,
_ModelsStrings_
BaseModel,
WorkflowJobTemplateNodeModel,
ModelsStrings
) {
BaseModel = _BaseModel_;
WorkflowJobTemplateNodeModel = _WorkflowJobTemplateNodeModel_;
ModelsStrings = _ModelsStrings_;
Base = BaseModel;
WorkflowJobTemplateNode = WorkflowJobTemplateNodeModel;
strings = ModelsStrings;
return InventorySourceModel;
}

View File

@@ -1,11 +1,11 @@
let BaseModel;
let WorkflowJobTemplateNodeModel;
let ModelsStrings;
let Base;
let WorkflowJobTemplateNode;
let strings;
function setDependentResources (id) {
this.dependentResources = [
{
model: new WorkflowJobTemplateNodeModel(),
model: new WorkflowJobTemplateNode(),
params: {
unified_job_template: id
}
@@ -13,24 +13,24 @@ function setDependentResources (id) {
];
}
function JobTemplateModel (method, resource, graft) {
BaseModel.call(this, 'job_templates');
function JobTemplateModel (method, resource, config) {
Base.call(this, 'job_templates');
this.Constructor = JobTemplateModel;
this.setDependentResources = setDependentResources.bind(this);
this.label = ModelsStrings.get('labels.JOB_TEMPLATE');
this.label = strings.get('labels.JOB_TEMPLATE');
return this.create(method, resource, graft);
return this.create(method, resource, config);
}
function JobTemplateModelLoader (
_BaseModel_,
_WorkflowJobTemplateNodeModel_,
_ModelsStrings_
BaseModel,
WorkflowJobTemplateNodeModel,
ModelsStrings
) {
BaseModel = _BaseModel_;
WorkflowJobTemplateNodeModel = _WorkflowJobTemplateNodeModel_;
ModelsStrings = _ModelsStrings_;
Base = BaseModel;
WorkflowJobTemplateNode = WorkflowJobTemplateNodeModel;
strings = ModelsStrings;
return JobTemplateModel;
}

View File

@@ -1,11 +1,11 @@
let BaseModel;
let Base;
function MeModel (method, resource, graft) {
BaseModel.call(this, 'me');
function MeModel (method, resource, config) {
Base.call(this, 'me');
this.Constructor = MeModel;
return this.create(method, resource, graft)
return this.create(method, resource, config)
.then(() => {
if (this.has('results')) {
_.merge(this.model.GET, this.get('results[0]'));
@@ -16,8 +16,8 @@ function MeModel (method, resource, graft) {
});
}
function MeModelLoader (_BaseModel_) {
BaseModel = _BaseModel_;
function MeModelLoader (BaseModel) {
Base = BaseModel;
return MeModel;
}

View File

@@ -1,21 +1,21 @@
let BaseModel;
let ModelsStrings;
let Base;
let strings;
function OrganizationModel (method, resource, graft) {
BaseModel.call(this, 'organizations');
function OrganizationModel (method, resource, config) {
Base.call(this, 'organizations');
this.Constructor = OrganizationModel;
this.label = ModelsStrings.get('labels.ORGANIZATION');
this.label = strings.get('labels.ORGANIZATION');
return this.create(method, resource, graft);
return this.create(method, resource, config);
}
function OrganizationModelLoader (
_BaseModel_,
_ModelsStrings_
BaseModel,
ModelsStrings
) {
BaseModel = _BaseModel_;
ModelsStrings = _ModelsStrings_;
Base = BaseModel;
strings = ModelsStrings;
return OrganizationModel;
}

View File

@@ -1,25 +1,25 @@
let BaseModel;
let JobTemplateModel;
let WorkflowJobTemplateNodeModel;
let InventorySourceModel;
let ModelsStrings;
let Base;
let JobTemplate;
let WorkflowJobTemplateNode;
let InventorySource;
let strings;
function setDependentResources (id) {
this.dependentResources = [
{
model: new JobTemplateModel(),
model: new JobTemplate(),
params: {
project: id
}
},
{
model: new WorkflowJobTemplateNodeModel(),
model: new WorkflowJobTemplateNode(),
params: {
unified_job_template: id
}
},
{
model: new InventorySourceModel(),
model: new InventorySource(),
params: {
source_project: id
}
@@ -27,28 +27,28 @@ function setDependentResources (id) {
];
}
function ProjectModel (method, resource, graft) {
BaseModel.call(this, 'projects');
function ProjectModel (method, resource, config) {
Base.call(this, 'projects');
this.Constructor = ProjectModel;
this.setDependentResources = setDependentResources.bind(this);
this.label = ModelsStrings.get('labels.PROJECT');
this.label = strings.get('labels.PROJECT');
return this.create(method, resource, graft);
return this.create(method, resource, config);
}
function ProjectModelLoader (
_BaseModel_,
_JobTemplateModel_,
_WorkflowJobTemplateNodeModel_,
_InventorySourceModel_,
_ModelsStrings_
BaseModel,
JobTemplateModel,
WorkflowJobTemplateNodeModel,
InventorySourceModel,
ModelsStrings
) {
BaseModel = _BaseModel_;
JobTemplateModel = _JobTemplateModel_;
WorkflowJobTemplateNodeModel = _WorkflowJobTemplateNodeModel_;
InventorySourceModel = _InventorySourceModel_;
ModelsStrings = _ModelsStrings_;
Base = BaseModel;
JobTemplate = JobTemplateModel;
WorkflowJobTemplateNode = WorkflowJobTemplateNodeModel;
InventorySource = InventorySourceModel;
strings = ModelsStrings;
return ProjectModel;
}

View File

@@ -1,21 +1,21 @@
let BaseModel;
let ModelsStrings;
let Base;
let strings;
function WorkflowJobTemplateNodeModel (method, resource, graft) {
BaseModel.call(this, 'workflow_job_template_nodes');
function WorkflowJobTemplateNodeModel (method, resource, config) {
Base.call(this, 'workflow_job_template_nodes');
this.Constructor = WorkflowJobTemplateNodeModel;
this.label = ModelsStrings.get('labels.WORKFLOW_JOB_TEMPLATE_NODE');
this.label = strings.get('labels.WORKFLOW_JOB_TEMPLATE_NODE');
return this.create(method, resource, graft);
return this.create(method, resource, config);
}
function WorkflowJobTemplateNodeModelLoader (
_BaseModel_,
_ModelsStrings_
BaseModel,
ModelsStrings
) {
BaseModel = _BaseModel_;
ModelsStrings = _ModelsStrings_;
Base = BaseModel;
strings = ModelsStrings;
return WorkflowJobTemplateNodeModel;
}