From 823da8ff7e18a12bf5f03dbdb785d3261d543902 Mon Sep 17 00:00:00 2001 From: Crystal Lai Date: Wed, 27 Jan 2021 15:25:12 +0100 Subject: [PATCH 1/9] Implement component mutations and queries --- gsa/src/web/graphql/policies.js | 115 +++++++----------------- gsa/src/web/pages/policies/component.js | 36 +++++--- 2 files changed, 57 insertions(+), 94 deletions(-) diff --git a/gsa/src/web/graphql/policies.js b/gsa/src/web/graphql/policies.js index 953c01892d..5249f9d8b7 100644 --- a/gsa/src/web/graphql/policies.js +++ b/gsa/src/web/graphql/policies.js @@ -18,7 +18,7 @@ */ import {useCallback} from 'react'; -import {gql, useQuery, useMutation, useLazyQuery} from '@apollo/client'; +import {gql, useQuery, useMutation, useLazyQuery, useApolloClient} from '@apollo/client'; import CollectionCounts from 'gmp/collection/collectioncounts'; import Policy from 'gmp/models/policy'; @@ -141,18 +141,10 @@ export const CLONE_POLICY = gql` } `; -export const DELETE_POLICIES_BY_FILTER = gql` - mutation deletePoliciesByFilter($filterString: String!) { - deletePoliciesByFilter(filterString: $filterString) { - ok - } - } -`; - -export const EXPORT_POLICIES_BY_FILTER = gql` - mutation exportPoliciesByFilter($filterString: String) { - exportPoliciesByFilter(filterString: $filterString) { - exportedEntities +export const CREATE_POLICY = gql` + mutation createPolicy($input: CreatePolicyInput!) { + createPolicy(input: $input) { + id } } `; @@ -219,81 +211,38 @@ export const useClonePolicy = options => { return [clonePolicy, {...other, id: policyId}]; }; -export const useLazyGetPolicies = (variables, options) => { - const [queryPolicies, {data, ...other}] = useLazyQuery(GET_POLICIES, { - ...options, - variables, - }); - const policies = isDefined(data?.policies) - ? data.policies.edges.map(entity => Policy.fromObject(entity.node)) - : undefined; - - const {total, filtered, offset = -1, limit, length} = - data?.policies?.counts || {}; - const counts = isDefined(data?.policies?.counts) - ? new CollectionCounts({ - all: total, - filtered: filtered, - first: offset + 1, - length: length, - rows: limit, - }) - : undefined; - const getPolicies = useCallback( - // eslint-disable-next-line no-shadow - (variables, options) => queryPolicies({...options, variables}), - [queryPolicies], - ); - const pageInfo = data?.policies?.pageInfo; - return [getPolicies, {...other, counts, policies, pageInfo}]; -}; - -export const useExportPoliciesByFilter = options => { - const [queryExportPoliciesByFilter] = useMutation( - EXPORT_POLICIES_BY_FILTER, +export const useCreatePolicy = options => { + const [queryCreatePolicy, {data, ...other}] = useMutation( + CREATE_POLICY, options, ); - const exportPoliciesByFilter = useCallback( + const createPolicy = useCallback( // eslint-disable-next-line no-shadow - filterString => - queryExportPoliciesByFilter({ - ...options, - variables: { - filterString, - }, - }), - [queryExportPoliciesByFilter, options], + (inputObject, options) => + queryCreatePolicy({...options, variables: {input: inputObject}}).then( + result => result?.data?.createPolicy?.id, + ), + [queryCreatePolicy], ); - - return exportPoliciesByFilter; + const policyId = data?.createPolicy?.id; + return [createPolicy, {...other, id: policyId}]; }; -export const useDeletePoliciesByIds = options => { - const [queryDeletePoliciesByIds, data] = useMutation( - DELETE_POLICIES_BY_IDS, - options, - ); - const deletePoliciesByIds = useCallback( - // eslint-disable-next-line no-shadow - (ids, options) => queryDeletePoliciesByIds({...options, variables: {ids}}), - [queryDeletePoliciesByIds], - ); - return [deletePoliciesByIds, data]; -}; +export const useLoadPolicyPromise = () => { + const client = useApolloClient(); -export const useDeletePoliciesByFilter = options => { - const [queryDeletePoliciesByFilter, data] = useMutation( - DELETE_POLICIES_BY_FILTER, - options, - ); - const deletePoliciesByFilter = useCallback( - // eslint-disable-next-line no-shadow - (filterString, options) => - queryDeletePoliciesByFilter({ - ...options, - variables: {filterString}, - }), - [queryDeletePoliciesByFilter], - ); - return [deletePoliciesByFilter, data]; + const loadPolicy = policyId => + client + .query({ + query: GET_POLICY, + variables: {id: policyId}, + fetchPolicy: 'no-cache', // do not cache, since this is used when a change is saved + }) + .then(response => { + const policy = Policy.fromObject(response?.data?.policy); + + return policy; + }); + + return loadPolicy; }; diff --git a/gsa/src/web/pages/policies/component.js b/gsa/src/web/pages/policies/component.js index 6f0875bcb8..1dbf408dd5 100644 --- a/gsa/src/web/pages/policies/component.js +++ b/gsa/src/web/pages/policies/component.js @@ -24,6 +24,8 @@ import _ from 'gmp/locale'; import {DEFAULT_MIN_QOD} from 'gmp/models/audit'; import {ALL_FILTER} from 'gmp/models/filter'; +import {BASE_SCAN_CONFIG_ID} from 'gmp/models/scanconfig'; + import { ospScannersFilter, OPENVAS_DEFAULT_SCANNER_ID, @@ -39,6 +41,8 @@ import {shorten} from 'gmp/utils/string'; import EntityComponent from 'web/entity/component'; +import {useCreatePolicy, useLoadPolicyPromise} from 'web/graphql/policies'; + import AlertComponent from 'web/pages/alerts/component'; import AuditDialog from 'web/pages/audits/dialog'; @@ -109,6 +113,9 @@ const PolicyComponent = ({ importDialogVisible: false, }); + const [createPolicy] = useCreatePolicy(); + const loadPolicyPromise = useLoadPolicyPromise(); + // Redux loaders const loadScannersAction = () => dispatch(loadScannersFromStore(gmp)(ALL_FILTER)); @@ -208,9 +215,17 @@ const PolicyComponent = ({ const handleSavePolicy = d => { const {policy} = state; - - handleInteraction(); const {name, comment, id} = d; + handleInteraction(); + + if (!isDefined(id)) { + return createPolicy({ + policyId: BASE_SCAN_CONFIG_ID, + name, + comment, + }).then(onCreated, onCreateError); + } + let saveData = d; if (policy.isInUse()) { saveData = {name, comment, id}; @@ -603,12 +618,12 @@ const PolicyComponent = ({ }), ); - return gmp.policy - .get({id: policyId}) - .then(response => { + return loadPolicyPromise(policyId) + .then(policy => { + console.log(policy); dispatchState( updateState({ - policy: response.data, + policy, }), ); }) @@ -785,10 +800,9 @@ const PolicyComponent = ({ {createPolicyDialogVisible && ( { - handleInteraction(); - return save(d).then(() => closeCreatePolicyDialog()); - }} + onSave={d => + handleSavePolicy(d).then(() => closeCreatePolicyDialog()) + } /> )} {editPolicyDialogVisible && ( @@ -797,7 +811,7 @@ const PolicyComponent = ({ configFamilies={policy.families} configId={policy.id} configIsInUse={policy.isInUse()} - configType={policy.policy_type} + configType={policy.policyType} editNvtDetailsTitle={_('Edit Policy NVT Details')} editNvtFamiliesTitle={_('Edit Policy Family')} families={families} From 1e422d0ca8268096bcd391cb29777499b8c65944 Mon Sep 17 00:00:00 2001 From: Crystal Lai Date: Wed, 27 Jan 2021 15:46:05 +0100 Subject: [PATCH 2/9] Policy promise test --- gsa/src/web/graphql/__tests__/policies.js | 124 +++++----------------- 1 file changed, 26 insertions(+), 98 deletions(-) diff --git a/gsa/src/web/graphql/__tests__/policies.js b/gsa/src/web/graphql/__tests__/policies.js index 71060419b1..a337be2487 100644 --- a/gsa/src/web/graphql/__tests__/policies.js +++ b/gsa/src/web/graphql/__tests__/policies.js @@ -16,7 +16,9 @@ * along with this program. If not, see . */ /* eslint-disable react/prop-types */ -import React from 'react'; +import React, {useState} from 'react'; + +import {isDefined} from 'gmp/utils/identity'; import {isDefined} from 'gmp/utils/identity'; @@ -38,7 +40,7 @@ import { useExportPoliciesByFilter, useExportPoliciesByIds, useGetPolicy, - useLazyGetPolicies, + useLoadPolicyPromise, } from '../policies'; const GetPolicyComponent = ({id}) => { @@ -156,124 +158,50 @@ describe('useClonePolicy tests', () => { }); }); -const DeletePoliciesByFilterComponent = () => { - const [deletePoliciesByFilter] = useDeletePoliciesByFilter(); - return ( -