Skip to content

Commit

Permalink
Feature/add extended filters to domains page (#5209)
Browse files Browse the repository at this point in the history
* add filters arg to find-my-domains query and loader

* create domain list filter components

* add filters arg to domain page queries

* update faked schema

* add DomainListFilters component to DomainsPage

* add filters arg to full domain list export

* add test for DomainListFilters

* FilterList tests

* add variables to export query

* fix DomainsPage test variables

* remove csv export changes - using separate branch

* add AB testing to filters on DomainsPage
  • Loading branch information
lcampbell2 committed Apr 4, 2024
1 parent a6ab1da commit e0eb922
Show file tree
Hide file tree
Showing 12 changed files with 660 additions and 312 deletions.
106 changes: 105 additions & 1 deletion api/src/domain/loaders/load-domain-connections-by-user-id.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,19 @@ import { t } from '@lingui/macro'

export const loadDomainConnectionsByUserId =
({ query, userKey, cleanseInput, i18n, auth: { loginRequiredBool } }) =>
async ({ after, before, first, last, ownership, orderBy, isSuperAdmin, myTracker, search, isAffiliated }) => {
async ({
after,
before,
first,
last,
ownership,
orderBy,
isSuperAdmin,
myTracker,
search,
isAffiliated,
filters = [],
}) => {
const userDBId = `users/${userKey}`

let ownershipOrgsOnly = aql`
Expand Down Expand Up @@ -310,6 +322,95 @@ export const loadDomainConnectionsByUserId =
sortString = aql`ASC`
}

let domainFilters = aql``
if (typeof filters !== 'undefined') {
filters.forEach(({ filterCategory, comparison, filterValue }) => {
if (comparison === '==') {
comparison = aql`==`
} else {
comparison = aql`!=`
}
if (filterCategory === 'dmarc-status') {
domainFilters = aql`
${domainFilters}
FILTER domain.status.dmarc ${comparison} ${filterValue}
`
} else if (filterCategory === 'dkim-status') {
domainFilters = aql`
${domainFilters}
FILTER domain.status.dkim ${comparison} ${filterValue}
`
} else if (filterCategory === 'https-status') {
domainFilters = aql`
${domainFilters}
FILTER domain.status.https ${comparison} ${filterValue}
`
} else if (filterCategory === 'spf-status') {
domainFilters = aql`
${domainFilters}
FILTER domain.status.spf ${comparison} ${filterValue}
`
} else if (filterCategory === 'ciphers-status') {
domainFilters = aql`
${domainFilters}
FILTER domain.status.ciphers ${comparison} ${filterValue}
`
} else if (filterCategory === 'curves-status') {
domainFilters = aql`
${domainFilters}
FILTER domain.status.curves ${comparison} ${filterValue}
`
} else if (filterCategory === 'hsts-status') {
domainFilters = aql`
${domainFilters}
FILTER domain.status.hsts ${comparison} ${filterValue}
`
} else if (filterCategory === 'policy-status') {
domainFilters = aql`
${domainFilters}
FILTER domain.status.policy ${comparison} ${filterValue}
`
} else if (filterCategory === 'protocols-status') {
domainFilters = aql`
${domainFilters}
FILTER domain.status.protocols ${comparison} ${filterValue}
`
} else if (filterCategory === 'certificates-status') {
domainFilters = aql`
${domainFilters}
FILTER domain.status.certificates ${comparison} ${filterValue}
`
} else if (filterCategory === 'tags') {
if (filterValue === 'archived') {
domainFilters = aql`
${domainFilters}
FILTER domain.archived ${comparison} true
`
} else if (filterValue === 'nxdomain') {
domainFilters = aql`
${domainFilters}
FILTER domain.rcode ${comparison} "NXDOMAIN"
`
} else if (filterValue === 'blocked') {
domainFilters = aql`
${domainFilters}
FILTER domain.blocked ${comparison} true
`
} else if (filterValue === 'wildcard-sibling') {
domainFilters = aql`
${domainFilters}
FILTER domain.wildcardSibling ${comparison} true
`
} else if (filterValue === 'scan-pending') {
domainFilters = aql`
${domainFilters}
FILTER domain.webScanPending ${comparison} true
`
}
}
})
}

let domainKeysQuery
if (myTracker) {
domainKeysQuery = aql`
Expand Down Expand Up @@ -418,6 +519,7 @@ export const loadDomainConnectionsByUserId =
LET retrievedDomains = (
${loopString}
${showArchivedDomains}
${domainFilters}
${afterTemplate}
${beforeTemplate}
SORT
Expand All @@ -429,6 +531,7 @@ export const loadDomainConnectionsByUserId =
LET hasNextPage = (LENGTH(
${loopString}
${showArchivedDomains}
${domainFilters}
${hasNextPageFilter}
SORT ${sortByField} TO_NUMBER(domain._key) ${sortString} LIMIT 1
RETURN domain
Expand All @@ -437,6 +540,7 @@ export const loadDomainConnectionsByUserId =
LET hasPreviousPage = (LENGTH(
${loopString}
${showArchivedDomains}
${domainFilters}
${hasPreviousPageFilter}
SORT ${sortByField} TO_NUMBER(domain._key) ${sortString} LIMIT 1
RETURN domain
Expand Down
8 changes: 6 additions & 2 deletions api/src/domain/queries/find-my-domains.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { GraphQLBoolean, GraphQLString } from 'graphql'
import { GraphQLBoolean, GraphQLString, GraphQLList } from 'graphql'
import { connectionArgs } from 'graphql-relay'

import { domainOrder } from '../inputs'
import { domainFilter, domainOrder } from '../inputs'
import { domainConnection } from '../objects'

export const findMyDomains = {
Expand All @@ -24,6 +24,10 @@ export const findMyDomains = {
type: GraphQLBoolean,
description: 'Filter the results based on the users affiliation.',
},
filters: {
type: new GraphQLList(domainFilter),
description: 'Filters used to limit domains returned.',
},
...connectionArgs,
},
resolve: async (
Expand Down
Loading

0 comments on commit e0eb922

Please sign in to comment.