http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/7b707a05/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js b/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js index 7ed1206..bde863b 100644 --- a/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js +++ b/nifi-registry-web-ui/src/main/webapp/nf-registry.spec.js @@ -20,44 +20,73 @@ var ngCoreTesting = require('@angular/core/testing'); var ngCommon = require('@angular/common'); var FdsDemo = require('nifi-registry/components/fluid-design-system/fds-demo.js'); var NfRegistry = require('nifi-registry/nf-registry.js'); +var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js'); var NfRegistryService = require('nifi-registry/services/nf-registry.service.js'); var NfPageNotFoundComponent = require('nifi-registry/components/page-not-found/nf-registry-page-not-found.js'); var NfRegistryExplorer = require('nifi-registry/components/explorer/nf-registry-explorer.js'); -var NfRegistryExplorerGridListViewer = require('nifi-registry/components/explorer/grid-list/nf-registry-explorer-grid-list-viewer.js'); var NfRegistryAdministration = require('nifi-registry/components/administration/nf-registry-administration.js'); var NfRegistryGeneralAdministration = require('nifi-registry/components/administration/general/nf-registry-general-administration.js'); var NfRegistryUsersAdministration = require('nifi-registry/components/administration/users/nf-registry-users-administration.js'); var NfRegistryAddUser = require('nifi-registry/components/administration/users/add/nf-registry-add-user.js'); var NfRegistryUserDetails = require('nifi-registry/components/administration/users/details/nf-registry-user-details.js'); var NfRegistryUserPermissions = require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js'); -var NfRegistryBucketDetails = require('nifi-registry/components/administration/workflow/buckets/details/nf-registry-bucket-details.js'); var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); var NfRegistryWorkflowAdministration = require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js'); var NfRegistryGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js'); -var NfRegistryBucketGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/bucket/nf-registry-bucket-grid-list-viewer.js'); -var NfRegistryDropletGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/bucket/droplet/nf-registry-droplet-grid-list-viewer.js'); +var NfRegistryBucketGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js'); +var NfRegistryDropletGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js'); var fdsCore = require('@fluid-design-system/core'); +var ngMoment = require('angular2-moment'); +var ngHttp = require('@angular/http'); describe('NfRegistry Component', function () { var comp; var fixture; - beforeEach(ngCoreTesting.async(function () { + beforeEach(function () { ngCoreTesting.TestBed.configureTestingModule({ imports: [ + ngMoment.MomentModule, + ngHttp.HttpModule, + ngHttp.JsonpModule, fdsCore, NfRegistryRoutes ], - declarations: [FdsDemo, NfRegistry, NfRegistryExplorer, NfRegistryExplorerGridListViewer, NfRegistryAdministration, NfRegistryGeneralAdministration, NfRegistryUsersAdministration, NfRegistryUserDetails, NfRegistryUserPermissions, NfRegistryBucketDetails, NfRegistryBucketPermissions, NfRegistryAddUser, NfRegistryWorkflowAdministration, NfRegistryGridListViewer, NfRegistryBucketGridListViewer, NfRegistryDropletGridListViewer, NfPageNotFoundComponent], - providers: [NfRegistryService, {provide: ngCommon.APP_BASE_HREF, useValue: '/'}], + declarations: [ + FdsDemo, + NfRegistry, + NfRegistryExplorer, + NfRegistryAdministration, + NfRegistryGeneralAdministration, + NfRegistryUsersAdministration, + NfRegistryUserDetails, + NfRegistryUserPermissions, + NfRegistryBucketPermissions, + NfRegistryAddUser, + NfRegistryWorkflowAdministration, + NfRegistryGridListViewer, + NfRegistryBucketGridListViewer, + NfRegistryDropletGridListViewer, + NfPageNotFoundComponent + ], + providers: [ + NfRegistryService, + NfRegistryApi, + { + provide: ngCommon.APP_BASE_HREF, + useValue: '/' + } + ], bootstrap: [NfRegistry] }); - })); + }); it('should create component', function () { fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); fixture.detectChanges(); comp = fixture.componentInstance; - expect(comp).toBeDefined() + + //assertions + expect(comp).toBeDefined(); }); }); \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/7b707a05/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js new file mode 100644 index 0000000..4738d42 --- /dev/null +++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js @@ -0,0 +1,427 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var ngHttp = require('@angular/http'); +var fdsDialogsModule = require('@fluid-design-system/dialogs'); +var rxjs = require('rxjs/Rx'); + +var headers = new Headers({'Content-Type': 'application/json'}); + +/** + * NfRegistryApi constructor. + * + * @param Http The angular http module. + * @param FdsDialogService The FDS dialog service. + * @constructor + */ +function NfRegistryApi(Http, FdsDialogService) { + this.http = Http; + this.dialogService = FdsDialogService; +}; + +NfRegistryApi.prototype = { + constructor: NfRegistryApi, + + /** + * Retrieves the snapshot metadata for an existing droplet the registry has stored. + * + * If verbose is true, then the metadata about all snapshots for the droplet will also be returned. + * + * @param {string} dropletType The type of the droplet to request. + * @param {boolean} [verbose] Flag to determine whether or not version children should be included in the response. + * @returns {*} + */ + getDropletSnapshotMetadata: function (dropletUri, verbose) { + var self = this; + var url = '/nifi-registry-api/' + dropletUri; + if (verbose) { + url += '?verbose=true'; + } + return this.http.get(url) + .map(function (response) { + return response.json().snapshotMetadata || []; + }) + .catch(function (error) { + self.dialogService.openConfirm({ + title: 'Error', + message: error._body, + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + return rxjs.Observable.throw(error._body); + }); + }, + + /** + * Retrieves the given droplet with or without snapshot metadata. + * + * @param {string} bucketId The id of the bucket to request. + * @param {string} dropletType The type of the droplet to request. + * @param {string} dropletId The id of the droplet to request. + * @param {boolean} [verbose] Flag to determine whether or not version children should be included in the response. + * @returns {*} + */ + getDroplet: function (bucketId, dropletType, dropletId, verbose) { + var self = this; + var url = '/nifi-registry-api/buckets/' + bucketId + '/' + dropletType + '/' + dropletId; + if (verbose) { + url += '?verbose=true'; + } + return this.http.get(url) + .map(function (response) { + return response.json() || {}; + }) + .catch(function (error) { + self.dialogService.openConfirm({ + title: 'Error', + message: error._body, + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + return rxjs.Observable.throw(error._body); + }); + }, + + /** + * Retrieves all droplets across all buckets (unless the `bucketId` is set then this will + * retrieve all droplets across that specific bucket). Droplets could include flows, extensions, etc. + * + * No snapshot metadata ever returned. + * + * @param {string} [bucketId] Defines a bucket id for filtering results. + * @returns {*} + */ + getDroplets: function (bucketId) { + var self = this; + var url = '/nifi-registry-api/items'; + if (bucketId) { + url += '/' + bucketId; + } + return this.http.get(url) + .map(function (response) { + return response.json() || []; + }) + .catch(function (error) { + self.dialogService.openConfirm({ + title: 'Error', + message: error._body, + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + return rxjs.Observable.throw(error._body); + }); + }, + + /** + * Delete an existing droplet the registry has stored. + * + * @param {string} dropletUri The portion of the URI describing the type of the droplet and its identifier + * + * Ex: + * 'flows/1234' + * 'extension/5678' + * + * @returns {*} + */ + deleteDroplet: function (dropletUri) { + var self = this; + return this.http.delete('/nifi-registry-api/' + dropletUri, headers) + .map(function (response) { + var body = response.json(); + return response.json() || {}; + }) + .catch(function (error) { + self.dialogService.openConfirm({ + title: 'Error', + message: error._body, + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + return rxjs.Observable.throw(error._body); + }); + }, + + /** + * Create a named bucket capable of storing NiFi bucket objects (aka droplets) such as flows and extension bundles. + * + * @param {string} name The name of the bucket. + * @returns {*} + */ + createBucket: function (name) { + var self = this; + return this.http.post('/nifi-registry-api/buckets', {'name': name}, headers) + .map(function (response) { + var body = response.json(); + return response.json() || {}; + }) + .catch(function (error) { + self.dialogService.openConfirm({ + title: 'Error', + message: error._body, + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + return rxjs.Observable.throw(error._body); + }); + }, + + /** + * Delete an existing bucket in the registry, along with all the objects it is storing. + * + * @param {string} bucketId The identifier of the bucket to be deleted. + * @returns {*} + */ + deleteBucket: function (bucketId) { + var self = this; + return this.http.delete('/nifi-registry-api/buckets/' + bucketId, headers) + .map(function (response) { + var body = response.json(); + return response.json() || {}; + }) + .catch(function (error) { + self.dialogService.openConfirm({ + title: 'Error', + message: error._body, + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + return rxjs.Observable.throw(error._body); + }); + }, + + /** + * Get metadata for an existing bucket in the registry. + * + * If verbose is set to true, then each bucket will be returned with the + * set of items in the bucket, but any further children (version snapshot metadata) + * of those items will not be included. + * + * @param {string} bucketId The identifier of the bucket to retrieve. + * @param {bool} [verbose] Flag indicating whether to include the set of items + * (NiFi bucket objects such as flows and extension + * bundles...otherwise known as droplets) in the bucket. + * @returns {*} + */ + getBucket: function (bucketId, verbose) { + var self = this; + var url = '/nifi-registry-api/buckets/' + bucketId; + if (verbose) { + url += '?verbose=true'; + } + return this.http.get(url) + .map(function (response) { + return response.json() || {}; + }) + .catch(function (error) { + self.dialogService.openConfirm({ + title: 'Error', + message: error._body, + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + return rxjs.Observable.throw(error._body); + }); + }, + + /** + * Get metadata for all buckets in the registry for which the client is authorized. + * + * NOTE: Information about the items stored in each bucket should be obtained by + * requesting and individual bucket by id. + * + * @returns {*} + */ + getBuckets: function () { + var self = this; + var url = '/nifi-registry-api/buckets'; + return this.http.get(url) + .map(function (response) { + var body = response.json(); + return response.json() || []; + }) + .catch(function (error) { + self.dialogService.openConfirm({ + title: 'Error', + message: error._body, + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + return rxjs.Observable.throw(error._body); + }); + }, + + //TODO: REST call to API to get user by id. + getUser: function (userId) { + var self = this; + return this.http.get('/nifi-registry-api/users/' + userId) + .map(function (response) { + return response.json() || {}; + }) + .catch(function (error) { + self.dialogService.openConfirm({ + title: 'Error', + message: error._body, + acceptButton: 'Ok', + acceptButtonColor: 'fds-warn' + }); + return rxjs.Observable.throw(error._body); + }); + }, + + //TODO: REST call to API to get users. + getUsers: function (userIds, bucketId) { + var self = this; + return new Promise( + function (resolve) { + resolve([{ + id: '23f6cc59-0156-1000-06b4-2b0810089090', + name: 'Scotty 2 Hotty', + status: 'authorized', + provider: 'Friendly LDAP Provider', + type: 'user', + activities: [{ + id: '25fd6vv87-3249-0001-05g6-4d4767890765', + description: 'Saved something...', + created: new Date().setDate(new Date().getDate() - 1), + updated: new Date() + }], + actions: [{ + 'name': 'details', + 'icon': 'fa fa-info-circle', + 'tooltip': 'User Details', + 'type': 'sidenav', + + }, { + 'name': 'permissions', + 'icon': 'fa fa-key', + 'tooltip': 'Manage User Policies', + 'type': 'sidenav' + }, { + 'name': 'Delete', + 'icon': 'fa fa-trash', + 'tooltip': 'Delete User' + }, { + 'name': 'Suspend', + 'icon': 'fa fa-ban', + 'tooltip': 'Suspend User' + }] + }, { + id: '25fd6vv87-3249-0001-05g6-4d4767890765', + name: 'Group 1', + status: 'suspended', + provider: 'IOAT', + type: 'group', + actions: [{ + 'name': 'details', + 'icon': 'fa fa-info-circle', + 'tooltip': 'User Details', + 'type': 'sidenav' + }, { + 'name': 'permissions', + 'icon': 'fa fa-key', + 'tooltip': 'Manage User Policies', + 'type': 'sidenav' + }, { + 'name': 'Delete', + 'icon': 'fa fa-trash', + 'tooltip': 'Delete User' + }, { + 'name': 'Reauthorize', + 'icon': 'fa fa-check-circle', + 'tooltip': 'Reauthorize User' + }] + }, { + id: '98f6cc59-0156-1000-06b4-2b0810089090', + name: 'G$', + status: 'authorized', + provider: 'Friendly LDAP Provider', + type: 'user', + actions: [{ + 'name': 'details', + 'icon': 'fa fa-info-circle', + 'tooltip': 'User Details', + 'type': 'sidenav' + }, { + 'name': 'permissions', + 'icon': 'fa fa-key', + 'tooltip': 'Manage User Policies', + 'type': 'sidenav' + }, { + 'name': 'Delete', + 'icon': 'fa fa-trash', + 'tooltip': 'Delete User' + }, { + 'name': 'Suspend', + 'icon': 'fa fa-ban', + 'tooltip': 'Suspend User' + }] + }, { + id: '65fd6vv87-3249-0001-05g6-4d4767890765', + name: 'Group 2', + status: 'suspended', + provider: 'IOAT', + type: 'group', + actions: [{ + 'name': 'details', + 'icon': 'fa fa-info-circle', + 'tooltip': 'User Details', + 'type': 'sidenav' + }, { + 'name': 'permissions', + 'icon': 'fa fa-key', + 'tooltip': 'Manage User Policies', + 'type': 'sidenav' + }, { + 'name': 'Delete', + 'icon': 'fa fa-trash', + 'tooltip': 'Delete User' + }, { + 'name': 'Reauthorize', + 'icon': 'fa fa-check-circle', + 'tooltip': 'Reauthorize User' + }] + }]); + }); + // return this.http.get('/nifi-registry-api/users/?bucket=' + bucketId) + // .map(function (response) { + // return response.json() || []; + // }) + // .catch(function (error) { + // self.dialogService.openConfirm({ + // title: 'Error', + // message: error._body, + // acceptButton: 'Ok', + // acceptButtonColor: 'fds-warn' + // }); + // return rxjs.Observable.throw(error._body); + // }); + }, + + //TODO: REST call to API to delete user by id. + deleteUser: function (id) { + var self = this; + }, + + //TODO: REST call to API to suspend user by id. + suspendUser: function (id) { + var self = this; + } +}; + +NfRegistryApi.parameters = [ngHttp.Http, fdsDialogsModule.FdsDialogService]; + +module.exports = NfRegistryApi; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/7b707a05/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js new file mode 100644 index 0000000..7bc869e --- /dev/null +++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js @@ -0,0 +1,538 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the 'License'); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var NfRegistryRoutes = require('nifi-registry/nf-registry.routes.js'); +var ngCoreTesting = require('@angular/core/testing'); +var ngHttpTesting = require('@angular/http/testing'); +var ngCommon = require('@angular/common'); +var FdsDemo = require('nifi-registry/components/fluid-design-system/fds-demo.js'); +var NfRegistry = require('nifi-registry/nf-registry.js'); +var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js'); +var NfRegistryService = require('nifi-registry/services/nf-registry.service.js'); +var NfPageNotFoundComponent = require('nifi-registry/components/page-not-found/nf-registry-page-not-found.js'); +var NfRegistryExplorer = require('nifi-registry/components/explorer/nf-registry-explorer.js'); +var NfRegistryAdministration = require('nifi-registry/components/administration/nf-registry-administration.js'); +var NfRegistryGeneralAdministration = require('nifi-registry/components/administration/general/nf-registry-general-administration.js'); +var NfRegistryUsersAdministration = require('nifi-registry/components/administration/users/nf-registry-users-administration.js'); +var NfRegistryAddUser = require('nifi-registry/components/administration/users/add/nf-registry-add-user.js'); +var NfRegistryUserDetails = require('nifi-registry/components/administration/users/details/nf-registry-user-details.js'); +var NfRegistryUserPermissions = require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js'); +var NfRegistryBucketPermissions = require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js'); +var NfRegistryWorkflowAdministration = require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js'); +var NfRegistryGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js'); +var NfRegistryBucketGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js'); +var NfRegistryDropletGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js'); +var fdsCore = require('@fluid-design-system/core'); +var ngMoment = require('angular2-moment'); +var ngHttp = require('@angular/http'); + +describe('NfRegistry Service API w/ Angular testing utils', function () { + var comp; + var fixture; + var nfRegistryService; + + beforeEach(function () { + ngCoreTesting.TestBed.configureTestingModule({ + imports: [ + ngMoment.MomentModule, + ngHttp.HttpModule, + ngHttp.JsonpModule, + fdsCore, + NfRegistryRoutes + ], + declarations: [ + FdsDemo, + NfRegistry, + NfRegistryExplorer, + NfRegistryAdministration, + NfRegistryGeneralAdministration, + NfRegistryUsersAdministration, + NfRegistryUserDetails, + NfRegistryUserPermissions, + NfRegistryBucketPermissions, + NfRegistryAddUser, + NfRegistryWorkflowAdministration, + NfRegistryGridListViewer, + NfRegistryBucketGridListViewer, + NfRegistryDropletGridListViewer, + NfPageNotFoundComponent + ], + providers: [ + NfRegistryService, + NfRegistryApi, + { + provide: ngCommon.APP_BASE_HREF, + useValue: '/' + }, + { + provide: ngHttp.XHRBackend, + useClass: ngHttpTesting.MockBackend + } + ], + bootstrap: [NfRegistry] + }); + }); + + it('should GET droplet snapshot metadata (verbose = true).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'get').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = { + snapshotMetadata: [ + {bucketIdentifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', version: 999} + ] + }; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.getDropletSnapshotMetadata('flow/test', true).subscribe(function (snapshotMetadata) { + //assertions + expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/flow/test?verbose=true'); + expect(snapshotMetadata.length).toBe(1); + expect(snapshotMetadata[0].bucketIdentifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'); + expect(snapshotMetadata[0].version).toEqual(999); + }); + })); + + it('should GET droplet snapshot metadata (verbose = false).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'get').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = { + snapshotMetadata: [ + {bucketIdentifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', version: 999} + ] + }; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.getDropletSnapshotMetadata('flow/test', false).subscribe(function (snapshotMetadata) { + //assertions + expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/flow/test'); + expect(snapshotMetadata.length).toBe(1); + expect(snapshotMetadata[0].bucketIdentifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'); + expect(snapshotMetadata[0].version).toEqual(999); + }); + })); + + it('should GET droplet by type and ID (verbose = false).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'get').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = { + 'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', + 'name': 'Flow #1', + 'description': 'This is flow #1', + 'bucketIdentifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', + 'createdTimestamp': 1505931890999, + 'modifiedTimestamp': 1505931890999, + 'type': 'FLOW', + 'snapshotMetadata': null, + 'link': { + 'params': { + 'rel': 'self' + }, + 'href': 'flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc' + } + }; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.getDroplet('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', 'flows', '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', false).subscribe(function (droplet) { + //assertions + expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/buckets/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc/flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc'); + expect(droplet.identifier).toEqual('2e04b4fb-9513-47bb-aa74-1ae34616bfdc'); + expect(droplet.type).toEqual('FLOW'); + expect(droplet.name).toEqual('Flow #1'); + }); + })); + + it('should GET droplet by type and ID (verbose = true).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'get').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = { + 'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', + 'name': 'Flow #1', + 'description': 'This is flow #1', + 'bucketIdentifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', + 'createdTimestamp': 1505931890999, + 'modifiedTimestamp': 1505931890999, + 'type': 'FLOW', + 'snapshotMetadata': null, + 'link': { + 'params': { + 'rel': 'self' + }, + 'href': 'flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc' + } + }; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.getDroplet('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', 'flows', '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', true).subscribe(function (droplet) { + //assertions + expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/buckets/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc/flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc?verbose=true'); + expect(droplet.identifier).toEqual('2e04b4fb-9513-47bb-aa74-1ae34616bfdc'); + expect(droplet.type).toEqual('FLOW'); + expect(droplet.name).toEqual('Flow #1'); + }); + })); + + it('should GET all droplets across all buckets.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'get').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = [{ + 'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', + 'name': 'Flow #1', + 'description': 'This is flow #1', + 'bucketIdentifier': '9q7f9e54-dc09-4ceb-aa58-9fe581319cdc', + 'createdTimestamp': 1505931890999, + 'modifiedTimestamp': 1505931890999, + 'type': 'FLOW', + 'snapshotMetadata': null, + 'link': { + 'params': { + 'rel': 'self' + }, + 'href': 'flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc' + } + }, { + 'identifier': '5d04b4fb-9513-47bb-aa74-1ae34616bfdc', + 'name': 'Flow #2', + 'description': 'This is flow #2', + 'bucketIdentifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', + 'createdTimestamp': 1505931890999, + 'modifiedTimestamp': 1505931890999, + 'type': 'FLOW', + 'snapshotMetadata': null, + 'link': { + 'params': { + 'rel': 'self' + }, + 'href': 'flows/5d04b4fb-9513-47bb-aa74-1ae34616bfdc' + } + }]; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.getDroplets().subscribe(function (droplets) { + //assertions + expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/items'); + expect(droplets.length).toBe(2); + expect(droplets[0].bucketIdentifier).toEqual('9q7f9e54-dc09-4ceb-aa58-9fe581319cdc'); + expect(droplets[1].bucketIdentifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'); + expect(droplets[0].name).toEqual('Flow #1'); + expect(droplets[1].name).toEqual('Flow #2'); + }); + })); + + it('should GET all droplets across a single bucket.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'get').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = [{ + 'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', + 'name': 'Flow #1', + 'description': 'This is flow #1', + 'bucketIdentifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', + 'createdTimestamp': 1505931890999, + 'modifiedTimestamp': 1505931890999, + 'type': 'FLOW', + 'snapshotMetadata': null, + 'link': { + 'params': { + 'rel': 'self' + }, + 'href': 'flows/2e04b4fb-9513-47bb-aa74-1ae34616bfdc' + } + }]; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.getDroplets('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc').subscribe(function (droplets) { + //assertions + expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/items/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'); + expect(droplets.length).toBe(1); + expect(droplets[0].bucketIdentifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'); + expect(droplets[0].name).toEqual('Flow #1'); + }); + })); + + it('should DELETE a droplet.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'delete').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = {}; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.deleteDroplet('flows/1234').subscribe(function () { + //assertions + var deleteDropletCall = nfRegistryService.api.http.delete.calls.first() + expect(deleteDropletCall.args[0]).toBe('/nifi-registry-api/flows/1234'); + }); + })); + + it('should POST to create a new bucket.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'post').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = { + identifier: '1234' + }; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.createBucket('test').subscribe(function (bucket) { + //assertions + var createDropletCall = nfRegistryService.api.http.post.calls.first(); + expect(createDropletCall.args[0]).toBe('/nifi-registry-api/buckets'); + expect(createDropletCall.args[1].name).toBe('test'); + expect(bucket.identifier).toBe('1234'); + }); + })); + + it('should DELETE a bucket.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'delete').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = {}; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.deleteBucket('1234').subscribe(function () { + //assertions + var deleteBucketCall = nfRegistryService.api.http.delete.calls.first() + expect(deleteBucketCall.args[0]).toBe('/nifi-registry-api/buckets/1234'); + }); + })); + + it('should GET bucket by ID (verbose = false).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'get').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = { + 'identifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', + 'name': 'Bucket #1' + }; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.getBucket('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', false).subscribe(function (bucket) { + //assertions + expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/buckets/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'); + expect(bucket.identifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'); + expect(bucket.name).toEqual('Bucket #1'); + }); + })); + + it('should GET bucket by ID (verbose = true).', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'get').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = { + 'identifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', + 'name': 'Bucket #1' + }; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.getBucket('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', true).subscribe(function (bucket) { + //assertions + expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/buckets/2f7f9e54-dc09-4ceb-aa58-9fe581319cdc?verbose=true'); + expect(bucket.identifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'); + expect(bucket.name).toEqual('Bucket #1'); + }); + })); + + it('should GET metadata for all buckets in the registry for which the client is authorized.', ngCoreTesting.inject([ngHttp.XHRBackend], function (mockBackend) { + fixture = ngCoreTesting.TestBed.createComponent(NfRegistry); + fixture.detectChanges(); + comp = fixture.componentInstance; + + // NfRegistryService from the root injector + nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService); + + //Spy + spyOn(nfRegistryService.api.http, 'get').and.callThrough(); + + //Setup the mock backend to return mock data + var mockResponse = [{ + 'identifier': '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc', + 'name': 'Bucket #1' + }]; + mockBackend.connections.subscribe(function (connection) { + // This is called every time someone subscribes to an http call + connection.mockRespond(new ngHttp.Response(new ngHttp.ResponseOptions({ + body: JSON.stringify(mockResponse) + }))); + }); + + // The function to test + nfRegistryService.api.getBuckets().subscribe(function (buckets) { + //assertions + expect(nfRegistryService.api.http.get).toHaveBeenCalledWith('/nifi-registry-api/buckets'); + expect(buckets[0].identifier).toEqual('2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'); + expect(buckets[0].name).toEqual('Bucket #1'); + }); + })); +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/7b707a05/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js ---------------------------------------------------------------------- diff --git a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js index 55f58d1..308db56 100644 --- a/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js +++ b/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js @@ -16,6 +16,11 @@ */ var covalentCore = require('@covalent/core'); +var ngRouter = require('@angular/router'); +var fdsDialogsModule = require('@fluid-design-system/dialogs'); +var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js'); +require('rxjs/add/operator/catch'); +require('rxjs/add/operator/map'); function filterData(data, searchTerm, ignoreCase) { var field = ''; @@ -28,28 +33,12 @@ function filterData(data, searchTerm, ignoreCase) { if (filter) { data = data.filter(function (item) { var res = Object.keys(item).find(function (key) { - if (field.indexOf(".") > -1) { - var objArray = field.split("."); - var obj = item; - var arrayLength = objArray.length; - for (var i = 0; i < arrayLength; i++) { - try { - obj = obj[objArray[i]]; - } catch (e) { - return false; - } - } - var preItemValue = ('' + obj); - var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue; - return itemValue.indexOf(filter) > -1; - } else { - if (key !== field && field !== '') { - return false; - } - var preItemValue = ('' + item[key]); - var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue; - return itemValue.indexOf(filter) > -1; + if (key !== field && field !== '') { + return false; } + var preItemValue = ('' + item[key]); + var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue; + return itemValue.indexOf(filter) > -1; }); return !(typeof res === 'undefined'); }); @@ -57,14 +46,26 @@ function filterData(data, searchTerm, ignoreCase) { return data; }; -function NfRegistryService(TdDataTableService) { - this.registries = []; - this.registry = {}; +/** + * NfRegistryService constructor. + * + * @param TdDataTableService The covalent data table service module. + * @param NfRegistryApi The registry API module. + * @param Router The angular router module. + * @param FdsDialogService The FDS dialog service. + * @constructor + */ +function NfRegistryService(TdDataTableService, NfRegistryApi, Router, FdsDialogService) { + this.router = Router; + this.dialogService = FdsDialogService; + this.registry = { + name: "Nifi Registry" + }; + this.api = NfRegistryApi; this.bucket = {}; this.buckets = []; this.droplet = {}; this.droplets = []; - this.certifications = []; this.user = {}; this.users = []; this.alerts = []; @@ -110,386 +111,25 @@ function NfRegistryService(TdDataTableService) { this.usersCurrentPage = 1; this.usersPageSize = 5; this.usersPageCount = 0; - - this.filteredCertifications = []; - - this.certificationColumns = [ - {name: 'name', label: 'Label Name', sortable: true, tooltip: 'Sort Certifications by name.', width: 40}, - {name: 'usage', label: 'Usage', sortable: true, tooltip: 'Sort Certifications by usage.', width: 30}, - {name: 'badge', label: 'Badge Design', sortable: false, tooltip: 'Certification badge.', width: 30} - ]; - - this.autoCompleteCertifications = []; - this.certificationsSearchTerms = []; }; NfRegistryService.prototype = { constructor: NfRegistryService, - deleteDroplet: function (id) { - //TODO: REST call to API to delete droplet by id. - }, - - deleteBucket: function (id) { - //TODO: REST call to API to delete bucket by id. - }, - - deleteUser: function (id) { - //TODO: REST call to API to delete user by id. - }, - - suspendUser: function (id) { - //TODO: REST call to API to suspend user by id. - }, - - getRegistries: function () { - //TODO: leverage $http service to make call to nifi registry api. For now just return mock data... - var self = this; - var date = new Date(); - return new Promise( - function (resolve) { - setTimeout( - function () { - resolve(self.registries = [{ - id: '23f6cc59-0156-1000-06b4-2b0810089090', - name: "Nifi Registry", - users: [{ - id: '23f6cc59-0156-1000-06b4-2b0810089090', - name: 'Scotty 2 Hotty', - status: 'authorized', - provider: 'Friendly LDAP Provider', - type: 'user', - activities: [{ - id: '25fd6vv87-3249-0001-05g6-4d4767890765', - description: 'Saved something...', - created: date.setDate(date.getDate() - 1), - updated: new Date() - }], - actions: [{ - 'name': 'details', - 'icon': 'fa fa-info-circle', - 'tooltip': 'User Details', - 'type': 'sidenav', - - }, { - 'name': 'permissions', - 'icon': 'fa fa-key', - 'tooltip': 'Manage User Policies', - 'type': 'sidenav' - }, { - 'name': 'Delete', - 'icon': 'fa fa-trash', - 'tooltip': 'Delete User' - }, { - 'name': 'Suspend', - 'icon': 'fa fa-ban', - 'tooltip': 'Suspend User' - }] - }, { - id: '25fd6vv87-3249-0001-05g6-4d4767890765', - name: 'Group 1', - status: 'suspended', - provider: 'IOAT', - type: 'group', - actions: [{ - 'name': 'details', - 'icon': 'fa fa-info-circle', - 'tooltip': 'User Details', - 'type': 'sidenav' - }, { - 'name': 'permissions', - 'icon': 'fa fa-key', - 'tooltip': 'Manage User Policies', - 'type': 'sidenav' - }, { - 'name': 'Delete', - 'icon': 'fa fa-trash', - 'tooltip': 'Delete User' - }, { - 'name': 'Reauthorize', - 'icon': 'fa fa-check-circle', - 'tooltip': 'Reauthorize User' - }] - }, { - id: '98f6cc59-0156-1000-06b4-2b0810089090', - name: 'G$', - status: 'authorized', - provider: 'Friendly LDAP Provider', - type: 'user', - actions: [{ - 'name': 'details', - 'icon': 'fa fa-info-circle', - 'tooltip': 'User Details', - 'type': 'sidenav' - }, { - 'name': 'permissions', - 'icon': 'fa fa-key', - 'tooltip': 'Manage User Policies', - 'type': 'sidenav' - }, { - 'name': 'Delete', - 'icon': 'fa fa-trash', - 'tooltip': 'Delete User' - }, { - 'name': 'Suspend', - 'icon': 'fa fa-ban', - 'tooltip': 'Suspend User' - }] - }, { - id: '65fd6vv87-3249-0001-05g6-4d4767890765', - name: 'Group 2', - status: 'suspended', - provider: 'IOAT', - type: 'group', - actions: [{ - 'name': 'details', - 'icon': 'fa fa-info-circle', - 'tooltip': 'User Details', - 'type': 'sidenav' - }, { - 'name': 'permissions', - 'icon': 'fa fa-key', - 'tooltip': 'Manage User Policies', - 'type': 'sidenav' - }, { - 'name': 'Delete', - 'icon': 'fa fa-trash', - 'tooltip': 'Delete User' - }, { - 'name': 'Reauthorize', - 'icon': 'fa fa-check-circle', - 'tooltip': 'Reauthorize User' - }] - }], - buckets: [{ - id: '25fd6vv87-3549-0001-05g6-4d4567890765', - name: "My Flows", - actions: [{ - 'name': 'permissions', - 'icon': 'fa fa-key', - 'tooltip': 'Manage Bucket Policies', - 'type': 'sidenav' - }, { - 'name': 'Delete', - 'icon': 'fa fa-trash', - 'tooltip': 'Delete Bucket' - }], - droplets: [{ - id: '23f6cc59-0156-1000-09b4-2b0610089090', - name: "Security_Dev_Ops", - displayName: 'Security Dev Ops', - type: 'Data Flow', - sublabel: 'Some info', - updated: new Date(), - description: 'This is the most secure flow ever!', - versions: [{ - id: '23f6cc59-0156-1000-06b4-2b0810089090', - revision: '1', - dependentFlows: [{ - id: '25fd6vv87-3549-0001-05g6-4d4567890765' - }], - author: '2Hot', - comment: 'delete ListenHttp', - created: new Date(date.setDate(date.getDate() - 1)), - updated: new Date() - }, { - id: '25fd6vv87-3549-0001-05g6-4d4567890765', - revision: '2', - dependentFlows: [{ - id: '23f6cc59-0156-1000-06b4-2b0810089090' - }], - author: '2Hot', - comment: 'added Labels for better description of groups of processors', - created: new Date(), - updated: new Date() - }], - flows: [], - extensions: [], - assets: [], - actions: [{ - 'name': 'Delete', - 'icon': 'fa fa-close', - 'tooltip': 'Delete User' - }] - }] - }, { - id: '23f6cc59-0156-1000-09b4-2b0810089080', - name: "Development Flows", - droplets: [{ - id: '23f6cc59-0156-1000-09b4-2b0610089090', - name: "Fraud Detection Flow", - displayName: 'Fraud Detection Flow', - type: 'Data Flow', - sublabel: 'A sublabel', - updated: new Date(date.setDate(date.getDate() - 2)), - description: 'This flow detects fraud!', - versions: [{ - id: '23f6cc59-0156-1000-06b4-2b0810089090', - revision: '1', - dependentFlows: [{ - id: '25fd6vv87-3549-0001-05g6-4d4567890765' - }], - author: 'G$', - comment: 'added funnel', - created: new Date(date.setDate(date.getDate() - 1)), - updated: new Date() - }, { - id: '25fd6vv87-3549-0001-05g6-4d4567890765', - revision: '2', - dependentFlows: [{ - id: '23f6cc59-0156-1000-06b4-2b0810089090' - }], - author: '2Hot', - comment: 'added Execute script', - created: new Date(date.setDate(date.getDate() - 1)), - updated: new Date() - }, { - id: '77fd6vv87-3549-0001-05g6-4d4567890765', - revision: '3', - dependentFlows: [{ - id: '23f6cc59-0156-1000-06b4-2b0810089090' - }], - author: 'Payne', - comment: 'removed Execute script', - created: new Date(date.setDate(date.getDate() - 1)), - updated: new Date() - }, { - id: '96fd6vv87-3549-0001-05g6-4d4567890765', - revision: '4', - dependentFlows: [{ - id: '23f6cc59-0156-1000-06b4-2b0810089090' - }], - author: 'G$', - comment: 'add Execute script', - created: new Date(date.setDate(date.getDate() - 1)), - updated: new Date() - }], - flows: [], - extensions: [], - assets: [], - actions: [{ - 'name': 'Delete', - 'icon': 'fa fa-close' - }] - }, { - id: '59f6cc23-0156-1000-09b4-2b0610089090', - name: "Cyber Security", - displayName: 'Cyber Security', - type: 'Data Flow', - sublabel: 'A sublabel', - updated: new Date(date.setDate(date.getDate() - 1)), - description: 'This is the most cyber secure flow ever!', - versions: [{ - id: '23f6cc59-0156-1000-06b4-2b0810089090', - revision: '1', - dependentFlows: [{ - id: '25fd6vv87-3549-0001-05g6-4d4567890765' - }], - author: 'G$', - comment: 'added funnel', - created: new Date(date.setDate(date.getDate() - 1)), - updated: new Date() - }], - flows: [], - extensions: [], - assets: [], - actions: [{ - 'name': 'Delete', - 'icon': 'fa fa-close', - 'tooltip': 'Delete User' - }] - }], - actions: [{ - 'name': 'permissions', - 'icon': 'fa fa-key', - 'tooltip': 'Manage Bucket Policies', - 'type': 'sidenav' - }, { - 'name': 'Delete', - 'icon': 'fa fa-trash', - 'tooltip': 'Delete Bucket' - }] - }] // some data model for the contents of a registry - }]) - }, 0); - } - ); - }, - - getRegistry: function (registryId) { - return this.getRegistries().then( - function (registries) { - return registries.find( - function (registry) { - if (registryId === registry.id) { - return registry; - } - }); - }); - }, - - getDroplet: function (registryId, bucketId, dropletId) { - return this.getDroplets(registryId, bucketId, dropletId).then( - function (droplets) { - return droplets[0]; - }); - }, - - getDroplets: function (registryIds, bucketIds, dropletIds) { - var self = this; - return this.getRegistries().then( - function (registries) { - var buckets = []; - - registries.find( - function (registry) { - if (registryIds === undefined || registryIds.indexOf(registry.id) >= 0) { - registry.buckets.find( - function (bucket) { - if (bucketIds === undefined || bucketIds.indexOf(bucket.id) >= 0) { - buckets.push(bucket); - } - }); - } - }); - - var droplets = []; - - buckets.find( - function (bucket) { - bucket.droplets.find( - function (droplet) { - if (dropletIds === undefined || dropletIds.indexOf(droplet.id) >= 0) { - droplets.push(droplet); - } - }); - }); - - return droplets; - }); - - }, - - isDropletFilterChecked: function (term) { - return (this.dropletsSearchTerms.indexOf(term) > -1); - }, - - getDropletTypeCount: function (type) { - return this.filteredDroplets.filter(function (droplet) { - return droplet.type === type; - }).length; - }, - - getDropletCertificationCount: function (certification) { - return this.filteredDroplets.filter(function (droplet) { - return Object.keys(droplet).find(function (key) { - if (key === certification && droplet[certification].type === 'certification') { - return droplet; - } - }); - }).length; + /** + * Set the state for the breadcrumb animations. + * + * @param {string} state The state. Valid values are 'in' or 'out'. + */ + setBreadcrumbState: function (state) { + this.breadCrumbState = state; }, + /** + * Gets the droplet grid-list explorer component's active sorting column display label. + * + * @returns {string} + */ getSortByLabel: function () { var sortByColumn; var arrayLength = this.dropletColumns.length; @@ -514,6 +154,12 @@ NfRegistryService.prototype = { } }, + /** + * Generates the droplet grid-list explorer component's sorting menu options. + * + * @param col One of the available `dropletColumns`. + * @returns {string} + */ generateSortMenuLabels: function (col) { var label = ''; switch (col.label) { @@ -527,57 +173,78 @@ NfRegistryService.prototype = { return label; }, - sortDroplets: function (sortEvent, column) { + /** + * Execute the given droplet action. + * + * @param action The action object. + * @param droplet The droplet object the `action` will act upon. + */ + executeDropletAction: function (action, droplet) { + var self = this; + if (action.name.toLowerCase() === 'delete') { + this.dialogService.openConfirm({ + title: 'Delete ' + droplet.type.toLowerCase(), + message: 'All versions of this ' + droplet.type.toLowerCase() + ' will be deleted.', + cancelButton: 'Cancel', + acceptButton: 'Delete', + acceptButtonColor: 'fds-warn' + }).afterClosed().subscribe( + function (accept) { + if (accept) { + self.api.deleteDroplet(droplet.link.href).subscribe(function(){ + self.droplets = self.droplets.filter(function(d){ + return (d.identifier !== droplet.identifier) ? true : false + }); + self.filterDroplets(); + }); + } + }); + } + }, + + /** + * Retrieves the snapshot metadata for the given droplet. + * + * @param droplet The droplet. + */ + getDropletSnapshotMetadata: function (droplet) { + this.api.getDropletSnapshotMetadata(droplet.link.href, true).subscribe(function(snapshotMetadata) { + droplet.snapshotMetadata = snapshotMetadata; + }) + }, + + /** + * Sort `droplets` by `column`. + * + * @param column The column to sort by. + */ + sortDroplets: function (column) { if (column.sortable === true) { // toggle column sort order var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC'; this.filterDroplets(column.name, sortOrder); - this.activeDropletColumn = column; //only one column can be actively sorted so we reset all to inactive this.dropletColumns.forEach(function (c) { c.active = false; }); //and set this column as the actively sorted column column.active = true; + this.activeDropletColumn = column; } }, - dropletsSearchRemove: function (searchTerm) { - this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder); - }, - - dropletsSearchAdd: function (searchTerm) { - this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder); - }, - - toggleDropletsFilter: function (searchTerm) { - var applySearchTerm = true; - // check if the search term is already applied and remove it if true - if (this.dropletsSearchTerms.length > 0) { - var arrayLength = this.dropletsSearchTerms.length; - for (var i = 0; i < arrayLength; i++) { - var index = this.dropletsSearchTerms.indexOf(searchTerm); - if (index > -1) { - this.dropletsSearchTerms.splice(index, 1); - applySearchTerm = false; - } - } - } - - // if we just removed the search term do NOT apply it again - if (applySearchTerm) { - this.dropletsSearchTerms.push(searchTerm); - } - - this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder); - }, - + /** + * Filter droplets. + * + * @param {string} [sortBy] The column name to sort `dropletColumns` by. + * @param {string} [sortOrder] The order. Either 'ASC' or 'DES' + */ filterDroplets: function (sortBy, sortOrder) { // if `sortOrder` is `undefined` then use 'ASC' if (sortOrder === undefined) { sortOrder = 'ASC' } - // if `sortBy` is `undefined` then find the first sortable column in this.dropletColumns + // if `sortBy` is `undefined` then find the first sortable column in `dropletColumns` if (sortBy === undefined) { var arrayLength = this.dropletColumns.length; for (var i = 0; i < arrayLength; i++) { @@ -596,7 +263,14 @@ NfRegistryService.prototype = { } } - var newData = this.droplets; + var newData; + + // if we are viewing a single droplet + if (this.droplet.identifier) { + newData = [this.droplet]; + } else { + newData = this.droplets; + } for (var i = 0; i < this.dropletsSearchTerms.length; i++) { newData = filterData(newData, this.dropletsSearchTerms[i], true, this.activeDropletColumn.name); @@ -607,6 +281,9 @@ NfRegistryService.prototype = { this.getAutoCompleteDroplets(); }, + /** + * Generates the auto complete options for the droplet filter. + */ getAutoCompleteDroplets: function () { var self = this; this.autoCompleteDroplets = []; @@ -617,36 +294,48 @@ NfRegistryService.prototype = { }); }, - getBucket: function (registryId, bucketId) { - return this.getBuckets(registryId, bucketId).then( - function (buckets) { - return buckets[0]; - }); - }, - - getBuckets: function (registryIds, bucketIds) { + /** + * Execute the given bucket action. + * + * @param action The action object. + * @param bucket The bucket object the `action` will act upon. + */ + executeBucketAction: function (action, bucket) { var self = this; - return this.getRegistries().then( - function (registries) { - var buckets = []; - - registries.find( - function (registry) { - if (registryIds === undefined || registryIds.indexOf(registry.id) >= 0) { - registry.buckets.find( - function (bucket) { - if (bucketIds === undefined || bucketIds.indexOf(bucket.id) >= 0) { - buckets.push(bucket); - } + switch (action.name.toLowerCase()) { + case 'delete': + this.dialogService.openConfirm({ + title: 'Delete Bucket', + message: 'All versions of all items will be deleted.', + cancelButton: 'Cancel', + acceptButton: 'Delete', + acceptButtonColor: 'fds-warn' + }).afterClosed().subscribe( + function (accept) { + if (accept) { + self.api.deleteBucket(bucket.identifier).subscribe(function (response) { + self.buckets = self.buckets.filter(function (b) { + return b.identifier !== bucket.identifier; }); + self.filterBuckets(); + }); } }); - - return buckets; - }); - + break; + case 'permissions': + this.router.navigateByUrl('/nifi-registry/administration/workflow(' + action.type + ':bucket/' + action.name + '/' + bucket.identifier + ')'); + break; + default: + break; + } }, + /** + * Filter buckets. + * + * @param {string} sortBy The column name to sort `bucketColumns` by. + * @param {string} sortOrder The order. Either 'ASC' or 'DES' + */ filterBuckets: function (sortBy, sortOrder) { // if `sortOrder` is `undefined` then use 'ASC' if (sortOrder === undefined) { @@ -683,6 +372,9 @@ NfRegistryService.prototype = { this.getAutoCompleteBuckets(); }, + /** + * Generates the auto complete options for the bucket filter. + */ getAutoCompleteBuckets: function () { var self = this; this.autoCompleteBuckets = []; @@ -693,6 +385,11 @@ NfRegistryService.prototype = { }); }, + /** + * Sort `buckets` by `column`. + * + * @param column The column to sort by. + */ sortBuckets: function (sortEvent, column) { if (column.sortable === true) { // toggle column sort order @@ -708,14 +405,6 @@ NfRegistryService.prototype = { } }, - bucketsSearchRemove: function (searchTerm) { - this.filterDroplets(this.activeBucketsColumn.name, this.activeBucketsColumn.sortOrder); - }, - - bucketsSearchAdd: function (searchTerm) { - this.filterDroplets(this.activeBucketsColumn.name, this.activeBucketsColumn.sortOrder); - }, - allFilteredBucketsSelected: function () { this.filteredBuckets.forEach(function (c) { if (c.checked === undefined || c.checked === false) { @@ -734,134 +423,6 @@ NfRegistryService.prototype = { } }, - getCertification: function (registryId, certificatonId) { - return this.getCertifications(registryId, certificatonId).then( - function (certificatons) { - return certificatons[0]; - }); - }, - getCertifications: function (registryIds, certificatonIds) { - var self = this; - return this.getRegistries().then( - function (registries) { - var certificatons = []; - - registries.find( - function (registry) { - if (registryIds === undefined || registryIds.indexOf(registry.id) >= 0) { - registry.certifications.find( - function (certificaton) { - if (certificatonIds === undefined || certificatonIds.indexOf(certificaton.id) >= 0) { - certificatons.push(certificaton); - } - }); - } - }); - - return certificatons; - }); - - }, - - filterCertifications: function (sortBy, sortOrder) { - // if `sortOrder` is `undefined` then use 'ASC' - if (sortOrder === undefined) { - sortOrder = 'ASC' - } - - // if `sortBy` is `undefined` then find the first sortable column in this.bucketColumns - if (sortBy === undefined) { - var arrayLength = this.bucketColumns.length; - for (var i = 0; i < arrayLength; i++) { - if (this.bucketColumns[i].sortable === true) { - sortBy = this.bucketColumns[i].name; - this.activeBucketColumn = this.bucketColumns[i]; - //only one column can be actively sorted so we reset all to inactive - this.bucketColumns.forEach(function (c) { - c.active = false; - }); - //and set this column as the actively sorted column - this.bucketColumns[i].active = true; - this.bucketColumns[i].sortOrder = sortOrder; - break; - } - } - } - - var newData = this.certifications; - - for (var i = 0; i < this.certificationsSearchTerms.length; i++) { - newData = filterData(newData, this.certificationsSearchTerms[i], true, this.activeBucketColumn.name); - } - - newData = this.dataTableService.sortData(newData, sortBy, sortOrder); - this.filteredCertifications = newData; - this.getAutoCompleteCertifications(); - }, - - getAutoCompleteCertifications: function () { - var self = this; - this.autoCompleteCertifications = []; - this.bucketColumns.forEach(function (c) { - return self.filteredCertifications.forEach(function (r) { - return (r[c.name.toLowerCase()]) ? self.autoCompleteCertifications.push(r[c.name.toLowerCase()].toString()) : ''; - }); - }); - }, - - sortCertifications: function (sortEvent, column) { - if (column.sortable === true) { - // toggle column sort order - var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC'; - this.filterCertifications(column.name, sortOrder); - this.activeCertificationsColumn = column; - //only one column can be actively sorted so we reset all to inactive - this.bucketColumns.forEach(function (c) { - c.active = false; - }); - //and set this column as the actively sorted column - column.active = true; - } - }, - - certificationsSearchRemove: function (searchTerm) { - this.filterDroplets(this.activeCertificationsColumn.name, this.activeCertificationsColumn.sortOrder); - }, - - certificationsSearchAdd: function (searchTerm) { - this.filterDroplets(this.activeCertificationsColumn.name, this.activeCertificationsColumn.sortOrder); - }, - - getUser: function (registryId, userId) { - return this.getUsers(registryId, userId).then( - function (users) { - return users[0]; - }); - }, - - getUsers: function (registryIds, userIds) { - var self = this; - return this.getRegistries().then( - function (registries) { - var users = []; - - registries.find( - function (registry) { - if (registryIds === undefined || registryIds.indexOf(registry.id) >= 0) { - registry.users.find( - function (user) { - if (userIds === undefined || userIds.indexOf(user.id) >= 0) { - users.push(user); - } - }); - } - }); - - return users; - }); - - }, - sortUsers: function (sortEvent, column) { if (column.sortable) { var sortBy = column.name; @@ -970,12 +531,8 @@ NfRegistryService.prototype = { }, //</editor-fold> - - setBreadcrumbState: function (state) { - this.breadCrumbState = state; - } }; -NfRegistryService.parameters = [covalentCore.TdDataTableService]; +NfRegistryService.parameters = [covalentCore.TdDataTableService, NfRegistryApi, ngRouter.Router, fdsDialogsModule.FdsDialogService]; module.exports = NfRegistryService;
