From 11d7d501a70e946643e1f8e2eecf6fa00558646e Mon Sep 17 00:00:00 2001 From: paulosf0 Date: Thu, 18 Jan 2024 14:34:55 -0300 Subject: [PATCH 01/26] feat: add tuning list and their services --- src/router/routes/waf-rules-routes/index.js | 8 +- .../delete-waf-rules-allowed-service.js | 2 +- src/services/waf-rules-services/index.js | 8 +- .../list-network-list-service.js | 28 +++ .../list-waf-rules-domain-service.js | 39 +++ .../list-waf-rules-tuning-service.js | 44 ++++ .../action-bar-with-teleport.vue | 4 +- .../delete-waf-rules-allowed-service.test.js | 4 +- .../list-network-list-service.test.js | 63 +++++ .../list-waf-rules-domain-service.test.js | 62 +++++ src/views/WafRules/EditView.vue | 5 + .../WafRules/FormFields/FormFieldsAllowed.vue | 7 +- src/views/WafRules/ListWafRulesTuning.vue | 222 ++++++++++++++++++ src/views/WafRules/TabsView.vue | 22 +- 14 files changed, 503 insertions(+), 15 deletions(-) create mode 100644 src/services/waf-rules-services/list-network-list-service.js create mode 100644 src/services/waf-rules-services/list-waf-rules-domain-service.js create mode 100644 src/services/waf-rules-services/list-waf-rules-tuning-service.js create mode 100644 src/tests/services/waf-rules-services/list-network-list-service.test.js create mode 100644 src/tests/services/waf-rules-services/list-waf-rules-domain-service.test.js create mode 100644 src/views/WafRules/ListWafRulesTuning.vue diff --git a/src/router/routes/waf-rules-routes/index.js b/src/router/routes/waf-rules-routes/index.js index fe17e084c..0ffa67e8f 100644 --- a/src/router/routes/waf-rules-routes/index.js +++ b/src/router/routes/waf-rules-routes/index.js @@ -1,5 +1,7 @@ import * as Helpers from '@/helpers' import * as WafRulesService from '@/services/waf-rules-services' +import { listCountriesService } from '@/services/network-lists-services' + /** @type {import('vue-router').RouteRecordRaw} */ export const wafRulesRoutes = { @@ -62,7 +64,11 @@ export const wafRulesRoutes = { loadWafRulesService: WafRulesService.loadWafRulesService }, wafTuning: { - documentationServiceTuning: Helpers.documentationCatalog.wafTuning + documentationServiceTuning: Helpers.documentationCatalog.wafTuning, + listWafRulesTuningService: WafRulesService.listWafRulesTuningService, + listNetworkListService: WafRulesService.listNetworkListService, + listCountriesService: listCountriesService, + listWafRulesDomainsService: WafRulesService.listWafRulesDomainsService } }, meta: { diff --git a/src/services/waf-rules-services/delete-waf-rules-allowed-service.js b/src/services/waf-rules-services/delete-waf-rules-allowed-service.js index 6545cf49f..b04a2cc8c 100644 --- a/src/services/waf-rules-services/delete-waf-rules-allowed-service.js +++ b/src/services/waf-rules-services/delete-waf-rules-allowed-service.js @@ -19,7 +19,7 @@ export const deleteWafRulesAllowedService = async ({ wafId, allowedId }) => { */ const parseHttpResponse = (httpResponse) => { switch (httpResponse.statusCode) { - case 200: + case 202: return 'Waf rule allowed successfully deleted' case 400: throw new Errors.NotFoundError().message diff --git a/src/services/waf-rules-services/index.js b/src/services/waf-rules-services/index.js index b13c20751..c31941e89 100644 --- a/src/services/waf-rules-services/index.js +++ b/src/services/waf-rules-services/index.js @@ -8,6 +8,9 @@ import { deleteWafRulesAllowedService } from './delete-waf-rules-allowed-service import { createWafRulesAllowedService } from './create-waf-rules-allowed-service' import { loadWafRulesAllowedService } from './load-waf-rules-allowed-service' import { editWafRulesAllowedService } from './edit-waf-rules-allowed-service' +import { listWafRulesTuningService } from './list-waf-rules-tuning-service' +import { listNetworkListService } from './list-network-list-service' +import { listWafRulesDomainsService } from './list-waf-rules-domain-service' export { listWafRulesService, @@ -19,5 +22,8 @@ export { deleteWafRulesAllowedService, createWafRulesAllowedService, loadWafRulesAllowedService, - editWafRulesAllowedService + editWafRulesAllowedService, + listWafRulesTuningService, + listNetworkListService, + listWafRulesDomainsService } diff --git a/src/services/waf-rules-services/list-network-list-service.js b/src/services/waf-rules-services/list-network-list-service.js new file mode 100644 index 000000000..ca8278396 --- /dev/null +++ b/src/services/waf-rules-services/list-network-list-service.js @@ -0,0 +1,28 @@ +import { AxiosHttpClientAdapter, parseHttpResponse } from '../axios/AxiosHttpClientAdapter' +import { makeNetworkListBaseUrl } from '../network-lists-services/make-network-list-base-url' + +export const listNetworkListService = async () => { + let httpResponse = await AxiosHttpClientAdapter.request({ + url: `${makeNetworkListBaseUrl()}?pagination=false&exclude_azion_lists=true`, + method: 'GET' + }) + + httpResponse = adapt(httpResponse) + return parseHttpResponse(httpResponse) +} + +const adapt = (httpResponse) => { + const isArray = Array.isArray(httpResponse.body.results) + + const networkList = isArray + ? httpResponse.body.results.map((networkList) => ({ + id: networkList.id, + name: networkList.name, + })) + : [] + + return { + body: networkList, + statusCode: httpResponse.statusCode + } +} diff --git a/src/services/waf-rules-services/list-waf-rules-domain-service.js b/src/services/waf-rules-services/list-waf-rules-domain-service.js new file mode 100644 index 000000000..96bb9a135 --- /dev/null +++ b/src/services/waf-rules-services/list-waf-rules-domain-service.js @@ -0,0 +1,39 @@ +import { AxiosHttpClientAdapter, parseHttpResponse } from '../axios/AxiosHttpClientAdapter' +import { makeWafRulesBaseUrl } from './make-waf-rules-base-url' + +export const listWafRulesDomainsService = async ({ wafId }) => { + let httpResponse = await AxiosHttpClientAdapter.request({ + url: `${makeWafRulesBaseUrl()}/${wafId}/domains`, + method: 'GET' + }) + + httpResponse = adapt(httpResponse) + + return parseHttpResponse(httpResponse) +} + + + +const adapt = (httpResponse) => { + /** + * Necessary until the API gets the common pattern + * of returning the array of data inside results property + * like other andpoints. + */ + + // eslint-disable-next-line no-console + const isArray = Array.isArray(httpResponse.body.results) + + + const parsedWafRulesDomain = isArray + ? httpResponse.body.results.map((domain) => ({ + domain: domain.domain, + id: domain.id, + name: domain.name, + })) : [] + + return { + body: parsedWafRulesDomain, + statusCode: httpResponse.statusCode + } +} diff --git a/src/services/waf-rules-services/list-waf-rules-tuning-service.js b/src/services/waf-rules-services/list-waf-rules-tuning-service.js new file mode 100644 index 000000000..cc89d5685 --- /dev/null +++ b/src/services/waf-rules-services/list-waf-rules-tuning-service.js @@ -0,0 +1,44 @@ +import { AxiosHttpClientAdapter, parseHttpResponse } from '../axios/AxiosHttpClientAdapter' +import { makeWafRulesBaseUrl } from './make-waf-rules-base-url' + +export const listWafRulesTuningService = async ({ wafId }) => { + let httpResponse = await AxiosHttpClientAdapter.request({ + url: `${makeWafRulesBaseUrl()}/${wafId}/waf_events`, + method: 'GET' + }) + + httpResponse = adapt(httpResponse) + + return parseHttpResponse(httpResponse) +} +// const parseStatusData = (status) => { +// const parsedStatus = status +// ? { +// content: 'Active', +// severity: 'success' +// } +// : { +// content: 'Inactive', +// severity: 'danger' +// } + +// return parsedStatus +// } + + + +const adapt = (httpResponse) => { + /** + * Necessary until the API gets the common pattern + * of returning the array of data inside results property + * like other andpoints. + */ + + // eslint-disable-next-line no-console + console.log(httpResponse.body); + + return { + body: httpResponse.body, + statusCode: httpResponse.statusCode + } +} diff --git a/src/templates/action-bar-block/action-bar-with-teleport.vue b/src/templates/action-bar-block/action-bar-with-teleport.vue index 1f94b169f..b41958cab 100644 --- a/src/templates/action-bar-block/action-bar-with-teleport.vue +++ b/src/templates/action-bar-block/action-bar-with-teleport.vue @@ -9,7 +9,8 @@ id: { type: String, default: '#action-bar' }, loading: Boolean, cancelDisabled: Boolean, - submitDisabled: Boolean + submitDisabled: Boolean, + primaryActionLabel: String }) const handleSubmit = () => { @@ -37,6 +38,7 @@ :cancelDisabled="props.cancelDisabled" :submitDisabled="props.submitDisabled" :inDrawer="false" + :primaryActionLabel="props.primaryActionLabel" @onSubmit="handleSubmit" @onCancel="handleCancel" /> diff --git a/src/tests/services/waf-rules-services/delete-waf-rules-allowed-service.test.js b/src/tests/services/waf-rules-services/delete-waf-rules-allowed-service.test.js index 14c1c21ea..6456eee76 100644 --- a/src/tests/services/waf-rules-services/delete-waf-rules-allowed-service.test.js +++ b/src/tests/services/waf-rules-services/delete-waf-rules-allowed-service.test.js @@ -14,7 +14,7 @@ const makeSut = () => { describe('WafRulesServices', () => { it('should call API with correct params', async () => { const requestSpy = vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ - statusCode: 200 + statusCode: 202 }) const wafRuleIdMock = 765678 const { sut } = makeSut() @@ -28,7 +28,7 @@ describe('WafRulesServices', () => { it('should return a feedback message on successfully deleted', async () => { vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ - statusCode: 200 + statusCode: 202 }) const wafRuleIdMock = 7816825367 const { sut } = makeSut() diff --git a/src/tests/services/waf-rules-services/list-network-list-service.test.js b/src/tests/services/waf-rules-services/list-network-list-service.test.js new file mode 100644 index 000000000..21884ea52 --- /dev/null +++ b/src/tests/services/waf-rules-services/list-network-list-service.test.js @@ -0,0 +1,63 @@ +import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter' +import { listNetworkListService } from '@/services/waf-rules-services' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const fixtures = { + networkMock: { + id: 123123123, + name: 'Network AZ', + } +} + +const makeSut = () => { + const sut = listNetworkListService + + return { + sut + } +} + +describe('WafRulesServices', () => { + beforeEach(() => { + vi.useFakeTimers() + }) + afterEach(() => { + vi.useRealTimers() + }) + + it('should call api with correct params', async () => { + const requestSpy = vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200, + body: { + results: null + } + }) + + const { sut } = makeSut() + await sut() + + expect(requestSpy).toHaveBeenCalledWith({ + url: `v3/network_lists?pagination=false&exclude_azion_lists=true`, + method: 'GET' + }) + }) + + it('should parsed correctly each network record', async () => { + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200, + body: { + results: [fixtures.networkMock] + } + }) + const { sut } = makeSut() + + const result = await sut() + + expect(result).toEqual([ + { + id: fixtures.networkMock.id, + name: fixtures.networkMock.name, + } + ]) + }) +}) diff --git a/src/tests/services/waf-rules-services/list-waf-rules-domain-service.test.js b/src/tests/services/waf-rules-services/list-waf-rules-domain-service.test.js new file mode 100644 index 000000000..d4204db3c --- /dev/null +++ b/src/tests/services/waf-rules-services/list-waf-rules-domain-service.test.js @@ -0,0 +1,62 @@ +import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter' +import { listWafRulesDomainsService } from '@/services/waf-rules-services' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const fixtures = { + wafRulesDomainMock: { + cnames: [], + domain: "erwc1eveo1.map.azionedge.net", + id: 1705587704, + name: "atack" + }, +} + +const makeSut = () => { + const sut = listWafRulesDomainsService + + return { + sut + } +} + +describe('WafRulesServices', () => { + beforeEach(() => { + vi.useFakeTimers() + }) + afterEach(() => { + vi.useRealTimers() + }) + + it('should call api with correct params', async () => { + const requestSpy = vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200, + body: { result: null } + }) + + const { sut } = makeSut() + await sut({ wafId: 100 }) + + expect(requestSpy).toHaveBeenCalledWith({ + url: 'v3/waf/100/domains', + method: 'GET' + }) + }) + + it('should parsed correctly domain', async () => { + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200, + body: { results: [fixtures.wafRulesDomainMock] } + }) + const { sut } = makeSut() + + const result = await sut({ wafId: 100 }) + + expect(result).toEqual([ + { + domain: fixtures.wafRulesDomainMock.domain, + id: fixtures.wafRulesDomainMock.id, + name: fixtures.wafRulesDomainMock.name, + }, + ]) + }) +}) diff --git a/src/views/WafRules/EditView.vue b/src/views/WafRules/EditView.vue index c6d7f347c..ea87ab8d6 100644 --- a/src/views/WafRules/EditView.vue +++ b/src/views/WafRules/EditView.vue @@ -11,6 +11,7 @@ + diff --git a/src/views/WafRules/TabsView.vue b/src/views/WafRules/TabsView.vue index 37229005d..8a4c1fd69 100644 --- a/src/views/WafRules/TabsView.vue +++ b/src/views/WafRules/TabsView.vue @@ -2,7 +2,8 @@ import ContentBlock from '@/templates/content-block' import PageHeadingBlock from '@/templates/page-heading-block' import EditView from '@/views/WafRules/EditView.vue' - import ListViewWafRulesAllowed from '@/views/WafRules/ListWafRulesAllowed.vue' + import ListWafRulesAllowed from '@/views/WafRules/ListWafRulesAllowed.vue' + import ListWafRulesTuning from '@/views/WafRules/ListWafRulesTuning.vue' import TabPanel from 'primevue/tabpanel' import TabView from 'primevue/tabview' @@ -13,7 +14,8 @@ const props = defineProps({ wafServices: { type: Object, required: true }, - wafRulesAllowed: { type: Object, required: true } + wafRulesAllowed: { type: Object, required: true }, + wafTuning: { type: Object, required: true } }) const mapTabs = { @@ -71,20 +73,28 @@ + :showActionBar="activeTab === mapTabs.mainSettings" + /> -

Tuning

+
- + /> From 9fcd4c42d8c53d8a398fc378495a92e18b483f7f Mon Sep 17 00:00:00 2001 From: paulosf0 Date: Thu, 18 Jan 2024 14:36:52 -0300 Subject: [PATCH 02/26] feat: husky format --- src/router/routes/waf-rules-routes/index.js | 1 - .../waf-rules-services/list-network-list-service.js | 2 +- .../list-waf-rules-domain-service.js | 12 +++++------- .../list-waf-rules-tuning-service.js | 4 +--- src/templates/edit-drawer-block/index.vue | 2 +- .../list-table-block/dialog/delete-dialog.vue | 6 ++++-- .../search-domains-metrics-service.test.js | 1 - .../list-network-list-service.test.js | 4 ++-- .../list-waf-rules-domain-service.test.js | 10 +++++----- 9 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/router/routes/waf-rules-routes/index.js b/src/router/routes/waf-rules-routes/index.js index 0ffa67e8f..7cd8c1070 100644 --- a/src/router/routes/waf-rules-routes/index.js +++ b/src/router/routes/waf-rules-routes/index.js @@ -2,7 +2,6 @@ import * as Helpers from '@/helpers' import * as WafRulesService from '@/services/waf-rules-services' import { listCountriesService } from '@/services/network-lists-services' - /** @type {import('vue-router').RouteRecordRaw} */ export const wafRulesRoutes = { path: '/waf', diff --git a/src/services/waf-rules-services/list-network-list-service.js b/src/services/waf-rules-services/list-network-list-service.js index ca8278396..d4c09088f 100644 --- a/src/services/waf-rules-services/list-network-list-service.js +++ b/src/services/waf-rules-services/list-network-list-service.js @@ -17,7 +17,7 @@ const adapt = (httpResponse) => { const networkList = isArray ? httpResponse.body.results.map((networkList) => ({ id: networkList.id, - name: networkList.name, + name: networkList.name })) : [] diff --git a/src/services/waf-rules-services/list-waf-rules-domain-service.js b/src/services/waf-rules-services/list-waf-rules-domain-service.js index 96bb9a135..b9ad24b71 100644 --- a/src/services/waf-rules-services/list-waf-rules-domain-service.js +++ b/src/services/waf-rules-services/list-waf-rules-domain-service.js @@ -12,8 +12,6 @@ export const listWafRulesDomainsService = async ({ wafId }) => { return parseHttpResponse(httpResponse) } - - const adapt = (httpResponse) => { /** * Necessary until the API gets the common pattern @@ -24,13 +22,13 @@ const adapt = (httpResponse) => { // eslint-disable-next-line no-console const isArray = Array.isArray(httpResponse.body.results) - const parsedWafRulesDomain = isArray ? httpResponse.body.results.map((domain) => ({ - domain: domain.domain, - id: domain.id, - name: domain.name, - })) : [] + domain: domain.domain, + id: domain.id, + name: domain.name + })) + : [] return { body: parsedWafRulesDomain, diff --git a/src/services/waf-rules-services/list-waf-rules-tuning-service.js b/src/services/waf-rules-services/list-waf-rules-tuning-service.js index cc89d5685..f4e82c3ee 100644 --- a/src/services/waf-rules-services/list-waf-rules-tuning-service.js +++ b/src/services/waf-rules-services/list-waf-rules-tuning-service.js @@ -25,8 +25,6 @@ export const listWafRulesTuningService = async ({ wafId }) => { // return parsedStatus // } - - const adapt = (httpResponse) => { /** * Necessary until the API gets the common pattern @@ -35,7 +33,7 @@ const adapt = (httpResponse) => { */ // eslint-disable-next-line no-console - console.log(httpResponse.body); + console.log(httpResponse.body) return { body: httpResponse.body, diff --git a/src/templates/edit-drawer-block/index.vue b/src/templates/edit-drawer-block/index.vue index ecb7382f1..1e59e069e 100644 --- a/src/templates/edit-drawer-block/index.vue +++ b/src/templates/edit-drawer-block/index.vue @@ -13,7 +13,7 @@ const emit = defineEmits(['update:visible', 'onSuccess', 'onError']) const props = defineProps({ id: { - type: [ String, Number ], + type: [String, Number], required: true }, visible: { diff --git a/src/templates/list-table-block/dialog/delete-dialog.vue b/src/templates/list-table-block/dialog/delete-dialog.vue index d358d68ca..275f6ef0a 100644 --- a/src/templates/list-table-block/dialog/delete-dialog.vue +++ b/src/templates/list-table-block/dialog/delete-dialog.vue @@ -27,7 +27,9 @@

- +
@@ -53,7 +55,7 @@