From e8fd40ace0cf1dd41b1988000c23a7f69d752fb2 Mon Sep 17 00:00:00 2001 From: gconsidine Date: Thu, 9 Nov 2017 17:01:32 -0500 Subject: [PATCH 1/2] Update model request interface and references --- awx/ui/.eslintrc.js | 1 + .../credentials/add-credentials.controller.js | 2 +- .../edit-credentials.controller.js | 2 +- awx/ui/client/lib/models/Base.js | 164 ++++++++++++------ awx/ui/client/lib/models/Config.js | 12 +- awx/ui/client/lib/models/Credential.js | 52 +++--- awx/ui/client/lib/models/CredentialType.js | 28 +-- awx/ui/client/lib/models/Inventory.js | 28 +-- awx/ui/client/lib/models/InventoryScript.js | 28 +-- awx/ui/client/lib/models/InventorySource.js | 28 +-- awx/ui/client/lib/models/JobTemplate.js | 28 +-- awx/ui/client/lib/models/Me.js | 12 +- awx/ui/client/lib/models/Organization.js | 20 +-- awx/ui/client/lib/models/Project.js | 44 ++--- .../lib/models/WorkflowJobTemplateNode.js | 20 +-- 15 files changed, 260 insertions(+), 209 deletions(-) diff --git a/awx/ui/.eslintrc.js b/awx/ui/.eslintrc.js index c8b8c73bba..217601f5f9 100644 --- a/awx/ui/.eslintrc.js +++ b/awx/ui/.eslintrc.js @@ -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', diff --git a/awx/ui/client/features/credentials/add-credentials.controller.js b/awx/ui/client/features/credentials/add-credentials.controller.js index 560968c918..f0e4445669 100644 --- a/awx/ui/client/features/credentials/add-credentials.controller.js +++ b/awx/ui/client/features/credentials/add-credentials.controller.js @@ -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 => { diff --git a/awx/ui/client/features/credentials/edit-credentials.controller.js b/awx/ui/client/features/credentials/edit-credentials.controller.js index 6fe3845266..e0a36c106f 100644 --- a/awx/ui/client/features/credentials/edit-credentials.controller.js +++ b/awx/ui/client/features/credentials/edit-credentials.controller.js @@ -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 = () => { diff --git a/awx/ui/client/lib/models/Base.js b/awx/ui/client/lib/models/Base.js index 854fb72de0..cd72106684 100644 --- a/awx/ui/client/lib/models/Base.js +++ b/awx/ui/client/lib/models/Base.js @@ -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) diff --git a/awx/ui/client/lib/models/Config.js b/awx/ui/client/lib/models/Config.js index 85be6ef147..9f2e3ab87a 100644 --- a/awx/ui/client/lib/models/Config.js +++ b/awx/ui/client/lib/models/Config.js @@ -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; diff --git a/awx/ui/client/lib/models/Credential.js b/awx/ui/client/lib/models/Credential.js index 0bfac7be07..ebf2ea141f 100644 --- a/awx/ui/client/lib/models/Credential.js +++ b/awx/ui/client/lib/models/Credential.js @@ -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; } diff --git a/awx/ui/client/lib/models/CredentialType.js b/awx/ui/client/lib/models/CredentialType.js index 936a1d8bdd..706839795c 100644 --- a/awx/ui/client/lib/models/CredentialType.js +++ b/awx/ui/client/lib/models/CredentialType.js @@ -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; } diff --git a/awx/ui/client/lib/models/Inventory.js b/awx/ui/client/lib/models/Inventory.js index b1d5af3f54..9ce657d4e5 100644 --- a/awx/ui/client/lib/models/Inventory.js +++ b/awx/ui/client/lib/models/Inventory.js @@ -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; } diff --git a/awx/ui/client/lib/models/InventoryScript.js b/awx/ui/client/lib/models/InventoryScript.js index aa37d09efd..9a1832b8da 100644 --- a/awx/ui/client/lib/models/InventoryScript.js +++ b/awx/ui/client/lib/models/InventoryScript.js @@ -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; } diff --git a/awx/ui/client/lib/models/InventorySource.js b/awx/ui/client/lib/models/InventorySource.js index abde6883fb..b1529780f3 100644 --- a/awx/ui/client/lib/models/InventorySource.js +++ b/awx/ui/client/lib/models/InventorySource.js @@ -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; } diff --git a/awx/ui/client/lib/models/JobTemplate.js b/awx/ui/client/lib/models/JobTemplate.js index 2b0a7ce021..c058171bee 100644 --- a/awx/ui/client/lib/models/JobTemplate.js +++ b/awx/ui/client/lib/models/JobTemplate.js @@ -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; } diff --git a/awx/ui/client/lib/models/Me.js b/awx/ui/client/lib/models/Me.js index c2ee95d46e..221a29da34 100644 --- a/awx/ui/client/lib/models/Me.js +++ b/awx/ui/client/lib/models/Me.js @@ -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; } diff --git a/awx/ui/client/lib/models/Organization.js b/awx/ui/client/lib/models/Organization.js index 734d547395..a518511ec6 100644 --- a/awx/ui/client/lib/models/Organization.js +++ b/awx/ui/client/lib/models/Organization.js @@ -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; } diff --git a/awx/ui/client/lib/models/Project.js b/awx/ui/client/lib/models/Project.js index 63d363bd92..071350a385 100644 --- a/awx/ui/client/lib/models/Project.js +++ b/awx/ui/client/lib/models/Project.js @@ -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; } diff --git a/awx/ui/client/lib/models/WorkflowJobTemplateNode.js b/awx/ui/client/lib/models/WorkflowJobTemplateNode.js index bc5cfdf107..5ac7baed0a 100644 --- a/awx/ui/client/lib/models/WorkflowJobTemplateNode.js +++ b/awx/ui/client/lib/models/WorkflowJobTemplateNode.js @@ -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; } From 8713e38c44fd8621945c5190d32f970b0d694fc0 Mon Sep 17 00:00:00 2001 From: gconsidine Date: Fri, 10 Nov 2017 10:42:05 -0500 Subject: [PATCH 2/2] Update the base model to use string service instead of each sub model --- awx/ui/client/lib/models/Base.js | 13 +++-- awx/ui/client/lib/models/Credential.js | 9 +--- awx/ui/client/lib/models/CredentialType.js | 12 +---- awx/ui/client/lib/models/Inventory.js | 12 +---- awx/ui/client/lib/models/InventoryScript.js | 12 +---- awx/ui/client/lib/models/InventorySource.js | 9 +--- awx/ui/client/lib/models/JobTemplate.js | 12 +---- awx/ui/client/lib/models/Organization.js | 11 +--- awx/ui/client/lib/models/Project.js | 7 +-- .../lib/models/WorkflowJobTemplateNode.js | 11 +--- awx/ui/client/lib/models/models.strings.js | 50 +++++++++++++++---- .../lib/services/base-string.service.js | 13 ++--- 12 files changed, 70 insertions(+), 101 deletions(-) diff --git a/awx/ui/client/lib/models/Base.js b/awx/ui/client/lib/models/Base.js index cd72106684..171c046a41 100644 --- a/awx/ui/client/lib/models/Base.js +++ b/awx/ui/client/lib/models/Base.js @@ -1,6 +1,7 @@ let $http; let $q; let cache; +let strings; function request (method, resource, config) { let req = this.parseRequestConfig(method, resource, config); @@ -473,14 +474,14 @@ function parseRequestConfig (method, resource, config) { /** * Base functionality for API interaction. * - * @arg {string} path - The API resource for the model extending BaseModel to + * @arg {string} resource - The API resource for the model extending BaseModel to * use. * @arg {Object=} settings - Configuration applied to all instances of the * extending model. * @arg {boolean=} settings.cache - Cache the model data. * */ -function BaseModel (path, settings) { +function BaseModel (resource, settings) { this.create = create; this.find = find; this.get = get; @@ -511,18 +512,20 @@ function BaseModel (path, settings) { }; this.model = {}; - this.path = this.normalizePath(path); + this.path = this.normalizePath(resource); + this.label = strings.get(`${resource}.LABEL`); this.settings = settings || {}; } -function BaseModelLoader (_$http_, _$q_, _cache_) { +function BaseModelLoader (_$http_, _$q_, _cache_, ModelsStrings) { $http = _$http_; $q = _$q_; cache = _cache_; + strings = ModelsStrings; return BaseModel; } -BaseModelLoader.$inject = ['$http', '$q', 'CacheService']; +BaseModelLoader.$inject = ['$http', '$q', 'CacheService', 'ModelsStrings']; export default BaseModelLoader; diff --git a/awx/ui/client/lib/models/Credential.js b/awx/ui/client/lib/models/Credential.js index ebf2ea141f..93d29bb002 100644 --- a/awx/ui/client/lib/models/Credential.js +++ b/awx/ui/client/lib/models/Credential.js @@ -5,7 +5,6 @@ let Project; let JobTemplate; let Inventory; let InventorySource; -let strings; function createFormSchema (method, config) { if (!config) { @@ -82,7 +81,6 @@ function CredentialModel (method, resource, config) { this.createFormSchema = createFormSchema.bind(this); this.assignInputGroupValues = assignInputGroupValues.bind(this); this.setDependentResources = setDependentResources.bind(this); - this.label = strings.get('labels.CREDENTIAL'); return this.create(method, resource, config); } @@ -92,15 +90,13 @@ function CredentialModelLoader ( ProjectModel, JobTemplateModel, InventoryModel, - InventorySourceModel, - ModelsStrings + InventorySourceModel ) { Base = BaseModel; Project = ProjectModel; JobTemplate = JobTemplateModel; Inventory = InventoryModel; InventorySource = InventorySourceModel; - strings = ModelsStrings; return CredentialModel; } @@ -110,8 +106,7 @@ CredentialModelLoader.$inject = [ 'ProjectModel', 'JobTemplateModel', 'InventoryModel', - 'InventorySourceModel', - 'ModelsStrings' + 'InventorySourceModel' ]; export default CredentialModelLoader; diff --git a/awx/ui/client/lib/models/CredentialType.js b/awx/ui/client/lib/models/CredentialType.js index 706839795c..0607350ad8 100644 --- a/awx/ui/client/lib/models/CredentialType.js +++ b/awx/ui/client/lib/models/CredentialType.js @@ -1,6 +1,5 @@ let Base; let Credential; -let strings; function categorizeByKind () { const group = {}; @@ -50,27 +49,20 @@ function CredentialTypeModel (method, resource, config) { this.categorizeByKind = categorizeByKind.bind(this); this.mergeInputProperties = mergeInputProperties.bind(this); this.setDependentResources = setDependentResources.bind(this); - this.label = strings.get('labels.CREDENTIAL_TYPE'); return this.create(method, resource, config); } -function CredentialTypeModelLoader ( - BaseModel, - CredentialModel, - ModelsStrings -) { +function CredentialTypeModelLoader (BaseModel, CredentialModel) { Base = BaseModel; Credential = CredentialModel; - strings = ModelsStrings; return CredentialTypeModel; } CredentialTypeModelLoader.$inject = [ 'BaseModel', - 'CredentialModel', - 'ModelsStrings' + 'CredentialModel' ]; export default CredentialTypeModelLoader; diff --git a/awx/ui/client/lib/models/Inventory.js b/awx/ui/client/lib/models/Inventory.js index 9ce657d4e5..3d270dfc79 100644 --- a/awx/ui/client/lib/models/Inventory.js +++ b/awx/ui/client/lib/models/Inventory.js @@ -1,6 +1,5 @@ let Base; let JobTemplate; -let strings; function setDependentResources (id) { this.dependentResources = [ @@ -18,27 +17,20 @@ function InventoryModel (method, resource, config) { this.Constructor = InventoryModel; this.setDependentResources = setDependentResources.bind(this); - this.label = strings.get('labels.INVENTORY'); return this.create(method, resource, config); } -function InventoryModelLoader ( - BaseModel, - JobTemplateModel, - ModelsStrings -) { +function InventoryModelLoader (BaseModel, JobTemplateModel) { Base = BaseModel; JobTemplate = JobTemplateModel; - strings = ModelsStrings; return InventoryModel; } InventoryModelLoader.$inject = [ 'BaseModel', - 'JobTemplateModel', - 'ModelsStrings' + 'JobTemplateModel' ]; export default InventoryModelLoader; diff --git a/awx/ui/client/lib/models/InventoryScript.js b/awx/ui/client/lib/models/InventoryScript.js index 9a1832b8da..1b759410ab 100644 --- a/awx/ui/client/lib/models/InventoryScript.js +++ b/awx/ui/client/lib/models/InventoryScript.js @@ -1,6 +1,5 @@ let Base; let InventorySource; -let strings; function setDependentResources (id) { this.dependentResources = [ @@ -18,27 +17,20 @@ function InventoryScriptModel (method, resource, config) { this.Constructor = InventoryScriptModel; this.setDependentResources = setDependentResources.bind(this); - this.label = strings.get('labels.INVENTORY_SCRIPT'); return this.create(method, resource, config); } -function InventoryScriptModelLoader ( - BaseModel, - InventorySourceModel, - ModelsStrings -) { +function InventoryScriptModelLoader (BaseModel, InventorySourceModel) { Base = BaseModel; InventorySource = InventorySourceModel; - strings = ModelsStrings; return InventoryScriptModel; } InventoryScriptModelLoader.$inject = [ 'BaseModel', - 'InventorySourceModel', - 'ModelsStrings' + 'InventorySourceModel' ]; export default InventoryScriptModelLoader; diff --git a/awx/ui/client/lib/models/InventorySource.js b/awx/ui/client/lib/models/InventorySource.js index b1529780f3..27ec05b6e9 100644 --- a/awx/ui/client/lib/models/InventorySource.js +++ b/awx/ui/client/lib/models/InventorySource.js @@ -1,6 +1,5 @@ let Base; let WorkflowJobTemplateNode; -let strings; function setDependentResources (id) { this.dependentResources = [ @@ -17,7 +16,6 @@ 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); return this.create(method, resource, config); @@ -25,20 +23,17 @@ function InventorySourceModel (method, resource, config) { function InventorySourceModelLoader ( BaseModel, - WorkflowJobTemplateNodeModel, - ModelsStrings + WorkflowJobTemplateNodeModel ) { Base = BaseModel; WorkflowJobTemplateNode = WorkflowJobTemplateNodeModel; - strings = ModelsStrings; return InventorySourceModel; } InventorySourceModelLoader.$inject = [ 'BaseModel', - 'WorkflowJobTemplateNodeModel', - 'ModelsStrings' + 'WorkflowJobTemplateNodeModel' ]; export default InventorySourceModelLoader; diff --git a/awx/ui/client/lib/models/JobTemplate.js b/awx/ui/client/lib/models/JobTemplate.js index c058171bee..885f1338a9 100644 --- a/awx/ui/client/lib/models/JobTemplate.js +++ b/awx/ui/client/lib/models/JobTemplate.js @@ -1,6 +1,5 @@ let Base; let WorkflowJobTemplateNode; -let strings; function setDependentResources (id) { this.dependentResources = [ @@ -18,27 +17,20 @@ function JobTemplateModel (method, resource, config) { this.Constructor = JobTemplateModel; this.setDependentResources = setDependentResources.bind(this); - this.label = strings.get('labels.JOB_TEMPLATE'); return this.create(method, resource, config); } -function JobTemplateModelLoader ( - BaseModel, - WorkflowJobTemplateNodeModel, - ModelsStrings -) { +function JobTemplateModelLoader (BaseModel, WorkflowJobTemplateNodeModel) { Base = BaseModel; WorkflowJobTemplateNode = WorkflowJobTemplateNodeModel; - strings = ModelsStrings; return JobTemplateModel; } JobTemplateModelLoader.$inject = [ 'BaseModel', - 'WorkflowJobTemplateNodeModel', - 'ModelsStrings' + 'WorkflowJobTemplateNodeModel' ]; export default JobTemplateModelLoader; diff --git a/awx/ui/client/lib/models/Organization.js b/awx/ui/client/lib/models/Organization.js index a518511ec6..2e29f72473 100644 --- a/awx/ui/client/lib/models/Organization.js +++ b/awx/ui/client/lib/models/Organization.js @@ -1,28 +1,21 @@ let Base; -let strings; function OrganizationModel (method, resource, config) { Base.call(this, 'organizations'); this.Constructor = OrganizationModel; - this.label = strings.get('labels.ORGANIZATION'); return this.create(method, resource, config); } -function OrganizationModelLoader ( - BaseModel, - ModelsStrings -) { +function OrganizationModelLoader (BaseModel) { Base = BaseModel; - strings = ModelsStrings; return OrganizationModel; } OrganizationModelLoader.$inject = [ - 'BaseModel', - 'ModelsStrings' + 'BaseModel' ]; export default OrganizationModelLoader; diff --git a/awx/ui/client/lib/models/Project.js b/awx/ui/client/lib/models/Project.js index 071350a385..bb08c09179 100644 --- a/awx/ui/client/lib/models/Project.js +++ b/awx/ui/client/lib/models/Project.js @@ -2,7 +2,6 @@ let Base; let JobTemplate; let WorkflowJobTemplateNode; let InventorySource; -let strings; function setDependentResources (id) { this.dependentResources = [ @@ -32,7 +31,6 @@ function ProjectModel (method, resource, config) { this.Constructor = ProjectModel; this.setDependentResources = setDependentResources.bind(this); - this.label = strings.get('labels.PROJECT'); return this.create(method, resource, config); } @@ -42,13 +40,11 @@ function ProjectModelLoader ( JobTemplateModel, WorkflowJobTemplateNodeModel, InventorySourceModel, - ModelsStrings ) { Base = BaseModel; JobTemplate = JobTemplateModel; WorkflowJobTemplateNode = WorkflowJobTemplateNodeModel; InventorySource = InventorySourceModel; - strings = ModelsStrings; return ProjectModel; } @@ -57,8 +53,7 @@ ProjectModelLoader.$inject = [ 'BaseModel', 'JobTemplateModel', 'WorkflowJobTemplateNodeModel', - 'InventorySourceModel', - 'ModelsStrings' + 'InventorySourceModel' ]; export default ProjectModelLoader; diff --git a/awx/ui/client/lib/models/WorkflowJobTemplateNode.js b/awx/ui/client/lib/models/WorkflowJobTemplateNode.js index 5ac7baed0a..c08cbd2e8c 100644 --- a/awx/ui/client/lib/models/WorkflowJobTemplateNode.js +++ b/awx/ui/client/lib/models/WorkflowJobTemplateNode.js @@ -1,28 +1,21 @@ let Base; -let strings; function WorkflowJobTemplateNodeModel (method, resource, config) { Base.call(this, 'workflow_job_template_nodes'); this.Constructor = WorkflowJobTemplateNodeModel; - this.label = strings.get('labels.WORKFLOW_JOB_TEMPLATE_NODE'); return this.create(method, resource, config); } -function WorkflowJobTemplateNodeModelLoader ( - BaseModel, - ModelsStrings -) { +function WorkflowJobTemplateNodeModelLoader (BaseModel) { Base = BaseModel; - strings = ModelsStrings; return WorkflowJobTemplateNodeModel; } WorkflowJobTemplateNodeModelLoader.$inject = [ - 'BaseModel', - 'ModelsStrings' + 'BaseModel' ]; export default WorkflowJobTemplateNodeModelLoader; diff --git a/awx/ui/client/lib/models/models.strings.js b/awx/ui/client/lib/models/models.strings.js index 55b72be5f0..acb2dd5bbf 100644 --- a/awx/ui/client/lib/models/models.strings.js +++ b/awx/ui/client/lib/models/models.strings.js @@ -4,16 +4,46 @@ function ModelsStrings (BaseString) { const { t } = this; const ns = this.models; - ns.labels = { - CREDENTIAL: t.s('Credentials'), - CREDENTIAL_TYPE: t.s('Credential Types'), - INVENTORY: t.s('Inventories'), - INVENTORY_SCRIPT: t.s('Inventory Scripts'), - INVENTORY_SOURCE: t.s('Inventory Sources'), - JOB_TEMPLATE: t.s('Job Templates'), - ORGANIZATION: t.s('Organizations'), - PROJECT: t.s('Projects'), - WORKFLOW_JOB_TEMPLATE_NODE: t.s('Workflow Job Template Nodes') + ns.credentials = { + LABEL: t.s('Credentials') + }; + + ns.credential_types = { + LABEL: t.s('Credential Types') + }; + + ns.inventories = { + LABEL: t.s('Inventories') + }; + + ns.inventory_scripts = { + LABEL: t.s('Inventory Scripts') + + }; + + ns.inventory_sources = { + LABEL: t.s('Inventory Sources') + + }; + + ns.job_templates = { + LABEL: t.s('Job Templates') + + }; + + ns.organizations = { + LABEL: t.s('Organizations') + + }; + + ns.projects = { + LABEL: t.s('Projects') + + }; + + ns.workflow_job_template_nodes = { + LABEL: t.s('Workflow Job Template Nodes') + }; } diff --git a/awx/ui/client/lib/services/base-string.service.js b/awx/ui/client/lib/services/base-string.service.js index 4f0df6b545..74d6611956 100644 --- a/awx/ui/client/lib/services/base-string.service.js +++ b/awx/ui/client/lib/services/base-string.service.js @@ -4,7 +4,6 @@ let i18n; function BaseStringService (namespace) { const ERROR_NO_NAMESPACE = 'BaseString cannot be extended without providing a namespace'; - const ERROR_NO_STRING = 'No string exists with this name'; if (!namespace) { throw new Error(ERROR_NO_NAMESPACE); @@ -67,8 +66,6 @@ function BaseStringService (namespace) { * the more globally relevant strings defined here. Strings with with dots as delimeters are * supported to give flexibility to extending classes to nest strings as necessary. * - * If no match is found, an error is thrown to alert the developer immediately instead of - * failing silently. * * The `t.s` and `t.p` calls should only be used where strings are defined in * .strings.js` files. To use translated strings elsewhere, access them through this @@ -88,13 +85,13 @@ function BaseStringService (namespace) { } else { value = value[key]; } - - if (!value) { - throw new Error(`${ERROR_NO_STRING}: ${name}`); - } }); - return typeof value === 'string' ? value : value(...args); + if (!value || typeof value === 'string') { + return value; + } + + return value(...args); }; }